ZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnIGIvYXJjaC9pMzg2L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhMGNiYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9LY29uZmlnCkBAIC0wLDAgKzEsMTI2OSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21haW5tZW51ICJMaW51eCBLZXJuZWwgQ29uZmlndXJhdGlvbiIKKworY29uZmlnIFg4NgorCWJvb2wKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGlzIExpbnV4J3MgaG9tZSBwb3J0LiAgTGludXggd2FzIG9yaWdpbmFsbHkgbmF0aXZlIHRvIHRoZSBJbnRlbAorCSAgMzg2LCBhbmQgcnVucyBvbiBhbGwgdGhlIGxhdGVyIHg4NiBwcm9jZXNzb3JzIGluY2x1ZGluZyB0aGUgSW50ZWwKKwkgIDQ4NiwgNTg2LCBQZW50aXVtcywgYW5kIHZhcmlvdXMgaW5zdHJ1Y3Rpb24tc2V0LWNvbXBhdGlibGUgY2hpcHMgYnkKKwkgIEFNRCwgQ3lyaXgsIGFuZCBvdGhlcnMuCisKK2NvbmZpZyBNTVUKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBTQlVTCisJYm9vbAorCitjb25maWcgVUlEMTYKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBHRU5FUklDX0lTQV9ETUEKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBHRU5FUklDX0lPTUFQCisJYm9vbAorCWRlZmF1bHQgeQorCitzb3VyY2UgImluaXQvS2NvbmZpZyIKKworbWVudSAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgorCitjaG9pY2UKKwlwcm9tcHQgIlN1YmFyY2hpdGVjdHVyZSBUeXBlIgorCWRlZmF1bHQgWDg2X1BDCisKK2NvbmZpZyBYODZfUEMKKwlib29sICJQQy1jb21wYXRpYmxlIgorCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3VyIGNvbXB1dGVyIGlzIGEgc3RhbmRhcmQgUEMgb3IgY29tcGF0aWJsZS4KKworY29uZmlnIFg4Nl9FTEFOCisJYm9vbCAiQU1EIEVsYW4iCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGFuIEFNRCBFbGFuIHByb2Nlc3Nvci4KKworCSAgRG8gbm90IHVzZSB0aGlzIG9wdGlvbiBmb3IgSzYvQXRobG9uL09wdGVyb24gcHJvY2Vzc29ycyEKKworCSAgSWYgdW5zdXJlLCBjaG9vc2UgIlBDLWNvbXBhdGlibGUiIGluc3RlYWQuCisKK2NvbmZpZyBYODZfVk9ZQUdFUgorCWJvb2wgIlZveWFnZXIgKE5DUikiCisJaGVscAorCSAgVm95YWdlciBpcyBhbiBNQ0EtYmFzZWQgMzItd2F5IGNhcGFibGUgU01QIGFyY2hpdGVjdHVyZSBwcm9wcmlldGFyeQorCSAgdG8gTkNSIENvcnAuICBNYWNoaW5lIGNsYXNzZXMgMzQ1eC8zNXh4LzQxMDAvNTF4eCBhcmUgVm95YWdlci1iYXNlZC4KKworCSAgKioqIFdBUk5JTkcgKioqCisKKwkgIElmIHlvdSBkbyBub3Qgc3BlY2lmaWNhbGx5IGtub3cgeW91IGhhdmUgYSBWb3lhZ2VyIGJhc2VkIG1hY2hpbmUsCisJICBzYXkgTiBoZXJlLCBvdGhlcndpc2UgdGhlIGtlcm5lbCB5b3UgYnVpbGQgd2lsbCBub3QgYmUgYm9vdGFibGUuCisKK2NvbmZpZyBYODZfTlVNQVEKKwlib29sICJOVU1BUSAoSUJNL1NlcXVlbnQpIgorCXNlbGVjdCBESVNDT05USUdNRU0KKwlzZWxlY3QgTlVNQQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGlzIHVzZWQgZm9yIGdldHRpbmcgTGludXggdG8gcnVuIG9uIGEgKElCTS9TZXF1ZW50KSBOVU1BCisJICBtdWx0aXF1YWQgYm94LiBUaGlzIGNoYW5nZXMgdGhlIHdheSB0aGF0IHByb2Nlc3NvcnMgYXJlIGJvb3RzdHJhcHBlZCwKKwkgIGFuZCB1c2VzIENsdXN0ZXJlZCBMb2dpY2FsIEFQSUMgYWRkcmVzc2luZyBtb2RlIGluc3RlYWQgb2YgRmxhdCBMb2dpY2FsLgorCSAgWW91IHdpbGwgbmVlZCBhIG5ldyBseW54ZXIuZWxmIGZpbGUgdG8gZmxhc2ggeW91ciBmaXJtd2FyZSB3aXRoIC0gc2VuZAorCSAgZW1haWwgdG8gPE1hcnRpbi5CbGlnaEB1cy5pYm0uY29tPi4KKworY29uZmlnIFg4Nl9TVU1NSVQKKwlib29sICJTdW1taXQvRVhBIChJQk0geDQ0MCkiCisJZGVwZW5kcyBvbiBTTVAKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpcyBuZWVkZWQgZm9yIElCTSBzeXN0ZW1zIHRoYXQgdXNlIHRoZSBTdW1taXQvRVhBIGNoaXBzZXQuCisJICBJbiBwYXJ0aWN1bGFyLCBpdCBpcyBuZWVkZWQgZm9yIHRoZSB4NDQwLgorCisJICBJZiB5b3UgZG9uJ3QgaGF2ZSBvbmUgb2YgdGhlc2UgY29tcHV0ZXJzLCB5b3Ugc2hvdWxkIHNheSBOIGhlcmUuCisKK2NvbmZpZyBYODZfQklHU01QCisJYm9vbCAiU3VwcG9ydCBmb3Igb3RoZXIgc3ViLWFyY2ggU01QIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gOCBDUFVzIgorCWRlcGVuZHMgb24gU01QCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgbmVlZGVkIGZvciB0aGUgc3lzdGVtcyB0aGF0IGhhdmUgbW9yZSB0aGFuIDggQ1BVcworCSAgYW5kIGlmIHRoZSBzeXN0ZW0gaXMgbm90IG9mIGFueSBzdWItYXJjaCB0eXBlIGFib3ZlLgorCisJICBJZiB5b3UgZG9uJ3QgaGF2ZSBzdWNoIGEgc3lzdGVtLCB5b3Ugc2hvdWxkIHNheSBOIGhlcmUuCisKK2NvbmZpZyBYODZfVklTV1MKKwlib29sICJTR0kgMzIwLzU0MCAoVmlzdWFsIFdvcmtzdGF0aW9uKSIKKwloZWxwCisJICBUaGUgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBzZXJpZXMgaXMgYW4gSUEzMi1iYXNlZCB3b3Jrc3RhdGlvbgorCSAgYmFzZWQgb24gU0dJIHN5c3RlbXMgY2hpcHMgd2l0aCBzb21lIGxlZ2FjeSBQQyBoYXJkd2FyZSBhdHRhY2hlZC4KKworCSAgU2F5IFkgaGVyZSB0byBjcmVhdGUgYSBrZXJuZWwgdG8gcnVuIG9uIHRoZSBTR0kgMzIwIG9yIDU0MC4KKworCSAgQSBrZXJuZWwgY29tcGlsZWQgZm9yIHRoZSBWaXN1YWwgV29ya3N0YXRpb24gd2lsbCBub3QgcnVuIG9uIFBDcworCSAgYW5kIHZpY2UgdmVyc2EuIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NnaS12aXN3cy50eHQ+IGZvciBkZXRhaWxzLgorCitjb25maWcgWDg2X0dFTkVSSUNBUkNICisgICAgICAgYm9vbCAiR2VuZXJpYyBhcmNoaXRlY3R1cmUgKFN1bW1pdCwgYmlnc21wLCBFUzcwMDAsIGRlZmF1bHQpIgorICAgICAgIGRlcGVuZHMgb24gU01QCisgICAgICAgaGVscAorICAgICAgICAgIFRoaXMgb3B0aW9uIGNvbXBpbGVzIGluIHRoZSBTdW1taXQsIGJpZ3NtcCwgRVM3MDAwLCBkZWZhdWx0IHN1YmFyY2hpdGVjdHVyZXMuCisJICBJdCBpcyBpbnRlbmRlZCBmb3IgYSBnZW5lcmljIGJpbmFyeSBrZXJuZWwuCisKK2NvbmZpZyBYODZfRVM3MDAwCisJYm9vbCAiU3VwcG9ydCBmb3IgVW5pc3lzIEVTNzAwMCBJQTMyIHNlcmllcyIKKwlkZXBlbmRzIG9uIFNNUAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFVuaXN5cyBFUzcwMDAgc3lzdGVtcy4gIFNheSAnWScgaGVyZSBpZiB0aGlzIGtlcm5lbCBpcworCSAgc3VwcG9zZWQgdG8gcnVuIG9uIGFuIElBMzItYmFzZWQgVW5pc3lzIEVTNzAwMCBzeXN0ZW0uCisJICBPbmx5IGNob29zZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBzdWNoIGEgc3lzdGVtLCBvdGhlcndpc2UgeW91CisJICBzaG91bGQgc2F5IE4gaGVyZS4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBBQ1BJX1NSQVQKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBOVU1BICYmIChYODZfU1VNTUlUIHx8IFg4Nl9HRU5FUklDQVJDSCkKKworY29uZmlnIFg4Nl9TVU1NSVRfTlVNQQorCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE5VTUEgJiYgKFg4Nl9TVU1NSVQgfHwgWDg2X0dFTkVSSUNBUkNIKQorCitjb25maWcgWDg2X0NZQ0xPTkVfVElNRVIKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBYODZfU1VNTUlUIHx8IFg4Nl9HRU5FUklDQVJDSAorCitjb25maWcgRVM3MDAwX0NMVVNURVJFRF9BUElDCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU01QICYmIFg4Nl9FUzcwMDAgJiYgTVBFTlRJVU1JSUkKKworaWYgIVg4Nl9FTEFOCisKK2Nob2ljZQorCXByb21wdCAiUHJvY2Vzc29yIGZhbWlseSIKKwlkZWZhdWx0IE02ODYKKworY29uZmlnIE0zODYKKwlib29sICIzODYiCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgcHJvY2Vzc29yIHR5cGUgb2YgeW91ciBDUFUuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBmb3IKKwkgIG9wdGltaXppbmcgcHVycG9zZXMuIEluIG9yZGVyIHRvIGNvbXBpbGUgYSBrZXJuZWwgdGhhdCBjYW4gcnVuIG9uCisJICBhbGwgeDg2IENQVSB0eXBlcyAoYWxiZWl0IG5vdCBvcHRpbWFsbHkgZmFzdCksIHlvdSBjYW4gc3BlY2lmeQorCSAgIjM4NiIgaGVyZS4KKworCSAgVGhlIGtlcm5lbCB3aWxsIG5vdCBuZWNlc3NhcmlseSBydW4gb24gZWFybGllciBhcmNoaXRlY3R1cmVzIHRoYW4KKwkgIHRoZSBvbmUgeW91IGhhdmUgY2hvc2VuLCBlLmcuIGEgUGVudGl1bSBvcHRpbWl6ZWQga2VybmVsIHdpbGwgcnVuIG9uCisJICBhIFBQcm8sIGJ1dCBub3QgbmVjZXNzYXJpbHkgb24gYSBpNDg2LgorCisJICBIZXJlIGFyZSB0aGUgc2V0dGluZ3MgcmVjb21tZW5kZWQgZm9yIGdyZWF0ZXN0IHNwZWVkOgorCSAgLSAiMzg2IiBmb3IgdGhlIEFNRC9DeXJpeC9JbnRlbCAzODZEWC9EWEwvU0wvU0xDL1NYLCBDeXJpeC9USQorCSAgNDg2RExDL0RMQzIsIFVNQyA0ODZTWC1TIGFuZCBOZXhHZW4gTng1ODYuICBPbmx5ICIzODYiIGtlcm5lbHMKKwkgIHdpbGwgcnVuIG9uIGEgMzg2IGNsYXNzIG1hY2hpbmUuCisJICAtICI0ODYiIGZvciB0aGUgQU1EL0N5cml4L0lCTS9JbnRlbCA0ODZEWC9EWDIvRFg0IG9yCisJICBTTC9TTEMvU0xDMi9TTEMzL1NYL1NYMiBhbmQgVU1DIFU1RCBvciBVNVMuCisJICAtICI1ODYiIGZvciBnZW5lcmljIFBlbnRpdW0gQ1BVcyBsYWNraW5nIHRoZSBUU0MKKwkgICh0aW1lIHN0YW1wIGNvdW50ZXIpIHJlZ2lzdGVyLgorCSAgLSAiUGVudGl1bS1DbGFzc2ljIiBmb3IgdGhlIEludGVsIFBlbnRpdW0uCisJICAtICJQZW50aXVtLU1NWCIgZm9yIHRoZSBJbnRlbCBQZW50aXVtIE1NWC4KKwkgIC0gIlBlbnRpdW0tUHJvIiBmb3IgdGhlIEludGVsIFBlbnRpdW0gUHJvLgorCSAgLSAiUGVudGl1bS1JSSIgZm9yIHRoZSBJbnRlbCBQZW50aXVtIElJIG9yIHByZS1Db3BwZXJtaW5lIENlbGVyb24uCisJICAtICJQZW50aXVtLUlJSSIgZm9yIHRoZSBJbnRlbCBQZW50aXVtIElJSSBvciBDb3BwZXJtaW5lIENlbGVyb24uCisJICAtICJQZW50aXVtLTQiIGZvciB0aGUgSW50ZWwgUGVudGl1bSA0IG9yIFA0LWJhc2VkIENlbGVyb24uCisJICAtICJLNiIgZm9yIHRoZSBBTUQgSzYsIEs2LUlJIGFuZCBLNi1JSUkgKGFrYSBLNi0zRCkuCisJICAtICJBdGhsb24iIGZvciB0aGUgQU1EIEs3IGZhbWlseSAoQXRobG9uL0R1cm9uL1RodW5kZXJiaXJkKS4KKwkgIC0gIkNydXNvZSIgZm9yIHRoZSBUcmFuc21ldGEgQ3J1c29lIHNlcmllcy4KKwkgIC0gIkVmZmljZW9uIiBmb3IgdGhlIFRyYW5zbWV0YSBFZmZpY2VvbiBzZXJpZXMuCisJICAtICJXaW5jaGlwLUM2IiBmb3Igb3JpZ2luYWwgSURUIFdpbmNoaXAuCisJICAtICJXaW5jaGlwLTIiIGZvciBJRFQgV2luY2hpcCAyLgorCSAgLSAiV2luY2hpcC0yQSIgZm9yIElEVCBXaW5jaGlwcyB3aXRoIDNkTm93ISBjYXBhYmlsaXRpZXMuCisJICAtICJNZWRpYUdYL0dlb2RlIiBmb3IgQ3lyaXggTWVkaWFHWCBha2EgR2VvZGUuCisJICAtICJDeXJpeElJSS9WSUEgQzMiIGZvciBWSUEgQ3lyaXggSUlJIG9yIFZJQSBDMy4KKwkgIC0gIlZJQSBDMy0yIGZvciBWSUEgQzMtMiAiTmVoZW1pYWgiIChtb2RlbCA5IGFuZCBhYm92ZSkuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8sIGNob29zZSAiMzg2Ii4KKworY29uZmlnIE00ODYKKwlib29sICI0ODYiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGEgNDg2IHNlcmllcyBwcm9jZXNzb3IsIGVpdGhlciBJbnRlbCBvciBvbmUgb2YgdGhlCisJICBjb21wYXRpYmxlIHByb2Nlc3NvcnMgZnJvbSBBTUQsIEN5cml4LCBJQk0sIG9yIEludGVsLiAgSW5jbHVkZXMgRFgsCisJICBEWDIsIGFuZCBEWDQgdmFyaWFudHM7IGFsc28gU0wvU0xDL1NMQzIvU0xDMy9TWC9TWDIgYW5kIFVNQyBVNUQgb3IKKwkgIFU1Uy4KKworY29uZmlnIE01ODYKKwlib29sICI1ODYvSzUvNXg4Ni82eDg2LzZ4ODZNWCIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBmb3IgYW4gNTg2IG9yIDY4NiBzZXJpZXMgcHJvY2Vzc29yIHN1Y2ggYXMgdGhlIEFNRCBLNSwKKwkgIHRoZSBDeXJpeCA1eDg2LCA2eDg2IGFuZCA2eDg2TVguICBUaGlzIGNob2ljZSBkb2VzIG5vdAorCSAgYXNzdW1lIHRoZSBSRFRTQyAoUmVhZCBUaW1lIFN0YW1wIENvdW50ZXIpIGluc3RydWN0aW9uLgorCitjb25maWcgTTU4NlRTQworCWJvb2wgIlBlbnRpdW0tQ2xhc3NpYyIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBmb3IgYSBQZW50aXVtIENsYXNzaWMgcHJvY2Vzc29yIHdpdGggdGhlIFJEVFNDIChSZWFkCisJICBUaW1lIFN0YW1wIENvdW50ZXIpIGluc3RydWN0aW9uIGZvciBiZW5jaG1hcmtpbmcuCisKK2NvbmZpZyBNNTg2TU1YCisJYm9vbCAiUGVudGl1bS1NTVgiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGEgUGVudGl1bSB3aXRoIHRoZSBNTVggZ3JhcGhpY3MvbXVsdGltZWRpYQorCSAgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb25zLgorCitjb25maWcgTTY4NgorCWJvb2wgIlBlbnRpdW0tUHJvIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGZvciBJbnRlbCBQZW50aXVtIFBybyBjaGlwcy4gIFRoaXMgZW5hYmxlcyB0aGUgdXNlIG9mCisJICBQZW50aXVtIFBybyBleHRlbmRlZCBpbnN0cnVjdGlvbnMsIGFuZCBkaXNhYmxlcyB0aGUgaW5pdC10aW1lIGd1YXJkCisJICBhZ2FpbnN0IHRoZSBmMDBmIGJ1ZyBmb3VuZCBpbiBlYXJsaWVyIFBlbnRpdW1zLgorCitjb25maWcgTVBFTlRJVU1JSQorCWJvb2wgIlBlbnRpdW0tSUkvQ2VsZXJvbihwcmUtQ29wcGVybWluZSkiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIEludGVsIGNoaXBzIGJhc2VkIG9uIHRoZSBQZW50aXVtLUlJIGFuZAorCSAgcHJlLUNvcHBlcm1pbmUgQ2VsZXJvbiBjb3JlLiAgVGhpcyBvcHRpb24gZW5hYmxlcyBhbiB1bmFsaWduZWQKKwkgIGNvcHkgb3B0aW1pemF0aW9uLCBjb21waWxlcyB0aGUga2VybmVsIHdpdGggb3B0aW1pemF0aW9uIGZsYWdzCisJICB0YWlsb3JlZCBmb3IgdGhlIGNoaXAsIGFuZCBhcHBsaWVzIGFueSBhcHBsaWNhYmxlIFBlbnRpdW0gUHJvCisJICBvcHRpbWl6YXRpb25zLgorCitjb25maWcgTVBFTlRJVU1JSUkKKwlib29sICJQZW50aXVtLUlJSS9DZWxlcm9uKENvcHBlcm1pbmUpL1BlbnRpdW0tSUlJIFhlb24iCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIEludGVsIGNoaXBzIGJhc2VkIG9uIHRoZSBQZW50aXVtLUlJSSBhbmQKKwkgIENlbGVyb24tQ29wcGVybWluZSBjb3JlLiAgVGhpcyBvcHRpb24gZW5hYmxlcyB1c2Ugb2Ygc29tZQorCSAgZXh0ZW5kZWQgcHJlZmV0Y2ggaW5zdHJ1Y3Rpb25zIGluIGFkZGl0aW9uIHRvIHRoZSBQZW50aXVtIElJCisJICBleHRlbnNpb25zLgorCitjb25maWcgTVBFTlRJVU1NCisJYm9vbCAiUGVudGl1bSBNIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGZvciBJbnRlbCBQZW50aXVtIE0gKG5vdCBQZW50aXVtLTQgTSkKKwkgIG5vdGVib29rIGNoaXBzLgorCitjb25maWcgTVBFTlRJVU00CisJYm9vbCAiUGVudGl1bS00L0NlbGVyb24oUDQtYmFzZWQpL1BlbnRpdW0tNCBNL1hlb24iCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIEludGVsIFBlbnRpdW0gNCBjaGlwcy4gIFRoaXMgaW5jbHVkZXMgdGhlCisJICBQZW50aXVtIDQsIFA0LWJhc2VkIENlbGVyb24gYW5kIFhlb24sIGFuZCBQZW50aXVtLTQgTQorCSAgKG5vdCBQZW50aXVtIE0pIGNoaXBzLiAgVGhpcyBvcHRpb24gZW5hYmxlcyBjb21waWxlIGZsYWdzCisJICBvcHRpbWl6ZWQgZm9yIHRoZSBjaGlwLCB1c2VzIHRoZSBjb3JyZWN0IGNhY2hlIHNoaWZ0LCBhbmQKKwkgIGFwcGxpZXMgYW55IGFwcGxpY2FibGUgUGVudGl1bSBJSUkgb3B0aW1pemF0aW9ucy4KKworY29uZmlnIE1LNgorCWJvb2wgIks2L0s2LUlJL0s2LUlJSSIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBmb3IgYW4gQU1EIEs2LWZhbWlseSBwcm9jZXNzb3IuICBFbmFibGVzIHVzZSBvZgorCSAgc29tZSBleHRlbmRlZCBpbnN0cnVjdGlvbnMsIGFuZCBwYXNzZXMgYXBwcm9wcmlhdGUgb3B0aW1pemF0aW9uCisJICBmbGFncyB0byBHQ0MuCisKK2NvbmZpZyBNSzcKKwlib29sICJBdGhsb24vRHVyb24vSzciCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGFuIEFNRCBBdGhsb24gSzctZmFtaWx5IHByb2Nlc3Nvci4gIEVuYWJsZXMgdXNlIG9mCisJICBzb21lIGV4dGVuZGVkIGluc3RydWN0aW9ucywgYW5kIHBhc3NlcyBhcHByb3ByaWF0ZSBvcHRpbWl6YXRpb24KKwkgIGZsYWdzIHRvIEdDQy4KKworY29uZmlnIE1LOAorCWJvb2wgIk9wdGVyb24vQXRobG9uNjQvSGFtbWVyL0s4IgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGZvciBhbiBBTUQgT3B0ZXJvbiBvciBBdGhsb242NCBIYW1tZXItZmFtaWx5IHByb2Nlc3Nvci4gIEVuYWJsZXMKKwkgIHVzZSBvZiBzb21lIGV4dGVuZGVkIGluc3RydWN0aW9ucywgYW5kIHBhc3NlcyBhcHByb3ByaWF0ZSBvcHRpbWl6YXRpb24KKwkgIGZsYWdzIHRvIEdDQy4KKworY29uZmlnIE1DUlVTT0UKKwlib29sICJDcnVzb2UiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGEgVHJhbnNtZXRhIENydXNvZSBwcm9jZXNzb3IuICBUcmVhdHMgdGhlIHByb2Nlc3NvcgorCSAgbGlrZSBhIDU4NiB3aXRoIFRTQywgYW5kIHNldHMgc29tZSBHQ0Mgb3B0aW1pemF0aW9uIGZsYWdzIChsaWtlIGEKKwkgIFBlbnRpdW0gUHJvIHdpdGggbm8gYWxpZ25tZW50IHJlcXVpcmVtZW50cykuCisKK2NvbmZpZyBNRUZGSUNFT04KKwlib29sICJFZmZpY2VvbiIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBmb3IgYSBUcmFuc21ldGEgRWZmaWNlb24gcHJvY2Vzc29yLgorCitjb25maWcgTVdJTkNISVBDNgorCWJvb2wgIldpbmNoaXAtQzYiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGFuIElEVCBXaW5jaGlwIEM2IGNoaXAuICBMaW51eCBhbmQgR0NDCisJICB0cmVhdCB0aGlzIGNoaXAgYXMgYSA1ODZUU0Mgd2l0aCBzb21lIGV4dGVuZGVkIGluc3RydWN0aW9ucworCSAgYW5kIGFsaWdubWVudCByZXF1aXJlbWVudHMuCisKK2NvbmZpZyBNV0lOQ0hJUDIKKwlib29sICJXaW5jaGlwLTIiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGFuIElEVCBXaW5jaGlwLTIuICBMaW51eCBhbmQgR0NDCisJICB0cmVhdCB0aGlzIGNoaXAgYXMgYSA1ODZUU0Mgd2l0aCBzb21lIGV4dGVuZGVkIGluc3RydWN0aW9ucworCSAgYW5kIGFsaWdubWVudCByZXF1aXJlbWVudHMuCisKK2NvbmZpZyBNV0lOQ0hJUDNECisJYm9vbCAiV2luY2hpcC0yQS9XaW5jaGlwLTMiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGFuIElEVCBXaW5jaGlwLTJBIG9yIDMuICBMaW51eCBhbmQgR0NDCisJICB0cmVhdCB0aGlzIGNoaXAgYXMgYSA1ODZUU0Mgd2l0aCBzb21lIGV4dGVuZGVkIGluc3RydWN0aW9ucworCSAgYW5kIGFsaWdubWVudCByZXFpcmVtZW50cy4gIEFsc28gZW5hYmxlIG91dCBvZiBvcmRlciBtZW1vcnkKKwkgIHN0b3JlcyBmb3IgdGhpcyBDUFUsIHdoaWNoIGNhbiBpbmNyZWFzZSBwZXJmb3JtYW5jZSBvZiBzb21lCisJICBvcGVyYXRpb25zLgorCitjb25maWcgTUdFT0RFCisJYm9vbCAiTWVkaWFHWC9HZW9kZSIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBmb3IgYSBDeXJpeCBNZWRpYUdYIGFrYSBHZW9kZSBjaGlwLiBMaW51eCBhbmQgR0NDCisgICAgICAgICAgdHJlYXQgdGhpcyBjaGlwIGFzIGEgNTg2VFNDIHdpdGggc29tZSBleHRlbmRlZCBpbnN0cnVjdGlvbnMKKyAgICAgICAgICBhbmQgYWxpZ25tZW50IHJlcWlyZW1lbnRzLgorCitjb25maWcgTUNZUklYSUlJCisJYm9vbCAiQ3lyaXhJSUkvVklBLUMzIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGZvciBhIEN5cml4IElJSSBvciBDMyBjaGlwLiAgUHJlc2VudGx5IExpbnV4IGFuZCBHQ0MKKwkgIHRyZWF0IHRoaXMgY2hpcCBhcyBhIGdlbmVyaWMgNTg2LiBXaGlsc3QgdGhlIENQVSBpcyA2ODYgY2xhc3MsCisJICBpdCBsYWNrcyB0aGUgY21vdiBleHRlbnNpb24gd2hpY2ggZ2NjIGFzc3VtZXMgaXMgcHJlc2VudCB3aGVuCisJICBnZW5lcmF0aW5nIDY4NiBjb2RlLgorCSAgTm90ZSB0aGF0IE5laGVtaWFoIChNb2RlbCA5KSBhbmQgYWJvdmUgd2lsbCBub3QgYm9vdCB3aXRoIHRoaXMKKwkgIGtlcm5lbCBkdWUgdG8gdGhlbSBsYWNraW5nIHRoZSAzRE5vdyEgaW5zdHJ1Y3Rpb25zIHVzZWQgaW4gZWFybGllcgorCSAgaW5jYXJuYXRpb25zIG9mIHRoZSBDUFUuCisKK2NvbmZpZyBNVklBQzNfMgorCWJvb2wgIlZJQSBDMy0yIChOZWhlbWlhaCkiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgZm9yIGEgVklBIEMzICJOZWhlbWlhaCIuIFNlbGVjdGluZyB0aGlzIGVuYWJsZXMgdXNhZ2UKKwkgIG9mIFNTRSBhbmQgdGVsbHMgZ2NjIHRvIHRyZWF0IHRoZSBDUFUgYXMgYSA2ODYuCisJICBOb3RlLCB0aGlzIGtlcm5lbCB3aWxsIG5vdCBib290IG9uIG9sZGVyIChwcmUgbW9kZWwgOSkgQzNzLgorCitlbmRjaG9pY2UKKworY29uZmlnIFg4Nl9HRU5FUklDCisgICAgICAgYm9vbCAiR2VuZXJpYyB4ODYgc3VwcG9ydCIKKyAgICAgICBoZWxwCisJICBJbnN0ZWFkIG9mIGp1c3QgaW5jbHVkaW5nIG9wdGltaXphdGlvbnMgZm9yIHRoZSBzZWxlY3RlZAorCSAgeDg2IHZhcmlhbnQgKGUuZy4gUElJLCBDcnVzb2Ugb3IgQXRobG9uKSwgaW5jbHVkZSBzb21lIG1vcmUKKwkgIGdlbmVyaWMgb3B0aW1pemF0aW9ucyBhcyB3ZWxsLiBUaGlzIHdpbGwgbWFrZSB0aGUga2VybmVsCisJICBwZXJmb3JtIGJldHRlciBvbiB4ODYgQ1BVcyBvdGhlciB0aGFuIHRoYXQgc2VsZWN0ZWQuCisKKwkgIFRoaXMgaXMgcmVhbGx5IGludGVuZGVkIGZvciBkaXN0cmlidXRvcnMgd2hvIG5lZWQgbW9yZQorCSAgZ2VuZXJpYyBvcHRpbWl6YXRpb25zLgorCitlbmRpZgorCisjCisjIERlZmluZSBpbXBsaWVkIG9wdGlvbnMgZnJvbSB0aGUgQ1BVIHNlbGVjdGlvbiBoZXJlCisjCitjb25maWcgWDg2X0NNUFhDSEcKKwlib29sCisJZGVwZW5kcyBvbiAhTTM4NgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1hBREQKKwlib29sCisJZGVwZW5kcyBvbiAhTTM4NgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X0wxX0NBQ0hFX1NISUZUCisJaW50CisJZGVmYXVsdCAiNyIgaWYgTVBFTlRJVU00IHx8IFg4Nl9HRU5FUklDCisJZGVmYXVsdCAiNCIgaWYgWDg2X0VMQU4gfHwgTTQ4NiB8fCBNMzg2CisJZGVmYXVsdCAiNSIgaWYgTVdJTkNISVAzRCB8fCBNV0lOQ0hJUDIgfHwgTVdJTkNISVBDNiB8fCBNQ1JVU09FIHx8IE1FRkZJQ0VPTiB8fCBNQ1lSSVhJSUkgfHwgTUs2IHx8IE1QRU5USVVNSUlJIHx8IE1QRU5USVVNSUkgfHwgTTY4NiB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTTU4NiB8fCBNVklBQzNfMiB8fCBNR0VPREUKKwlkZWZhdWx0ICI2IiBpZiBNSzcgfHwgTUs4IHx8IE1QRU5USVVNTQorCitjb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSworCWJvb2wKKwlkZXBlbmRzIG9uIE0zODYKKwlkZWZhdWx0IHkKKworY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCisJYm9vbAorCWRlcGVuZHMgb24gIU0zODYKKwlkZWZhdWx0IHkKKworY29uZmlnIEdFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1BQUk9fRkVOQ0UKKwlib29sCisJZGVwZW5kcyBvbiBNNjg2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE00ODYgfHwgTTM4NiB8fCBNR0VPREUKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9GMDBGX0JVRworCWJvb2wKKwlkZXBlbmRzIG9uIE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE00ODYgfHwgTTM4NgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1dQX1dPUktTX09LCisJYm9vbAorCWRlcGVuZHMgb24gIU0zODYKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9JTlZMUEcKKwlib29sCisJZGVwZW5kcyBvbiAhTTM4NgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X0JTV0FQCisJYm9vbAorCWRlcGVuZHMgb24gIU0zODYKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9QT1BBRF9PSworCWJvb2wKKwlkZXBlbmRzIG9uICFNMzg2CisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfQUxJR05NRU5UXzE2CisJYm9vbAorCWRlcGVuZHMgb24gTVdJTkNISVAzRCB8fCBNV0lOQ0hJUDIgfHwgTVdJTkNISVBDNiB8fCBNQ1lSSVhJSUkgfHwgWDg2X0VMQU4gfHwgTUs2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE00ODYgfHwgTVZJQUMzXzIgfHwgTUdFT0RFCisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfR09PRF9BUElDCisJYm9vbAorCWRlcGVuZHMgb24gTUs3IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE01ODZNTVggfHwgTUs4IHx8IE1FRkZJQ0VPTgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X0lOVEVMX1VTRVJDT1BZCisJYm9vbAorCWRlcGVuZHMgb24gTVBFTlRJVU00IHx8IE1QRU5USVVNTSB8fCBNUEVOVElVTUlJSSB8fCBNUEVOVElVTUlJIHx8IE01ODZNTVggfHwgWDg2X0dFTkVSSUMgfHwgTUs4IHx8IE1LNyB8fCBNRUZGSUNFT04KKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9VU0VfUFBST19DSEVDS1NVTQorCWJvb2wKKwlkZXBlbmRzIG9uIE1XSU5DSElQM0QgfHwgTVdJTkNISVAyIHx8IE1XSU5DSElQQzYgfHwgTUNZUklYSUlJIHx8IE1LNyB8fCBNSzYgfHwgTVBFTlRJVU00IHx8IE1QRU5USVVNTSB8fCBNUEVOVElVTUlJSSB8fCBNUEVOVElVTUlJIHx8IE02ODYgfHwgTUs4IHx8IE1WSUFDM18yIHx8IE1FRkZJQ0VPTgorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1VTRV8zRE5PVworCWJvb2wKKwlkZXBlbmRzIG9uIE1DWVJJWElJSSB8fCBNSzcKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9PT1NUT1JFCisJYm9vbAorCWRlcGVuZHMgb24gKE1XSU5DSElQM0QgfHwgTVdJTkNISVAyIHx8IE1XSU5DSElQQzYgfHwgTUdFT0RFKSAmJiBNVFJSCisJZGVmYXVsdCB5CisKK2NvbmZpZyBIUEVUX1RJTUVSCisJYm9vbCAiSFBFVCBUaW1lciBTdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBIUEVUIGZvciB0aGUga2VybmVsJ3MgaW50ZXJuYWwgdGltZXIuCisJICBIUEVUIGlzIHRoZSBuZXh0IGdlbmVyYXRpb24gdGltZXIgcmVwbGFjaW5nIGxlZ2FjeSA4MjU0cy4KKwkgIFlvdSBjYW4gc2FmZWx5IGNob29zZSBZIGhlcmUuICBIb3dldmVyLCBIUEVUIHdpbGwgb25seSBiZQorCSAgYWN0aXZhdGVkIGlmIHRoZSBwbGF0Zm9ybSBhbmQgdGhlIEJJT1Mgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCisJICBPdGhlcndpc2UgdGhlIDgyNTQgd2lsbCBiZSB1c2VkIGZvciB0aW1pbmcgc2VydmljZXMuCisKKwkgIENob29zZSBOIHRvIGNvbnRpbnVlIHVzaW5nIHRoZSBsZWdhY3kgODI1NCB0aW1lci4KKworY29uZmlnIEhQRVRfRU1VTEFURV9SVEMKKwlib29sICJQcm92aWRlIFJUQyBpbnRlcnJ1cHQiCisJZGVwZW5kcyBvbiBIUEVUX1RJTUVSICYmIFJUQz15CisKK2NvbmZpZyBTTVAKKwlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIG9uZSBDUFUuIElmIHlvdSBoYXZlCisJICBhIHN5c3RlbSB3aXRoIG9ubHkgb25lIENQVSwgbGlrZSBtb3N0IHBlcnNvbmFsIGNvbXB1dGVycywgc2F5IE4uIElmCisJICB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLCBzYXkgWS4KKworCSAgSWYgeW91IHNheSBOIGhlcmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gb24gc2luZ2xlIGFuZCBtdWx0aXByb2Nlc3NvcgorCSAgbWFjaGluZXMsIGJ1dCB3aWxsIHVzZSBvbmx5IG9uZSBDUFUgb2YgYSBtdWx0aXByb2Nlc3NvciBtYWNoaW5lLiBJZgorCSAgeW91IHNheSBZIGhlcmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gb24gbWFueSwgYnV0IG5vdCBhbGwsCisJICBzaW5nbGVwcm9jZXNzb3IgbWFjaGluZXMuIE9uIGEgc2luZ2xlcHJvY2Vzc29yIG1hY2hpbmUsIHRoZSBrZXJuZWwKKwkgIHdpbGwgcnVuIGZhc3RlciBpZiB5b3Ugc2F5IE4gaGVyZS4KKworCSAgTm90ZSB0aGF0IGlmIHlvdSBzYXkgWSBoZXJlIGFuZCBjaG9vc2UgYXJjaGl0ZWN0dXJlICI1ODYiIG9yCisJICAiUGVudGl1bSIgdW5kZXIgIlByb2Nlc3NvciBmYW1pbHkiLCB0aGUga2VybmVsIHdpbGwgbm90IHdvcmsgb24gNDg2CisJICBhcmNoaXRlY3R1cmVzLiBTaW1pbGFybHksIG11bHRpcHJvY2Vzc29yIGtlcm5lbHMgZm9yIHRoZSAiUFBybyIKKwkgIGFyY2hpdGVjdHVyZSBtYXkgbm90IHdvcmsgb24gYWxsIFBlbnRpdW0gYmFzZWQgYm9hcmRzLgorCisJICBQZW9wbGUgdXNpbmcgbXVsdGlwcm9jZXNzb3IgbWFjaGluZXMgd2hvIHNheSBZIGhlcmUgc2hvdWxkIGFsc28gc2F5CisJICBZIHRvICJFbmhhbmNlZCBSZWFsIFRpbWUgQ2xvY2sgU3VwcG9ydCIsIGJlbG93LiBUaGUgIkFkdmFuY2VkIFBvd2VyCisJICBNYW5hZ2VtZW50IiBjb2RlIHdpbGwgYmUgZGlzYWJsZWQgaWYgeW91IHNheSBZIGhlcmUuCisKKwkgIFNlZSBhbHNvIHRoZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NtcC50eHQ+LAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9pMzg2L0lPLUFQSUMudHh0PiwKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbm1pX3dhdGNoZG9nLnR4dD4gYW5kIHRoZSBTTVAtSE9XVE8gYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgorCitjb25maWcgTlJfQ1BVUworCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0yNTUpIgorCXJhbmdlIDIgMjU1CisJZGVwZW5kcyBvbiBTTVAKKwlkZWZhdWx0ICIzMiIgaWYgWDg2X05VTUFRIHx8IFg4Nl9TVU1NSVQgfHwgWDg2X0JJR1NNUCB8fCBYODZfRVM3MDAwCisJZGVmYXVsdCAiOCIKKwloZWxwCisJICBUaGlzIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgQ1BVcyB3aGljaCB0aGlzCisJICBrZXJuZWwgd2lsbCBzdXBwb3J0LiAgVGhlIG1heGltdW0gc3VwcG9ydGVkIHZhbHVlIGlzIDI1NSBhbmQgdGhlCisJICBtaW5pbXVtIHZhbHVlIHdoaWNoIG1ha2VzIHNlbnNlIGlzIDIuCisKKwkgIFRoaXMgaXMgcHVyZWx5IHRvIHNhdmUgbWVtb3J5IC0gZWFjaCBzdXBwb3J0ZWQgQ1BVIGFkZHMKKwkgIGFwcHJveGltYXRlbHkgZWlnaHQga2lsb2J5dGVzIHRvIHRoZSBrZXJuZWwgaW1hZ2UuCisKK2NvbmZpZyBTQ0hFRF9TTVQKKwlib29sICJTTVQgKEh5cGVydGhyZWFkaW5nKSBzY2hlZHVsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNNUAorCWRlZmF1bHQgb2ZmCisJaGVscAorCSAgU01UIHNjaGVkdWxlciBzdXBwb3J0IGltcHJvdmVzIHRoZSBDUFUgc2NoZWR1bGVyJ3MgZGVjaXNpb24gbWFraW5nCisJICB3aGVuIGRlYWxpbmcgd2l0aCBJbnRlbCBQZW50aXVtIDQgY2hpcHMgd2l0aCBIeXBlclRocmVhZGluZyBhdCBhCisJICBjb3N0IG9mIHNsaWdodGx5IGluY3JlYXNlZCBvdmVyaGVhZCBpbiBzb21lIHBsYWNlcy4gSWYgdW5zdXJlIHNheQorCSAgTiBoZXJlLgorCitjb25maWcgUFJFRU1QVAorCWJvb2wgIlByZWVtcHRpYmxlIEtlcm5lbCIKKwloZWxwCisJICBUaGlzIG9wdGlvbiByZWR1Y2VzIHRoZSBsYXRlbmN5IG9mIHRoZSBrZXJuZWwgd2hlbiByZWFjdGluZyB0bworCSAgcmVhbC10aW1lIG9yIGludGVyYWN0aXZlIGV2ZW50cyBieSBhbGxvd2luZyBhIGxvdyBwcmlvcml0eSBwcm9jZXNzIHRvCisJICBiZSBwcmVlbXB0ZWQgZXZlbiBpZiBpdCBpcyBpbiBrZXJuZWwgbW9kZSBleGVjdXRpbmcgYSBzeXN0ZW0gY2FsbC4KKwkgIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBydW4gbW9yZSByZWxpYWJseSBldmVuIHdoZW4gdGhlIHN5c3RlbSBpcworCSAgdW5kZXIgbG9hZC4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBhIGRlc2t0b3AsIGVtYmVkZGVkCisJICBvciByZWFsLXRpbWUgc3lzdGVtLiAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKK2NvbmZpZyBQUkVFTVBUX0JLTAorCWJvb2wgIlByZWVtcHQgVGhlIEJpZyBLZXJuZWwgTG9jayIKKwlkZXBlbmRzIG9uIFBSRUVNUFQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiByZWR1Y2VzIHRoZSBsYXRlbmN5IG9mIHRoZSBrZXJuZWwgYnkgbWFraW5nIHRoZQorCSAgYmlnIGtlcm5lbCBsb2NrIHByZWVtcHRpYmxlLgorCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBrZXJuZWwgZm9yIGEgZGVza3RvcCBzeXN0ZW0uCisJICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KKworY29uZmlnIFg4Nl9VUF9BUElDCisJYm9vbCAiTG9jYWwgQVBJQyBzdXBwb3J0IG9uIHVuaXByb2Nlc3NvcnMiCisJZGVwZW5kcyBvbiAhU01QICYmICEoWDg2X1ZJU1dTIHx8IFg4Nl9WT1lBR0VSKQorCWhlbHAKKwkgIEEgbG9jYWwgQVBJQyAoQWR2YW5jZWQgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVyKSBpcyBhbgorCSAgaW50ZWdyYXRlZCBpbnRlcnJ1cHQgY29udHJvbGxlciBpbiB0aGUgQ1BVLiBJZiB5b3UgaGF2ZSBhIHNpbmdsZS1DUFUKKwkgIHN5c3RlbSB3aGljaCBoYXMgYSBwcm9jZXNzb3Igd2l0aCBhIGxvY2FsIEFQSUMsIHlvdSBjYW4gc2F5IFkgaGVyZSB0bworCSAgZW5hYmxlIGFuZCB1c2UgaXQuIElmIHlvdSBzYXkgWSBoZXJlIGV2ZW4gdGhvdWdoIHlvdXIgbWFjaGluZSBkb2Vzbid0CisJICBoYXZlIGEgbG9jYWwgQVBJQywgdGhlbiB0aGUga2VybmVsIHdpbGwgc3RpbGwgcnVuIHdpdGggbm8gc2xvd2Rvd24gYXQKKwkgIGFsbC4gVGhlIGxvY2FsIEFQSUMgc3VwcG9ydHMgQ1BVLWdlbmVyYXRlZCBzZWxmLWludGVycnVwdHMgKHRpbWVyLAorCSAgcGVyZm9ybWFuY2UgY291bnRlcnMpLCBhbmQgdGhlIE5NSSB3YXRjaGRvZyB3aGljaCBkZXRlY3RzIGhhcmQKKwkgIGxvY2t1cHMuCisKK2NvbmZpZyBYODZfVVBfSU9BUElDCisJYm9vbCAiSU8tQVBJQyBzdXBwb3J0IG9uIHVuaXByb2Nlc3NvcnMiCisJZGVwZW5kcyBvbiBYODZfVVBfQVBJQworCWhlbHAKKwkgIEFuIElPLUFQSUMgKEkvTyBBZHZhbmNlZCBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIpIGlzIGFuCisJICBTTVAtY2FwYWJsZSByZXBsYWNlbWVudCBmb3IgUEMtc3R5bGUgaW50ZXJydXB0IGNvbnRyb2xsZXJzLiBNb3N0CisJICBTTVAgc3lzdGVtcyBhbmQgbWFueSByZWNlbnQgdW5pcHJvY2Vzc29yIHN5c3RlbXMgaGF2ZSBvbmUuCisKKwkgIElmIHlvdSBoYXZlIGEgc2luZ2xlLUNQVSBzeXN0ZW0gd2l0aCBhbiBJTy1BUElDLCB5b3UgY2FuIHNheSBZIGhlcmUKKwkgIHRvIHVzZSBpdC4gSWYgeW91IHNheSBZIGhlcmUgZXZlbiB0aG91Z2ggeW91ciBtYWNoaW5lIGRvZXNuJ3QgaGF2ZQorCSAgYW4gSU8tQVBJQywgdGhlbiB0aGUga2VybmVsIHdpbGwgc3RpbGwgcnVuIHdpdGggbm8gc2xvd2Rvd24gYXQgYWxsLgorCitjb25maWcgWDg2X0xPQ0FMX0FQSUMKKwlib29sCisJZGVwZW5kcyBvbiBYODZfVVBfQVBJQyB8fCAoKFg4Nl9WSVNXUyB8fCBTTVApICYmICFYODZfVk9ZQUdFUikKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9JT19BUElDCisJYm9vbAorCWRlcGVuZHMgb24gWDg2X1VQX0lPQVBJQyB8fCAoU01QICYmICEoWDg2X1ZJU1dTIHx8IFg4Nl9WT1lBR0VSKSkKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9WSVNXU19BUElDCisJYm9vbAorCWRlcGVuZHMgb24gWDg2X1ZJU1dTCisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfVFNDCisJYm9vbAorCWRlcGVuZHMgb24gKE1XSU5DSElQM0QgfHwgTVdJTkNISVAyIHx8IE1DUlVTT0UgfHwgTUVGRklDRU9OIHx8IE1DWVJJWElJSSB8fCBNSzcgfHwgTUs2IHx8IE1QRU5USVVNNCB8fCBNUEVOVElVTU0gfHwgTVBFTlRJVU1JSUkgfHwgTVBFTlRJVU1JSSB8fCBNNjg2IHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNSzggfHwgTVZJQUMzXzIgfHwgTUdFT0RFKSAmJiAhWDg2X05VTUFRCisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfTUNFCisJYm9vbCAiTWFjaGluZSBDaGVjayBFeGNlcHRpb24iCisJZGVwZW5kcyBvbiAhWDg2X1ZPWUFHRVIKKwktLS1oZWxwLS0tCisJICBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbiBzdXBwb3J0IGFsbG93cyB0aGUgcHJvY2Vzc29yIHRvIG5vdGlmeSB0aGUKKwkgIGtlcm5lbCBpZiBpdCBkZXRlY3RzIGEgcHJvYmxlbSAoZS5nLiBvdmVyaGVhdGluZywgY29tcG9uZW50IGZhaWx1cmUpLgorCSAgVGhlIGFjdGlvbiB0aGUga2VybmVsIHRha2VzIGRlcGVuZHMgb24gdGhlIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtLAorCSAgcmFuZ2luZyBmcm9tIGEgd2FybmluZyBtZXNzYWdlIG9uIHRoZSBjb25zb2xlLCB0byBoYWx0aW5nIHRoZSBtYWNoaW5lLgorCSAgWW91ciBwcm9jZXNzb3IgbXVzdCBiZSBhIFBlbnRpdW0gb3IgbmV3ZXIgdG8gc3VwcG9ydCB0aGlzIC0gY2hlY2sgdGhlCisJICBmbGFncyBpbiAvcHJvYy9jcHVpbmZvIGZvciBtY2UuICBOb3RlIHRoYXQgc29tZSBvbGRlciBQZW50aXVtIHN5c3RlbXMKKwkgIGhhdmUgYSBkZXNpZ24gZmxhdyB3aGljaCBsZWFkcyB0byBmYWxzZSBNQ0UgZXZlbnRzIC0gaGVuY2UgTUNFIGlzCisJICBkaXNhYmxlZCBvbiBhbGwgUDUgcHJvY2Vzc29ycywgdW5sZXNzIGV4cGxpY2l0bHkgZW5hYmxlZCB3aXRoICJtY2UiCisJICBhcyBhIGJvb3QgYXJndW1lbnQuICBTaW1pbGFybHksIGlmIE1DRSBpcyBidWlsdCBpbiBhbmQgY3JlYXRlcyBhCisJICBwcm9ibGVtIG9uIHNvbWUgbmV3IG5vbi1zdGFuZGFyZCBtYWNoaW5lLCB5b3UgY2FuIGJvb3Qgd2l0aCAibm9tY2UiCisJICB0byBkaXNhYmxlIGl0LiAgTUNFIHN1cHBvcnQgc2ltcGx5IGlnbm9yZXMgbm9uLU1DRSBwcm9jZXNzb3JzIGxpa2UKKwkgIHRoZSAzODYgYW5kIDQ4Niwgc28gbmVhcmx5IGV2ZXJ5b25lIGNhbiBzYXkgWSBoZXJlLgorCitjb25maWcgWDg2X01DRV9OT05GQVRBTAorCXRyaXN0YXRlICJDaGVjayBmb3Igbm9uLWZhdGFsIGVycm9ycyBvbiBBTUQgQXRobG9uL0R1cm9uIC8gSW50ZWwgUGVudGl1bSA0IgorCWRlcGVuZHMgb24gWDg2X01DRQorCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgZmVhdHVyZSBzdGFydHMgYSB0aW1lciB0aGF0IHRyaWdnZXJzIGV2ZXJ5IDUgc2Vjb25kcyB3aGljaAorCSAgd2lsbCBsb29rIGF0IHRoZSBtYWNoaW5lIGNoZWNrIHJlZ2lzdGVycyB0byBzZWUgaWYgYW55dGhpbmcgaGFwcGVuZWQuCisJICBOb24tZmF0YWwgcHJvYmxlbXMgYXV0b21hdGljYWxseSBnZXQgY29ycmVjdGVkIChidXQgc3RpbGwgbG9nZ2VkKS4KKwkgIERpc2FibGUgdGhpcyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBzZWUgdGhlc2UgbWVzc2FnZXMuCisJICBTZWVpbmcgdGhlIG1lc3NhZ2VzIHRoaXMgb3B0aW9uIHByaW50cyBvdXQgbWF5IGJlIGluZGljYXRpdmUgb2YgZHlpbmcgaGFyZHdhcmUsCisJICBvciBvdXQtb2Ytc3BlYyAoaWUsIG92ZXJjbG9ja2VkKSBoYXJkd2FyZS4KKwkgIFRoaXMgb3B0aW9uIG9ubHkgZG9lcyBzb21ldGhpbmcgb24gY2VydGFpbiBDUFVzLgorCSAgKEFNRCBBdGhsb24vRHVyb24gYW5kIEludGVsIFBlbnRpdW0gNCkKKworY29uZmlnIFg4Nl9NQ0VfUDRUSEVSTUFMCisJYm9vbCAiY2hlY2sgZm9yIFA0IHRoZXJtYWwgdGhyb3R0bGluZyBpbnRlcnJ1cHQuIgorCWRlcGVuZHMgb24gWDg2X01DRSAmJiAoWDg2X1VQX0FQSUMgfHwgU01QKSAmJiAhWDg2X1ZJU1dTCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBmZWF0dXJlIHdpbGwgY2F1c2UgYSBtZXNzYWdlIHRvIGJlIHByaW50ZWQgd2hlbiB0aGUgUDQKKwkgIGVudGVycyB0aGVybWFsIHRocm90dGxpbmcuCisKK2NvbmZpZyBUT1NISUJBCisJdHJpc3RhdGUgIlRvc2hpYmEgTGFwdG9wIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgVGhpcyBhZGRzIGEgZHJpdmVyIHRvIHNhZmVseSBhY2Nlc3MgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUgb2YKKwkgIHRoZSBDUFUgb24gVG9zaGliYSBwb3J0YWJsZXMgd2l0aCBhIGdlbnVpbmUgVG9zaGliYSBCSU9TLiBJdCBkb2VzCisJICBub3Qgd29yayBvbiBtb2RlbHMgd2l0aCBhIFBob2VuaXggQklPUy4gVGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUKKwkgIGlzIHVzZWQgdG8gc2V0IHRoZSBCSU9TIGFuZCBwb3dlciBzYXZpbmcgb3B0aW9ucyBvbiBUb3NoaWJhIHBvcnRhYmxlcy4KKworCSAgRm9yIGluZm9ybWF0aW9uIG9uIHV0aWxpdGllcyB0byBtYWtlIHVzZSBvZiB0aGlzIGRyaXZlciBzZWUgdGhlCisJICBUb3NoaWJhIExpbnV4IHV0aWxpdGllcyB3ZWIgc2l0ZSBhdDoKKwkgIDxodHRwOi8vd3d3LmJ1enphcmQub3JnLnVrL3Rvc2hpYmEvPi4KKworCSAgU2F5IFkgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgb24gYSBUb3NoaWJhIHBvcnRhYmxlLgorCSAgU2F5IE4gb3RoZXJ3aXNlLgorCitjb25maWcgSThLCisJdHJpc3RhdGUgIkRlbGwgbGFwdG9wIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgVGhpcyBhZGRzIGEgZHJpdmVyIHRvIHNhZmVseSBhY2Nlc3MgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUKKwkgIG9mIHRoZSBDUFUgb24gdGhlIERlbGwgSW5zcGlyb24gODAwMC4gVGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUKKwkgIGlzIHVzZWQgdG8gcmVhZCBjcHUgdGVtcGVyYXR1cmUgYW5kIGNvb2xpbmcgZmFuIHN0YXR1cyBhbmQgdG8KKwkgIGNvbnRyb2wgdGhlIGZhbnMgb24gdGhlIEk4SyBwb3J0YWJsZXMuCisKKwkgIFRoaXMgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBvbmx5IG9uIHRoZSBJbnNwaXJvbiA4MDAwIGJ1dCBpdCBtYXkKKwkgIGFsc28gd29yayB3aXRoIG90aGVyIERlbGwgbGFwdG9wcy4gWW91IGNhbiBmb3JjZSBsb2FkaW5nIG9uIG90aGVyCisJICBtb2RlbHMgYnkgcGFzc2luZyB0aGUgcGFyYW1ldGVyIGBmb3JjZT0xJyB0byB0aGUgbW9kdWxlLiBVc2UgYXQKKwkgIHlvdXIgb3duIHJpc2suCisKKwkgIEZvciBpbmZvcm1hdGlvbiBvbiB1dGlsaXRpZXMgdG8gbWFrZSB1c2Ugb2YgdGhpcyBkcml2ZXIgc2VlIHRoZQorCSAgSThLIExpbnV4IHV0aWxpdGllcyB3ZWIgc2l0ZSBhdDoKKwkgIDxodHRwOi8vcGVvcGxlLmRlYmlhbi5vcmcvfmR6L2k4ay8+CisKKwkgIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIG9uIGEgRGVsbCBJbnNwaXJvbiA4MDAwLgorCSAgU2F5IE4gb3RoZXJ3aXNlLgorCitjb25maWcgTUlDUk9DT0RFCisJdHJpc3RhdGUgIi9kZXYvY3B1L21pY3JvY29kZSAtIEludGVsIElBMzIgQ1BVIG1pY3JvY29kZSBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCBhbHNvIHRvICIvZGV2IGZpbGUgc3lzdGVtIHN1cHBvcnQiIGluIHRoZQorCSAgJ0ZpbGUgc3lzdGVtcycgc2VjdGlvbiwgeW91IHdpbGwgYmUgYWJsZSB0byB1cGRhdGUgdGhlIG1pY3JvY29kZSBvbgorCSAgSW50ZWwgcHJvY2Vzc29ycyBpbiB0aGUgSUEzMiBmYW1pbHksIGUuZy4gUGVudGl1bSBQcm8sIFBlbnRpdW0gSUksCisJICBQZW50aXVtIElJSSwgUGVudGl1bSA0LCBYZW9uIGV0Yy4gIFlvdSB3aWxsIG9idmlvdXNseSBuZWVkIHRoZQorCSAgYWN0dWFsIG1pY3JvY29kZSBiaW5hcnkgZGF0YSBpdHNlbGYgd2hpY2ggaXMgbm90IHNoaXBwZWQgd2l0aCB0aGUKKwkgIExpbnV4IGtlcm5lbC4KKworCSAgRm9yIGxhdGVzdCBuZXdzIGFuZCBpbmZvcm1hdGlvbiBvbiBvYnRhaW5pbmcgYWxsIHRoZSByZXF1aXJlZAorCSAgaW5ncmVkaWVudHMgZm9yIHRoaXMgZHJpdmVyLCBjaGVjazoKKwkgIDxodHRwOi8vd3d3LnVyYmFubXl0aC5vcmcvbWljcm9jb2RlLz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1pY3JvY29kZS4KKworY29uZmlnIFg4Nl9NU1IKKwl0cmlzdGF0ZSAiL2Rldi9jcHUvKi9tc3IgLSBNb2RlbC1zcGVjaWZpYyByZWdpc3RlciBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZGV2aWNlIGdpdmVzIHByaXZpbGVnZWQgcHJvY2Vzc2VzIGFjY2VzcyB0byB0aGUgeDg2CisJICBNb2RlbC1TcGVjaWZpYyBSZWdpc3RlcnMgKE1TUnMpLiAgSXQgaXMgYSBjaGFyYWN0ZXIgZGV2aWNlIHdpdGgKKwkgIG1ham9yIDIwMiBhbmQgbWlub3JzIDAgdG8gMzEgZm9yIC9kZXYvY3B1LzAvbXNyIHRvIC9kZXYvY3B1LzMxL21zci4KKwkgIE1TUiBhY2Nlc3NlcyBhcmUgZGlyZWN0ZWQgdG8gYSBzcGVjaWZpYyBDUFUgb24gbXVsdGktcHJvY2Vzc29yCisJICBzeXN0ZW1zLgorCitjb25maWcgWDg2X0NQVUlECisJdHJpc3RhdGUgIi9kZXYvY3B1LyovY3B1aWQgLSBDUFUgaW5mb3JtYXRpb24gc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIGRldmljZSBnaXZlcyBwcm9jZXNzZXMgYWNjZXNzIHRvIHRoZSB4ODYgQ1BVSUQgaW5zdHJ1Y3Rpb24gdG8KKwkgIGJlIGV4ZWN1dGVkIG9uIGEgc3BlY2lmaWMgcHJvY2Vzc29yLiAgSXQgaXMgYSBjaGFyYWN0ZXIgZGV2aWNlCisJICB3aXRoIG1ham9yIDIwMyBhbmQgbWlub3JzIDAgdG8gMzEgZm9yIC9kZXYvY3B1LzAvY3B1aWQgdG8KKwkgIC9kZXYvY3B1LzMxL2NwdWlkLgorCitzb3VyY2UgImRyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyIKKworY2hvaWNlCisJcHJvbXB0ICJIaWdoIE1lbW9yeSBTdXBwb3J0IgorCWRlZmF1bHQgTk9ISUdITUVNCisKK2NvbmZpZyBOT0hJR0hNRU0KKwlib29sICJvZmYiCisJLS0taGVscC0tLQorCSAgTGludXggY2FuIHVzZSB1cCB0byA2NCBHaWdhYnl0ZXMgb2YgcGh5c2ljYWwgbWVtb3J5IG9uIHg4NiBzeXN0ZW1zLgorCSAgSG93ZXZlciwgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgMzItYml0IHg4NiBwcm9jZXNzb3JzIGlzIG9ubHkgNAorCSAgR2lnYWJ5dGVzIGxhcmdlLiBUaGF0IG1lYW5zIHRoYXQsIGlmIHlvdSBoYXZlIGEgbGFyZ2UgYW1vdW50IG9mCisJICBwaHlzaWNhbCBtZW1vcnksIG5vdCBhbGwgb2YgaXQgY2FuIGJlICJwZXJtYW5lbnRseSBtYXBwZWQiIGJ5IHRoZQorCSAga2VybmVsLiBUaGUgcGh5c2ljYWwgbWVtb3J5IHRoYXQncyBub3QgcGVybWFuZW50bHkgbWFwcGVkIGlzIGNhbGxlZAorCSAgImhpZ2ggbWVtb3J5Ii4KKworCSAgSWYgeW91IGFyZSBjb21waWxpbmcgYSBrZXJuZWwgd2hpY2ggd2lsbCBuZXZlciBydW4gb24gYSBtYWNoaW5lIHdpdGgKKwkgIG1vcmUgdGhhbiAxIEdpZ2FieXRlIHRvdGFsIHBoeXNpY2FsIFJBTSwgYW5zd2VyICJvZmYiIGhlcmUgKGRlZmF1bHQKKwkgIGNob2ljZSBhbmQgc3VpdGFibGUgZm9yIG1vc3QgdXNlcnMpLiBUaGlzIHdpbGwgcmVzdWx0IGluIGEgIjNHQi8xR0IiCisJICBzcGxpdDogM0dCIGFyZSBtYXBwZWQgc28gdGhhdCBlYWNoIHByb2Nlc3Mgc2VlcyBhIDNHQiB2aXJ0dWFsIG1lbW9yeQorCSAgc3BhY2UgYW5kIHRoZSByZW1haW5pbmcgcGFydCBvZiB0aGUgNEdCIHZpcnR1YWwgbWVtb3J5IHNwYWNlIGlzIHVzZWQKKwkgIGJ5IHRoZSBrZXJuZWwgdG8gcGVybWFuZW50bHkgbWFwIGFzIG11Y2ggcGh5c2ljYWwgbWVtb3J5IGFzCisJICBwb3NzaWJsZS4KKworCSAgSWYgdGhlIG1hY2hpbmUgaGFzIGJldHdlZW4gMSBhbmQgNCBHaWdhYnl0ZXMgcGh5c2ljYWwgUkFNLCB0aGVuCisJICBhbnN3ZXIgIjRHQiIgaGVyZS4KKworCSAgSWYgbW9yZSB0aGFuIDQgR2lnYWJ5dGVzIGlzIHVzZWQgdGhlbiBhbnN3ZXIgIjY0R0IiIGhlcmUuIFRoaXMKKwkgIHNlbGVjdGlvbiB0dXJucyBJbnRlbCBQQUUgKFBoeXNpY2FsIEFkZHJlc3MgRXh0ZW5zaW9uKSBtb2RlIG9uLgorCSAgUEFFIGltcGxlbWVudHMgMy1sZXZlbCBwYWdpbmcgb24gSUEzMiBwcm9jZXNzb3JzLiBQQUUgaXMgZnVsbHkKKwkgIHN1cHBvcnRlZCBieSBMaW51eCwgUEFFIG1vZGUgaXMgaW1wbGVtZW50ZWQgb24gYWxsIHJlY2VudCBJbnRlbAorCSAgcHJvY2Vzc29ycyAoUGVudGl1bSBQcm8gYW5kIGJldHRlcikuIE5PVEU6IElmIHlvdSBzYXkgIjY0R0IiIGhlcmUsCisJICB0aGVuIHRoZSBrZXJuZWwgd2lsbCBub3QgYm9vdCBvbiBDUFVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBQQUUhCisKKwkgIFRoZSBhY3R1YWwgYW1vdW50IG9mIHRvdGFsIHBoeXNpY2FsIG1lbW9yeSB3aWxsIGVpdGhlciBiZQorCSAgYXV0byBkZXRlY3RlZCBvciBjYW4gYmUgZm9yY2VkIGJ5IHVzaW5nIGEga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24KKwkgIHN1Y2ggYXMgIm1lbT0yNTZNIi4gKFRyeSAibWFuIGJvb3RwYXJhbSIgb3Igc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mCisJICB5b3VyIGJvb3QgbG9hZGVyIChsaWxvIG9yIGxvYWRsaW4pIGFib3V0IGhvdyB0byBwYXNzIG9wdGlvbnMgdG8gdGhlCisJICBrZXJuZWwgYXQgYm9vdCB0aW1lLikKKworCSAgSWYgdW5zdXJlLCBzYXkgIm9mZiIuCisKK2NvbmZpZyBISUdITUVNNEcKKwlib29sICI0R0IiCisJaGVscAorCSAgU2VsZWN0IHRoaXMgaWYgeW91IGhhdmUgYSAzMi1iaXQgcHJvY2Vzc29yIGFuZCBiZXR3ZWVuIDEgYW5kIDQKKwkgIGdpZ2FieXRlcyBvZiBwaHlzaWNhbCBSQU0uCisKK2NvbmZpZyBISUdITUVNNjRHCisJYm9vbCAiNjRHQiIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBpZiB5b3UgaGF2ZSBhIDMyLWJpdCBwcm9jZXNzb3IgYW5kIG1vcmUgdGhhbiA0CisJICBnaWdhYnl0ZXMgb2YgcGh5c2ljYWwgUkFNLgorCitlbmRjaG9pY2UKKworY29uZmlnIEhJR0hNRU0KKwlib29sCisJZGVwZW5kcyBvbiBISUdITUVNNjRHIHx8IEhJR0hNRU00RworCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1BBRQorCWJvb2wKKwlkZXBlbmRzIG9uIEhJR0hNRU02NEcKKwlkZWZhdWx0IHkKKworIyBDb21tb24gTlVNQSBGZWF0dXJlcworY29uZmlnIE5VTUEKKwlib29sICJOdW1hIE1lbW9yeSBBbGxvY2F0aW9uIGFuZCBTY2hlZHVsZXIgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNNUCAmJiBISUdITUVNNjRHICYmIChYODZfTlVNQVEgfHwgWDg2X0dFTkVSSUNBUkNIIHx8IChYODZfU1VNTUlUICYmIEFDUEkpKQorCWRlZmF1bHQgbiBpZiBYODZfUEMKKwlkZWZhdWx0IHkgaWYgKFg4Nl9OVU1BUSB8fCBYODZfU1VNTUlUKQorCisjIE5lZWQgY29tbWVudHMgdG8gaGVscCB0aGUgaGFwbGVzcyB1c2VyIHRyeWluZyB0byB0dXJuIG9uIE5VTUEgc3VwcG9ydAorY29tbWVudCAiTlVNQSAoTlVNQS1RKSByZXF1aXJlcyBTTVAsIDY0R0IgaGlnaG1lbSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWDg2X05VTUFRICYmICghSElHSE1FTTY0RyB8fCAhU01QKQorCitjb21tZW50ICJOVU1BIChTdW1taXQpIHJlcXVpcmVzIFNNUCwgNjRHQiBoaWdobWVtIHN1cHBvcnQsIEFDUEkiCisJZGVwZW5kcyBvbiBYODZfU1VNTUlUICYmICghSElHSE1FTTY0RyB8fCAhQUNQSSkKKworY29uZmlnIERJU0NPTlRJR01FTQorCWJvb2wKKwlkZXBlbmRzIG9uIE5VTUEKKwlkZWZhdWx0IHkKKworY29uZmlnIEhBVkVfQVJDSF9CT09UTUVNX05PREUKKwlib29sCisJZGVwZW5kcyBvbiBOVU1BCisJZGVmYXVsdCB5CisKK2NvbmZpZyBIQVZFX01FTU9SWV9QUkVTRU5UCisJYm9vbAorCWRlcGVuZHMgb24gRElTQ09OVElHTUVNCisJZGVmYXVsdCB5CisKK2NvbmZpZyBORUVEX05PREVfTUVNTUFQX1NJWkUKKwlib29sCisJZGVwZW5kcyBvbiBESVNDT05USUdNRU0KKwlkZWZhdWx0IHkKKworY29uZmlnIEhJR0hQVEUKKwlib29sICJBbGxvY2F0ZSAzcmQtbGV2ZWwgcGFnZXRhYmxlcyBmcm9tIGhpZ2htZW0iCisJZGVwZW5kcyBvbiBISUdITUVNNEcgfHwgSElHSE1FTTY0RworCWhlbHAKKwkgIFRoZSBWTSB1c2VzIG9uZSBwYWdlIHRhYmxlIGVudHJ5IGZvciBlYWNoIHBhZ2Ugb2YgcGh5c2ljYWwgbWVtb3J5LgorCSAgRm9yIHN5c3RlbXMgd2l0aCBhIGxvdCBvZiBSQU0sIHRoaXMgY2FuIGJlIHdhc3RlZnVsIG9mIHByZWNpb3VzCisJICBsb3cgbWVtb3J5LiAgU2V0dGluZyB0aGlzIG9wdGlvbiB3aWxsIHB1dCB1c2VyLXNwYWNlIHBhZ2UgdGFibGUKKwkgIGVudHJpZXMgaW4gaGlnaCBtZW1vcnkuCisKK2NvbmZpZyBNQVRIX0VNVUxBVElPTgorCWJvb2wgIk1hdGggZW11bGF0aW9uIgorCS0tLWhlbHAtLS0KKwkgIExpbnV4IGNhbiBlbXVsYXRlIGEgbWF0aCBjb3Byb2Nlc3NvciAodXNlZCBmb3IgZmxvYXRpbmcgcG9pbnQKKwkgIG9wZXJhdGlvbnMpIGlmIHlvdSBkb24ndCBoYXZlIG9uZS4gNDg2RFggYW5kIFBlbnRpdW0gcHJvY2Vzc29ycyBoYXZlCisJICBhIG1hdGggY29wcm9jZXNzb3IgYnVpbHQgaW4sIDQ4NlNYIGFuZCAzODYgZG8gbm90LCB1bmxlc3MgeW91IGFkZGVkCisJICBhIDQ4N0RYIG9yIDM4NywgcmVzcGVjdGl2ZWx5LiAoVGhlIG1lc3NhZ2VzIGR1cmluZyBib290IHRpbWUgY2FuCisJICBnaXZlIHlvdSBzb21lIGhpbnRzIGhlcmUgWyJtYW4gZG1lc2ciXS4pIEV2ZXJ5b25lIG5lZWRzIGVpdGhlciBhCisJICBjb3Byb2Nlc3NvciBvciB0aGlzIGVtdWxhdGlvbi4KKworCSAgSWYgeW91IGRvbid0IGhhdmUgYSBtYXRoIGNvcHJvY2Vzc29yLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlOyBpZiB5b3UKKwkgIHNheSBZIGhlcmUgZXZlbiB0aG91Z2ggeW91IGhhdmUgYSBjb3Byb2Nlc3NvciwgdGhlIGNvcHJvY2Vzc29yIHdpbGwKKwkgIGJlIHVzZWQgbmV2ZXJ0aGVsZXNzLiAoVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCB3aXRoIHRoZSBrZXJuZWwKKwkgIGNvbW1hbmQgbGluZSBvcHRpb24gIm5vMzg3Iiwgd2hpY2ggY29tZXMgaGFuZHkgaWYgeW91ciBjb3Byb2Nlc3NvcgorCSAgaXMgYnJva2VuLiBUcnkgIm1hbiBib290cGFyYW0iIG9yIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIGJvb3QKKwkgIGxvYWRlciAobGlsbyBvciBsb2FkbGluKSBhYm91dCBob3cgdG8gcGFzcyBvcHRpb25zIHRvIHRoZSBrZXJuZWwgYXQKKwkgIGJvb3QgdGltZS4pIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBhIGdvb2QgaWRlYSB0byBzYXkgWSBoZXJlIGlmIHlvdQorCSAgaW50ZW5kIHRvIHVzZSB0aGlzIGtlcm5lbCBvbiBkaWZmZXJlbnQgbWFjaGluZXMuCisKKwkgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFscyBvZiB0aGUgTGludXggbWF0aCBjb3Byb2Nlc3NvcgorCSAgZW11bGF0aW9uIGNhbiBiZSBmb3VuZCBpbiA8ZmlsZTphcmNoL2kzODYvbWF0aC1lbXUvUkVBRE1FPi4KKworCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgc2F5IFk7IGFwYXJ0IGZyb20gcmVzdWx0aW5nIGluIGEgNjYgS0IgYmlnZ2VyCisJICBrZXJuZWwsIGl0IHdvbid0IGh1cnQuCisKK2NvbmZpZyBNVFJSCisJYm9vbCAiTVRSUiAoTWVtb3J5IFR5cGUgUmFuZ2UgUmVnaXN0ZXIpIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgT24gSW50ZWwgUDYgZmFtaWx5IHByb2Nlc3NvcnMgKFBlbnRpdW0gUHJvLCBQZW50aXVtIElJIGFuZCBsYXRlcikKKwkgIHRoZSBNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlcnMgKE1UUlJzKSBtYXkgYmUgdXNlZCB0byBjb250cm9sCisJICBwcm9jZXNzb3IgYWNjZXNzIHRvIG1lbW9yeSByYW5nZXMuIFRoaXMgaXMgbW9zdCB1c2VmdWwgaWYgeW91IGhhdmUKKwkgIGEgdmlkZW8gKFZHQSkgY2FyZCBvbiBhIFBDSSBvciBBR1AgYnVzLiBFbmFibGluZyB3cml0ZS1jb21iaW5pbmcKKwkgIGFsbG93cyBidXMgd3JpdGUgdHJhbnNmZXJzIHRvIGJlIGNvbWJpbmVkIGludG8gYSBsYXJnZXIgdHJhbnNmZXIKKwkgIGJlZm9yZSBidXJzdGluZyBvdmVyIHRoZSBQQ0kvQUdQIGJ1cy4gVGhpcyBjYW4gaW5jcmVhc2UgcGVyZm9ybWFuY2UKKwkgIG9mIGltYWdlIHdyaXRlIG9wZXJhdGlvbnMgMi41IHRpbWVzIG9yIG1vcmUuIFNheWluZyBZIGhlcmUgY3JlYXRlcyBhCisJICAvcHJvYy9tdHJyIGZpbGUgd2hpY2ggbWF5IGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB5b3VyIHByb2Nlc3NvcidzCisJICBNVFJScy4gVHlwaWNhbGx5IHRoZSBYIHNlcnZlciBzaG91bGQgdXNlIHRoaXMuCisKKwkgIFRoaXMgY29kZSBoYXMgYSByZWFzb25hYmx5IGdlbmVyaWMgaW50ZXJmYWNlIHNvIHRoYXQgc2ltaWxhcgorCSAgY29udHJvbCByZWdpc3RlcnMgb24gb3RoZXIgcHJvY2Vzc29ycyBjYW4gYmUgZWFzaWx5IHN1cHBvcnRlZAorCSAgYXMgd2VsbDoKKworCSAgVGhlIEN5cml4IDZ4ODYsIDZ4ODZNWCBhbmQgTSBJSSBwcm9jZXNzb3JzIGhhdmUgQWRkcmVzcyBSYW5nZQorCSAgUmVnaXN0ZXJzIChBUlJzKSB3aGljaCBwcm92aWRlIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5IHRvIE1UUlJzLiBGb3IKKwkgIHRoZXNlLCB0aGUgQVJScyBhcmUgdXNlZCB0byBlbXVsYXRlIHRoZSBNVFJScy4KKwkgIFRoZSBBTUQgSzYtMiAoc3RlcHBpbmcgOCBhbmQgYWJvdmUpIGFuZCBLNi0zIHByb2Nlc3NvcnMgaGF2ZSB0d28KKwkgIE1UUlJzLiBUaGUgQ2VudGF1ciBDNiAoV2luQ2hpcCkgaGFzIDggTUNScywgYWxsb3dpbmcKKwkgIHdyaXRlLWNvbWJpbmluZy4gQWxsIG9mIHRoZXNlIHByb2Nlc3NvcnMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGNvZGUKKwkgIGFuZCBpdCBtYWtlcyBzZW5zZSB0byBzYXkgWSBoZXJlIGlmIHlvdSBoYXZlIG9uZSBvZiB0aGVtLgorCisJICBTYXlpbmcgWSBoZXJlIGFsc28gZml4ZXMgYSBwcm9ibGVtIHdpdGggYnVnZ3kgU01QIEJJT1NlcyB3aGljaCBvbmx5CisJICBzZXQgdGhlIE1UUlJzIGZvciB0aGUgYm9vdCBDUFUgYW5kIG5vdCBmb3IgdGhlIHNlY29uZGFyeSBDUFVzLiBUaGlzCisJICBjYW4gbGVhZCB0byBhbGwgc29ydHMgb2YgcHJvYmxlbXMsIHNvIGl0J3MgZ29vZCB0byBzYXkgWSBoZXJlLgorCisJICBZb3UgY2FuIHNhZmVseSBzYXkgWSBldmVuIGlmIHlvdXIgbWFjaGluZSBkb2Vzbid0IGhhdmUgTVRSUnMsIHlvdSdsbAorCSAganVzdCBhZGQgYWJvdXQgOSBLQiB0byB5b3VyIGtlcm5lbC4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vbXRyci50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitjb25maWcgRUZJCisJYm9vbCAiQm9vdCBmcm9tIEVGSSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQUNQSQorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwlUaGlzIGVuYWJsZXMgdGhlIHRoZSBrZXJuZWwgdG8gYm9vdCBvbiBFRkkgcGxhdGZvcm1zIHVzaW5nCisJc3lzdGVtIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcGFzc2VkIHRvIGl0IGZyb20gdGhlIGZpcm13YXJlLgorCVRoaXMgYWxzbyBlbmFibGVzIHRoZSBrZXJuZWwgdG8gdXNlIGFueSBFRkkgcnVudGltZSBzZXJ2aWNlcyB0aGF0IGFyZQorCWF2YWlsYWJsZSAoc3VjaCBhcyB0aGUgRUZJIHZhcmlhYmxlIHNlcnZpY2VzKS4KKworCVRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsIG9uIHN5c3RlbXMgdGhhdCBoYXZlIEVGSSBmaXJtd2FyZQorCWFuZCB3aWxsIHJlc3VsdCBpbiBhIGtlcm5lbCBpbWFnZSB0aGF0IGlzIH44ayBsYXJnZXIuICBJbiBhZGRpdGlvbiwKKwl5b3UgbXVzdCB1c2UgdGhlIGxhdGVzdCBFTElMTyBsb2FkZXIgYXZhaWxhYmxlIGF0CisJPGh0dHA6Ly9lbGlsby5zb3VyY2Vmb3JnZS5uZXQ+IGluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mCisJa2VybmVsIGluaXRpYWxpemF0aW9uIHVzaW5nIEVGSSBpbmZvcm1hdGlvbiAobmVpdGhlciBHUlVCIG5vciBMSUxPIGtub3cKKwlhbnl0aGluZyBhYm91dCBFRkkpLiAgSG93ZXZlciwgZXZlbiB3aXRoIHRoaXMgb3B0aW9uLCB0aGUgcmVzdWx0YW50CisJa2VybmVsIHNob3VsZCBjb250aW51ZSB0byBib290IG9uIGV4aXN0aW5nIG5vbi1FRkkgcGxhdGZvcm1zLgorCitjb25maWcgSVJRQkFMQU5DRQorIAlib29sICJFbmFibGUga2VybmVsIGlycSBiYWxhbmNpbmciCisJZGVwZW5kcyBvbiBTTVAgJiYgWDg2X0lPX0FQSUMKKwlkZWZhdWx0IHkKKwloZWxwCisgCSAgVGhlIGRlZmF1bHQgeWVzIHdpbGwgYWxsb3cgdGhlIGtlcm5lbCB0byBkbyBpcnEgbG9hZCBiYWxhbmNpbmcuCisJICBTYXlpbmcgbm8gd2lsbCBrZWVwIHRoZSBrZXJuZWwgZnJvbSBkb2luZyBpcnEgbG9hZCBiYWxhbmNpbmcuCisKK2NvbmZpZyBIQVZFX0RFQ19MT0NLCisJYm9vbAorCWRlcGVuZHMgb24gKFNNUCB8fCBQUkVFTVBUKSAmJiBYODZfQ01QWENIRworCWRlZmF1bHQgeQorCisjIHR1cm5pbmcgdGhpcyBvbiB3YXN0ZXMgYSBidW5jaCBvZiBzcGFjZS4KKyMgU3VtbWl0IG5lZWRzIGl0IG9ubHkgd2hlbiBOVU1BIGlzIG9uCitjb25maWcgQk9PVF9JT1JFTUFQCisJYm9vbAorCWRlcGVuZHMgb24gKCgoWDg2X1NVTU1JVCB8fCBYODZfR0VORVJJQ0FSQ0gpICYmIE5VTUEpIHx8IChYODYgJiYgRUZJKSkKKwlkZWZhdWx0IHkKKworY29uZmlnIFJFR1BBUk0KKwlib29sICJVc2UgcmVnaXN0ZXIgYXJndW1lbnRzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJaGVscAorCUNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIC1tcmVncGFybT0zLiBUaGlzIHVzZXMgYSBkaWZmZXJlbnQgQUJJCisJYW5kIHBhc3NlcyB0aGUgZmlyc3QgdGhyZWUgYXJndW1lbnRzIG9mIGEgZnVuY3Rpb24gY2FsbCBpbiByZWdpc3RlcnMuCisJVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIGJpbmFyeSBvbmx5IG1vZHVsZXMuCisKKwlUaGlzIGZlYXR1cmUgaXMgb25seSBlbmFibGVkIGZvciBnY2MtMy4wIGFuZCBsYXRlciAtIGVhcmxpZXIgY29tcGlsZXJzCisJZ2VuZXJhdGUgaW5jb3JyZWN0IG91dHB1dCB3aXRoIGNlcnRhaW4ga2VybmVsIGNvbnN0cnVjdHMgd2hlbgorCS1tcmVncGFybT0zIGlzIHVzZWQuCisKK2NvbmZpZyBTRUNDT01QCisJYm9vbCAiRW5hYmxlIHNlY2NvbXAgdG8gc2FmZWx5IGNvbXB1dGUgdW50cnVzdGVkIGJ5dGVjb2RlIgorCWRlcGVuZHMgb24gUFJPQ19GUworCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMga2VybmVsIGZlYXR1cmUgaXMgdXNlZnVsIGZvciBudW1iZXIgY3J1bmNoaW5nIGFwcGxpY2F0aW9ucworCSAgdGhhdCBtYXkgbmVlZCB0byBjb21wdXRlIHVudHJ1c3RlZCBieXRlY29kZSBkdXJpbmcgdGhlaXIKKwkgIGV4ZWN1dGlvbi4gQnkgdXNpbmcgcGlwZXMgb3Igb3RoZXIgdHJhbnNwb3J0cyBtYWRlIGF2YWlsYWJsZSB0bworCSAgdGhlIHByb2Nlc3MgYXMgZmlsZSBkZXNjcmlwdG9ycyBzdXBwb3J0aW5nIHRoZSByZWFkL3dyaXRlCisJICBzeXNjYWxscywgaXQncyBwb3NzaWJsZSB0byBpc29sYXRlIHRob3NlIGFwcGxpY2F0aW9ucyBpbgorCSAgdGhlaXIgb3duIGFkZHJlc3Mgc3BhY2UgdXNpbmcgc2VjY29tcC4gT25jZSBzZWNjb21wIGlzCisJICBlbmFibGVkIHZpYSAvcHJvYy88cGlkPi9zZWNjb21wLCBpdCBjYW5ub3QgYmUgZGlzYWJsZWQKKwkgIGFuZCB0aGUgdGFzayBpcyBvbmx5IGFsbG93ZWQgdG8gZXhlY3V0ZSBhIGZldyBzYWZlIHN5c2NhbGxzCisJICBkZWZpbmVkIGJ5IGVhY2ggc2VjY29tcCBtb2RlLgorCisJICBJZiB1bnN1cmUsIHNheSBZLiBPbmx5IGVtYmVkZGVkIHNob3VsZCBzYXkgTiBoZXJlLgorCitlbmRtZW51CisKKworbWVudSAiUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChBQ1BJLCBBUE0pIgorCWRlcGVuZHMgb24gIVg4Nl9WT1lBR0VSCisKK3NvdXJjZSBrZXJuZWwvcG93ZXIvS2NvbmZpZworCitzb3VyY2UgImRyaXZlcnMvYWNwaS9LY29uZmlnIgorCittZW51ICJBUE0gKEFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQpIEJJT1MgU3VwcG9ydCIKK2RlcGVuZHMgb24gUE0gJiYgIVg4Nl9WSVNXUworCitjb25maWcgQVBNCisJdHJpc3RhdGUgIkFQTSAoQWR2YW5jZWQgUG93ZXIgTWFuYWdlbWVudCkgQklPUyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUE0KKwktLS1oZWxwLS0tCisJICBBUE0gaXMgYSBCSU9TIHNwZWNpZmljYXRpb24gZm9yIHNhdmluZyBwb3dlciB1c2luZyBzZXZlcmFsIGRpZmZlcmVudAorCSAgdGVjaG5pcXVlcy4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBiYXR0ZXJ5IHBvd2VyZWQgbGFwdG9wcyB3aXRoCisJICBBUE0gY29tcGxpYW50IEJJT1Nlcy4gSWYgeW91IHNheSBZIGhlcmUsIHRoZSBzeXN0ZW0gdGltZSB3aWxsIGJlCisJICByZXNldCBhZnRlciBhIFJFU1VNRSBvcGVyYXRpb24sIHRoZSAvcHJvYy9hcG0gZGV2aWNlIHdpbGwgcHJvdmlkZQorCSAgYmF0dGVyeSBzdGF0dXMgaW5mb3JtYXRpb24sIGFuZCB1c2VyLXNwYWNlIHByb2dyYW1zIHdpbGwgcmVjZWl2ZQorCSAgbm90aWZpY2F0aW9uIG9mIEFQTSAiZXZlbnRzIiAoZS5nLiBiYXR0ZXJ5IHN0YXR1cyBjaGFuZ2UpLgorCisJICBJZiB5b3Ugc2VsZWN0ICJZIiBoZXJlLCB5b3UgY2FuIGRpc2FibGUgYWN0dWFsIHVzZSBvZiB0aGUgQVBNCisJICBCSU9TIGJ5IHBhc3NpbmcgdGhlICJhcG09b2ZmIiBvcHRpb24gdG8gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuCisKKwkgIE5vdGUgdGhhdCB0aGUgQVBNIHN1cHBvcnQgaXMgYWxtb3N0IGNvbXBsZXRlbHkgZGlzYWJsZWQgZm9yCisJICBtYWNoaW5lcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLgorCisJICBJbiBvcmRlciB0byB1c2UgQVBNLCB5b3Ugd2lsbCBuZWVkIHN1cHBvcnRpbmcgc29mdHdhcmUuIEZvciBsb2NhdGlvbgorCSAgYW5kIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9wbS50eHQ+IGFuZCB0aGUKKwkgIEJhdHRlcnkgUG93ZXJlZCBMaW51eCBtaW5pLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVGhpcyBkcml2ZXIgZG9lcyBub3Qgc3BpbiBkb3duIGRpc2sgZHJpdmVzIChzZWUgdGhlIGhkcGFybSg4KQorCSAgbWFucGFnZSAoIm1hbiA4IGhkcGFybSIpIGZvciB0aGF0KSwgYW5kIGl0IGRvZXNuJ3QgdHVybiBvZmYKKwkgIFZFU0EtY29tcGxpYW50ICJncmVlbiIgbW9uaXRvcnMuCisKKwkgIFRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIFRJIDQwMDBNIFRyYXZlbE1hdGUgYW5kIHRoZSBBQ0VSCisJICA0ODYvRFg0Lzc1IGJlY2F1c2UgdGhleSBkb24ndCBoYXZlIGNvbXBsaWFudCBCSU9TZXMuIE1hbnkgImdyZWVuIgorCSAgZGVza3RvcCBtYWNoaW5lcyBhbHNvIGRvbid0IGhhdmUgY29tcGxpYW50IEJJT1NlcywgYW5kIHRoaXMgZHJpdmVyCisJICBtYXkgY2F1c2UgdGhvc2UgbWFjaGluZXMgdG8gcGFuaWMgZHVyaW5nIHRoZSBib290IHBoYXNlLgorCisJICBHZW5lcmFsbHksIGlmIHlvdSBkb24ndCBoYXZlIGEgYmF0dGVyeSBpbiB5b3VyIG1hY2hpbmUsIHRoZXJlIGlzbid0CisJICBtdWNoIHBvaW50IGluIHVzaW5nIHRoaXMgZHJpdmVyIGFuZCB5b3Ugc2hvdWxkIHNheSBOLiBJZiB5b3UgZ2V0CisJICByYW5kb20ga2VybmVsIE9PUFNlcyBvciByZWJvb3RzIHRoYXQgZG9uJ3Qgc2VlbSB0byBiZSByZWxhdGVkIHRvCisJICBhbnl0aGluZywgdHJ5IGRpc2FibGluZy9lbmFibGluZyB0aGlzIG9wdGlvbiAob3IgZGlzYWJsaW5nL2VuYWJsaW5nCisJICBBUE0gaW4geW91ciBCSU9TKS4KKworCSAgU29tZSBvdGhlciB0aGluZ3MgeW91IHNob3VsZCB0cnkgd2hlbiBleHBlcmllbmNpbmcgc2VlbWluZ2x5IHJhbmRvbSwKKwkgICJ3ZWlyZCIgcHJvYmxlbXM6CisKKwkgIDEpIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGVub3VnaCBzd2FwIHNwYWNlIGFuZCB0aGF0IGl0IGlzCisJICBlbmFibGVkLgorCSAgMikgcGFzcyB0aGUgIm5vLWhsdCIgb3B0aW9uIHRvIHRoZSBrZXJuZWwKKwkgIDMpIHN3aXRjaCBvbiBmbG9hdGluZyBwb2ludCBlbXVsYXRpb24gaW4gdGhlIGtlcm5lbCBhbmQgcGFzcworCSAgdGhlICJubzM4NyIgb3B0aW9uIHRvIHRoZSBrZXJuZWwKKwkgIDQpIHBhc3MgdGhlICJmbG9wcHk9bm9kbWEiIG9wdGlvbiB0byB0aGUga2VybmVsCisJICA1KSBwYXNzIHRoZSAibWVtPTRNIiBvcHRpb24gdG8gdGhlIGtlcm5lbCAodGhlcmVieSBkaXNhYmxpbmcKKwkgIGFsbCBidXQgdGhlIGZpcnN0IDQgTUIgb2YgUkFNKQorCSAgNikgbWFrZSBzdXJlIHRoYXQgdGhlIENQVSBpcyBub3Qgb3ZlciBjbG9ja2VkLgorCSAgNykgcmVhZCB0aGUgc2lnMTEgRkFRIGF0IDxodHRwOi8vd3d3LmJpdHdpemFyZC5ubC9zaWcxMS8+CisJICA4KSBkaXNhYmxlIHRoZSBjYWNoZSBmcm9tIHlvdXIgQklPUyBzZXR0aW5ncworCSAgOSkgaW5zdGFsbCBhIGZhbiBmb3IgdGhlIHZpZGVvIGNhcmQgb3IgZXhjaGFuZ2UgdmlkZW8gUkFNCisJICAxMCkgaW5zdGFsbCBhIGJldHRlciBmYW4gZm9yIHRoZSBDUFUKKwkgIDExKSBleGNoYW5nZSBSQU0gY2hpcHMKKwkgIDEyKSBleGNoYW5nZSB0aGUgbW90aGVyYm9hcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFwbS4KKworY29uZmlnIEFQTV9JR05PUkVfVVNFUl9TVVNQRU5ECisJYm9vbCAiSWdub3JlIFVTRVIgU1VTUEVORCIKKwlkZXBlbmRzIG9uIEFQTQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHdpbGwgaWdub3JlIFVTRVIgU1VTUEVORCByZXF1ZXN0cy4gT24gbWFjaGluZXMgd2l0aCBhCisJICBjb21wbGlhbnQgQVBNIEJJT1MsIHlvdSB3YW50IHRvIHNheSBOLiBIb3dldmVyLCBvbiB0aGUgTkVDIFZlcnNhIE0KKwkgIHNlcmllcyBub3RlYm9va3MsIGl0IGlzIG5lY2Vzc2FyeSB0byBzYXkgWSBiZWNhdXNlIG9mIGEgQklPUyBidWcuCisKK2NvbmZpZyBBUE1fRE9fRU5BQkxFCisJYm9vbCAiRW5hYmxlIFBNIGF0IGJvb3QgdGltZSIKKwlkZXBlbmRzIG9uIEFQTQorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBBUE0gZmVhdHVyZXMgYXQgYm9vdCB0aW1lLiBGcm9tIHBhZ2UgMzYgb2YgdGhlIEFQTSBCSU9TCisJICBzcGVjaWZpY2F0aW9uOiAiV2hlbiBkaXNhYmxlZCwgdGhlIEFQTSBCSU9TIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkKKwkgIHBvd2VyIG1hbmFnZSBkZXZpY2VzLCBlbnRlciB0aGUgU3RhbmRieSBTdGF0ZSwgZW50ZXIgdGhlIFN1c3BlbmQKKwkgIFN0YXRlLCBvciB0YWtlIHBvd2VyIHNhdmluZyBzdGVwcyBpbiByZXNwb25zZSB0byBDUFUgSWRsZSBjYWxscy4iCisJICBUaGlzIGRyaXZlciB3aWxsIG1ha2UgQ1BVIElkbGUgY2FsbHMgd2hlbiBMaW51eCBpcyBpZGxlICh1bmxlc3MgdGhpcworCSAgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmIC0tIHNlZSAiRG8gQ1BVIElETEUgY2FsbHMiLCBiZWxvdykuIFRoaXMKKwkgIHNob3VsZCBhbHdheXMgc2F2ZSBiYXR0ZXJ5IHBvd2VyLCBidXQgbW9yZSBjb21wbGljYXRlZCBBUE0gZmVhdHVyZXMKKwkgIHdpbGwgYmUgZGVwZW5kZW50IG9uIHlvdXIgQklPUyBpbXBsZW1lbnRhdGlvbi4gWW91IG1heSBuZWVkIHRvIHR1cm4KKwkgIHRoaXMgb3B0aW9uIG9mZiBpZiB5b3VyIGNvbXB1dGVyIGhhbmdzIGF0IGJvb3QgdGltZSB3aGVuIHVzaW5nIEFQTQorCSAgc3VwcG9ydCwgb3IgaWYgaXQgYmVlcHMgY29udGludW91c2x5IGluc3RlYWQgb2Ygc3VzcGVuZGluZy4gVHVybgorCSAgdGhpcyBvZmYgaWYgeW91IGhhdmUgYSBORUMgVWx0cmFMaXRlIFZlcnNhIDMzL0Mgb3IgYSBUb3NoaWJhCisJICBUNDAwQ0RULiBUaGlzIGlzIG9mZiBieSBkZWZhdWx0IHNpbmNlIG1vc3QgbWFjaGluZXMgZG8gZmluZSB3aXRob3V0CisJICB0aGlzIGZlYXR1cmUuCisKK2NvbmZpZyBBUE1fQ1BVX0lETEUKKwlib29sICJNYWtlIENQVSBJZGxlIGNhbGxzIHdoZW4gaWRsZSIKKwlkZXBlbmRzIG9uIEFQTQorCWhlbHAKKwkgIEVuYWJsZSBjYWxscyB0byBBUE0gQ1BVIElkbGUvQ1BVIEJ1c3kgaW5zaWRlIHRoZSBrZXJuZWwncyBpZGxlIGxvb3AuCisJICBPbiBzb21lIG1hY2hpbmVzLCB0aGlzIGNhbiBhY3RpdmF0ZSBpbXByb3ZlZCBwb3dlciBzYXZpbmdzLCBzdWNoIGFzCisJICBhIHNsb3dlZCBDUFUgY2xvY2sgcmF0ZSwgd2hlbiB0aGUgbWFjaGluZSBpcyBpZGxlLiBUaGVzZSBpZGxlIGNhbGxzCisJICBhcmUgbWFkZSBhZnRlciB0aGUgaWRsZSBsb29wIGhhcyBydW4gZm9yIHNvbWUgbGVuZ3RoIG9mIHRpbWUgKGUuZy4sCisJICAzMzMgbVMpLiBPbiBzb21lIG1hY2hpbmVzLCB0aGlzIHdpbGwgY2F1c2UgYSBoYW5nIGF0IGJvb3QgdGltZSBvcgorCSAgd2hlbmV2ZXIgdGhlIENQVSBiZWNvbWVzIGlkbGUuIChPbiBtYWNoaW5lcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLAorCSAgdGhpcyBvcHRpb24gZG9lcyBub3RoaW5nLikKKworY29uZmlnIEFQTV9ESVNQTEFZX0JMQU5LCisJYm9vbCAiRW5hYmxlIGNvbnNvbGUgYmxhbmtpbmcgdXNpbmcgQVBNIgorCWRlcGVuZHMgb24gQVBNCisJaGVscAorCSAgRW5hYmxlIGNvbnNvbGUgYmxhbmtpbmcgdXNpbmcgdGhlIEFQTS4gU29tZSBsYXB0b3BzIGNhbiB1c2UgdGhpcyB0bworCSAgdHVybiBvZmYgdGhlIExDRCBiYWNrbGlnaHQgd2hlbiB0aGUgc2NyZWVuIGJsYW5rZXIgb2YgdGhlIExpbnV4CisJICB2aXJ0dWFsIGNvbnNvbGUgYmxhbmtzIHRoZSBzY3JlZW4uIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdXNlZCBieQorCSAgdGhlIHZpcnR1YWwgY29uc29sZSBzY3JlZW4gYmxhbmtlciwgYW5kIHdvbid0IHR1cm4gb2ZmIHRoZSBiYWNrbGlnaHQKKwkgIHdoZW4gdXNpbmcgdGhlIFggV2luZG93IHN5c3RlbS4gVGhpcyBhbHNvIGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyB0bworCSAgZG8gd2l0aCB5b3VyIFZFU0EtY29tcGxpYW50IHBvd2VyLXNhdmluZyBtb25pdG9yLiBGdXJ0aGVyLCB0aGlzCisJICBvcHRpb24gZG9lc24ndCB3b3JrIGZvciBhbGwgbGFwdG9wcyAtLSBpdCBtaWdodCBub3QgdHVybiBvZmYgeW91cgorCSAgYmFja2xpZ2h0IGF0IGFsbCwgb3IgaXQgbWlnaHQgcHJpbnQgYSBsb3Qgb2YgZXJyb3JzIHRvIHRoZSBjb25zb2xlLAorCSAgZXNwZWNpYWxseSBpZiB5b3UgYXJlIHVzaW5nIGdwbS4KKworY29uZmlnIEFQTV9SVENfSVNfR01UCisJYm9vbCAiUlRDIHN0b3JlcyB0aW1lIGluIEdNVCIKKwlkZXBlbmRzIG9uIEFQTQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91ciBSVEMgKFJlYWwgVGltZSBDbG9jayBhLmsuYS4gaGFyZHdhcmUgY2xvY2spCisJICBzdG9yZXMgdGhlIHRpbWUgaW4gR01UIChHcmVlbndpY2ggTWVhbiBUaW1lKS4gU2F5IE4gaWYgeW91ciBSVEMKKwkgIHN0b3JlcyBsb2NhbHRpbWUuCisKKwkgIEl0IGlzIGluIGZhY3QgcmVjb21tZW5kZWQgdG8gc3RvcmUgR01UIGluIHlvdXIgUlRDLCBiZWNhdXNlIHRoZW4geW91CisJICBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGRheWxpZ2h0IHNhdmluZ3MgdGltZSBjaGFuZ2VzLiBUaGUgb25seQorCSAgcmVhc29uIG5vdCB0byB1c2UgR01UIGluIHlvdXIgUlRDIGlzIGlmIHlvdSBhbHNvIHJ1biBhIGJyb2tlbiBPUworCSAgdGhhdCBkb2Vzbid0IHVuZGVyc3RhbmQgR01ULgorCitjb25maWcgQVBNX0FMTE9XX0lOVFMKKwlib29sICJBbGxvdyBpbnRlcnJ1cHRzIGR1cmluZyBBUE0gQklPUyBjYWxscyIKKwlkZXBlbmRzIG9uIEFQTQorCWhlbHAKKwkgIE5vcm1hbGx5IHdlIGRpc2FibGUgZXh0ZXJuYWwgaW50ZXJydXB0cyB3aGlsZSB3ZSBhcmUgbWFraW5nIGNhbGxzIHRvCisJICB0aGUgQVBNIEJJT1MgYXMgYSBtZWFzdXJlIHRvIGxlc3NlbiB0aGUgZWZmZWN0cyBvZiBhIGJhZGx5IGJlaGF2aW5nCisJICBCSU9TIGltcGxlbWVudGF0aW9uLiAgVGhlIEJJT1Mgc2hvdWxkIHJlZW5hYmxlIGludGVycnVwdHMgaWYgaXQKKwkgIG5lZWRzIHRvLiAgVW5mb3J0dW5hdGVseSwgc29tZSBCSU9TZXMgZG8gbm90IC0tIGVzcGVjaWFsbHkgdGhvc2UgaW4KKwkgIG1hbnkgb2YgdGhlIG5ld2VyIElCTSBUaGlua3BhZHMuICBJZiB5b3UgZXhwZXJpZW5jZSBoYW5ncyB3aGVuIHlvdQorCSAgc3VzcGVuZCwgdHJ5IHNldHRpbmcgdGhpcyB0byBZLiAgT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIEFQTV9SRUFMX01PREVfUE9XRVJfT0ZGCisJYm9vbCAiVXNlIHJlYWwgbW9kZSBBUE0gQklPUyBjYWxsIHRvIHBvd2VyIG9mZiIKKwlkZXBlbmRzIG9uIEFQTQorCWhlbHAKKwkgIFVzZSByZWFsIG1vZGUgQVBNIEJJT1MgY2FsbHMgdG8gc3dpdGNoIG9mZiB0aGUgY29tcHV0ZXIuIFRoaXMgaXMKKwkgIGEgd29yay1hcm91bmQgZm9yIGEgbnVtYmVyIG9mIGJ1Z2d5IEJJT1Nlcy4gU3dpdGNoIHRoaXMgb3B0aW9uIG9uIGlmCisJICB5b3VyIGNvbXB1dGVyIGNyYXNoZXMgaW5zdGVhZCBvZiBwb3dlcmluZyBvZmYgcHJvcGVybHkuCisKK2VuZG1lbnUKKworc291cmNlICJhcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWciCisKK2VuZG1lbnUKKworbWVudSAiQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkiCisKK2NvbmZpZyBQQ0kKKwlib29sICJQQ0kgc3VwcG9ydCIgaWYgIVg4Nl9WSVNXUworCWRlcGVuZHMgb24gIVg4Nl9WT1lBR0VSCisJZGVmYXVsdCB5IGlmIFg4Nl9WSVNXUworCWhlbHAKKwkgIEZpbmQgb3V0IHdoZXRoZXIgeW91IGhhdmUgYSBQQ0kgbW90aGVyYm9hcmQuIFBDSSBpcyB0aGUgbmFtZSBvZiBhCisJICBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYgaW5zaWRlCisJICB5b3VyIGJveC4gT3RoZXIgYnVzIHN5c3RlbXMgYXJlIElTQSwgRUlTQSwgTWljcm9DaGFubmVsIChNQ0EpIG9yCisJICBWRVNBLiBJZiB5b3UgaGF2ZSBQQ0ksIHNheSBZLCBvdGhlcndpc2UgTi4KKworCSAgVGhlIFBDSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4sIGNvbnRhaW5zIHZhbHVhYmxlCisJICBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBQQ0kgaGFyZHdhcmUgZG9lcyB3b3JrIHVuZGVyIExpbnV4IGFuZCB3aGljaAorCSAgZG9lc24ndC4KKworY2hvaWNlCisJcHJvbXB0ICJQQ0kgYWNjZXNzIG1vZGUiCisJZGVwZW5kcyBvbiBQQ0kgJiYgIVg4Nl9WSVNXUworCWRlZmF1bHQgUENJX0dPQU5ZCisJLS0taGVscC0tLQorCSAgT24gUENJIHN5c3RlbXMsIHRoZSBCSU9TIGNhbiBiZSB1c2VkIHRvIGRldGVjdCB0aGUgUENJIGRldmljZXMgYW5kCisJICBkZXRlcm1pbmUgdGhlaXIgY29uZmlndXJhdGlvbi4gSG93ZXZlciwgc29tZSBvbGQgUENJIG1vdGhlcmJvYXJkcworCSAgaGF2ZSBCSU9TIGJ1Z3MgYW5kIG1heSBjcmFzaCBpZiB0aGlzIGlzIGRvbmUuIEFsc28sIHNvbWUgZW1iZWRkZWQKKwkgIFBDSS1iYXNlZCBzeXN0ZW1zIGRvbid0IGhhdmUgYW55IEJJT1MgYXQgYWxsLiBMaW51eCBjYW4gYWxzbyB0cnkgdG8KKwkgIGRldGVjdCB0aGUgUENJIGhhcmR3YXJlIGRpcmVjdGx5IHdpdGhvdXQgdXNpbmcgdGhlIEJJT1MuCisKKwkgIFdpdGggdGhpcyBvcHRpb24sIHlvdSBjYW4gc3BlY2lmeSBob3cgTGludXggc2hvdWxkIGRldGVjdCB0aGUKKwkgIFBDSSBkZXZpY2VzLiBJZiB5b3UgY2hvb3NlICJCSU9TIiwgdGhlIEJJT1Mgd2lsbCBiZSB1c2VkLAorCSAgaWYgeW91IGNob29zZSAiRGlyZWN0IiwgdGhlIEJJT1Mgd29uJ3QgYmUgdXNlZCwgYW5kIGlmIHlvdQorCSAgY2hvb3NlICJNTUNvbmZpZyIsIHRoZW4gUENJIEV4cHJlc3MgTU1DT05GSUcgd2lsbCBiZSB1c2VkLgorCSAgSWYgeW91IGNob29zZSAiQW55IiwgdGhlIGtlcm5lbCB3aWxsIHRyeSBNTUNPTkZJRywgdGhlbiB0aGUKKwkgIGRpcmVjdCBhY2Nlc3MgbWV0aG9kIGFuZCBmYWxscyBiYWNrIHRvIHRoZSBCSU9TIGlmIHRoYXQgZG9lc24ndAorCSAgd29yay4gSWYgdW5zdXJlLCBnbyB3aXRoIHRoZSBkZWZhdWx0LCB3aGljaCBpcyAiQW55Ii4KKworY29uZmlnIFBDSV9HT0JJT1MKKwlib29sICJCSU9TIgorCitjb25maWcgUENJX0dPTU1DT05GSUcKKwlib29sICJNTUNvbmZpZyIKKworY29uZmlnIFBDSV9HT0RJUkVDVAorCWJvb2wgIkRpcmVjdCIKKworY29uZmlnIFBDSV9HT0FOWQorCWJvb2wgIkFueSIKKworZW5kY2hvaWNlCisKK2NvbmZpZyBQQ0lfQklPUworCWJvb2wKKwlkZXBlbmRzIG9uICFYODZfVklTV1MgJiYgUENJICYmIChQQ0lfR09CSU9TIHx8IFBDSV9HT0FOWSkKKwlkZWZhdWx0IHkKKworY29uZmlnIFBDSV9ESVJFQ1QKKwlib29sCisgCWRlcGVuZHMgb24gUENJICYmICgoUENJX0dPRElSRUNUIHx8IFBDSV9HT0FOWSkgfHwgWDg2X1ZJU1dTKQorCWRlZmF1bHQgeQorCitjb25maWcgUENJX01NQ09ORklHCisJYm9vbAorCWRlcGVuZHMgb24gUENJICYmIChQQ0lfR09NTUNPTkZJRyB8fCAoUENJX0dPQU5ZICYmIEFDUEkpKQorCXNlbGVjdCBBQ1BJX0JPT1QKKwlkZWZhdWx0IHkKKworc291cmNlICJkcml2ZXJzL3BjaS9wY2llL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9wY2kvS2NvbmZpZyIKKworY29uZmlnIElTQQorCWJvb2wgIklTQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gIShYODZfVk9ZQUdFUiB8fCBYODZfVklTV1MpCisJaGVscAorCSAgRmluZCBvdXQgd2hldGhlciB5b3UgaGF2ZSBJU0Egc2xvdHMgb24geW91ciBtb3RoZXJib2FyZC4gIElTQSBpcyB0aGUKKwkgIG5hbWUgb2YgYSBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYKKwkgIGluc2lkZSB5b3VyIGJveC4gIE90aGVyIGJ1cyBzeXN0ZW1zIGFyZSBQQ0ksIEVJU0EsIE1pY3JvQ2hhbm5lbAorCSAgKE1DQSkgb3IgVkVTQS4gIElTQSBpcyBhbiBvbGRlciBzeXN0ZW0sIG5vdyBiZWluZyBkaXNwbGFjZWQgYnkgUENJOworCSAgbmV3ZXIgYm9hcmRzIGRvbid0IHN1cHBvcnQgaXQuICBJZiB5b3UgaGF2ZSBJU0EsIHNheSBZLCBvdGhlcndpc2UgTi4KKworY29uZmlnIEVJU0EKKwlib29sICJFSVNBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0EKKwktLS1oZWxwLS0tCisJICBUaGUgRXh0ZW5kZWQgSW5kdXN0cnkgU3RhbmRhcmQgQXJjaGl0ZWN0dXJlIChFSVNBKSBidXMgd2FzCisJICBkZXZlbG9wZWQgYXMgYW4gb3BlbiBhbHRlcm5hdGl2ZSB0byB0aGUgSUJNIE1pY3JvQ2hhbm5lbCBidXMuCisKKwkgIFRoZSBFSVNBIGJ1cyBwcm92aWRlZCBzb21lIG9mIHRoZSBmZWF0dXJlcyBvZiB0aGUgSUJNIE1pY3JvQ2hhbm5lbAorCSAgYnVzIHdoaWxlIG1haW50YWluaW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBjYXJkcyBtYWRlIGZvcgorCSAgdGhlIG9sZGVyIElTQSBidXMuICBUaGUgRUlTQSBidXMgc2F3IGxpbWl0ZWQgdXNlIGJldHdlZW4gMTk4OCBhbmQKKwkgIDE5OTUgd2hlbiBpdCB3YXMgbWFkZSBvYnNvbGV0ZSBieSB0aGUgUENJIGJ1cy4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBhbiBFSVNBLWJhc2VkIG1hY2hpbmUuCisKKwkgIE90aGVyd2lzZSwgc2F5IE4uCisKK3NvdXJjZSAiZHJpdmVycy9laXNhL0tjb25maWciCisKK2NvbmZpZyBNQ0EKKwlib29sICJNQ0Egc3VwcG9ydCIgaWYgIShYODZfVklTV1MgfHwgWDg2X1ZPWUFHRVIpCisJZGVmYXVsdCB5IGlmIFg4Nl9WT1lBR0VSCisJaGVscAorCSAgTWljcm9DaGFubmVsIEFyY2hpdGVjdHVyZSBpcyBmb3VuZCBpbiBzb21lIElCTSBQUy8yIG1hY2hpbmVzIGFuZAorCSAgbGFwdG9wcy4gIEl0IGlzIGEgYnVzIHN5c3RlbSBzaW1pbGFyIHRvIFBDSSBvciBJU0EuIFNlZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tY2EudHh0PiAoYW5kIGVzcGVjaWFsbHkgdGhlIHdlYiBwYWdlIGdpdmVuCisJICB0aGVyZSkgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYnVpbGQgYW4gTUNBIGJ1cyBrZXJuZWwuCisKK3NvdXJjZSAiZHJpdmVycy9tY2EvS2NvbmZpZyIKKworY29uZmlnIFNDeDIwMAorCXRyaXN0YXRlICJOYXRTZW1pIFNDeDIwMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gIVg4Nl9WT1lBR0VSCisJaGVscAorCSAgVGhpcyBwcm92aWRlcyBiYXNpYyBzdXBwb3J0IGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBTQ3gyMDAKKwkgIHByb2Nlc3Nvci4gIFJpZ2h0IG5vdyB0aGlzIGlzIGp1c3QgYSBkcml2ZXIgZm9yIHRoZSBHUElPIHBpbnMuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCisKKwkgIFRoaXMgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gIElmIGNvbXBpbGVkIGFzIGEKKwkgIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgc2N4MjAwLgorCitzb3VyY2UgImRyaXZlcnMvcGNtY2lhL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnIgorCitlbmRtZW51CisKK21lbnUgIkV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzIgorCitzb3VyY2UgImZzL0tjb25maWcuYmluZm10IgorCitlbmRtZW51CisKK3NvdXJjZSAiZHJpdmVycy9LY29uZmlnIgorCitzb3VyY2UgImZzL0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9pMzg2L29wcm9maWxlL0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9pMzg2L0tjb25maWcuZGVidWciCisKK3NvdXJjZSAic2VjdXJpdHkvS2NvbmZpZyIKKworc291cmNlICJjcnlwdG8vS2NvbmZpZyIKKworc291cmNlICJsaWIvS2NvbmZpZyIKKworIworIyBVc2UgdGhlIGdlbmVyaWMgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgaW4ga2VybmVsL2lycS86CisjCitjb25maWcgR0VORVJJQ19IQVJESVJRUworCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIEdFTkVSSUNfSVJRX1BST0JFCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1NNUAorCWJvb2wKKwlkZXBlbmRzIG9uIFNNUCAmJiAhWDg2X1ZPWUFHRVIKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9IVAorCWJvb2wKKwlkZXBlbmRzIG9uIFNNUCAmJiAhKFg4Nl9WSVNXUyB8fCBYODZfVk9ZQUdFUikKKwlkZWZhdWx0IHkKKworY29uZmlnIFg4Nl9CSU9TX1JFQk9PVAorCWJvb2wKKwlkZXBlbmRzIG9uICEoWDg2X1ZJU1dTIHx8IFg4Nl9WT1lBR0VSKQorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X1RSQU1QT0xJTkUKKwlib29sCisJZGVwZW5kcyBvbiBYODZfU01QIHx8IChYODZfVk9ZQUdFUiAmJiBTTVApCisJZGVmYXVsdCB5CisKK2NvbmZpZyBQQworCWJvb2wKKwlkZXBlbmRzIG9uIFg4NiAmJiAhRU1CRURERUQKKwlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnLmRlYnVnIGIvYXJjaC9pMzg2L0tjb25maWcuZGVidWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiMjA2NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9LY29uZmlnLmRlYnVnCkBAIC0wLDAgKzEsNzIgQEAKK21lbnUgIktlcm5lbCBoYWNraW5nIgorCitzb3VyY2UgImxpYi9LY29uZmlnLmRlYnVnIgorCitjb25maWcgRUFSTFlfUFJJTlRLCisJYm9vbCAiRWFybHkgcHJpbnRrIiBpZiBFTUJFRERFRCAmJiBERUJVR19LRVJORUwKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXcml0ZSBrZXJuZWwgbG9nIG91dHB1dCBkaXJlY3RseSBpbnRvIHRoZSBWR0EgYnVmZmVyIG9yIHRvIGEgc2VyaWFsCisJICBwb3J0LgorCisJICBUaGlzIGlzIHVzZWZ1bCBmb3Iga2VybmVsIGRlYnVnZ2luZyB3aGVuIHlvdXIgbWFjaGluZSBjcmFzaGVzIHZlcnkKKwkgIGVhcmx5IGJlZm9yZSB0aGUgY29uc29sZSBjb2RlIGlzIGluaXRpYWxpemVkLiBGb3Igbm9ybWFsIG9wZXJhdGlvbgorCSAgaXQgaXMgbm90IHJlY29tbWVuZGVkIGJlY2F1c2UgaXQgbG9va3MgdWdseSBhbmQgZG9lc24ndCBjb29wZXJhdGUKKwkgIHdpdGgga2xvZ2Qvc3lzbG9nZCBvciB0aGUgWCBzZXJ2ZXIuIFlvdSBzaG91bGQgbm9ybWFsbHkgTiBoZXJlLAorCSAgdW5sZXNzIHlvdSB3YW50IHRvIGRlYnVnIHN1Y2ggYSBjcmFzaC4KKworY29uZmlnIERFQlVHX1NUQUNLT1ZFUkZMT1cKKwlib29sICJDaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3dzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisKK2NvbmZpZyBLUFJPQkVTCisJYm9vbCAiS3Byb2JlcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCisJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcworCSAgYSBwcm9iZXBvaW50IGFuZCBzcGVjaWZpZXMgdGhlIGNhbGxiYWNrLiAgS3Byb2JlcyBpcyB1c2VmdWwKKwkgIGZvciBrZXJuZWwgZGVidWdnaW5nLCBub24taW50cnVzaXZlIGluc3RydW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KKwkgIElmIGluIGRvdWJ0LCBzYXkgIk4iLgorCitjb25maWcgREVCVUdfU1RBQ0tfVVNBR0UKKwlib29sICJTdGFjayB1dGlsaXphdGlvbiBpbnN0cnVtZW50YXRpb24iCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBFbmFibGVzIHRoZSBkaXNwbGF5IG9mIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBmcmVlIHN0YWNrIHdoaWNoIGVhY2gKKwkgIHRhc2sgaGFzIGV2ZXIgaGFkIGF2YWlsYWJsZSBpbiB0aGUgc3lzcnEtVCBhbmQgc3lzcnEtUCBkZWJ1ZyBvdXRwdXQuCisKKwkgIFRoaXMgb3B0aW9uIHdpbGwgc2xvdyBkb3duIHByb2Nlc3MgY3JlYXRpb24gc29tZXdoYXQuCisKK2NvbW1lbnQgIlBhZ2UgYWxsb2MgZGVidWcgaXMgaW5jb21wYXRpYmxlIHdpdGggU29mdHdhcmUgU3VzcGVuZCBvbiBpMzg2IgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFNPRlRXQVJFX1NVU1BFTkQKKworY29uZmlnIERFQlVHX1BBR0VBTExPQworCWJvb2wgIlBhZ2UgYWxsb2MgZGVidWdnaW5nIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFTT0ZUV0FSRV9TVVNQRU5ECisJaGVscAorCSAgVW5tYXAgcGFnZXMgZnJvbSB0aGUga2VybmVsIGxpbmVhciBtYXBwaW5nIGFmdGVyIGZyZWVfcGFnZXMoKS4KKwkgIFRoaXMgcmVzdWx0cyBpbiBhIGxhcmdlIHNsb3dkb3duLCBidXQgaGVscHMgdG8gZmluZCBjZXJ0YWluIHR5cGVzCisJICBvZiBtZW1vcnkgY29ycnVwdGlvbnMuCisKK2NvbmZpZyA0S1NUQUNLUworCWJvb2wgIlVzZSA0S2IgZm9yIGtlcm5lbCBzdGFja3MgaW5zdGVhZCBvZiA4S2IiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB0aGUga2VybmVsIHdpbGwgdXNlIGEgNEtiIHN0YWNrc2l6ZSBmb3IgdGhlCisJICBrZXJuZWwgc3RhY2sgYXR0YWNoZWQgdG8gZWFjaCBwcm9jZXNzL3RocmVhZC4gVGhpcyBmYWNpbGl0YXRlcworCSAgcnVubmluZyBtb3JlIHRocmVhZHMgb24gYSBzeXN0ZW0gYW5kIGFsc28gcmVkdWNlcyB0aGUgcHJlc3N1cmUKKwkgIG9uIHRoZSBWTSBzdWJzeXN0ZW0gZm9yIGhpZ2hlciBvcmRlciBhbGxvY2F0aW9ucy4gVGhpcyBvcHRpb24KKwkgIHdpbGwgYWxzbyB1c2UgSVJRIHN0YWNrcyB0byBjb21wZW5zYXRlIGZvciB0aGUgcmVkdWNlZCBzdGFja3NwYWNlLgorCitjb25maWcgWDg2X0ZJTkRfU01QX0NPTkZJRworCWJvb2wKKwlkZXBlbmRzIG9uIFg4Nl9MT0NBTF9BUElDIHx8IFg4Nl9WT1lBR0VSCisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfTVBQQVJTRQorCWJvb2wKKwlkZXBlbmRzIG9uIFg4Nl9MT0NBTF9BUElDICYmICFYODZfVklTV1MKKwlkZWZhdWx0IHkKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L01ha2VmaWxlIGIvYXJjaC9pMzg2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNGM3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvTWFrZWZpbGUKQEAgLTAsMCArMSwxNzMgQEAKKyMKKyMgaTM4Ni9NYWtlZmlsZQorIworIyBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgdGhlIGdsb2JhbCBtYWtlZmlsZSBzbyB0aGF0IHlvdSBjYW4gYWRkIHlvdXIgb3duCisjIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBmbGFncyBhbmQgZGVwZW5kZW5jaWVzLiBSZW1lbWJlciB0byBkbyBoYXZlIGFjdGlvbnMKKyMgZm9yICJhcmNoY2xlYW4iIGNsZWFuaW5nIHVwIGZvciB0aGlzIGFyY2hpdGVjdHVyZS4KKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTQgYnkgTGludXMgVG9ydmFsZHMKKyMKKyMgMTk5OTA3MTMgIEFydHVyIFNrYXdpbmEgPHNrYXdpbmFAZ2VvY2l0aWVzLmNvbT4KKyMgICAgICAgICAgIEFkZGVkICctbWFyY2gnIGFuZCAnLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnknIHN1cHBvcnQKKyMKKyMgICAgICAgICAgIEtpYW51c2NoIFNheWFoIEthcmFkamkgPGtpYW51c2NoQHNrLXRlY2gubmV0PgorIyAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgR0VPREUgQ1BVCisKK0xERkxBR1MJCTo9IC1tIGVsZl9pMzg2CitPQkpDT1BZRkxBR1MJOj0gLU8gYmluYXJ5IC1SIC5ub3RlIC1SIC5jb21tZW50IC1TCitMREZMQUdTX3ZtbGludXggOj0KK0NIRUNLRkxBR1MJKz0gLURfX2kzODZfXworCitDRkxBR1MgKz0gLXBpcGUgLW1zb2Z0LWZsb2F0CisKKyMgcHJldmVudCBnY2MgZnJvbSBrZWVwaW5nIHRoZSBzdGFjayAxNiBieXRlIGFsaWduZWQKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIpCisKK2FsaWduIDo9ICQoY2Mtb3B0aW9uLWFsaWduKQorY2ZsYWdzLSQoQ09ORklHX00zODYpCQkrPSAtbWFyY2g9aTM4NgorY2ZsYWdzLSQoQ09ORklHX000ODYpCQkrPSAtbWFyY2g9aTQ4NgorY2ZsYWdzLSQoQ09ORklHX001ODYpCQkrPSAtbWFyY2g9aTU4NgorY2ZsYWdzLSQoQ09ORklHX001ODZUU0MpCSs9IC1tYXJjaD1pNTg2CitjZmxhZ3MtJChDT05GSUdfTTU4Nk1NWCkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9cGVudGl1bS1tbXgsLW1hcmNoPWk1ODYpCitjZmxhZ3MtJChDT05GSUdfTTY4NikJCSs9IC1tYXJjaD1pNjg2CitjZmxhZ3MtJChDT05GSUdfTVBFTlRJVU1JSSkJKz0gLW1hcmNoPWk2ODYgJChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9cGVudGl1bTIpCitjZmxhZ3MtJChDT05GSUdfTVBFTlRJVU1JSUkpCSs9IC1tYXJjaD1pNjg2ICQoY2FsbCBjYy1vcHRpb24sLW10dW5lPXBlbnRpdW0zKQorY2ZsYWdzLSQoQ09ORklHX01QRU5USVVNTSkJKz0gLW1hcmNoPWk2ODYgJChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9cGVudGl1bTMpCitjZmxhZ3MtJChDT05GSUdfTVBFTlRJVU00KQkrPSAtbWFyY2g9aTY4NiAkKGNhbGwgY2Mtb3B0aW9uLC1tdHVuZT1wZW50aXVtNCkKK2NmbGFncy0kKENPTkZJR19NSzYpCQkrPSAtbWFyY2g9azYKKyMgUGxlYXNlIG5vdGUsIHRoYXQgcGF0Y2hlcyB0aGF0IGFkZCAtbWFyY2g9YXRobG9uLXhwIGFuZCBmcmllbmRzIGFyZSBwb2ludGxlc3MuCisjIFRoZXkgbWFrZSB6ZXJvIGRpZmZlcmVuY2Ugd2hhdHNvc2V2ZXIgdG8gcGVyZm9ybWFuY2UgYXQgdGhpcyB0aW1lLgorY2ZsYWdzLSQoQ09ORklHX01LNykJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWF0aGxvbiwtbWFyY2g9aTY4NiAkKGFsaWduKS1mdW5jdGlvbnM9NCkKK2NmbGFncy0kKENPTkZJR19NSzgpCQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1rOCwkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1hdGhsb24sLW1hcmNoPWk2ODYgJChhbGlnbiktZnVuY3Rpb25zPTQpKQorY2ZsYWdzLSQoQ09ORklHX01DUlVTT0UpCSs9IC1tYXJjaD1pNjg2ICQoYWxpZ24pLWZ1bmN0aW9ucz0wICQoYWxpZ24pLWp1bXBzPTAgJChhbGlnbiktbG9vcHM9MAorY2ZsYWdzLSQoQ09ORklHX01FRkZJQ0VPTikJKz0gLW1hcmNoPWk2ODYgJChjYWxsIGNjLW9wdGlvbiwtbXR1bmU9cGVudGl1bTMpICQoYWxpZ24pLWZ1bmN0aW9ucz0wICQoYWxpZ24pLWp1bXBzPTAgJChhbGlnbiktbG9vcHM9MAorY2ZsYWdzLSQoQ09ORklHX01XSU5DSElQQzYpCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPXdpbmNoaXAtYzYsLW1hcmNoPWk1ODYpCitjZmxhZ3MtJChDT05GSUdfTVdJTkNISVAyKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD13aW5jaGlwMiwtbWFyY2g9aTU4NikKK2NmbGFncy0kKENPTkZJR19NV0lOQ0hJUDNEKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD13aW5jaGlwMiwtbWFyY2g9aTU4NikKK2NmbGFncy0kKENPTkZJR19NQ1lSSVhJSUkpCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWMzLC1tYXJjaD1pNDg2KSAkKGFsaWduKS1mdW5jdGlvbnM9MCAkKGFsaWduKS1qdW1wcz0wICQoYWxpZ24pLWxvb3BzPTAKK2NmbGFncy0kKENPTkZJR19NVklBQzNfMikJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWFyY2g9YzMtMiwtbWFyY2g9aTY4NikKKworIyBBTUQgRWxhbiBzdXBwb3J0CitjZmxhZ3MtJChDT05GSUdfWDg2X0VMQU4pCSs9IC1tYXJjaD1pNDg2CisKKyMgTWVkaWFHWCBha2EgR2VvZGUgc3VwcG9ydAorY2ZsYWdzLSQoQ09ORklHX01HRU9ERSkJCSs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPXBlbnRpdW0tbW14LC1tYXJjaD1pNTg2KQorCisjIC1tcmVncGFybT0zIHdvcmtzIG9rIG9uIGdjYy0zLjAgYW5kIGxhdGVyCisjCitHQ0NfVkVSU0lPTgkJCTo9ICQoY2FsbCBjYy12ZXJzaW9uKQorY2ZsYWdzLSQoQ09ORklHX1JFR1BBUk0pIAkrPSAkKHNoZWxsIGlmIFsgJChHQ0NfVkVSU0lPTikgLWdlIDAzMDAgXSA7IHRoZW4gZWNobyAiLW1yZWdwYXJtPTMiOyBmaSA7KQorCisjIERpc2FibGUgdW5pdC1hdC1hLXRpbWUgbW9kZSwgaXQgbWFrZXMgZ2NjIHVzZSBhIGxvdCBtb3JlIHN0YWNrCisjIGR1ZSB0byB0aGUgbGFjayBvZiBzaGFyaW5nIG9mIHN0YWNrbG90cy4KK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tdW5pdC1hdC1hLXRpbWUpCisKK0NGTEFHUyArPSAkKGNmbGFncy15KQorCisjIERlZmF1bHQgc3ViYXJjaCAuYyBmaWxlcworbWNvcmUteSAgOj0gbWFjaC1kZWZhdWx0CisKKyMgVm95YWdlciBzdWJhcmNoIHN1cHBvcnQKK21mbGFncy0kKENPTkZJR19YODZfVk9ZQUdFUikJOj0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlcgorbWNvcmUtJChDT05GSUdfWDg2X1ZPWUFHRVIpCTo9IG1hY2gtdm95YWdlcgorCisjIFZJU1dTIHN1YmFyY2ggc3VwcG9ydAorbWZsYWdzLSQoQ09ORklHX1g4Nl9WSVNXUykJOj0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtdmlzd3MKK21jb3JlLSQoQ09ORklHX1g4Nl9WSVNXUykJOj0gbWFjaC12aXN3cworCisjIE5VTUFRIHN1YmFyY2ggc3VwcG9ydAorbWZsYWdzLSQoQ09ORklHX1g4Nl9OVU1BUSkJOj0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtbnVtYXEKK21jb3JlLSQoQ09ORklHX1g4Nl9OVU1BUSkJOj0gbWFjaC1kZWZhdWx0CisKKyMgQklHU01QIHN1YmFyY2ggc3VwcG9ydAorbWZsYWdzLSQoQ09ORklHX1g4Nl9CSUdTTVApCTo9IC1JaW5jbHVkZS9hc20taTM4Ni9tYWNoLWJpZ3NtcAorbWNvcmUtJChDT05GSUdfWDg2X0JJR1NNUCkJOj0gbWFjaC1kZWZhdWx0CisKKyNTdW1taXQgc3ViYXJjaCBzdXBwb3J0CittZmxhZ3MtJChDT05GSUdfWDg2X1NVTU1JVCkgOj0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtc3VtbWl0CittY29yZS0kKENPTkZJR19YODZfU1VNTUlUKSAgOj0gbWFjaC1kZWZhdWx0CisKKyMgZ2VuZXJpYyBzdWJhcmNoaXRlY3R1cmUKK21mbGFncy0kKENPTkZJR19YODZfR0VORVJJQ0FSQ0gpIDo9IC1JaW5jbHVkZS9hc20taTM4Ni9tYWNoLWdlbmVyaWMKK21jb3JlLSQoQ09ORklHX1g4Nl9HRU5FUklDQVJDSCkgOj0gbWFjaC1kZWZhdWx0Citjb3JlLSQoQ09ORklHX1g4Nl9HRU5FUklDQVJDSCkgKz0gYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy8KKworIyBFUzcwMDAgc3ViYXJjaCBzdXBwb3J0CittZmxhZ3MtJChDT05GSUdfWDg2X0VTNzAwMCkJOj0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtZXM3MDAwCittY29yZS0kKENPTkZJR19YODZfRVM3MDAwKQk6PSBtYWNoLWRlZmF1bHQKK2NvcmUtJChDT05GSUdfWDg2X0VTNzAwMCkJOj0gYXJjaC9pMzg2L21hY2gtZXM3MDAwLworCisjIGRlZmF1bHQgc3ViYXJjaCAuaCBmaWxlcworbWZsYWdzLXkgKz0gLUlpbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdAorCitoZWFkLXkgOj0gYXJjaC9pMzg2L2tlcm5lbC9oZWFkLm8gYXJjaC9pMzg2L2tlcm5lbC9pbml0X3Rhc2subworCitsaWJzLXkgCQkJCQkrPSBhcmNoL2kzODYvbGliLworY29yZS15CQkJCQkrPSBhcmNoL2kzODYva2VybmVsLyBcCisJCQkJCSAgIGFyY2gvaTM4Ni9tbS8gXAorCQkJCQkgICBhcmNoL2kzODYvJChtY29yZS15KS8gXAorCQkJCQkgICBhcmNoL2kzODYvY3J5cHRvLworZHJpdmVycy0kKENPTkZJR19NQVRIX0VNVUxBVElPTikJKz0gYXJjaC9pMzg2L21hdGgtZW11LworZHJpdmVycy0kKENPTkZJR19QQ0kpCQkJKz0gYXJjaC9pMzg2L3BjaS8KKyMgbXVzdCBiZSBsaW5rZWQgYWZ0ZXIga2VybmVsLworZHJpdmVycy0kKENPTkZJR19PUFJPRklMRSkJCSs9IGFyY2gvaTM4Ni9vcHJvZmlsZS8KK2RyaXZlcnMtJChDT05GSUdfUE0pCQkJKz0gYXJjaC9pMzg2L3Bvd2VyLworCitDRkxBR1MgKz0gJChtZmxhZ3MteSkKK0FGTEFHUyArPSAkKG1mbGFncy15KQorCitib290IDo9IGFyY2gvaTM4Ni9ib290CisKKy5QSE9OWTogekltYWdlIGJ6SW1hZ2UgY29tcHJlc3NlZCB6bGlsbyBiemxpbG8gXAorCXpkaXNrIGJ6ZGlzayBmZGltYWdlIGZkaW1hZ2UxNDQgZmRpbWFnZTI4OCBpbnN0YWxsCisKK2FsbDogYnpJbWFnZQorCisjIEtCVUlMRF9JTUFHRSBzcGVjaWZ5IHRhcmdldCBpbWFnZSBiZWluZyBidWlsdAorICAgICAgICAgICAgICAgICAgICBLQlVJTERfSU1BR0UgOj0gJChib290KS9iekltYWdlCit6SW1hZ2UgemxpbG8gemRpc2s6IEtCVUlMRF9JTUFHRSA6PSBhcmNoL2kzODYvYm9vdC96SW1hZ2UKKworekltYWdlIGJ6SW1hZ2U6IHZtbGludXgKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICQoS0JVSUxEX0lNQUdFKQorCitjb21wcmVzc2VkOiB6SW1hZ2UKKworemxpbG8gYnpsaWxvOiB2bWxpbnV4CisJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBCT09USU1BR0U9JChLQlVJTERfSU1BR0UpIHpsaWxvCisKK3pkaXNrIGJ6ZGlzazogdm1saW51eAorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgQk9PVElNQUdFPSQoS0JVSUxEX0lNQUdFKSB6ZGlzaworCitmZGltYWdlIGZkaW1hZ2UxNDQgZmRpbWFnZTI4ODogdm1saW51eAorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgQk9PVElNQUdFPSQoS0JVSUxEX0lNQUdFKSAkQAorCitpbnN0YWxsOgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgQk9PVElNQUdFPSQoS0JVSUxEX0lNQUdFKSAkQAorCitwcmVwYXJlOiBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FzbV9vZmZzZXRzLmgKK0NMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLSQoQVJDSCkvYXNtX29mZnNldHMuaAorCithcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnM6IGluY2x1ZGUvYXNtIGluY2x1ZGUvbGludXgvdmVyc2lvbi5oIFwKKwkJCQkgICBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKKworaW5jbHVkZS9hc20tJChBUkNIKS9hc21fb2Zmc2V0cy5oOiBhcmNoLyQoQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMKKwkkKGNhbGwgZmlsZWNoayxnZW4tYXNtLW9mZnNldHMpCisKK2FyY2hjbGVhbjoKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL2kzODYvYm9vdAorCitkZWZpbmUgYXJjaGhlbHAKKyAgZWNobyAgJyogYnpJbWFnZQktIENvbXByZXNzZWQga2VybmVsIGltYWdlIChhcmNoLyQoQVJDSCkvYm9vdC9iekltYWdlKScKKyAgZWNobyAgJyAgaW5zdGFsbAktIEluc3RhbGwga2VybmVsIHVzaW5nJworICBlY2hvICAnCQkgICAoeW91cikgfi9iaW4vaW5zdGFsbGtlcm5lbCBvcicKKyAgZWNobyAgJwkJICAgKGRpc3RyaWJ1dGlvbikgL3NiaW4vaW5zdGFsbGtlcm5lbCBvcicKKyAgZWNobyAgJwkJICAgaW5zdGFsbCB0byAkJChJTlNUQUxMX1BBVEgpIGFuZCBydW4gbGlsbycKKyAgZWNobyAgJyAgYnpkaXNrICAgICAgIC0gQ3JlYXRlIGEgYm9vdCBmbG9wcHkgaW4gL2Rldi9mZDAnCisgIGVjaG8gICcgIGZkaW1hZ2UgICAgICAtIENyZWF0ZSBhIGJvb3QgZmxvcHB5IGltYWdlJworZW5kZWYKKworQ0xFQU5fRklMRVMgKz0gYXJjaC8kKEFSQ0gpL2Jvb3QvZmRpbWFnZSBhcmNoLyQoQVJDSCkvYm9vdC9tdG9vbHMuY29uZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUgYi9hcmNoL2kzODYvYm9vdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTcwNjRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUKQEAgLTAsMCArMSwxMDQgQEAKKyMKKyMgYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUKKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTQgYnkgTGludXMgVG9ydmFsZHMKKyMKKworIyBST09UX0RFViBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgcm9vdC1kZXZpY2Ugd2hlbiBtYWtpbmcgdGhlIGltYWdlLgorIyBUaGlzIGNhbiBiZSBlaXRoZXIgRkxPUFBZLCBDVVJSRU5ULCAvZGV2L3h4eHggb3IgZW1wdHksIGluIHdoaWNoIGNhc2UKKyMgdGhlIGRlZmF1bHQgb2YgRkxPUFBZIGlzIHVzZWQgYnkgJ2J1aWxkJy4KKworUk9PVF9ERVYgOj0gQ1VSUkVOVAorCisjIElmIHlvdSB3YW50IHRvIHByZXNldCB0aGUgU1ZHQSBtb2RlLCB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSBhbmQKKyMgc2V0IFNWR0FfTU9ERSB0byB3aGF0ZXZlciBudW1iZXIgeW91IHdhbnQuCisjIFNldCBpdCB0byAtRFNWR0FfTU9ERT1OT1JNQUxfVkdBIGlmIHlvdSBqdXN0IHdhbnQgdGhlIEVHQS9WR0EgbW9kZS4KKyMgVGhlIG51bWJlciBpcyB0aGUgc2FtZSBhcyB5b3Ugd291bGQgb3JkaW5hcmlseSBwcmVzcyBhdCBib290dXAuCisKK1NWR0FfTU9ERSA6PSAtRFNWR0FfTU9ERT1OT1JNQUxfVkdBCisKKyMgSWYgeW91IHdhbnQgdGhlIFJBTSBkaXNrIGRldmljZSwgZGVmaW5lIHRoaXMgdG8gYmUgdGhlIHNpemUgaW4gYmxvY2tzLgorCisjUkFNRElTSyA6PSAtRFJBTURJU0s9NTEyCisKK3RhcmdldHMJCTo9IHZtbGludXguYmluIGJvb3RzZWN0IGJvb3RzZWN0Lm8gc2V0dXAgc2V0dXAubyBcCisJCSAgIHpJbWFnZSBiekltYWdlCitzdWJkaXItIAk6PSBjb21wcmVzc2VkCisKK2hvc3Rwcm9ncy15CTo9IHRvb2xzL2J1aWxkCisKK0hPU1RDRkxBR1NfYnVpbGQubyA6PSAkKExJTlVYSU5DTFVERSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJChvYmopL3pJbWFnZTogIElNQUdFX09GRlNFVCA6PSAweDEwMDAKKyQob2JqKS96SW1hZ2U6ICBFWFRSQV9BRkxBR1MgOj0gLXRyYWRpdGlvbmFsICQoU1ZHQV9NT0RFKSAkKFJBTURJU0spCiskKG9iaikvYnpJbWFnZTogSU1BR0VfT0ZGU0VUIDo9IDB4MTAwMDAwCiskKG9iaikvYnpJbWFnZTogRVhUUkFfQUZMQUdTIDo9IC10cmFkaXRpb25hbCAkKFNWR0FfTU9ERSkgJChSQU1ESVNLKSAtRF9fQklHX0tFUk5FTF9fCiskKG9iaikvYnpJbWFnZTogQlVJTERGTEFHUyAgIDo9IC1iCisKK3F1aWV0X2NtZF9pbWFnZSA9IEJVSUxEICAgJEAKK2NtZF9pbWFnZSA9ICQob2JqKS90b29scy9idWlsZCAkKEJVSUxERkxBR1MpICQob2JqKS9ib290c2VjdCAkKG9iaikvc2V0dXAgXAorCSAgICAkKG9iaikvdm1saW51eC5iaW4gJChST09UX0RFVikgPiAkQAorCiskKG9iaikvekltYWdlICQob2JqKS9iekltYWdlOiAkKG9iaikvYm9vdHNlY3QgJChvYmopL3NldHVwIFwKKwkJCSAgICAgICQob2JqKS92bWxpbnV4LmJpbiAkKG9iaikvdG9vbHMvYnVpbGQgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxpbWFnZSkKKwlAZWNobyAnS2VybmVsOiAkQCBpcyByZWFkeScKKworJChvYmopL3ZtbGludXguYmluOiAkKG9iaikvY29tcHJlc3NlZC92bWxpbnV4IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKKworTERGTEFHU19ib290c2VjdCA6PSAtVHRleHQgMHgwIC1zIC0tb2Zvcm1hdCBiaW5hcnkKK0xERkxBR1Nfc2V0dXAJIDo9IC1UdGV4dCAweDAgLXMgLS1vZm9ybWF0IGJpbmFyeSAtZSBiZWd0ZXh0CisKKyQob2JqKS9zZXR1cCAkKG9iaikvYm9vdHNlY3Q6ICU6ICUubyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQorCiskKG9iaikvY29tcHJlc3NlZC92bWxpbnV4OiBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQob2JqKS9jb21wcmVzc2VkIElNQUdFX09GRlNFVD0kKElNQUdFX09GRlNFVCkgJEAKKworIyBTZXQgdGhpcyBpZiB5b3Ugd2FudCB0byBwYXNzIGFwcGVuZCBhcmd1bWVudHMgdG8gdGhlIHpkaXNrL2ZkaW1hZ2Uga2VybmVsCitGREFSR1MgPSAKKworJChvYmopL210b29scy5jb25mOiAkKHNyYykvbXRvb2xzLmNvbmYuaW4KKwlzZWQgLWUgJ3N8QE9CSkB8JChvYmopfGcnIDwgJDwgPiAkQAorCisjIFRoaXMgcmVxdWlyZXMgd3JpdGUgYWNjZXNzIHRvIC9kZXYvZmQwCit6ZGlzazogJChCT09USU1BR0UpICQob2JqKS9tdG9vbHMuY29uZgorCU1UT09MU1JDPSQob2JqKS9tdG9vbHMuY29uZiBtZm9ybWF0IGE6CQkJOyBzeW5jCisJc3lzbGludXggL2Rldi9mZDAJCQkJCTsgc3luYworCWVjaG8gJ2RlZmF1bHQgbGludXggJChGREFSR1MpJyB8IFwKKwkJTVRPT0xTUkM9JChzcmMpL210b29scy5jb25mIG1jb3B5IC0gYTpzeXNsaW51eC5jZmcKKwlNVE9PTFNSQz0kKG9iaikvbXRvb2xzLmNvbmYgbWNvcHkgJChCT09USU1BR0UpIGE6bGludXgJOyBzeW5jCisKKyMgVGhlc2UgcmVxdWlyZSBiZWluZyByb290IG9yIGhhdmluZyBzeXNsaW51eCAyLjAyIG9yIGhpZ2hlciBpbnN0YWxsZWQKK2ZkaW1hZ2UgZmRpbWFnZTE0NDogJChCT09USU1BR0UpICQob2JqKS9tdG9vbHMuY29uZgorCWRkIGlmPS9kZXYvemVybyBvZj0kKG9iaikvZmRpbWFnZSBicz0xMDI0IGNvdW50PTE0NDAKKwlNVE9PTFNSQz0kKG9iaikvbXRvb2xzLmNvbmYgbWZvcm1hdCB2OgkJCTsgc3luYworCXN5c2xpbnV4ICQob2JqKS9mZGltYWdlCQkJCQk7IHN5bmMKKwllY2hvICdkZWZhdWx0IGxpbnV4ICQoRkRBUkdTKScgfCBcCisJCU1UT09MU1JDPSQob2JqKS9tdG9vbHMuY29uZiBtY29weSAtIHY6c3lzbGludXguY2ZnCisJTVRPT0xTUkM9JChvYmopL210b29scy5jb25mIG1jb3B5ICQoQk9PVElNQUdFKSB2OmxpbnV4CTsgc3luYworCitmZGltYWdlMjg4OiAkKEJPT1RJTUFHRSkgJChvYmopL210b29scy5jb25mCisJZGQgaWY9L2Rldi96ZXJvIG9mPSQob2JqKS9mZGltYWdlIGJzPTEwMjQgY291bnQ9Mjg4MAorCU1UT09MU1JDPSQob2JqKS9tdG9vbHMuY29uZiBtZm9ybWF0IHc6CQkJOyBzeW5jCisJc3lzbGludXggJChvYmopL2ZkaW1hZ2UJCQkJCTsgc3luYworCWVjaG8gJ2RlZmF1bHQgbGludXggJChGREFSR1MpJyB8IFwKKwkJTVRPT0xTUkM9JChvYmopL210b29scy5jb25mIG1jb3B5IC0gdzpzeXNsaW51eC5jZmcKKwlNVE9PTFNSQz0kKG9iaikvbXRvb2xzLmNvbmYgbWNvcHkgJChCT09USU1BR0UpIHc6bGludXgJOyBzeW5jCisKK3psaWxvOiAkKEJPT1RJTUFHRSkKKwlpZiBbIC1mICQoSU5TVEFMTF9QQVRIKS92bWxpbnV6IF07IHRoZW4gbXYgJChJTlNUQUxMX1BBVEgpL3ZtbGludXogJChJTlNUQUxMX1BBVEgpL3ZtbGludXoub2xkOyBmaQorCWlmIFsgLWYgJChJTlNUQUxMX1BBVEgpL1N5c3RlbS5tYXAgXTsgdGhlbiBtdiAkKElOU1RBTExfUEFUSCkvU3lzdGVtLm1hcCAkKElOU1RBTExfUEFUSCkvU3lzdGVtLm9sZDsgZmkKKwljYXQgJChCT09USU1BR0UpID4gJChJTlNUQUxMX1BBVEgpL3ZtbGludXoKKwljcCBTeXN0ZW0ubWFwICQoSU5TVEFMTF9QQVRIKS8KKwlpZiBbIC14IC9zYmluL2xpbG8gXTsgdGhlbiAvc2Jpbi9saWxvOyBlbHNlIC9ldGMvbGlsby9pbnN0YWxsOyBmaQorCitpbnN0YWxsOiAkKEJPT1RJTUFHRSkKKwlzaCAkKHNyY3RyZWUpLyQoc3JjKS9pbnN0YWxsLnNoICQoS0VSTkVMUkVMRUFTRSkgJDwgU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvYm9vdHNlY3QuUyBiL2FyY2gvaTM4Ni9ib290L2Jvb3RzZWN0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5ZmUxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvYm9vdC9ib290c2VjdC5TCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKglib290c2VjdC5TCQlDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKKyAqCisgKgltb2RpZmllZCBieSBEcmV3IEVja2hhcmR0CisgKgltb2RpZmllZCBieSBCcnVjZSBFdmFucyAoYmRlKQorICoJbW9kaWZpZWQgYnkgQ2hyaXMgTm9lIChNYXkgMTk5OSkgKGFzODYgLT4gZ2FzKQorICoJZ3V0dGVkIGJ5IEguIFBldGVyIEFudmluIChKYW4gMjAwMykKKyAqCisgKiBCSUcgRkFUIE5PVEU6IFdlJ3JlIGluIHJlYWwgbW9kZSB1c2luZyA2NGsgc2VnbWVudHMuICBUaGVyZWZvcmUgc2VnbWVudAorICogYWRkcmVzc2VzIG11c3QgYmUgbXVsdGlwbGllZCBieSAxNiB0byBvYnRhaW4gdGhlaXIgcmVzcGVjdGl2ZSBsaW5lYXIKKyAqIGFkZHJlc3Nlcy4gVG8gYXZvaWQgY29uZnVzaW9uLCBsaW5lYXIgYWRkcmVzc2VzIGFyZSB3cml0dGVuIHVzaW5nIGxlYWRpbmcKKyAqIGhleCB3aGlsZSBzZWdtZW50IGFkZHJlc3NlcyBhcmUgd3JpdHRlbiBhcyBzZWdtZW50Om9mZnNldC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS9ib290Lmg+CisKK1NFVFVQU0VDVFMJPSA0CQkJLyogZGVmYXVsdCBuciBvZiBzZXR1cC1zZWN0b3JzICovCitCT09UU0VHCQk9IDB4MDdDMAkJLyogb3JpZ2luYWwgYWRkcmVzcyBvZiBib290LXNlY3RvciAqLworSU5JVFNFRwkJPSBERUZfSU5JVFNFRwkJLyogd2UgbW92ZSBib290IGhlcmUgLSBvdXQgb2YgdGhlIHdheSAqLworU0VUVVBTRUcJPSBERUZfU0VUVVBTRUcJCS8qIHNldHVwIHN0YXJ0cyBoZXJlICovCitTWVNTRUcJCT0gREVGX1NZU1NFRwkJLyogc3lzdGVtIGxvYWRlZCBhdCAweDEwMDAwICg2NTUzNikgKi8KK1NZU1NJWkUJCT0gREVGX1NZU1NJWkUJCS8qIHN5c3RlbSBzaXplOiAjIG9mIDE2LWJ5dGUgY2xpY2tzICovCisJCQkJCS8qIHRvIGJlIGxvYWRlZCAqLworUk9PVF9ERVYJPSAwIAkJCS8qIFJPT1RfREVWIGlzIG5vdyB3cml0dGVuIGJ5ICJidWlsZCIgKi8KK1NXQVBfREVWCT0gMAkJCS8qIFNXQVBfREVWIGlzIG5vdyB3cml0dGVuIGJ5ICJidWlsZCIgKi8KKworI2lmbmRlZiBTVkdBX01PREUKKyNkZWZpbmUgU1ZHQV9NT0RFIEFTS19WR0EKKyNlbmRpZgorCisjaWZuZGVmIFJBTURJU0sKKyNkZWZpbmUgUkFNRElTSyAwCisjZW5kaWYKKworI2lmbmRlZiBST09UX1JET05MWQorI2RlZmluZSBST09UX1JET05MWSAxCisjZW5kaWYKKworLmNvZGUxNgorLnRleHQKKworLmdsb2JhbCBfc3RhcnQKK19zdGFydDoKKworCSMgTm9ybWFsaXplIHRoZSBzdGFydCBhZGRyZXNzCisJam1wbAkkQk9PVFNFRywgJHN0YXJ0MgorCitzdGFydDI6CisJbW92dwklY3MsICVheAorCW1vdncJJWF4LCAlZHMKKwltb3Z3CSVheCwgJWVzCisJbW92dwklYXgsICVzcworCW1vdncJJDB4N2MwMCwgJXNwCisJc3RpCisJY2xkCisKKwltb3Z3CSRidWdnZXJfb2ZmX21zZywgJXNpCisKK21zZ19sb29wOgorCWxvZHNiCisJYW5kYgklYWwsICVhbAorCWp6CWRpZQorCW1vdmIJJDB4ZSwgJWFoCisJbW92dwkkNywgJWJ4CisJaW50CSQweDEwCisJam1wCW1zZ19sb29wCisKK2RpZToKKwkjIEFsbG93IHRoZSB1c2VyIHRvIHByZXNzIGEga2V5LCB0aGVuIHJlYm9vdAorCXhvcncJJWF4LCAlYXgKKwlpbnQJJDB4MTYKKwlpbnQJJDB4MTkKKworCSMgaW50IDB4MTkgc2hvdWxkIG5ldmVyIHJldHVybi4gIEluIGNhc2UgaXQgZG9lcyBhbnl3YXksCisJIyBpbnZva2UgdGhlIEJJT1MgcmVzZXQgY29kZS4uLgorCWxqbXAJJDB4ZjAwMCwkMHhmZmYwCisKKworYnVnZ2VyX29mZl9tc2c6CisJLmFzY2lpCSJEaXJlY3QgYm9vdGluZyBmcm9tIGZsb3BweSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLlxyXG4iCisJLmFzY2lpCSJQbGVhc2UgdXNlIGEgYm9vdCBsb2FkZXIgcHJvZ3JhbSBpbnN0ZWFkLlxyXG4iCisJLmFzY2lpCSJcbiIKKwkuYXNjaWkJIlJlbW92ZSBkaXNrIGFuZCBwcmVzcyBhbnkga2V5IHRvIHJlYm9vdCAuIC4gLlxyXG4iCisJLmJ5dGUJMAorCQorCisJIyBLZXJuZWwgYXR0cmlidXRlczsgdXNlZCBieSBzZXR1cAorCisJLm9yZyA0OTcKK3NldHVwX3NlY3RzOgkuYnl0ZSBTRVRVUFNFQ1RTCityb290X2ZsYWdzOgkud29yZCBST09UX1JET05MWQorc3lzc2l6ZToJLndvcmQgU1lTU0laRQorc3dhcF9kZXY6CS53b3JkIFNXQVBfREVWCityYW1fc2l6ZToJLndvcmQgUkFNRElTSwordmlkX21vZGU6CS53b3JkIFNWR0FfTU9ERQorcm9vdF9kZXY6CS53b3JkIFJPT1RfREVWCitib290X2ZsYWc6CS53b3JkIDB4QUE1NQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZWE5NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTAsMCArMSwyNSBAQAorIworIyBsaW51eC9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisjCisjIGNyZWF0ZSBhIGNvbXByZXNzZWQgdm1saW51eCBpbWFnZSBmcm9tIHRoZSBvcmlnaW5hbCB2bWxpbnV4CisjCisKK3RhcmdldHMJCTo9IHZtbGludXggdm1saW51eC5iaW4gdm1saW51eC5iaW4uZ3ogaGVhZC5vIG1pc2MubyBwaWdneS5vCitFWFRSQV9BRkxBR1MJOj0gLXRyYWRpdGlvbmFsCisKK0xERkxBR1Nfdm1saW51eCA6PSAtVHRleHQgJChJTUFHRV9PRkZTRVQpIC1lIHN0YXJ0dXBfMzIKKworJChvYmopL3ZtbGludXg6ICQob2JqKS9oZWFkLm8gJChvYmopL21pc2MubyAkKG9iaikvcGlnZ3kubyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQorCUA6CisKKyQob2JqKS92bWxpbnV4LmJpbjogdm1saW51eCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCisKKyQob2JqKS92bWxpbnV4LmJpbi5nejogJChvYmopL3ZtbGludXguYmluIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKKworTERGTEFHU19waWdneS5vIDo9IC1yIC0tZm9ybWF0IGJpbmFyeSAtLW9mb3JtYXQgZWxmMzItaTM4NiAtVAorCiskKG9iaikvcGlnZ3kubzogJChvYmopL3ZtbGludXguc2NyICQob2JqKS92bWxpbnV4LmJpbi5neiBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWU4MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAgbGludXgvYm9vdC9oZWFkLlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiAgaGVhZC5TIGNvbnRhaW5zIHRoZSAzMi1iaXQgc3RhcnR1cCBjb2RlLgorICoKKyAqIE5PVEUhISEgU3RhcnR1cCBoYXBwZW5zIGF0IGFic29sdXRlIGFkZHJlc3MgMHgwMDAwMTAwMCwgd2hpY2ggaXMgYWxzbyB3aGVyZQorICogdGhlIHBhZ2UgZGlyZWN0b3J5IHdpbGwgZXhpc3QuIFRoZSBzdGFydHVwIGNvZGUgd2lsbCBiZSBvdmVyd3JpdHRlbiBieQorICogdGhlIHBhZ2UgZGlyZWN0b3J5LiBbQWNjb3JkaW5nIHRvIGNvbW1lbnRzIGV0YyBlbHNld2hlcmUgb24gYSBjb21wcmVzc2VkCisgKiBrZXJuZWwgaXQgd2lsbCBlbmQgdXAgYXQgMHgxMDAwICsgMU1iIEkgaG9wZSBzbyBhcyBJIGFzc3VtZSB0aGlzLiAtIEFDXQorICoKKyAqIFBhZ2UgMCBpcyBkZWxpYmVyYXRlbHkga2VwdCBzYWZlLCBzaW5jZSBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlIGNvZGUgaW4gCisgKiBsYXB0b3BzIG1heSBuZWVkIHRvIGFjY2VzcyB0aGUgQklPUyBkYXRhIHN0b3JlZCB0aGVyZS4gIFRoaXMgaXMgYWxzbworICogdXNlZnVsIGZvciBmdXR1cmUgZGV2aWNlIGRyaXZlcnMgdGhhdCBlaXRoZXIgYWNjZXNzIHRoZSBCSU9TIHZpYSBWTTg2IAorICogbW9kZS4KKyAqLworCisvKgorICogSGlnaCBsb2FkZWQgc3R1ZmYgYnkgSGFucyBMZXJtZW4gJiBXZXJuZXIgQWxtZXNiZXJnZXIsIEZlYi4gMTk5NgorICovCisudGV4dAorCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisKKwkuZ2xvYmwgc3RhcnR1cF8zMgorCQorc3RhcnR1cF8zMjoKKwljbGQKKwljbGkKKwltb3ZsICQoX19CT09UX0RTKSwlZWF4CisJbW92bCAlZWF4LCVkcworCW1vdmwgJWVheCwlZXMKKwltb3ZsICVlYXgsJWZzCisJbW92bCAlZWF4LCVncworCisJbHNzIHN0YWNrX3N0YXJ0LCVlc3AKKwl4b3JsICVlYXgsJWVheAorMToJaW5jbCAlZWF4CQkjIGNoZWNrIHRoYXQgQTIwIHJlYWxseSBJUyBlbmFibGVkCisJbW92bCAlZWF4LDB4MDAwMDAwCSMgbG9vcCBmb3JldmVyIGlmIGl0IGlzbid0CisJY21wbCAlZWF4LDB4MTAwMDAwCisJamUgMWIKKworLyoKKyAqIEluaXRpYWxpemUgZWZsYWdzLiAgU29tZSBCSU9TJ3MgbGVhdmUgYml0cyBsaWtlIE5UIHNldC4gIFRoaXMgd291bGQKKyAqIGNvbmZ1c2UgdGhlIGRlYnVnZ2VyIGlmIHRoaXMgY29kZSBpcyB0cmFjZWQuCisgKiBYWFggLSBiZXN0IHRvIGluaXRpYWxpemUgYmVmb3JlIHN3aXRjaGluZyB0byBwcm90ZWN0ZWQgbW9kZS4KKyAqLworCXB1c2hsICQwCisJcG9wZmwKKy8qCisgKiBDbGVhciBCU1MKKyAqLworCXhvcmwgJWVheCwlZWF4CisJbW92bCAkX2VkYXRhLCVlZGkKKwltb3ZsICRfZW5kLCVlY3gKKwlzdWJsICVlZGksJWVjeAorCWNsZAorCXJlcAorCXN0b3NiCisvKgorICogRG8gdGhlIGRlY29tcHJlc3Npb24sIGFuZCBqdW1wIHRvIHRoZSBuZXcga2VybmVsLi4KKyAqLworCXN1YmwgJDE2LCVlc3AJIyBwbGFjZSBmb3Igc3RydWN0dXJlIG9uIHRoZSBzdGFjaworCW1vdmwgJWVzcCwlZWF4CisJcHVzaGwgJWVzaQkjIHJlYWwgbW9kZSBwb2ludGVyIGFzIHNlY29uZCBhcmcKKwlwdXNobCAlZWF4CSMgYWRkcmVzcyBvZiBzdHJ1Y3R1cmUgYXMgZmlyc3QgYXJnCisJY2FsbCBkZWNvbXByZXNzX2tlcm5lbAorCW9ybCAgJWVheCwlZWF4IAorCWpueiAgM2YKKwlwb3BsICVlc2kJIyBkaXNjYXJkIGFkZHJlc3MKKwlwb3BsICVlc2kJIyByZWFsIG1vZGUgcG9pbnRlcgorCXhvcmwgJWVieCwlZWJ4CisJbGptcCAkKF9fQk9PVF9DUyksICQweDEwMDAwMAorCisvKgorICogV2UgY29tZSBoZXJlLCBpZiB3ZSB3ZXJlIGxvYWRlZCBoaWdoLgorICogV2UgbmVlZCB0byBtb3ZlIHRoZSBtb3ZlLWluLXBsYWNlIHJvdXRpbmUgZG93biB0byAweDEwMDAKKyAqIGFuZCB0aGVuIHN0YXJ0IGl0IHdpdGggdGhlIGJ1ZmZlciBhZGRyZXNzZXMgaW4gcmVnaXN0ZXJzLAorICogd2hpY2ggd2UgZ290IGZyb20gdGhlIHN0YWNrLgorICovCiszOgorCW1vdmwgJG1vdmVfcm91dGluZV9zdGFydCwlZXNpCisJbW92bCAkMHgxMDAwLCVlZGkKKwltb3ZsICRtb3ZlX3JvdXRpbmVfZW5kLCVlY3gKKwlzdWJsICVlc2ksJWVjeAorCWFkZGwgJDMsJWVjeAorCXNocmwgJDIsJWVjeAorCWNsZAorCXJlcAorCW1vdnNsCisKKwlwb3BsICVlc2kJIyBkaXNjYXJkIHRoZSBhZGRyZXNzCisJcG9wbCAlZWJ4CSMgcmVhbCBtb2RlIHBvaW50ZXIKKwlwb3BsICVlc2kJIyBsb3dfYnVmZmVyX3N0YXJ0CisJcG9wbCAlZWN4CSMgbGNvdW50CisJcG9wbCAlZWR4CSMgaGlnaF9idWZmZXJfc3RhcnQKKwlwb3BsICVlYXgJIyBoY291bnQKKwltb3ZsICQweDEwMDAwMCwlZWRpCisJY2xpCQkjIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgaW50ZXJydXB0ZWQKKwlsam1wICQoX19CT09UX0NTKSwgJDB4MTAwMCAjIGFuZCBqdW1wIHRvIHRoZSBtb3ZlIHJvdXRpbmUKKworLyoKKyAqIFJvdXRpbmUgKHRlbXBsYXRlKSBmb3IgbW92aW5nIHRoZSBkZWNvbXByZXNzZWQga2VybmVsIGluIHBsYWNlLAorICogaWYgd2Ugd2VyZSBoaWdoIGxvYWRlZC4gVGhpcyBfbXVzdF8gUElDLWNvZGUgIQorICovCittb3ZlX3JvdXRpbmVfc3RhcnQ6CisJbW92bCAlZWN4LCVlYnAKKwlzaHJsICQyLCVlY3gKKwlyZXAKKwltb3ZzbAorCW1vdmwgJWVicCwlZWN4CisJYW5kbCAkMywlZWN4CisJcmVwCisJbW92c2IKKwltb3ZsICVlZHgsJWVzaQorCW1vdmwgJWVheCwlZWN4CSMgTk9URTogcmVwIG1vdnNiIHdvbid0IG1vdmUgaWYgJWVjeCA9PSAwCisJYWRkbCAkMywlZWN4CisJc2hybCAkMiwlZWN4CisJcmVwCisJbW92c2wKKwltb3ZsICVlYngsJWVzaQkjIFJlc3RvcmUgc2V0dXAgcG9pbnRlcgorCXhvcmwgJWVieCwlZWJ4CisJbGptcCAkKF9fQk9PVF9DUyksICQweDEwMDAwMAorbW92ZV9yb3V0aW5lX2VuZDoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jIGIvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2NzA0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogbWlzYy5jCisgKiAKKyAqIFRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIHNldmVyYWwgcm91dGluZXMgZnJvbSBnemlwLTEuMC4zIAorICogYWRhcHRlZCBmb3IgTGludXguCisgKgorICogbWFsbG9jIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5MyBhbmQgTWF0dGhpYXMgVXJsaWNocyAxOTk0CisgKiBwdXRzIGJ5IE5pY2sgSG9sbG93YXkgMTk5MywgYmV0dGVyIHB1dHMgYnkgTWFydGluIE1hcmVzIDE5OTUKKyAqIEhpZ2ggbG9hZGVkIHN0dWZmIGJ5IEhhbnMgTGVybWVuICYgV2VybmVyIEFsbWVzYmVyZ2VyLCBGZWIuIDE5OTYKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDx2aWRlby9lZGlkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qCisgKiBnemlwIGRlY2xhcmF0aW9ucworICovCisKKyNkZWZpbmUgT0YoYXJncykgIGFyZ3MKKyNkZWZpbmUgU1RBVElDIHN0YXRpYworCisjdW5kZWYgbWVtc2V0CisjdW5kZWYgbWVtY3B5CisKKy8qCisgKiBXaHkgZG8gd2UgZG8gdGhpcz8gRG9uJ3QgYXNrIG1lLi4KKyAqCisgKiBJbmNvbXByZWhlbnNpYmxlIGFyZSB0aGUgd2F5cyBvZiBib290bG9hZGVycy4KKyAqLworc3RhdGljIHZvaWQqIG1lbXNldCh2b2lkICosIGludCwgc2l6ZV90KTsKK3N0YXRpYyB2b2lkKiBtZW1jcHkodm9pZCAqLCBfX2NvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKyNkZWZpbmUgbWVtemVybyhzLCBuKSAgICAgbWVtc2V0ICgocyksIDAsIChuKSkKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1Y2g7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOworCisjZGVmaW5lIFdTSVpFIDB4ODAwMAkJLyogV2luZG93IHNpemUgbXVzdCBiZSBhdCBsZWFzdCAzMmssICovCisJCQkJLyogYW5kIGEgcG93ZXIgb2YgdHdvICovCisKK3N0YXRpYyB1Y2ggKmluYnVmOwkgICAgIC8qIGlucHV0IGJ1ZmZlciAqLworc3RhdGljIHVjaCB3aW5kb3dbV1NJWkVdOyAgICAvKiBTbGlkaW5nIHdpbmRvdyBidWZmZXIgKi8KKworc3RhdGljIHVuc2lnbmVkIGluc2l6ZSA9IDA7ICAvKiB2YWxpZCBieXRlcyBpbiBpbmJ1ZiAqLworc3RhdGljIHVuc2lnbmVkIGlucHRyID0gMDsgICAvKiBpbmRleCBvZiBuZXh0IGJ5dGUgdG8gYmUgcHJvY2Vzc2VkIGluIGluYnVmICovCitzdGF0aWMgdW5zaWduZWQgb3V0Y250ID0gMDsgIC8qIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KKworLyogZ3ppcCBmbGFnIGJ5dGUgKi8KKyNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEgLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IEFTQ0lJIHRleHQgKi8KKyNkZWZpbmUgQ09OVElOVUFUSU9OIDB4MDIgLyogYml0IDEgc2V0OiBjb250aW51YXRpb24gb2YgbXVsdGktcGFydCBnemlwIGZpbGUgKi8KKyNkZWZpbmUgRVhUUkFfRklFTEQgIDB4MDQgLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisjZGVmaW5lIE9SSUdfTkFNRSAgICAweDA4IC8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKyNkZWZpbmUgQ09NTUVOVCAgICAgIDB4MTAgLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLworI2RlZmluZSBFTkNSWVBURUQgICAgMHgyMCAvKiBiaXQgNSBzZXQ6IGZpbGUgaXMgZW5jcnlwdGVkICovCisjZGVmaW5lIFJFU0VSVkVEICAgICAweEMwIC8qIGJpdCA2LDc6ICAgcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBnZXRfYnl0ZSgpICAoaW5wdHIgPCBpbnNpemUgPyBpbmJ1ZltpbnB0cisrXSA6IGZpbGxfaW5idWYoKSkKKwkJCisvKiBEaWFnbm9zdGljIGZ1bmN0aW9ucyAqLworI2lmZGVmIERFQlVHCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgZXJyb3IobXNnKTt9CisjICBkZWZpbmUgVHJhY2UoeCkgZnByaW50ZiB4CisjICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAodmVyYm9zZSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2V2dih4KSB7aWYgKHZlcmJvc2U+MSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh2ZXJib3NlICYmIChjKSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjdihjLHgpIHtpZiAodmVyYm9zZT4xICYmIChjKSkgZnByaW50ZiB4IDt9CisjZWxzZQorIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKKyMgIGRlZmluZSBUcmFjZSh4KQorIyAgZGVmaW5lIFRyYWNldih4KQorIyAgZGVmaW5lIFRyYWNldnYoeCkKKyMgIGRlZmluZSBUcmFjZWMoYyx4KQorIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQorI2VuZGlmCisKK3N0YXRpYyBpbnQgIGZpbGxfaW5idWYodm9pZCk7CitzdGF0aWMgdm9pZCBmbHVzaF93aW5kb3codm9pZCk7CitzdGF0aWMgdm9pZCBlcnJvcihjaGFyICptKTsKK3N0YXRpYyB2b2lkIGd6aXBfbWFyayh2b2lkICoqKTsKK3N0YXRpYyB2b2lkIGd6aXBfcmVsZWFzZSh2b2lkICoqKTsKKyAgCisvKgorICogVGhpcyBpcyBzZXQgdXAgYnkgdGhlIHNldHVwLXJvdXRpbmUgYXQgYm9vdC10aW1lCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpyZWFsX21vZGU7IC8qIFBvaW50ZXIgdG8gcmVhbC1tb2RlIGRhdGEgKi8KKworI2RlZmluZSBSTV9FWFRfTUVNX0sgICAoKih1bnNpZ25lZCBzaG9ydCAqKShyZWFsX21vZGUgKyAweDIpKQorI2lmbmRlZiBTVEFOREFSRF9NRU1PUllfQklPU19DQUxMCisjZGVmaW5lIFJNX0FMVF9NRU1fSyAgICgqKHVuc2lnbmVkIGxvbmcgKikocmVhbF9tb2RlICsgMHgxZTApKQorI2VuZGlmCisjZGVmaW5lIFJNX1NDUkVFTl9JTkZPICgqKHN0cnVjdCBzY3JlZW5faW5mbyAqKShyZWFsX21vZGUrMCkpCisKK2V4dGVybiBjaGFyIGlucHV0X2RhdGFbXTsKK2V4dGVybiBpbnQgaW5wdXRfbGVuOworCitzdGF0aWMgbG9uZyBieXRlc19vdXQgPSAwOworc3RhdGljIHVjaCAqb3V0cHV0X2RhdGE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBvdXRwdXRfcHRyID0gMDsKKworc3RhdGljIHZvaWQgKm1hbGxvYyhpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZCBmcmVlKHZvaWQgKndoZXJlKTsKKworc3RhdGljIHZvaWQgcHV0c3RyKGNvbnN0IGNoYXIgKik7CisKK2V4dGVybiBpbnQgZW5kOworc3RhdGljIGxvbmcgZnJlZV9tZW1fcHRyID0gKGxvbmcpJmVuZDsKK3N0YXRpYyBsb25nIGZyZWVfbWVtX2VuZF9wdHI7CisKKyNkZWZpbmUgSU5QTEFDRV9NT1ZFX1JPVVRJTkUgIDB4MTAwMAorI2RlZmluZSBMT1dfQlVGRkVSX1NUQVJUICAgICAgMHgyMDAwCisjZGVmaW5lIExPV19CVUZGRVJfTUFYICAgICAgIDB4OTAwMDAKKyNkZWZpbmUgSEVBUF9TSVpFICAgICAgICAgICAgIDB4MzAwMAorc3RhdGljIHVuc2lnbmVkIGludCBsb3dfYnVmZmVyX2VuZCwgbG93X2J1ZmZlcl9zaXplOworc3RhdGljIGludCBoaWdoX2xvYWRlZCA9MDsKK3N0YXRpYyB1Y2ggKmhpZ2hfYnVmZmVyX3N0YXJ0IC8qID0gKHVjaCAqKSgoKHVsZykmZW5kKSArIEhFQVBfU0laRSkqLzsKKworc3RhdGljIGNoYXIgKnZpZG1lbSA9IChjaGFyICopMHhiODAwMDsKK3N0YXRpYyBpbnQgdmlkcG9ydDsKK3N0YXRpYyBpbnQgbGluZXMsIGNvbHM7CisKKyNpZmRlZiBDT05GSUdfWDg2X05VTUFRCitzdGF0aWMgdm9pZCAqIHhxdWFkX3BvcnRpbyA9IE5VTEw7CisjZW5kaWYKKworI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2xpYi9pbmZsYXRlLmMiCisKK3N0YXRpYyB2b2lkICptYWxsb2MoaW50IHNpemUpCit7CisJdm9pZCAqcDsKKworCWlmIChzaXplIDwwKSBlcnJvcigiTWFsbG9jIGVycm9yIik7CisJaWYgKGZyZWVfbWVtX3B0ciA8PSAwKSBlcnJvcigiTWVtb3J5IGVycm9yIik7CisKKwlmcmVlX21lbV9wdHIgPSAoZnJlZV9tZW1fcHRyICsgMykgJiB+MzsJLyogQWxpZ24gKi8KKworCXAgPSAodm9pZCAqKWZyZWVfbWVtX3B0cjsKKwlmcmVlX21lbV9wdHIgKz0gc2l6ZTsKKworCWlmIChmcmVlX21lbV9wdHIgPj0gZnJlZV9tZW1fZW5kX3B0cikKKwkJZXJyb3IoIk91dCBvZiBtZW1vcnkiKTsKKworCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBmcmVlKHZvaWQgKndoZXJlKQorewkvKiBEb24ndCBjYXJlICovCit9CisKK3N0YXRpYyB2b2lkIGd6aXBfbWFyayh2b2lkICoqcHRyKQoreworCSpwdHIgPSAodm9pZCAqKSBmcmVlX21lbV9wdHI7Cit9CisKK3N0YXRpYyB2b2lkIGd6aXBfcmVsZWFzZSh2b2lkICoqcHRyKQoreworCWZyZWVfbWVtX3B0ciA9IChsb25nKSAqcHRyOworfQorIAorc3RhdGljIHZvaWQgc2Nyb2xsKHZvaWQpCit7CisJaW50IGk7CisKKwltZW1jcHkgKCB2aWRtZW0sIHZpZG1lbSArIGNvbHMgKiAyLCAoIGxpbmVzIC0gMSApICogY29scyAqIDIgKTsKKwlmb3IgKCBpID0gKCBsaW5lcyAtIDEgKSAqIGNvbHMgKiAyOyBpIDwgbGluZXMgKiBjb2xzICogMjsgaSArPSAyICkKKwkJdmlkbWVtW2ldID0gJyAnOworfQorCitzdGF0aWMgdm9pZCBwdXRzdHIoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgeCx5LHBvczsKKwljaGFyIGM7CisKKwl4ID0gUk1fU0NSRUVOX0lORk8ub3JpZ194OworCXkgPSBSTV9TQ1JFRU5fSU5GTy5vcmlnX3k7CisKKwl3aGlsZSAoICggYyA9ICpzKysgKSAhPSAnXDAnICkgeworCQlpZiAoIGMgPT0gJ1xuJyApIHsKKwkJCXggPSAwOworCQkJaWYgKCArK3kgPj0gbGluZXMgKSB7CisJCQkJc2Nyb2xsKCk7CisJCQkJeS0tOworCQkJfQorCQl9IGVsc2UgeworCQkJdmlkbWVtIFsgKCB4ICsgY29scyAqIHkgKSAqIDIgXSA9IGM7IAorCQkJaWYgKCArK3ggPj0gY29scyApIHsKKwkJCQl4ID0gMDsKKwkJCQlpZiAoICsreSA+PSBsaW5lcyApIHsKKwkJCQkJc2Nyb2xsKCk7CisJCQkJCXktLTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlSTV9TQ1JFRU5fSU5GTy5vcmlnX3ggPSB4OworCVJNX1NDUkVFTl9JTkZPLm9yaWdfeSA9IHk7CisKKwlwb3MgPSAoeCArIGNvbHMgKiB5KSAqIDI7CS8qIFVwZGF0ZSBjdXJzb3IgcG9zaXRpb24gKi8KKwlvdXRiX3AoMTQsIHZpZHBvcnQpOworCW91dGJfcCgweGZmICYgKHBvcyA+PiA5KSwgdmlkcG9ydCsxKTsKKwlvdXRiX3AoMTUsIHZpZHBvcnQpOworCW91dGJfcCgweGZmICYgKHBvcyA+PiAxKSwgdmlkcG9ydCsxKTsKK30KKworc3RhdGljIHZvaWQqIG1lbXNldCh2b2lkKiBzLCBpbnQgYywgc2l6ZV90IG4pCit7CisJaW50IGk7CisJY2hhciAqc3MgPSAoY2hhciopczsKKworCWZvciAoaT0wO2k8bjtpKyspIHNzW2ldID0gYzsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQqIG1lbWNweSh2b2lkKiBfX2Rlc3QsIF9fY29uc3Qgdm9pZCogX19zcmMsCisJCQkgICAgc2l6ZV90IF9fbikKK3sKKwlpbnQgaTsKKwljaGFyICpkID0gKGNoYXIgKilfX2Rlc3QsICpzID0gKGNoYXIgKilfX3NyYzsKKworCWZvciAoaT0wO2k8X19uO2krKykgZFtpXSA9IHNbaV07CisJcmV0dXJuIF9fZGVzdDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaWxsIHRoZSBpbnB1dCBidWZmZXIuIFRoaXMgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5CisgKiBhbmQgYXQgbGVhc3Qgb25lIGJ5dGUgaXMgcmVhbGx5IG5lZWRlZC4KKyAqLworc3RhdGljIGludCBmaWxsX2luYnVmKHZvaWQpCit7CisJaWYgKGluc2l6ZSAhPSAwKSB7CisJCWVycm9yKCJyYW4gb3V0IG9mIGlucHV0IGRhdGEiKTsKKwl9CisKKwlpbmJ1ZiA9IGlucHV0X2RhdGE7CisJaW5zaXplID0gaW5wdXRfbGVuOworCWlucHRyID0gMTsKKwlyZXR1cm4gaW5idWZbMF07Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogV3JpdGUgdGhlIG91dHB1dCB3aW5kb3cgd2luZG93WzAuLm91dGNudC0xXSBhbmQgdXBkYXRlIGNyYyBhbmQgYnl0ZXNfb3V0LgorICogKFVzZWQgZm9yIHRoZSBkZWNvbXByZXNzZWQgZGF0YSBvbmx5LikKKyAqLworc3RhdGljIHZvaWQgZmx1c2hfd2luZG93X2xvdyh2b2lkKQoreworICAgIHVsZyBjID0gY3JjOyAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLworICAgIHVuc2lnbmVkIG47CisgICAgdWNoICppbiwgKm91dCwgY2g7CisgICAgCisgICAgaW4gPSB3aW5kb3c7CisgICAgb3V0ID0gJm91dHB1dF9kYXRhW291dHB1dF9wdHJdOyAKKyAgICBmb3IgKG4gPSAwOyBuIDwgb3V0Y250OyBuKyspIHsKKwkgICAgY2ggPSAqb3V0KysgPSAqaW4rKzsKKwkgICAgYyA9IGNyY18zMl90YWJbKChpbnQpYyBeIGNoKSAmIDB4ZmZdIF4gKGMgPj4gOCk7CisgICAgfQorICAgIGNyYyA9IGM7CisgICAgYnl0ZXNfb3V0ICs9ICh1bGcpb3V0Y250OworICAgIG91dHB1dF9wdHIgKz0gKHVsZylvdXRjbnQ7CisgICAgb3V0Y250ID0gMDsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfd2luZG93X2hpZ2godm9pZCkKK3sKKyAgICB1bGcgYyA9IGNyYzsgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KKyAgICB1bnNpZ25lZCBuOworICAgIHVjaCAqaW4sICBjaDsKKyAgICBpbiA9IHdpbmRvdzsKKyAgICBmb3IgKG4gPSAwOyBuIDwgb3V0Y250OyBuKyspIHsKKwljaCA9ICpvdXRwdXRfZGF0YSsrID0gKmluKys7CisJaWYgKCh1bGcpb3V0cHV0X2RhdGEgPT0gbG93X2J1ZmZlcl9lbmQpIG91dHB1dF9kYXRhPWhpZ2hfYnVmZmVyX3N0YXJ0OworCWMgPSBjcmNfMzJfdGFiWygoaW50KWMgXiBjaCkgJiAweGZmXSBeIChjID4+IDgpOworICAgIH0KKyAgICBjcmMgPSBjOworICAgIGJ5dGVzX291dCArPSAodWxnKW91dGNudDsKKyAgICBvdXRjbnQgPSAwOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF93aW5kb3codm9pZCkKK3sKKwlpZiAoaGlnaF9sb2FkZWQpIGZsdXNoX3dpbmRvd19oaWdoKCk7CisJZWxzZSBmbHVzaF93aW5kb3dfbG93KCk7Cit9CisKK3N0YXRpYyB2b2lkIGVycm9yKGNoYXIgKngpCit7CisJcHV0c3RyKCJcblxuIik7CisJcHV0c3RyKHgpOworCXB1dHN0cigiXG5cbiAtLSBTeXN0ZW0gaGFsdGVkIik7CisKKwl3aGlsZSgxKTsJLyogSGFsdCAqLworfQorCisjZGVmaW5lIFNUQUNLX1NJWkUgKDQwOTYpCisKK2xvbmcgdXNlcl9zdGFjayBbU1RBQ0tfU0laRV07CisKK3N0cnVjdCB7CisJbG9uZyAqIGE7CisJc2hvcnQgYjsKKwl9IHN0YWNrX3N0YXJ0ID0geyAmIHVzZXJfc3RhY2sgW1NUQUNLX1NJWkVdICwgX19CT09UX0RTIH07CisKK3N0YXRpYyB2b2lkIHNldHVwX25vcm1hbF9vdXRwdXRfYnVmZmVyKHZvaWQpCit7CisjaWZkZWYgU1RBTkRBUkRfTUVNT1JZX0JJT1NfQ0FMTAorCWlmIChSTV9FWFRfTUVNX0sgPCAxMDI0KSBlcnJvcigiTGVzcyB0aGFuIDJNQiBvZiBtZW1vcnkiKTsKKyNlbHNlCisJaWYgKChSTV9BTFRfTUVNX0sgPiBSTV9FWFRfTUVNX0sgPyBSTV9BTFRfTUVNX0sgOiBSTV9FWFRfTUVNX0spIDwgMTAyNCkgZXJyb3IoIkxlc3MgdGhhbiAyTUIgb2YgbWVtb3J5Iik7CisjZW5kaWYKKwlvdXRwdXRfZGF0YSA9IChjaGFyICopMHgxMDAwMDA7IC8qIFBvaW50cyB0byAxTSAqLworCWZyZWVfbWVtX2VuZF9wdHIgPSAobG9uZylyZWFsX21vZGU7Cit9CisKK3N0cnVjdCBtb3ZlcGFyYW1zIHsKKwl1Y2ggKmxvd19idWZmZXJfc3RhcnQ7ICBpbnQgbGNvdW50OworCXVjaCAqaGlnaF9idWZmZXJfc3RhcnQ7IGludCBoY291bnQ7Cit9OworCitzdGF0aWMgdm9pZCBzZXR1cF9vdXRwdXRfYnVmZmVyX2lmX3dlX3J1bl9oaWdoKHN0cnVjdCBtb3ZlcGFyYW1zICptdikKK3sKKwloaWdoX2J1ZmZlcl9zdGFydCA9ICh1Y2ggKikoKCh1bGcpJmVuZCkgKyBIRUFQX1NJWkUpOworI2lmZGVmIFNUQU5EQVJEX01FTU9SWV9CSU9TX0NBTEwKKwlpZiAoUk1fRVhUX01FTV9LIDwgKDMqMTAyNCkpIGVycm9yKCJMZXNzIHRoYW4gNE1CIG9mIG1lbW9yeSIpOworI2Vsc2UKKwlpZiAoKFJNX0FMVF9NRU1fSyA+IFJNX0VYVF9NRU1fSyA/IFJNX0FMVF9NRU1fSyA6IFJNX0VYVF9NRU1fSykgPAorCQkJKDMqMTAyNCkpCisJCWVycm9yKCJMZXNzIHRoYW4gNE1CIG9mIG1lbW9yeSIpOworI2VuZGlmCQorCW12LT5sb3dfYnVmZmVyX3N0YXJ0ID0gb3V0cHV0X2RhdGEgPSAoY2hhciAqKUxPV19CVUZGRVJfU1RBUlQ7CisJbG93X2J1ZmZlcl9lbmQgPSAoKHVuc2lnbmVkIGludClyZWFsX21vZGUgPiBMT1dfQlVGRkVSX01BWAorCSAgPyBMT1dfQlVGRkVSX01BWCA6ICh1bnNpZ25lZCBpbnQpcmVhbF9tb2RlKSAmIH4weGZmZjsKKwlsb3dfYnVmZmVyX3NpemUgPSBsb3dfYnVmZmVyX2VuZCAtIExPV19CVUZGRVJfU1RBUlQ7CisJaGlnaF9sb2FkZWQgPSAxOworCWZyZWVfbWVtX2VuZF9wdHIgPSAobG9uZyloaWdoX2J1ZmZlcl9zdGFydDsKKwlpZiAoICgweDEwMDAwMCArIGxvd19idWZmZXJfc2l6ZSkgPiAoKHVsZyloaWdoX2J1ZmZlcl9zdGFydCkpIHsKKwkJaGlnaF9idWZmZXJfc3RhcnQgPSAodWNoICopKDB4MTAwMDAwICsgbG93X2J1ZmZlcl9zaXplKTsKKwkJbXYtPmhjb3VudCA9IDA7IC8qIHNheTogd2UgbmVlZCBub3QgdG8gbW92ZSBoaWdoX2J1ZmZlciAqLworCX0KKwllbHNlIG12LT5oY291bnQgPSAtMTsKKwltdi0+aGlnaF9idWZmZXJfc3RhcnQgPSBoaWdoX2J1ZmZlcl9zdGFydDsKK30KKworc3RhdGljIHZvaWQgY2xvc2Vfb3V0cHV0X2J1ZmZlcl9pZl93ZV9ydW5faGlnaChzdHJ1Y3QgbW92ZXBhcmFtcyAqbXYpCit7CisJaWYgKGJ5dGVzX291dCA+IGxvd19idWZmZXJfc2l6ZSkgeworCQltdi0+bGNvdW50ID0gbG93X2J1ZmZlcl9zaXplOworCQlpZiAobXYtPmhjb3VudCkKKwkJCW12LT5oY291bnQgPSBieXRlc19vdXQgLSBsb3dfYnVmZmVyX3NpemU7CisJfSBlbHNlIHsKKwkJbXYtPmxjb3VudCA9IGJ5dGVzX291dDsKKwkJbXYtPmhjb3VudCA9IDA7CisJfQorfQorCisKK2FzbWxpbmthZ2UgaW50IGRlY29tcHJlc3Nfa2VybmVsKHN0cnVjdCBtb3ZlcGFyYW1zICptdiwgdm9pZCAqcm1vZGUpCit7CisJcmVhbF9tb2RlID0gcm1vZGU7CisKKwlpZiAoUk1fU0NSRUVOX0lORk8ub3JpZ192aWRlb19tb2RlID09IDcpIHsKKwkJdmlkbWVtID0gKGNoYXIgKikgMHhiMDAwMDsKKwkJdmlkcG9ydCA9IDB4M2I0OworCX0gZWxzZSB7CisJCXZpZG1lbSA9IChjaGFyICopIDB4YjgwMDA7CisJCXZpZHBvcnQgPSAweDNkNDsKKwl9CisKKwlsaW5lcyA9IFJNX1NDUkVFTl9JTkZPLm9yaWdfdmlkZW9fbGluZXM7CisJY29scyA9IFJNX1NDUkVFTl9JTkZPLm9yaWdfdmlkZW9fY29sczsKKworCWlmIChmcmVlX21lbV9wdHIgPCAweDEwMDAwMCkgc2V0dXBfbm9ybWFsX291dHB1dF9idWZmZXIoKTsKKwllbHNlIHNldHVwX291dHB1dF9idWZmZXJfaWZfd2VfcnVuX2hpZ2gobXYpOworCisJbWFrZWNyYygpOworCXB1dHN0cigiVW5jb21wcmVzc2luZyBMaW51eC4uLiAiKTsKKwlndW56aXAoKTsKKwlwdXRzdHIoIk9rLCBib290aW5nIHRoZSBrZXJuZWwuXG4iKTsKKwlpZiAoaGlnaF9sb2FkZWQpIGNsb3NlX291dHB1dF9idWZmZXJfaWZfd2VfcnVuX2hpZ2gobXYpOworCXJldHVybiBoaWdoX2xvYWRlZDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXguc2NyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZDlkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXguc2NyCkBAIC0wLDAgKzEsOSBAQAorU0VDVElPTlMKK3sKKyAgLmRhdGEgOiB7IAorCWlucHV0X2xlbiA9IC47CisJTE9ORyhpbnB1dF9kYXRhX2VuZCAtIGlucHV0X2RhdGEpIGlucHV0X2RhdGEgPSAuOyAKKwkqKC5kYXRhKSAKKwlpbnB1dF9kYXRhX2VuZCA9IC47IAorCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L2VkZC5TIGIvYXJjaC9pMzg2L2Jvb3QvZWRkLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3ZDZiMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9ib290L2VkZC5TCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIHN1cHBvcnQKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCBEZWxsLCBJbmMuCisgKiBieSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+IE9jdG9iZXIgMjAwMgorICogY29uZm9ybWFudCB0byBUMTMgQ29tbWl0dGVlIHd3dy50MTMub3JnCisgKiAgIHByb2plY3RzIDE1NzJELCAxNDg0RCwgMTM4NkQsIDEyMjZEVAorICogZGlzayBzaWduYXR1cmUgcmVhZCBieSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKglhbmQgQW5kcmV3IFdpbGtzIDxBbmRyZXdfV2lsa3NAZGVsbC5jb20+IFNlcHRlbWJlciAyMDAzLCBKdW5lIDIwMDQKKyAqIGxlZ2FjeSBDSFMgcmV0cmVpdmFsIGJ5IFBhdHJpY2sgSi4gTG9QcmVzdGkgPHBhdGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogICAgICBNYXJjaCAyMDA0CisgKiBDb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNpbmcsIE1hdHQgRG9tc2NoLCBOb3ZlbWJlciAyMDA0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2VkZC5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfRUREKSB8fCBkZWZpbmVkKENPTkZJR19FRERfTU9EVUxFKQorCW1vdmIJJDAsIChFRERfTUJSX1NJR19OUl9CVUYpCisJbW92YgkkMCwgKEVERE5SKQorCisjIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgZm9yIHR3byBvcHRpb25zOgorIyBlZGQ9b2YgIGRpc2FibGVzIEVERCBjb21wbGV0ZWx5ICAoZWRkPW9mZikKKyMgZWRkPXNrICBza2lwcyB0aGUgTUJSIHRlc3QgICAgKGVkZD1za2lwbWJyKQorCXB1c2hsCSVlc2kKKyAgICAJY21wbAkkMCwgJWNzOmNtZF9saW5lX3B0cgorCWp6CWRvbmVfY2wKKwltb3ZsCSVjczooY21kX2xpbmVfcHRyKSwgJWVzaQorIyBkczplc2kgaGFzIHRoZSBwb2ludGVyIHRvIHRoZSBjb21tYW5kIGxpbmUgbm93CisJbW92bAkkKENPTU1BTkRfTElORV9TSVpFLTcpLCAlZWN4CisjIGxvb3AgdGhyb3VnaCBrZXJuZWwgY29tbWFuZCBsaW5lIG9uZSBieXRlIGF0IGEgdGltZQorY2xfbG9vcDoKKwljbXBsCSRFRERfQ0xfRVFVQUxTLCAoJXNpKQorCWp6CWZvdW5kX2VkZF9lcXVhbHMKKwlpbmNsCSVlc2kKKwlsb29wCWNsX2xvb3AKKwlqbXAJZG9uZV9jbAorZm91bmRfZWRkX2VxdWFsczoKKyMgb25seSBsb29raW5nIGF0IGZpcnN0IHR3byBjaGFyYWN0ZXJzIGFmdGVyIGVxdWFscworICAgIAlhZGRsCSQ0LCAlZXNpCisJY21wdwkkRUREX0NMX09GRiwgKCVzaSkJIyBlZGQ9b2YKKwlqeglkb19lZGRfb2ZmCisJY21wdwkkRUREX0NMX1NLSVAsICglc2kpCSMgZWRkPXNrCisJanoJZG9fZWRkX3NraXBtYnIKKwlqbXAJZG9uZV9jbAorZG9fZWRkX3NraXBtYnI6CisgICAgCXBvcGwJJWVzaQorCWptcAllZGRfc3RhcnQKK2RvX2VkZF9vZmY6CisJcG9wbAklZXNpCisJam1wCWVkZF9kb25lCitkb25lX2NsOgorCXBvcGwJJWVzaQorCisKKyMgUmVhZCB0aGUgZmlyc3Qgc2VjdG9yIG9mIGVhY2ggQklPUyBkaXNrIGRldmljZSBhbmQgc3RvcmUgdGhlIDQtYnl0ZSBzaWduYXR1cmUKK2VkZF9tYnJfc2lnX3N0YXJ0OgorCW1vdmIJJDB4ODAsICVkbAkJCSMgZnJvbSBkZXZpY2UgODAKKwltb3Z3CSRFRERfTUJSX1NJR19CVUYsICVieAkJIyBzdG9yZSBidWZmZXIgcHRyIGluIGJ4CitlZGRfbWJyX3NpZ19yZWFkOgorCW1vdmwJJDB4RkZGRkZGRkYsICVlYXgKKwltb3ZsCSVlYXgsICglYngpCQkJIyBhc3N1bWUgZmFpbHVyZQorCXB1c2h3CSVieAorCW1vdmIJJFJFQURfU0VDVE9SUywgJWFoCisJbW92YgkkMSwgJWFsCQkJCSMgcmVhZCAxIHNlY3RvcgorCW1vdmIJJDAsICVkaAkJCQkjIGF0IGhlYWQgMAorCW1vdncJJDEsICVjeAkJCQkjIGN5bGluZGVyIDAsIHNlY3RvciAwCisJcHVzaHcJJWVzCisJcHVzaHcJJWRzCisJcG9wdwklZXMKKyAgICAJbW92dwkkRUREQlVGLCAlYngJCQkjIGRpc2sncyBkYXRhIGdvZXMgaW50byBFRERCVUYKKwlwdXNodwklZHggICAgICAgICAgICAgIyB3b3JrIGFyb3VuZCBidWdneSBCSU9TZXMKKwlzdGMgICAgICAgICAgICAgICAgICAgICAjIHdvcmsgYXJvdW5kIGJ1Z2d5IEJJT1NlcworCWludAkkMHgxMworCXN0aSAgICAgICAgICAgICAgICAgICAgICMgd29yayBhcm91bmQgYnVnZ3kgQklPU2VzCisJcG9wdwklZHgKKwlwb3B3CSVlcworCXBvcHcJJWJ4CisJamMJZWRkX21icl9zaWdfZG9uZQkJIyBvbiBmYWlsdXJlLCB3ZSdyZSBkb25lLgorCW1vdmwJKEVEREJVRitFRERfTUJSX1NJR19PRkZTRVQpLCAlZWF4ICMgcmVhZCBzaWcgb3V0IG9mIHRoZSBNQlIKKwltb3ZsCSVlYXgsICglYngpCQkJIyBzdG9yZSBzdWNjZXNzCisJaW5jYgkoRUREX01CUl9TSUdfTlJfQlVGKQkJIyBub3RlIHRoYXQgd2Ugc3RvcmVkIHNvbWV0aGluZworCWluY2IJJWRsCQkJCSMgaW5jcmVtZW50IHRvIG5leHQgZGV2aWNlCisJYWRkdwkkNCwgJWJ4CQkJCSMgaW5jcmVtZW50IHNpZyBidWZmZXIgcHRyCisJY21wYgkkRUREX01CUl9TSUdfTUFYLCAoRUREX01CUl9TSUdfTlJfQlVGKQkjIE91dCBvZiBzcGFjZT8KKwlqYgllZGRfbWJyX3NpZ19yZWFkCQkjIGtlZXAgbG9vcGluZworZWRkX21icl9zaWdfZG9uZToKKworIyBEbyB0aGUgQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIGNhbGxzCisjIFRoaXMgY29uc2lzdHMgb2YgdHdvIGNhbGxzOgorIyAgICBpbnQgMTNoIGFoPTQxaCAiQ2hlY2sgRXh0ZW5zaW9ucyBQcmVzZW50IgorIyAgICBpbnQgMTNoIGFoPTQ4aCAiR2V0IERldmljZSBQYXJhbWV0ZXJzIgorIyAgICBpbnQgMTNoIGFoPTA4aCAiTGVnYWN5IEdldCBEZXZpY2UgUGFyYW1ldGVycyIKKyMKKyMgQSBidWZmZXIgb2Ygc2l6ZSBFRERNQVhOUiooRURERVhUU0laRStFRERQQVJNU0laRSkgaXMgcmVzZXJ2ZWQgZm9yIG91ciB1c2UKKyMgaW4gdGhlIGJvb3RfcGFyYW1zIGF0IEVEREJVRi4gIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHdoaWNoIGFyZQorIyB1c2VkIHRvIHN0b3JlIHRoZSBkZXZpY2UgbnVtYmVyLCBpbnRlcmZhY2Ugc3VwcG9ydCBtYXAgYW5kIHZlcnNpb24KKyMgcmVzdWx0cyBmcm9tIGZuNDEuICBUaGUgbmV4dCBmb3VyIGJ5dGVzIGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBsZWdhY3kKKyMgY3lsaW5kZXJzLCBoZWFkcywgYW5kIHNlY3RvcnMgZnJvbSBmbjA4LiBUaGUgZm9sbG93aW5nIDc0IGJ5dGVzIGFyZSB1c2VkIHRvCisjIHN0b3JlIHRoZSByZXN1bHRzIGZyb20gZm40OC4gIFN0YXJ0aW5nIGZyb20gZGV2aWNlIDgwaCwgZm40MSwgdGhlbiBmbjQ4CisjIGFyZSBjYWxsZWQgYW5kIHRoZWlyIHJlc3VsdHMgc3RvcmVkIGluIEVEREJVRituKihFRERFWFRTSVpFK0VERFBBUk1JWkUpLgorIyBUaGVuIHRoZSBwb2ludGVyIGlzIGluY3JlbWVudGVkIHRvIHN0b3JlIHRoZSBkYXRhIGZvciB0aGUgbmV4dCBjYWxsLgorIyBUaGlzIHJlcGVhdHMgdW50aWwgZWl0aGVyIGEgZGV2aWNlIGRvZXNuJ3QgZXhpc3QsIG9yIHVudGlsIEVERE1BWE5SCisjIGRldmljZXMgaGF2ZSBiZWVuIHN0b3JlZC4KKyMgVGhlIG9uZSB0cmlja3kgcGFydCBpcyB0aGF0IGRzOnNpIGFsd2F5cyBwb2ludHMgRURERVhUU0laRSBieXRlcyBpbnRvCisjIHRoZSBzdHJ1Y3R1cmUsIGFuZCB0aGUgZm40MSBhbmQgZm4wOCByZXN1bHRzIGFyZSBzdG9yZWQgYXQgb2Zmc2V0cworIyBmcm9tIHRoZXJlLiAgVGhpcyByZW1vdmVzIHRoZSBuZWVkIHRvIGluY3JlbWVudCB0aGUgcG9pbnRlciBmb3IKKyMgZXZlcnkgc3RvcmUsIGFuZCBsZWF2ZXMgaXQgcmVhZHkgZm9yIHRoZSBmbjQ4IGNhbGwuCisjIEEgc2Vjb25kIG9uZS1ieXRlIGJ1ZmZlciwgRURETlIsIGluIHRoZSBib290X3BhcmFtcyBzdG9yZXMKKyMgdGhlIG51bWJlciBvZiBCSU9TIGRldmljZXMgd2hpY2ggZXhpc3QsIHVwIHRvIEVERE1BWE5SLgorIyBJbiBzZXR1cC5jLCBjb3B5X2VkZCgpIHN0b3JlcyBib3RoIGJvb3RfcGFyYW1zIGJ1ZmZlcnMgYXdheQorIyBmb3IgbGF0ZXIgdXNlLCBhcyB0aGV5IHdvdWxkIGdldCBvdmVyd3JpdHRlbiBvdGhlcndpc2UuCisjIFRoaXMgY29kZSBpcyBzZW5zaXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHN0cnVjdHMgaW4gZWRkLmgKK2VkZF9zdGFydDoKKwkJCQkJCSMgJWRzIHBvaW50cyB0byB0aGUgYm9vdHNlY3RvcgorICAgICAgIAkJCQkJCSMgcmVzdWx0IGJ1ZmZlciBmb3IgZm40OAorCW1vdncJJEVEREJVRitFRERFWFRTSVpFLCAlc2kJCSMgaW4gZHM6c2ksIGZuNDEgcmVzdWx0cworCQkJCQkJIyBrZXB0IGp1c3QgYmVmb3JlIHRoYXQKKwltb3ZiCSQweDgwLCAlZGwJCQkjIEJJT1MgZGV2aWNlIDB4ODAKKworZWRkX2NoZWNrX2V4dDoKKwltb3ZiCSRDSEVDS0VYVEVOU0lPTlNQUkVTRU5ULCAlYWggICAgIyBGdW5jdGlvbiA0MQorCW1vdncJJEVERE1BR0lDMSwgJWJ4CQkJIyBtYWdpYworCWludAkkMHgxMwkJCQkjIG1ha2UgdGhlIGNhbGwKKwlqYwllZGRfZG9uZQkJCSMgbm8gbW9yZSBCSU9TIGRldmljZXMKKworCWNtcHcJJEVERE1BR0lDMiwgJWJ4CQkJIyBpcyBtYWdpYyByaWdodD8KKwlqbmUJZWRkX25leHQJCQkjIG5vcGUsIG5leHQuLi4KKworCW1vdmIJJWRsLCAlZHM6LTgoJXNpKQkJIyBzdG9yZSBkZXZpY2UgbnVtYmVyCisJbW92YgklYWgsICVkczotNyglc2kpCQkjIHN0b3JlIHZlcnNpb24KKwltb3Z3CSVjeCwgJWRzOi02KCVzaSkJCSMgc3RvcmUgZXh0ZW5zaW9ucworCWluY2IJKEVERE5SKQkJCQkjIG5vdGUgdGhhdCB3ZSBzdG9yZWQgc29tZXRoaW5nCisKK2VkZF9nZXRfZGV2aWNlX3BhcmFtczoKKwltb3Z3CSRFRERQQVJNU0laRSwgJWRzOiglc2kpCQkjIHB1dCBzaXplCisJbW92dwkkMHgwLCAlZHM6Miglc2kpCQkjIHdvcmsgYXJvdW5kIGJ1Z2d5IEJJT1NlcworCW1vdmIJJEdFVERFVklDRVBBUkFNRVRFUlMsICVhaAkjIEZ1bmN0aW9uIDQ4CisJaW50CSQweDEzCQkJCSMgbWFrZSB0aGUgY2FsbAorCQkJCQkJIyBEb24ndCBjaGVjayBmb3IgZmFpbCByZXR1cm4KKwkJCQkJCSMgaXQgZG9lc24ndCBtYXR0ZXIuCitlZGRfZ2V0X2xlZ2FjeV9jaHM6CisJeG9ydyAgICAlYXgsICVheAorCW1vdncgICAgJWF4LCAlZHM6LTQoJXNpKQorCW1vdncgICAgJWF4LCAlZHM6LTIoJXNpKQorICAgICAgICAjIFJhbGYgQnJvd24ncyBJbnRlcnJ1cHQgTGlzdCBzYXlzIHRvIHNldCBFUzpESSB0bworCSMgMDAwMGg6MDAwMGggInRvIGd1YXJkIGFnYWluc3QgQklPUyBidWdzIgorCXB1c2h3ICAgJWVzCisJbW92dyAgICAlYXgsICVlcworCW1vdncgICAgJWF4LCAlZGkKKwlwdXNodyAgICVkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZWdhY3kgY2FsbCBjbG9iYmVycyAlZGwKKwltb3ZiICAgICRMRUdBQ1lHRVRERVZJQ0VQQVJBTUVURVJTLCAlYWggIyBGdW5jdGlvbiAwOAorCWludCAgICAgJDB4MTMgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ha2UgdGhlIGNhbGwKKwlqYyAgICAgIGVkZF9sZWdhY3lfZG9uZSAgICAgICAgICAgICAgICAgIyBmYWlsZWQKKwltb3ZiICAgICVjbCwgJWFsICAgICAgICAgICAgICAgICAgICAgICAgIyBMb3cgNiBiaXRzIGFyZSBtYXgKKwlhbmRiICAgICQweDNGLCAlYWwgICAgICAgICAgICAgICAgICAgICAgIyAgIHNlY3RvciBudW1iZXIKKwltb3ZiCSVhbCwgJWRzOi0xKCVzaSkgICAgICAgICAgICAgICAgIyBSZWNvcmQgbWF4IHNlY3QKKwltb3ZiICAgICVkaCwgJWRzOi0yKCVzaSkgICAgICAgICAgICAgICAgIyBSZWNvcmQgbWF4IGhlYWQgbnVtYmVyCisJbW92YiAgICAlY2gsICVhbCAgICAgICAgICAgICAgICAgICAgICAgICMgTG93IDggYml0cyBvZiBtYXggY3lsCisJc2hyICAgICAkNiwgJWNsCisJbW92YiAgICAlY2wsICVhaCAgICAgICAgICAgICAgICAgICAgICAgICMgSGlnaCAyIGJpdHMgb2YgbWF4IGN5bAorCW1vdncgICAgJWF4LCAlZHM6LTQoJXNpKQorCitlZGRfbGVnYWN5X2RvbmU6CisJcG9wdyAgICAlZHgKKwlwb3B3ICAgICVlcworCW1vdncJJXNpLCAlYXgJCQkjIGluY3JlbWVudCBzaQorCWFkZHcJJEVERFBBUk1TSVpFK0VEREVYVFNJWkUsICVheAorCW1vdncJJWF4LCAlc2kKKworZWRkX25leHQ6CisJaW5jYgklZGwJCQkJIyBpbmNyZW1lbnQgdG8gbmV4dCBkZXZpY2UKKwljbXBiCSRFRERNQVhOUiwgKEVERE5SKSAJCSMgT3V0IG9mIHNwYWNlPworCWpiCWVkZF9jaGVja19leHQJCQkjIGtlZXAgbG9vcGluZworCitlZGRfZG9uZToKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvaW5zdGFsbC5zaCBiL2FyY2gvaTM4Ni9ib290L2luc3RhbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmMjQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9ib290L2luc3RhbGwuc2gKQEAgLTAsMCArMSw0MCBAQAorIyEvYmluL3NoCisjCisjIGFyY2gvaTM4Ni9ib290L2luc3RhbGwuc2gKKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTUgYnkgTGludXMgVG9ydmFsZHMKKyMKKyMgQWRhcHRlZCBmcm9tIGNvZGUgaW4gYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUgYnkgSC4gUGV0ZXIgQW52aW4KKyMKKyMgIm1ha2UgaW5zdGFsbCIgc2NyaXB0IGZvciBpMzg2IGFyY2hpdGVjdHVyZQorIworIyBBcmd1bWVudHM6CisjICAgJDEgLSBrZXJuZWwgdmVyc2lvbgorIyAgICQyIC0ga2VybmVsIGltYWdlIGZpbGUKKyMgICAkMyAtIGtlcm5lbCBtYXAgZmlsZQorIyAgICQ0IC0gZGVmYXVsdCBpbnN0YWxsIHBhdGggKGJsYW5rIGlmIHJvb3QgZGlyZWN0b3J5KQorIworCisjIFVzZXIgbWF5IGhhdmUgYSBjdXN0b20gaW5zdGFsbCBzY3JpcHQKKworaWYgWyAteCB+L2Jpbi9pbnN0YWxsa2VybmVsIF07IHRoZW4gZXhlYyB+L2Jpbi9pbnN0YWxsa2VybmVsICIkQCI7IGZpCitpZiBbIC14IC9zYmluL2luc3RhbGxrZXJuZWwgXTsgdGhlbiBleGVjIC9zYmluL2luc3RhbGxrZXJuZWwgIiRAIjsgZmkKKworIyBEZWZhdWx0IGluc3RhbGwgLSBzYW1lIGFzIG1ha2UgemxpbG8KKworaWYgWyAtZiAkNC92bWxpbnV6IF07IHRoZW4KKwltdiAkNC92bWxpbnV6ICQ0L3ZtbGludXoub2xkCitmaQorCitpZiBbIC1mICQ0L1N5c3RlbS5tYXAgXTsgdGhlbgorCW12ICQ0L1N5c3RlbS5tYXAgJDQvU3lzdGVtLm9sZAorZmkKKworY2F0ICQyID4gJDQvdm1saW51egorY3AgJDMgJDQvU3lzdGVtLm1hcAorCitpZiBbIC14IC9zYmluL2xpbG8gXTsgdGhlbiAvc2Jpbi9saWxvOyBlbHNlIC9ldGMvbGlsby9pbnN0YWxsOyBmaQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvbXRvb2xzLmNvbmYuaW4gYi9hcmNoL2kzODYvYm9vdC9tdG9vbHMuY29uZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ2ZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2Jvb3QvbXRvb2xzLmNvbmYuaW4KQEAgLTAsMCArMSwxNyBAQAorIworIyBtdG9vbHMgY29uZmlndXJhdGlvbiBmaWxlIGZvciAibWFrZSAoYil6ZGlzayIKKyMKKworIyBBY3R1YWwgZmxvcHB5IGRyaXZlCitkcml2ZSBhOgorICBmaWxlPSIvZGV2L2ZkMCIKKworIyAxLjQ0IE1CIGZsb3BweSBkaXNrIGltYWdlCitkcml2ZSB2OgorICBmaWxlPSJAT0JKQC9mZGltYWdlIiBjeWxpbmRlcnM9ODAgaGVhZHM9MiBzZWN0b3JzPTE4IGZpbHRlcgorCisjIDIuODggTUIgZmxvcHB5IGRpc2sgaW1hZ2UgKG1vc3RseSBmb3IgdmlydHVhbCB1c2VzKQorZHJpdmUgdzoKKyAgZmlsZT0iQE9CSkAvZmRpbWFnZSIgY3lsaW5kZXJzPTgwIGhlYWRzPTIgc2VjdG9ycz0zNiBmaWx0ZXIKKworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9zZXR1cC5TIGIvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTM0YWIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUwpAQCAtMCwwICsxLDEwMjggQEAKKy8qCisgKglzZXR1cC5TCQlDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKKyAqCisgKiBzZXR1cC5zIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBzeXN0ZW0gZGF0YSBmcm9tIHRoZSBCSU9TLAorICogYW5kIHB1dHRpbmcgdGhlbSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZXMgaW4gc3lzdGVtIG1lbW9yeS4KKyAqIGJvdGggc2V0dXAucyBhbmQgc3lzdGVtIGhhcyBiZWVuIGxvYWRlZCBieSB0aGUgYm9vdGJsb2NrLgorICoKKyAqIFRoaXMgY29kZSBhc2tzIHRoZSBiaW9zIGZvciBtZW1vcnkvZGlzay9vdGhlciBwYXJhbWV0ZXJzLCBhbmQKKyAqIHB1dHMgdGhlbSBpbiBhICJzYWZlIiBwbGFjZTogMHg5MDAwMC0weDkwMUZGLCBpZSB3aGVyZSB0aGUKKyAqIGJvb3QtYmxvY2sgdXNlZCB0byBiZS4gSXQgaXMgdGhlbiB1cCB0byB0aGUgcHJvdGVjdGVkIG1vZGUKKyAqIHN5c3RlbSB0byByZWFkIHRoZW0gZnJvbSB0aGVyZSBiZWZvcmUgdGhlIGFyZWEgaXMgb3ZlcndyaXR0ZW4KKyAqIGZvciBidWZmZXItYmxvY2tzLgorICoKKyAqIE1vdmUgUFMvMiBhdXggaW5pdCBjb2RlIHRvIHBzYXV4LmMKKyAqICh0cm95ZXJAc2FpZnIwMC5jZnNhdC5Ib25leXdlbGwuQ09NKSAwM09jdDkyCisgKgorICogc29tZSBjaGFuZ2VzIGFuZCBhZGRpdGlvbmFsIGZlYXR1cmVzIGJ5IENocmlzdG9waCBOaWVtYW5uLAorICogTWFyY2ggMTk5My9KdW5lIDE5OTQgKENocmlzdG9waC5OaWVtYW5uQGxpbnV4Lm9yZykKKyAqCisgKiBhZGQgQVBNIEJJT1MgY2hlY2tpbmcgYnkgU3RlcGhlbiBSb3Rod2VsbCwgTWF5IDE5OTQKKyAqIChzZnJAY2FuYi5hdXVnLm9yZy5hdSkKKyAqCisgKiBIaWdoIGxvYWQgc3R1ZmYsIGluaXRyZCBzdXBwb3J0IGFuZCBwb3NpdGlvbiBpbmRlcGVuZGVuY3kKKyAqIGJ5IEhhbnMgTGVybWVuICYgV2VybmVyIEFsbWVzYmVyZ2VyLCBGZWJydWFyeSAxOTk2CisgKiA8bGVybWVuQGVsc2Vydi5mZm0uZmdhbi5kZT4sIDxhbG1lc2JlckBscmMuZXBmbC5jaD4KKyAqCisgKiBWaWRlbyBoYW5kbGluZyBtb3ZlZCB0byB2aWRlby5TIGJ5IE1hcnRpbiBNYXJlcywgTWFyY2ggMTk5NgorICogPG1qQGszMzIuZmVsZC5jdnV0LmN6PgorICoKKyAqIEV4dGVuZGVkIG1lbW9yeSBkZXRlY3Rpb24gc2NoZW1lIHJldHdpZGRsZWQgYnkgb3JjQHBlbGwuY2hpLmlsLnVzIChkYXZpZAorICogcGFyc29ucykgdG8gYXZvaWQgbG9hZGxpbiBjb25mdXNpb24sIEp1bHkgMTk5NworICoKKyAqIFRyYW5zY3JpYmVkIGZyb20gSW50ZWwgKGFzODYpIC0+IEFUJlQgKGdhcykgYnkgQ2hyaXMgTm9lLCBNYXkgMTk5OS4KKyAqIDxzdGlrZXJAbm9ydGhsaW5rLmNvbT4KKyAqCisgKiBGaXggdG8gd29yayBhcm91bmQgYnVnZ3kgQklPU2VzIHdoaWNoIGRvbnQgdXNlIGNhcnJ5IGJpdCBjb3JyZWN0bHkKKyAqIGFuZC9vciByZXBvcnQgZXh0ZW5kZWQgbWVtb3J5IGluIENYL0RYIGZvciBlODAxaCBtZW1vcnkgc2l6ZSBkZXRlY3Rpb24gCisgKiBjYWxsLiAgQXMgYSByZXN1bHQgdGhlIGtlcm5lbCBnb3Qgd3JvbmcgZmlndXJlcy4gIFRoZSBpbnQxNS9lODAxaCBkb2NzCisgKiBmcm9tIFJhbGYgQnJvd24gaW50ZXJydXB0IGxpc3Qgc2VlbSB0byBpbmRpY2F0ZSBBWC9CWCBzaG91bGQgYmUgdXNlZAorICogYW55d2F5LiAgU28gdG8gYXZvaWQgYnJlYWtpbmcgbWFueSBtYWNoaW5lcyAocHJlc3VtYWJseSB0aGVyZSB3YXMgYSByZWFzb24KKyAqIHRvIG9yZ2luYWxseSB1c2UgQ1gvRFggaW5zdGVhZCBvZiBBWC9CWCksIHdlIGRvIGEga2x1ZGdlIHRvIHNlZQorICogaWYgQ1gvRFggaGF2ZSBiZWVuIGNoYW5nZWQgaW4gdGhlIGU4MDEgY2FsbCBhbmQgaWYgc28gdXNlIEFYL0JYIC4KKyAqIE1pY2hhZWwgTWlsbGVyLCBBcHJpbCAyMDAxIDxtaWNoYWVsbUBtam1tLm9yZz4KKyAqCisgKiBOZXcgQTIwIGNvZGUgcG9ydGVkIGZyb20gU1lTTElOVVggYnkgSC4gUGV0ZXIgQW52aW4uIEFNRCBFbGFuIGJ1Z2ZpeGVzCisgKiBieSBSb2JlcnQgU2Nod2ViZWwsIERlY2VtYmVyIDIwMDEgPHJvYmVydEBzY2h3ZWJlbC5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZS5oPgorI2luY2x1ZGUgPGFzbS9ib290Lmg+CisjaW5jbHVkZSA8YXNtL2U4MjAuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCQorLyogU2lnbmF0dXJlIHdvcmRzIHRvIGVuc3VyZSBMSUxPIGxvYWRlZCB1cyByaWdodCAqLworI2RlZmluZSBTSUcxCTB4QUE1NQorI2RlZmluZSBTSUcyCTB4NUE1QQorCitJTklUU0VHICA9IERFRl9JTklUU0VHCQkjIDB4OTAwMCwgd2UgbW92ZSBib290IGhlcmUsIG91dCBvZiB0aGUgd2F5CitTWVNTRUcgICA9IERFRl9TWVNTRUcJCSMgMHgxMDAwLCBzeXN0ZW0gbG9hZGVkIGF0IDB4MTAwMDAgKDY1NTM2KS4KK1NFVFVQU0VHID0gREVGX1NFVFVQU0VHCQkjIDB4OTAyMCwgdGhpcyBpcyB0aGUgY3VycmVudCBzZWdtZW50CisJCQkJIyAuLi4gYW5kIHRoZSBmb3JtZXIgY29udGVudHMgb2YgQ1MKKworREVMVEFfSU5JVFNFRyA9IFNFVFVQU0VHIC0gSU5JVFNFRwkjIDB4MDAyMAorCisuY29kZTE2CisuZ2xvYmwgYmVndGV4dCwgYmVnZGF0YSwgYmVnYnNzLCBlbmR0ZXh0LCBlbmRkYXRhLCBlbmRic3MKKworLnRleHQKK2JlZ3RleHQ6CisuZGF0YQorYmVnZGF0YToKKy5ic3MKK2JlZ2JzczoKKy50ZXh0CisKK3N0YXJ0OgorCWptcAl0cmFtcG9saW5lCisKKyMgVGhpcyBpcyB0aGUgc2V0dXAgaGVhZGVyLCBhbmQgaXQgbXVzdCBzdGFydCBhdCAlY3M6MiAob2xkIDB4OTAyMDoyKQorCisJCS5hc2NpaQkiSGRyUyIJCSMgaGVhZGVyIHNpZ25hdHVyZQorCQkud29yZAkweDAyMDMJCSMgaGVhZGVyIHZlcnNpb24gbnVtYmVyICg+PSAweDAxMDUpCisJCQkJCSMgb3IgZWxzZSBvbGQgbG9hZGxpbi0xLjUgd2lsbCBmYWlsKQorcmVhbG1vZGVfc3d0Y2g6CS53b3JkCTAsIDAJCSMgZGVmYXVsdF9zd2l0Y2gsIFNFVFVQU0VHCitzdGFydF9zeXNfc2VnOgkud29yZAlTWVNTRUcKKwkJLndvcmQJa2VybmVsX3ZlcnNpb24JIyBwb2ludGluZyB0byBrZXJuZWwgdmVyc2lvbiBzdHJpbmcKKwkJCQkJIyBhYm92ZSBzZWN0aW9uIG9mIGhlYWRlciBpcyBjb21wYXRpYmxlCisJCQkJCSMgd2l0aCBsb2FkbGluLTEuNSAoaGVhZGVyIHYxLjUpLiBEb24ndAorCQkJCQkjIGNoYW5nZSBpdC4KKwordHlwZV9vZl9sb2FkZXI6CS5ieXRlCTAJCSMgPSAwLCBvbGQgb25lIChMSUxPLCBMb2FkbGluLAorCQkJCQkjICAgICAgQm9vdGxpbiwgU1lTTFgsIGJvb3RzZWN0Li4uKQorCQkJCQkjIFNlZSBEb2N1bWVudGF0aW9uL2kzODYvYm9vdC50eHQgZm9yCisJCQkJCSMgYXNzaWduZWQgaWRzCisJCisjIGZsYWdzLCB1bnVzZWQgYml0cyBtdXN0IGJlIHplcm8gKFJGVSkgYml0IHdpdGhpbiBsb2FkZmxhZ3MKK2xvYWRmbGFnczoKK0xPQURFRF9ISUdICT0gMQkJCSMgSWYgc2V0LCB0aGUga2VybmVsIGlzIGxvYWRlZCBoaWdoCitDQU5fVVNFX0hFQVAJPSAweDgwCQkJIyBJZiBzZXQsIHRoZSBsb2FkZXIgYWxzbyBoYXMgc2V0CisJCQkJCSMgaGVhcF9lbmRfcHRyIHRvIHRlbGwgaG93IG11Y2gKKwkJCQkJIyBzcGFjZSBiZWhpbmQgc2V0dXAuUyBjYW4gYmUgdXNlZCBmb3IKKwkJCQkJIyBoZWFwIHB1cnBvc2VzLgorCQkJCQkjIE9ubHkgdGhlIGxvYWRlciBrbm93cyB3aGF0IGlzIGZyZWUKKyNpZm5kZWYgX19CSUdfS0VSTkVMX18KKwkJLmJ5dGUJMAorI2Vsc2UKKwkJLmJ5dGUJTE9BREVEX0hJR0gKKyNlbmRpZgorCitzZXR1cF9tb3ZlX3NpemU6IC53b3JkICAweDgwMDAJCSMgc2l6ZSB0byBtb3ZlLCB3aGVuIHNldHVwIGlzIG5vdAorCQkJCQkjIGxvYWRlZCBhdCAweDkwMDAwLiBXZSB3aWxsIG1vdmUgc2V0dXAgCisJCQkJCSMgdG8gMHg5MDAwMCB0aGVuIGp1c3QgYmVmb3JlIGp1bXBpbmcKKwkJCQkJIyBpbnRvIHRoZSBrZXJuZWwuIEhvd2V2ZXIsIG9ubHkgdGhlCisJCQkJCSMgbG9hZGVyIGtub3dzIGhvdyBtdWNoIGRhdGEgYmVoaW5kCisJCQkJCSMgdXMgYWxzbyBuZWVkcyB0byBiZSBsb2FkZWQuCisKK2NvZGUzMl9zdGFydDoJCQkJIyBoZXJlIGxvYWRlcnMgY2FuIHB1dCBhIGRpZmZlcmVudAorCQkJCQkjIHN0YXJ0IGFkZHJlc3MgZm9yIDMyLWJpdCBjb2RlLgorI2lmbmRlZiBfX0JJR19LRVJORUxfXworCQkubG9uZwkweDEwMDAJCSMgICAweDEwMDAgPSBkZWZhdWx0IGZvciB6SW1hZ2UKKyNlbHNlCisJCS5sb25nCTB4MTAwMDAwCSMgMHgxMDAwMDAgPSBkZWZhdWx0IGZvciBiaWcga2VybmVsCisjZW5kaWYKKworcmFtZGlza19pbWFnZToJLmxvbmcJMAkJIyBhZGRyZXNzIG9mIGxvYWRlZCByYW1kaXNrIGltYWdlCisJCQkJCSMgSGVyZSB0aGUgbG9hZGVyIHB1dHMgdGhlIDMyLWJpdAorCQkJCQkjIGFkZHJlc3Mgd2hlcmUgaXQgbG9hZGVkIHRoZSBpbWFnZS4KKwkJCQkJIyBUaGlzIG9ubHkgd2lsbCBiZSByZWFkIGJ5IHRoZSBrZXJuZWwuCisKK3JhbWRpc2tfc2l6ZToJLmxvbmcJMAkJIyBpdHMgc2l6ZSBpbiBieXRlcworCitib290c2VjdF9rbHVkZ2U6CisJCS5sb25nCTAJCSMgb2Jzb2xldGUKKworaGVhcF9lbmRfcHRyOgkud29yZAltb2RlbGlzdCsxMDI0CSMgKEhlYWRlciB2ZXJzaW9uIDB4MDIwMSBvciBsYXRlcikKKwkJCQkJIyBzcGFjZSBmcm9tIGhlcmUgKGV4Y2x1c2l2ZSkgZG93biB0bworCQkJCQkjIGVuZCBvZiBzZXR1cCBjb2RlIGNhbiBiZSB1c2VkIGJ5IHNldHVwCisJCQkJCSMgZm9yIGxvY2FsIGhlYXAgcHVycG9zZXMuCisKK3BhZDE6CQkud29yZAkwCitjbWRfbGluZV9wdHI6CS5sb25nIDAJCQkjIChIZWFkZXIgdmVyc2lvbiAweDAyMDIgb3IgbGF0ZXIpCisJCQkJCSMgSWYgbm9uemVybywgYSAzMi1iaXQgcG9pbnRlcgorCQkJCQkjIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCQkJCQkjIFRoZSBjb21tYW5kIGxpbmUgc2hvdWxkIGJlCisJCQkJCSMgbG9jYXRlZCBiZXR3ZWVuIHRoZSBzdGFydCBvZgorCQkJCQkjIHNldHVwIGFuZCB0aGUgZW5kIG9mIGxvdworCQkJCQkjIG1lbW9yeSAoMHhhMDAwMCksIG9yIGl0IG1heQorCQkJCQkjIGdldCBvdmVyd3JpdHRlbiBiZWZvcmUgaXQKKwkJCQkJIyBnZXRzIHJlYWQuICBJZiB0aGlzIGZpZWxkIGlzCisJCQkJCSMgdXNlZCwgdGhlcmUgaXMgbm8gbG9uZ2VyCisJCQkJCSMgYW55dGhpbmcgbWFnaWNhbCBhYm91dCB0aGUKKwkJCQkJIyAweDkwMDAwIHNlZ21lbnQ7IHRoZSBzZXR1cAorCQkJCQkjIGNhbiBiZSBsb2NhdGVkIGFueXdoZXJlIGluCisJCQkJCSMgbG93IG1lbW9yeSAweDEwMDAwIG9yIGhpZ2hlci4KKworcmFtZGlza19tYXg6CS5sb25nICgtX19QQUdFX09GRlNFVC0oNTEyIDw8IDIwKS0xKSAmIDB4N2ZmZmZmZmYKKwkJCQkJIyAoSGVhZGVyIHZlcnNpb24gMHgwMjAzIG9yIGxhdGVyKQorCQkJCQkjIFRoZSBoaWdoZXN0IHNhZmUgYWRkcmVzcyBmb3IKKwkJCQkJIyB0aGUgY29udGVudHMgb2YgYW4gaW5pdHJkCisKK3RyYW1wb2xpbmU6CWNhbGwJc3RhcnRfb2Zfc2V0dXAKKwkJLmFsaWduIDE2CisJCQkJCSMgVGhlIG9mZnNldCBhdCB0aGlzIHBvaW50IGlzIDB4MjQwCisJCS5zcGFjZQkoMHg3ZmYtMHgyNDArMSkgIyBFODIwICYgRUREIHNwYWNlIChlbmRpbmcgYXQgMHg3ZmYpCisjIEVuZCBvZiBzZXR1cCBoZWFkZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3RhcnRfb2Zfc2V0dXA6CisjIEJvb3RsaW4gZGVwZW5kcyBvbiB0aGlzIGJlaW5nIGRvbmUgZWFybHkKKwltb3Z3CSQweDAxNTAwLCAlYXgKKwltb3ZiCSQweDgxLCAlZGwKKwlpbnQJJDB4MTMKKworI2lmZGVmIFNBRkVfUkVTRVRfRElTS19DT05UUk9MTEVSCisjIFJlc2V0IHRoZSBkaXNrIGNvbnRyb2xsZXIuCisJbW92dwkkMHgwMDAwLCAlYXgKKwltb3ZiCSQweDgwLCAlZGwKKwlpbnQJJDB4MTMKKyNlbmRpZgorCisjIFNldCAlZHMgPSAlY3MsIHdlIGtub3cgdGhhdCBTRVRVUFNFRyA9ICVjcyBhdCB0aGlzIHBvaW50CisJbW92dwklY3MsICVheAkJIyBha2EgU0VUVVBTRUcKKwltb3Z3CSVheCwgJWRzCisjIENoZWNrIHNpZ25hdHVyZSBhdCBlbmQgb2Ygc2V0dXAKKwljbXB3CSRTSUcxLCBzZXR1cF9zaWcxCisJam5lCWJhZF9zaWcKKworCWNtcHcJJFNJRzIsIHNldHVwX3NpZzIKKwlqbmUJYmFkX3NpZworCisJam1wCWdvb2Rfc2lnMQorCisjIFJvdXRpbmUgdG8gcHJpbnQgYXNjaWl6IHN0cmluZyBhdCBkczpzaQorcHJ0c3RyOgorCWxvZHNiCisJYW5kYgklYWwsICVhbAorCWp6CWZpbgorCisJY2FsbAlwcnRjaHIKKwlqbXAJcHJ0c3RyCisKK2ZpbjoJcmV0CisKKyMgU3BhY2UgcHJpbnRpbmcKK3BydHNwMjoJY2FsbAlwcnRzcGMJCSMgUHJpbnQgZG91YmxlIHNwYWNlCitwcnRzcGM6CW1vdmIJJDB4MjAsICVhbAkjIFByaW50IHNpbmdsZSBzcGFjZSAobm90ZTogZmFsbC10aHJ1KQorCisjIFBhcnQgb2YgYWJvdmUgcm91dGluZSwgdGhpcyBvbmUganVzdCBwcmludHMgYXNjaWkgYWwKK3BydGNocjoJcHVzaHcJJWF4CisJcHVzaHcJJWN4CisJbW92dwkkNywlYngKKwltb3Z3CSQweDAxLCAlY3gKKwltb3ZiCSQweDBlLCAlYWgKKwlpbnQJJDB4MTAKKwlwb3B3CSVjeAorCXBvcHcJJWF4CisJcmV0CisKK2JlZXA6CW1vdmIJJDB4MDcsICVhbAorCWptcAlwcnRjaHIKKwkKK25vX3NpZ19tZXNzOiAuc3RyaW5nCSJObyBzZXR1cCBzaWduYXR1cmUgZm91bmQgLi4uIgorCitnb29kX3NpZzE6CisJam1wCWdvb2Rfc2lnCisKKyMgV2Ugbm93IGhhdmUgdG8gZmluZCB0aGUgcmVzdCBvZiB0aGUgc2V0dXAgY29kZS9kYXRhCitiYWRfc2lnOgorCW1vdncJJWNzLCAlYXgJCQkjIFNFVFVQU0VHCisJc3VidwkkREVMVEFfSU5JVFNFRywgJWF4CQkjIElOSVRTRUcKKwltb3Z3CSVheCwgJWRzCisJeG9yYgklYmgsICViaAorCW1vdmIJKDQ5NyksICVibAkJCSMgZ2V0IHNldHVwIHNlY3QgZnJvbSBib290c2VjdAorCXN1YncJJDQsICVieAkJCQkjIExJTE8gbG9hZHMgNCBzZWN0b3JzIG9mIHNldHVwCisJc2hsdwkkOCwgJWJ4CQkJCSMgY29udmVydCB0byB3b3JkcyAoMXNlY3Q9Ml44IHdvcmRzKQorCW1vdncJJWJ4LCAlY3gKKwlzaHJ3CSQzLCAlYngJCQkJIyBjb252ZXJ0IHRvIHNlZ21lbnQKKwlhZGR3CSRTWVNTRUcsICVieAorCW1vdncJJWJ4LCAlY3M6c3RhcnRfc3lzX3NlZworIyBNb3ZlIHJlc3Qgb2Ygc2V0dXAgY29kZS9kYXRhIHRvIGhlcmUKKwltb3Z3CSQyMDQ4LCAlZGkJCQkjIGZvdXIgc2VjdG9ycyBsb2FkZWQgYnkgTElMTworCXN1YncJJXNpLCAlc2kKKwlwdXNodwklY3MKKwlwb3B3CSVlcworCW1vdncJJFNZU1NFRywgJWF4CisJbW92dwklYXgsICVkcworCXJlcAorCW1vdnN3CisJbW92dwklY3MsICVheAkJCSMgYWthIFNFVFVQU0VHCisJbW92dwklYXgsICVkcworCWNtcHcJJFNJRzEsIHNldHVwX3NpZzEKKwlqbmUJbm9fc2lnCisKKwljbXB3CSRTSUcyLCBzZXR1cF9zaWcyCisJam5lCW5vX3NpZworCisJam1wCWdvb2Rfc2lnCisKK25vX3NpZzoKKwlsZWEJbm9fc2lnX21lc3MsICVzaQorCWNhbGwJcHJ0c3RyCisKK25vX3NpZ19sb29wOgorCWhsdAorCWptcAlub19zaWdfbG9vcAorCitnb29kX3NpZzoKKwltb3Z3CSVjcywgJWF4CQkJIyBha2EgU0VUVVBTRUcKKwlzdWJ3CSRERUxUQV9JTklUU0VHLCAlYXggCQkjIGFrYSBJTklUU0VHCisJbW92dwklYXgsICVkcworIyBDaGVjayBpZiBhbiBvbGQgbG9hZGVyIHRyaWVzIHRvIGxvYWQgYSBiaWcta2VybmVsCisJdGVzdGIJJExPQURFRF9ISUdILCAlY3M6bG9hZGZsYWdzCSMgRG8gd2UgaGF2ZSBhIGJpZyBrZXJuZWw/CisJanoJbG9hZGVyX29rCQkJIyBObywgbm8gZGFuZ2VyIGZvciBvbGQgbG9hZGVycy4KKworCWNtcGIJJDAsICVjczp0eXBlX29mX2xvYWRlciAJCSMgRG8gd2UgaGF2ZSBhIGxvYWRlciB0aGF0CisJCQkJCQkjIGNhbiBkZWFsIHdpdGggdXM/CisJam56CWxvYWRlcl9vawkJCSMgWWVzLCBjb250aW51ZS4KKworCXB1c2h3CSVjcwkJCQkjIE5vLCB3ZSBoYXZlIGFuIG9sZCBsb2FkZXIsCisJcG9wdwklZHMJCQkJIyBkaWUuIAorCWxlYQlsb2FkZXJfcGFuaWNfbWVzcywgJXNpCisJY2FsbAlwcnRzdHIKKworCWptcAlub19zaWdfbG9vcAorCitsb2FkZXJfcGFuaWNfbWVzczogLnN0cmluZyAiV3JvbmcgbG9hZGVyLCBnaXZpbmcgdXAuLi4iCisKK2xvYWRlcl9vazoKKyMgR2V0IG1lbW9yeSBzaXplIChleHRlbmRlZCBtZW0sIGtCKQorCisJeG9ybAklZWF4LCAlZWF4CisJbW92bAklZWF4LCAoMHgxZTApCisjaWZuZGVmIFNUQU5EQVJEX01FTU9SWV9CSU9TX0NBTEwKKwltb3ZiCSVhbCwgKEU4MjBOUikKKyMgVHJ5IHRocmVlIGRpZmZlcmVudCBtZW1vcnkgZGV0ZWN0aW9uIHNjaGVtZXMuICBGaXJzdCwgdHJ5CisjIGU4MjBoLCB3aGljaCBsZXRzIHVzIGFzc2VtYmxlIGEgbWVtb3J5IG1hcCwgdGhlbiB0cnkgZTgwMWgsCisjIHdoaWNoIHJldHVybnMgYSAzMi1iaXQgbWVtb3J5IHNpemUsIGFuZCBmaW5hbGx5IDg4aCwgd2hpY2gKKyMgcmV0dXJucyAwLTY0bQorCisjIG1ldGhvZCBFODIwSDoKKyMgdGhlIG1lbW9yeSBtYXAgZnJvbSBoZWxsLiAgZTgyMGggcmV0dXJucyBtZW1vcnkgY2xhc3NpZmllZCBpbnRvCisjIGEgd2hvbGUgYnVuY2ggb2YgZGlmZmVyZW50IHR5cGVzLCBhbmQgYWxsb3dzIG1lbW9yeSBob2xlcyBhbmQKKyMgZXZlcnl0aGluZy4gIFdlIHNjYW4gdGhyb3VnaCB0aGlzIG1lbW9yeSBtYXAgYW5kIGJ1aWxkIGEgbGlzdAorIyBvZiB0aGUgZmlyc3QgMzIgbWVtb3J5IGFyZWFzLCB3aGljaCB3ZSByZXR1cm4gYXQgW0U4MjBNQVBdLgorIyBUaGlzIGlzIGRvY3VtZW50ZWQgYXQgaHR0cDovL3d3dy5hY3BpLmluZm8vLCBpbiB0aGUgQUNQSSAyLjAgc3BlY2lmaWNhdGlvbi4KKworI2RlZmluZSBTTUFQICAweDUzNGQ0MTUwCisKK21lbWU4MjA6CisJeG9ybAklZWJ4LCAlZWJ4CQkJIyBjb250aW51YXRpb24gY291bnRlcgorCW1vdncJJEU4MjBNQVAsICVkaQkJCSMgcG9pbnQgaW50byB0aGUgd2hpdGVsaXN0CisJCQkJCQkjIHNvIHdlIGNhbiBoYXZlIHRoZSBiaW9zCisJCQkJCQkjIGRpcmVjdGx5IHdyaXRlIGludG8gaXQuCisKK2ptcGU4MjA6CisJbW92bAkkMHgwMDAwZTgyMCwgJWVheAkJIyBlODIwLCB1cHBlciB3b3JkIHplcm9lZAorCW1vdmwJJFNNQVAsICVlZHgJCQkjIGFzY2lpICdTTUFQJworCW1vdmwJJDIwLCAlZWN4CQkJIyBzaXplIG9mIHRoZSBlODIwcmVjCisJcHVzaHcJJWRzCQkJCSMgZGF0YSByZWNvcmQuCisJcG9wdwklZXMKKwlpbnQJJDB4MTUJCQkJIyBtYWtlIHRoZSBjYWxsCisJamMJYmFpbDgyMAkJCQkjIGZhbGwgdG8gZTgwMSBpZiBpdCBmYWlscworCisJY21wbAkkU01BUCwgJWVheAkJCSMgY2hlY2sgdGhlIHJldHVybiBpcyBgU01BUCcKKwlqbmUJYmFpbDgyMAkJCQkjIGZhbGwgdG8gZTgwMSBpZiBpdCBmYWlscworCisjCWNtcGwJJDEsIDE2KCVkaSkJCQkjIGlzIHRoaXMgdXNhYmxlIG1lbW9yeT8KKyMJam5lCWFnYWluODIwCisKKwkjIElmIHRoaXMgaXMgdXNhYmxlIG1lbW9yeSwgd2Ugc2F2ZSBpdCBieSBzaW1wbHkgYWR2YW5jaW5nICVkaSBieQorCSMgc2l6ZW9mKGU4MjByZWMpLgorCSMKK2dvb2Q4MjA6CisJbW92YgkoRTgyME5SKSwgJWFsCQkJIyB1cCB0byAzMiBlbnRyaWVzCisJY21wYgkkRTgyME1BWCwgJWFsCisJam5sCWJhaWw4MjAKKworCWluY2IJKEU4MjBOUikKKwltb3Z3CSVkaSwgJWF4CisJYWRkdwkkMjAsICVheAorCW1vdncJJWF4LCAlZGkKK2FnYWluODIwOgorCWNtcGwJJDAsICVlYngJCQkjIGNoZWNrIHRvIHNlZSBpZgorCWpuZQlqbXBlODIwCQkJCSMgJWVieCBpcyBzZXQgdG8gRU9GCitiYWlsODIwOgorCisKKyMgbWV0aG9kIEU4MDFIOgorIyBtZW1vcnkgc2l6ZSBpcyBpbiAxayBjaHVua3NpemVzLCB0byBhdm9pZCBjb25mdXNpbmcgbG9hZGxpbi4KKyMgd2Ugc3RvcmUgdGhlIDB4ZTgwMSBtZW1vcnkgc2l6ZSBpbiBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHBsYWNlLAorIyBiZWNhdXNlIGl0IHdpbGwgbW9zdCBsaWtlbHkgYmUgbG9uZ2VyIHRoYW4gMTYgYml0cy4KKyMgKHVzZSAxZTAgYmVjYXVzZSB0aGF0J3Mgd2hhdCBMYXJyeSBBdWd1c3RpbmUgdXNlcyBpbiBoaXMKKyMgYWx0ZXJuYXRpdmUgbmV3IG1lbW9yeSBkZXRlY3Rpb24gc2NoZW1lLCBhbmQgaXQncyBzZW5zaWJsZQorIyB0byB3cml0ZSBldmVyeXRoaW5nIGludG8gdGhlIHNhbWUgcGxhY2UuKQorCittZW1lODAxOgorCXN0YwkJCQkJIyBmaXggdG8gd29yayBhcm91bmQgYnVnZ3kKKwl4b3J3CSVjeCwlY3gJCQkJIyBCSU9TZXMgd2hpY2ggZG9udCBjbGVhci9zZXQKKwl4b3J3CSVkeCwlZHgJCQkJIyBjYXJyeSBvbiBwYXNzL2Vycm9yIG9mCisJCQkJCQkjIGU4MDFoIG1lbW9yeSBzaXplIGNhbGwKKwkJCQkJCSMgb3IgbWVyZWx5IHBhc3MgY3gsZHggdGhvdWdoCisJCQkJCQkjIHdpdGhvdXQgY2hhbmdpbmcgdGhlbS4KKwltb3Z3CSQweGU4MDEsICVheAorCWludAkkMHgxNQorCWpjCW1lbTg4CisKKwljbXB3CSQweDAsICVjeAkJCSMgS2x1ZGdlIHRvIGhhbmRsZSBCSU9TZXMKKwlqbmUJZTgwMXVzZWN4ZHgJCQkjIHdoaWNoIHJlcG9ydCB0aGVpciBleHRlbmRlZAorCWNtcHcJJDB4MCwgJWR4CQkJIyBtZW1vcnkgaW4gQVgvQlggcmF0aGVyIHRoYW4KKwlqbmUJZTgwMXVzZWN4ZHgJCQkjIENYL0RYLiAgVGhlIHNwZWMgSSBoYXZlIHJlYWQKKwltb3Z3CSVheCwgJWN4CQkJIyBzZWVtcyB0byBpbmRpY2F0ZSBBWC9CWCAKKwltb3Z3CSVieCwgJWR4CQkJIyBhcmUgbW9yZSByZWFzb25hYmxlIGFueXdheS4uLgorCitlODAxdXNlY3hkeDoKKwlhbmRsCSQweGZmZmYsICVlZHgJCQkjIGNsZWFyIHNpZ24gZXh0ZW5kCisJc2hsbAkkNiwgJWVkeAkJCSMgYW5kIGdvIGZyb20gNjRrIHRvIDFrIGNodW5rcworCW1vdmwJJWVkeCwgKDB4MWUwKQkJCSMgc3RvcmUgZXh0ZW5kZWQgbWVtb3J5IHNpemUKKwlhbmRsCSQweGZmZmYsICVlY3gJCQkjIGNsZWFyIHNpZ24gZXh0ZW5kCisgCWFkZGwJJWVjeCwgKDB4MWUwKQkJCSMgYW5kIGFkZCBsb3dlciBtZW1vcnkgaW50bworCQkJCQkJIyB0b3RhbCBzaXplLgorCisjIFllIE9sZGUgVHJhZGl0aW9uYWwgTWV0aG9kZS4gIFJldHVybnMgdGhlIG1lbW9yeSBzaXplICh1cCB0byAxNm1iIG9yCisjIDY0bWIsIGRlcGVuZGluZyBvbiB0aGUgYmlvcykgaW4gYXguCittZW04ODoKKworI2VuZGlmCisJbW92YgkkMHg4OCwgJWFoCisJaW50CSQweDE1CisJbW92dwklYXgsICgyKQorCisjIFNldCB0aGUga2V5Ym9hcmQgcmVwZWF0IHJhdGUgdG8gdGhlIG1heAorCW1vdncJJDB4MDMwNSwgJWF4CisJeG9ydwklYngsICVieAorCWludAkkMHgxNgorCisjIENoZWNrIGZvciB2aWRlbyBhZGFwdGVyIGFuZCBpdHMgcGFyYW1ldGVycyBhbmQgYWxsb3cgdGhlCisjIHVzZXIgdG8gYnJvd3NlIHZpZGVvIG1vZGVzLgorCWNhbGwJdmlkZW8JCQkJIyBOT1RFOiB3ZSBuZWVkICVkcyBwb2ludGluZworCQkJCQkJIyB0byBib290c2VjdG9yCisKKyMgR2V0IGhkMCBkYXRhLi4uCisJeG9ydwklYXgsICVheAorCW1vdncJJWF4LCAlZHMKKwlsZHN3CSg0ICogMHg0MSksICVzaQorCW1vdncJJWNzLCAlYXgJCQkjIGFrYSBTRVRVUFNFRworCXN1YncJJERFTFRBX0lOSVRTRUcsICVheAkJIyBha2EgSU5JVFNFRworCXB1c2h3CSVheAorCW1vdncJJWF4LCAlZXMKKwltb3Z3CSQweDAwODAsICVkaQorCW1vdncJJDB4MTAsICVjeAorCXB1c2h3CSVjeAorCWNsZAorCXJlcAorIAltb3ZzYgorIyBHZXQgaGQxIGRhdGEuLi4KKwl4b3J3CSVheCwgJWF4CisJbW92dwklYXgsICVkcworCWxkc3cJKDQgKiAweDQ2KSwgJXNpCisJcG9wdwklY3gKKwlwb3B3CSVlcworCW1vdncJJDB4MDA5MCwgJWRpCisJcmVwCisJbW92c2IKKyMgQ2hlY2sgdGhhdCB0aGVyZSBJUyBhIGhkMSA6LSkKKwltb3Z3CSQweDAxNTAwLCAlYXgKKwltb3ZiCSQweDgxLCAlZGwKKwlpbnQJJDB4MTMKKwlqYwlub19kaXNrMQorCQorCWNtcGIJJDMsICVhaAorCWplCWlzX2Rpc2sxCisKK25vX2Rpc2sxOgorCW1vdncJJWNzLCAlYXgJCQkjIGFrYSBTRVRVUFNFRworCXN1YncJJERFTFRBX0lOSVRTRUcsICVheCAJCSMgYWthIElOSVRTRUcKKwltb3Z3CSVheCwgJWVzCisJbW92dwkkMHgwMDkwLCAlZGkKKwltb3Z3CSQweDEwLCAlY3gKKwl4b3J3CSVheCwgJWF4CisJY2xkCisJcmVwCisJc3Rvc2IKK2lzX2Rpc2sxOgorIyBjaGVjayBmb3IgTWljcm8gQ2hhbm5lbCAoTUNBKSBidXMKKwltb3Z3CSVjcywgJWF4CQkJIyBha2EgU0VUVVBTRUcKKwlzdWJ3CSRERUxUQV9JTklUU0VHLCAlYXgJCSMgYWthIElOSVRTRUcKKwltb3Z3CSVheCwgJWRzCisJeG9ydwklYXgsICVheAorCW1vdncJJWF4LCAoMHhhMCkJCQkjIHNldCB0YWJsZSBsZW5ndGggdG8gMAorCW1vdmIJJDB4YzAsICVhaAorCXN0YworCWludAkkMHgxNQkJCQkjIG1vdmVzIGZlYXR1cmUgdGFibGUgdG8gZXM6YngKKwlqYwlub19tY2EKKworCXB1c2h3CSVkcworCW1vdncJJWVzLCAlYXgKKwltb3Z3CSVheCwgJWRzCisJbW92dwklY3MsICVheAkJCSMgYWthIFNFVFVQU0VHCisJc3VidwkkREVMVEFfSU5JVFNFRywgJWF4CQkjIGFrYSBJTklUU0VHCisJbW92dwklYXgsICVlcworCW1vdncJJWJ4LCAlc2kKKwltb3Z3CSQweGEwLCAlZGkKKwltb3Z3CSglc2kpLCAlY3gKKwlhZGR3CSQyLCAlY3gJCQkJIyB0YWJsZSBsZW5ndGggaXMgYSBzaG9ydAorCWNtcHcJJDB4MTAsICVjeAorCWpjCXN5c2Rlc2Nfb2sKKworCW1vdncJJDB4MTAsICVjeAkJCSMgd2Uga2VlcCBvbmx5IGZpcnN0IDE2IGJ5dGVzCitzeXNkZXNjX29rOgorCXJlcAorCW1vdnNiCisJcG9wdwklZHMKK25vX21jYToKKyNpZmRlZiBDT05GSUdfWDg2X1ZPWUFHRVIKKwltb3ZiCSQweGZmLCAweDQwCSMgZmxhZyBvbiBjb25maWcgZm91bmQKKwltb3ZiCSQweGMwLCAlYWwKKwltb3YJJDB4ZmYsICVhaAorCWludAkkMHgxNQkJIyBwdXQgdm95YWdlciBjb25maWcgaW5mbyBhdCBlczpkaQorCWpjCW5vX3ZveWFnZXIKKwltb3Z3CSQweDQwLCAlc2kJIyBwbGFjZSB2b3lhZ2VyIGluZm8gaW4gYXBtIHRhYmxlCisJY2xkCisJbW92dwkkNywgJWN4Cit2b3lhZ2VyX3JlcDoKKwltb3ZiCSVlczooJWRpKSwgJWFsCisJbW92YgklYWwsKCVzaSkKKwlpbmN3CSVkaQorCWluY3cJJXNpCisJZGVjdwklY3gKKwlqbnoJdm95YWdlcl9yZXAKK25vX3ZveWFnZXI6CQorI2VuZGlmCisjIENoZWNrIGZvciBQUy8yIHBvaW50aW5nIGRldmljZQorCW1vdncJJWNzLCAlYXgJCQkjIGFrYSBTRVRVUFNFRworCXN1YncJJERFTFRBX0lOSVRTRUcsICVheAkJIyBha2EgSU5JVFNFRworCW1vdncJJWF4LCAlZHMKKwltb3Z3CSQwLCAoMHgxZmYpCQkJIyBkZWZhdWx0IGlzIG5vIHBvaW50aW5nIGRldmljZQorCWludAkkMHgxMQkJCQkjIGludCAweDExOiBlcXVpcG1lbnQgbGlzdAorCXRlc3RiCSQweDA0LCAlYWwJCQkjIGNoZWNrIGlmIG1vdXNlIGluc3RhbGxlZAorCWp6CW5vX3BzbW91c2UKKworCW1vdncJJDB4QUEsICgweDFmZikJCQkjIGRldmljZSBwcmVzZW50Citub19wc21vdXNlOgorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X1NQRUVEU1RFUF9TTUkpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl9TUEVFRFNURVBfU01JX01PRFVMRSkKKwltb3ZsCSQweDAwMDBFOTgwLCAlZWF4CQkjIElTVCBTdXBwb3J0IAorCW1vdmwJJDB4NDc1MzQ5NDMsICVlZHgJCSMgUmVxdWVzdCB2YWx1ZQorCWludAkkMHgxNQorCisJbW92bAklZWF4LCAoOTYpCisJbW92bAklZWJ4LCAoMTAwKQorCW1vdmwJJWVjeCwgKDEwNCkKKwltb3ZsCSVlZHgsICgxMDgpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0FQTSkgfHwgZGVmaW5lZChDT05GSUdfQVBNX01PRFVMRSkKKyMgVGhlbiBjaGVjayBmb3IgYW4gQVBNIEJJT1MuLi4KKwkJCQkJCSMgJWRzIHBvaW50cyB0byB0aGUgYm9vdHNlY3RvcgorCW1vdncJJDAsIDB4NDAJCQkjIHZlcnNpb24gPSAwIG1lYW5zIG5vIEFQTSBCSU9TCisJbW92dwkkMHgwNTMwMCwgJWF4CQkJIyBBUE0gQklPUyBpbnN0YWxsYXRpb24gY2hlY2sKKwl4b3J3CSVieCwgJWJ4CisJaW50CSQweDE1CisJamMJZG9uZV9hcG1fYmlvcwkJCSMgTm9wZSwgbm8gQVBNIEJJT1MKKwkKKwljbXB3CSQweDA1MDRkLCAlYngJCQkjIENoZWNrIGZvciAiUE0iIHNpZ25hdHVyZQorCWpuZQlkb25lX2FwbV9iaW9zCQkJIyBObyBzaWduYXR1cmUsIG5vIEFQTSBCSU9TCisKKwlhbmR3CSQweDAyLCAlY3gJCQkjIElzIDMyIGJpdCBzdXBwb3J0ZWQ/CisJamUJZG9uZV9hcG1fYmlvcwkJCSMgTm8gMzItYml0LCBubyAoZ29vZCkgQVBNIEJJT1MKKworCW1vdncJJDB4MDUzMDQsICVheAkJCSMgRGlzY29ubmVjdCBmaXJzdCBqdXN0IGluIGNhc2UKKwl4b3J3CSVieCwgJWJ4CisJaW50CSQweDE1CQkJCSMgaWdub3JlIHJldHVybiBjb2RlCisJbW92dwkkMHgwNTMwMywgJWF4CQkJIyAzMiBiaXQgY29ubmVjdAorCXhvcmwJJWVieCwgJWVieAorCXhvcncJJWN4LCAlY3gJCQkjIHBhcmFub2lhIDotKQorCXhvcncJJWR4LCAlZHgJCQkjICAgLi4uCisJeG9ybAklZXNpLCAlZXNpCQkJIyAgIC4uLgorCXhvcncJJWRpLCAlZGkJCQkjICAgLi4uCisJaW50CSQweDE1CisJamMJbm9fMzJfYXBtX2Jpb3MJCQkjIEFjaywgZXJyb3IuIAorCisJbW92dwklYXgsICAoNjYpCQkJIyBCSU9TIGNvZGUgc2VnbWVudAorCW1vdmwJJWVieCwgKDY4KQkJCSMgQklPUyBlbnRyeSBwb2ludCBvZmZzZXQKKwltb3Z3CSVjeCwgICg3MikJCQkjIEJJT1MgMTYgYml0IGNvZGUgc2VnbWVudAorCW1vdncJJWR4LCAgKDc0KQkJCSMgQklPUyBkYXRhIHNlZ21lbnQKKwltb3ZsCSVlc2ksICg3OCkJCQkjIEJJT1MgY29kZSBzZWdtZW50IGxlbmd0aHMKKwltb3Z3CSVkaSwgICg4MikJCQkjIEJJT1MgZGF0YSBzZWdtZW50IGxlbmd0aAorIyBSZWRvIHRoZSBpbnN0YWxsYXRpb24gY2hlY2sgYXMgdGhlIDMyIGJpdCBjb25uZWN0CisjIG1vZGlmaWVzIHRoZSBmbGFncyByZXR1cm5lZCBvbiBzb21lIEJJT1NzCisJbW92dwkkMHgwNTMwMCwgJWF4CQkJIyBBUE0gQklPUyBpbnN0YWxsYXRpb24gY2hlY2sKKwl4b3J3CSVieCwgJWJ4CisJeG9ydwklY3gsICVjeAkJCSMgcGFyYW5vaWEKKwlpbnQJJDB4MTUKKwlqYwlhcG1fZGlzY29ubmVjdAkJCSMgZXJyb3IgLT4gc2hvdWxkbid0IGhhcHBlbgorCisJY21wdwkkMHgwNTA0ZCwgJWJ4CQkJIyBjaGVjayBmb3IgIlBNIiBzaWduYXR1cmUKKwlqbmUJYXBtX2Rpc2Nvbm5lY3QJCQkjIG5vIHNpZyAtPiBzaG91bGRuJ3QgaGFwcGVuCisKKwltb3Z3CSVheCwgKDY0KQkJCSMgcmVjb3JkIHRoZSBBUE0gQklPUyB2ZXJzaW9uCisJbW92dwklY3gsICg3NikJCQkjIGFuZCBmbGFncworCWptcAlkb25lX2FwbV9iaW9zCisKK2FwbV9kaXNjb25uZWN0OgkJCQkJIyBUaWR5IHVwCisJbW92dwkkMHgwNTMwNCwgJWF4CQkJIyBEaXNjb25uZWN0CisJeG9ydwklYngsICVieAorCWludAkkMHgxNQkJCQkjIGlnbm9yZSByZXR1cm4gY29kZQorCisJam1wCWRvbmVfYXBtX2Jpb3MKKworbm9fMzJfYXBtX2Jpb3M6CisJYW5kdwkkMHhmZmZkLCAoNzYpCQkJIyByZW1vdmUgMzIgYml0IHN1cHBvcnQgYml0Citkb25lX2FwbV9iaW9zOgorI2VuZGlmCisKKyNpbmNsdWRlICJlZGQuUyIKKworIyBOb3cgd2Ugd2FudCB0byBtb3ZlIHRvIHByb3RlY3RlZCBtb2RlIC4uLgorCWNtcHcJJDAsICVjczpyZWFsbW9kZV9zd3RjaAorCWp6CXJtb2Rlc3d0Y2hfbm9ybWFsCisKKwlsY2FsbAkqJWNzOnJlYWxtb2RlX3N3dGNoCisKKwlqbXAJcm1vZGVzd3RjaF9lbmQKKworcm1vZGVzd3RjaF9ub3JtYWw6CisgICAgICAgIHB1c2h3CSVjcworCWNhbGwJZGVmYXVsdF9zd2l0Y2gKKworcm1vZGVzd3RjaF9lbmQ6CisjIHdlIGdldCB0aGUgY29kZTMyIHN0YXJ0IGFkZHJlc3MgYW5kIG1vZGlmeSB0aGUgYmVsb3cgJ2ptcGknCisjIChsb2FkZXIgbWF5IGhhdmUgY2hhbmdlZCBpdCkKKwltb3ZsCSVjczpjb2RlMzJfc3RhcnQsICVlYXgKKwltb3ZsCSVlYXgsICVjczpjb2RlMzIKKworIyBOb3cgd2UgbW92ZSB0aGUgc3lzdGVtIHRvIGl0cyByaWdodGZ1bCBwbGFjZSAuLi4gYnV0IHdlIGNoZWNrIGlmIHdlIGhhdmUgYQorIyBiaWcta2VybmVsLiBJbiB0aGF0IGNhc2Ugd2UgKm11c3QqIG5vdCBtb3ZlIGl0IC4uLgorCXRlc3RiCSRMT0FERURfSElHSCwgJWNzOmxvYWRmbGFncworCWp6CWRvX21vdmUwCQkJIyAuLiB0aGVuIHdlIGhhdmUgYSBub3JtYWwgbG93CisJCQkJCQkjIGxvYWRlZCB6SW1hZ2UKKwkJCQkJCSMgLi4gb3IgZWxzZSB3ZSBoYXZlIGEgaGlnaAorCQkJCQkJIyBsb2FkZWQgYnpJbWFnZQorCWptcAllbmRfbW92ZQkJCSMgLi4uIGFuZCB3ZSBza2lwIG1vdmluZworCitkb19tb3ZlMDoKKwltb3Z3CSQweDEwMCwgJWF4CQkJIyBzdGFydCBvZiBkZXN0aW5hdGlvbiBzZWdtZW50CisJbW92dwklY3MsICVicAkJCSMgYWthIFNFVFVQU0VHCisJc3VidwkkREVMVEFfSU5JVFNFRywgJWJwCQkjIGFrYSBJTklUU0VHCisJbW92dwklY3M6c3RhcnRfc3lzX3NlZywgJWJ4CQkjIHN0YXJ0IG9mIHNvdXJjZSBzZWdtZW50CisJY2xkCitkb19tb3ZlOgorCW1vdncJJWF4LCAlZXMJCQkjIGRlc3RpbmF0aW9uIHNlZ21lbnQKKwlpbmNiCSVhaAkJCQkjIGluc3RlYWQgb2YgYWRkIGF4LCMweDEwMAorCW1vdncJJWJ4LCAlZHMJCQkjIHNvdXJjZSBzZWdtZW50CisJYWRkdwkkMHgxMDAsICVieAorCXN1YncJJWRpLCAlZGkKKwlzdWJ3CSVzaSwgJXNpCisJbW92dyAJJDB4ODAwLCAlY3gKKwlyZXAKKwltb3ZzdworCWNtcHcJJWJwLCAlYngJCQkjIGFzc3VtZSBzdGFydF9zeXNfc2VnID4gMHgyMDAsCisJCQkJCQkjIHNvIHdlIHdpbGwgcGVyaGFwcyByZWFkIG9uZQorCQkJCQkJIyBwYWdlIG1vcmUgdGhhbiBuZWVkZWQsIGJ1dAorCQkJCQkJIyBuZXZlciBvdmVyd3JpdGUgSU5JVFNFRworCQkJCQkJIyBiZWNhdXNlIGRlc3RpbmF0aW9uIGlzIGEKKwkJCQkJCSMgbWluaW11bSBvbmUgcGFnZSBiZWxvdyBzb3VyY2UKKwlqYglkb19tb3ZlCisKK2VuZF9tb3ZlOgorIyB0aGVuIHdlIGxvYWQgdGhlIHNlZ21lbnQgZGVzY3JpcHRvcnMKKwltb3Z3CSVjcywgJWF4CQkJIyBha2EgU0VUVVBTRUcKKwltb3Z3CSVheCwgJWRzCisJCQorIyBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gYmUgZG93bndhcmQgY29tcGF0aWJsZSB3aXRoIHZlcnNpb24gPD0yMDEKKwljbXBsCSQwLCBjbWRfbGluZV9wdHIKKwlqbmUJZW5kX21vdmVfc2VsZgkJIyBsb2FkZXIgdXNlcyB2ZXJzaW9uID49MjAyIGZlYXR1cmVzCisJY21wYgkkMHgyMCwgdHlwZV9vZl9sb2FkZXIKKwlqZQllbmRfbW92ZV9zZWxmCQkjIGJvb3RzZWN0IGxvYWRlciwgd2Uga25vdyBvZiBpdAorCisjIEJvb3QgbG9hZGVyIGRvZXNudCBzdXBwb3J0IGJvb3QgcHJvdG9jb2wgdmVyc2lvbiAyLjAyLgorIyBJZiB3ZSBoYXZlIG91ciBjb2RlIG5vdCBhdCAweDkwMDAwLCB3ZSBuZWVkIHRvIG1vdmUgaXQgdGhlcmUgbm93LgorIyBXZSBhbHNvIHRoZW4gbmVlZCB0byBtb3ZlIHRoZSBwYXJhbXMgYmVoaW5kIGl0IChjb21tYW5kbGluZSkKKyMgQmVjYXVzZSB3ZSB3b3VsZCBvdmVyd3JpdGUgdGhlIGNvZGUgb24gdGhlIGN1cnJlbnQgSVAsIHdlIG1vdmUKKyMgaXQgaW4gdHdvIHN0ZXBzLCBqdW1waW5nIGhpZ2ggYWZ0ZXIgdGhlIGZpcnN0IG9uZS4KKwltb3Z3CSVjcywgJWF4CisJY21wdwkkU0VUVVBTRUcsICVheAorCWplCWVuZF9tb3ZlX3NlbGYKKworCWNsaQkJCQkJIyBtYWtlIHN1cmUgd2UgcmVhbGx5IGhhdmUKKwkJCQkJCSMgaW50ZXJydXB0cyBkaXNhYmxlZCAhCisJCQkJCQkjIGJlY2F1c2UgYWZ0ZXIgdGhpcyB0aGUgc3RhY2sKKwkJCQkJCSMgc2hvdWxkIG5vdCBiZSB1c2VkCisJc3VidwkkREVMVEFfSU5JVFNFRywgJWF4CQkjIGFrYSBJTklUU0VHCisJbW92dwklc3MsICVkeAorCWNtcHcJJWF4LCAlZHgKKwlqYgltb3ZlX3NlbGZfMQorCisJYWRkdwkkSU5JVFNFRywgJWR4CisJc3VidwklYXgsICVkeAkJCSMgdGhpcyB3aWxsIGdvIGludG8gJXNzIGFmdGVyCisJCQkJCQkjIHRoZSBtb3ZlCittb3ZlX3NlbGZfMToKKwltb3Z3CSVheCwgJWRzCisJbW92dwkkSU5JVFNFRywgJWF4CQkJIyByZWFsIElOSVRTRUcKKwltb3Z3CSVheCwgJWVzCisJbW92dwklY3M6c2V0dXBfbW92ZV9zaXplLCAlY3gKKwlzdGQJCQkJCSMgd2UgaGF2ZSB0byBtb3ZlIHVwLCBzbyB3ZSB1c2UKKwkJCQkJCSMgZGlyZWN0aW9uIGRvd24gYmVjYXVzZSB0aGUKKwkJCQkJCSMgYXJlYXMgbWF5IG92ZXJsYXAKKwltb3Z3CSVjeCwgJWRpCisJZGVjdwklZGkKKwltb3Z3CSVkaSwgJXNpCisJc3VidwkkbW92ZV9zZWxmX2hlcmUrMHgyMDAsICVjeAorCXJlcAorCW1vdnNiCisJbGptcAkkU0VUVVBTRUcsICRtb3ZlX3NlbGZfaGVyZQorCittb3ZlX3NlbGZfaGVyZToKKwltb3Z3CSRtb3ZlX3NlbGZfaGVyZSsweDIwMCwgJWN4CisJcmVwCisJbW92c2IKKwltb3Z3CSRTRVRVUFNFRywgJWF4CisJbW92dwklYXgsICVkcworCW1vdncJJWR4LCAlc3MKK2VuZF9tb3ZlX3NlbGY6CQkJCQkjIG5vdyB3ZSBhcmUgYXQgdGhlIHJpZ2h0IHBsYWNlCisKKyMKKyMgRW5hYmxlIEEyMC4gIFRoaXMgaXMgYXQgdGhlIHZlcnkgYmVzdCBhbiBhbm5veWluZyBwcm9jZWR1cmUuCisjIEEyMCBjb2RlIHBvcnRlZCBmcm9tIFNZU0xJTlVYIDEuNTItMS42MyBieSBILiBQZXRlciBBbnZpbi4KKyMgQU1EIEVsYW4gYnVnIGZpeCBieSBSb2JlcnQgU2Nod2ViZWwuCisjCisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfRUxBTikKKwltb3ZiICQweDAyLCAlYWwJCQkjIGFsdGVybmF0ZSBBMjAgZ2F0ZQorCW91dGIgJWFsLCAkMHg5MgkJCSMgdGhpcyB3b3JrcyBvbiBTQzQxMC9TQzUyMAorYTIwX2VsYW5fd2FpdDoKKwljYWxsIGEyMF90ZXN0CisJanogYTIwX2VsYW5fd2FpdAorCWptcCBhMjBfZG9uZQorI2VuZGlmCisKKworQTIwX1RFU1RfTE9PUFMJCT0gIDMyCQkjIEl0ZXJhdGlvbnMgcGVyIHdhaXQKK0EyMF9FTkFCTEVfTE9PUFMJPSAyNTUJCSMgVG90YWwgbG9vcHMgdG8gdHJ5CQkKKworCisjaWZuZGVmIENPTkZJR19YODZfVk9ZQUdFUgorYTIwX3RyeV9sb29wOgorCisJIyBGaXJzdCwgc2VlIGlmIHdlIGFyZSBvbiBhIHN5c3RlbSB3aXRoIG5vIEEyMCBnYXRlLgorYTIwX25vbmU6CisJY2FsbAlhMjBfdGVzdAorCWpueglhMjBfZG9uZQorCisJIyBOZXh0LCB0cnkgdGhlIEJJT1MgKElOVCAweDE1LCBBWD0weDI0MDEpCithMjBfYmlvczoKKwltb3Z3CSQweDI0MDEsICVheAorCXB1c2hmbAkJCQkJIyBCZSBwYXJhbm9pZCBhYm91dCBmbGFncworCWludAkkMHgxNQorCXBvcGZsCisKKwljYWxsCWEyMF90ZXN0CisJam56CWEyMF9kb25lCisKKwkjIFRyeSBlbmFibGluZyBBMjAgdGhyb3VnaCB0aGUga2V5Ym9hcmQgY29udHJvbGxlcgorI2VuZGlmIC8qIENPTkZJR19YODZfVk9ZQUdFUiAqLworYTIwX2tiYzoKKwljYWxsCWVtcHR5XzgwNDIKKworI2lmbmRlZiBDT05GSUdfWDg2X1ZPWUFHRVIKKwljYWxsCWEyMF90ZXN0CQkJIyBKdXN0IGluIGNhc2UgdGhlIEJJT1Mgd29ya2VkCisJam56CWEyMF9kb25lCQkJIyBidXQgaGFkIGEgZGVsYXllZCByZWFjdGlvbi4KKyNlbmRpZgorCisJbW92YgkkMHhEMSwgJWFsCQkJIyBjb21tYW5kIHdyaXRlCisJb3V0YgklYWwsICQweDY0CisJY2FsbAllbXB0eV84MDQyCisKKwltb3ZiCSQweERGLCAlYWwJCQkjIEEyMCBvbgorCW91dGIJJWFsLCAkMHg2MAorCWNhbGwJZW1wdHlfODA0MgorCisjaWZuZGVmIENPTkZJR19YODZfVk9ZQUdFUgorCSMgV2FpdCB1bnRpbCBhMjAgcmVhbGx5ICppcyogZW5hYmxlZDsgaXQgY2FuIHRha2UgYSBmYWlyIGFtb3VudCBvZgorCSMgdGltZSBvbiBjZXJ0YWluIHN5c3RlbXM7IFRvc2hpYmEgVGVjcmFzIGFyZSBrbm93biB0byBoYXZlIHRoaXMKKwkjIHByb2JsZW0uCithMjBfa2JjX3dhaXQ6CisJeG9ydwklY3gsICVjeAorYTIwX2tiY193YWl0X2xvb3A6CisJY2FsbAlhMjBfdGVzdAorCWpueglhMjBfZG9uZQorCWxvb3AJYTIwX2tiY193YWl0X2xvb3AKKworCSMgRmluYWwgYXR0ZW1wdDogdXNlICJjb25maWd1cmF0aW9uIHBvcnQgQSIKK2EyMF9mYXN0OgorCWluYgkkMHg5MiwgJWFsCQkJIyBDb25maWd1cmF0aW9uIFBvcnQgQQorCW9yYgkkMHgwMiwgJWFsCQkJIyAiZmFzdCBBMjAiIHZlcnNpb24KKwlhbmRiCSQweEZFLCAlYWwJCQkjIGRvbid0IGFjY2lkZW50YWxseSByZXNldAorCW91dGIJJWFsLCAkMHg5MgorCisJIyBXYWl0IGZvciBjb25maWd1cmF0aW9uIHBvcnQgQSB0byB0YWtlIGVmZmVjdAorYTIwX2Zhc3Rfd2FpdDoKKwl4b3J3CSVjeCwgJWN4CithMjBfZmFzdF93YWl0X2xvb3A6CisJY2FsbAlhMjBfdGVzdAorCWpueglhMjBfZG9uZQorCWxvb3AJYTIwX2Zhc3Rfd2FpdF9sb29wCisKKwkjIEEyMCBpcyBzdGlsbCBub3QgcmVzcG9uZGluZy4gIFRyeSBmcm9iYmluZyBpdCBhZ2Fpbi4KKwkjIAorCWRlY2IJKGEyMF90cmllcykKKwlqbnoJYTIwX3RyeV9sb29wCisJCisJbW92dwkkYTIwX2Vycl9tc2csICVzaQorCWNhbGwJcHJ0c3RyCisKK2EyMF9kaWU6CisJaGx0CisJam1wCWEyMF9kaWUKKworYTIwX3RyaWVzOgorCS5ieXRlCUEyMF9FTkFCTEVfTE9PUFMKKworYTIwX2Vycl9tc2c6CisJLmFzY2lpCSJsaW51eDogZmF0YWwgZXJyb3I6IEEyMCBnYXRlIG5vdCByZXNwb25kaW5nISIKKwkuYnl0ZQkxMywgMTAsIDAKKworCSMgSWYgd2UgZ2V0IGhlcmUsIGFsbCBpcyBnb29kCithMjBfZG9uZToKKworI2VuZGlmIC8qIENPTkZJR19YODZfVk9ZQUdFUiAqLworIyBzZXQgdXAgZ2R0IGFuZCBpZHQKKwlsaWR0CWlkdF80OAkJCQkjIGxvYWQgaWR0IHdpdGggMCwwCisJeG9ybAklZWF4LCAlZWF4CQkJIyBDb21wdXRlIGdkdF9iYXNlCisJbW92dwklZHMsICVheAkJCSMgKENvbnZlcnQgJWRzOmdkdCB0byBhIGxpbmVhciBwdHIpCisJc2hsbAkkNCwgJWVheAorCWFkZGwJJGdkdCwgJWVheAorCW1vdmwJJWVheCwgKGdkdF80OCsyKQorCWxnZHQJZ2R0XzQ4CQkJCSMgbG9hZCBnZHQgd2l0aCB3aGF0ZXZlciBpcworCQkJCQkJIyBhcHByb3ByaWF0ZQorCisjIG1ha2Ugc3VyZSBhbnkgcG9zc2libGUgY29wcm9jZXNzb3IgaXMgcHJvcGVybHkgcmVzZXQuLgorCXhvcncJJWF4LCAlYXgKKwlvdXRiCSVhbCwgJDB4ZjAKKwljYWxsCWRlbGF5CisKKwlvdXRiCSVhbCwgJDB4ZjEKKwljYWxsCWRlbGF5CisKKyMgd2VsbCwgdGhhdCB3ZW50IG9rLCBJIGhvcGUuIE5vdyB3ZSBtYXNrIGFsbCBpbnRlcnJ1cHRzIC0gdGhlIHJlc3QKKyMgaXMgZG9uZSBpbiBpbml0X0lSUSgpLgorCW1vdmIJJDB4RkYsICVhbAkJCSMgbWFzayBhbGwgaW50ZXJydXB0cyBmb3Igbm93CisJb3V0YgklYWwsICQweEExCisJY2FsbAlkZWxheQorCQorCW1vdmIJJDB4RkIsICVhbAkJCSMgbWFzayBhbGwgaXJxJ3MgYnV0IGlycTIgd2hpY2gKKwlvdXRiCSVhbCwgJDB4MjEJCQkjIGlzIGNhc2NhZGVkCisKKyMgV2VsbCwgdGhhdCBjZXJ0YWlubHkgd2Fzbid0IGZ1biA6LSguIEhvcGVmdWxseSBpdCB3b3JrcywgYW5kIHdlIGRvbid0CisjIG5lZWQgbm8gc3RlZW5raW5nIEJJT1MgYW55d2F5IChleGNlcHQgZm9yIHRoZSBpbml0aWFsIGxvYWRpbmcgOi0pLgorIyBUaGUgQklPUy1yb3V0aW5lIHdhbnRzIGxvdHMgb2YgdW5uZWNlc3NhcnkgZGF0YSwgYW5kIGl0J3MgbGVzcworIyAiaW50ZXJlc3RpbmciIGFueXdheS4gVGhpcyBpcyBob3cgUkVBTCBwcm9ncmFtbWVycyBkbyBpdC4KKyMKKyMgV2VsbCwgbm93J3MgdGhlIHRpbWUgdG8gYWN0dWFsbHkgbW92ZSBpbnRvIHByb3RlY3RlZCBtb2RlLiBUbyBtYWtlCisjIHRoaW5ncyBhcyBzaW1wbGUgYXMgcG9zc2libGUsIHdlIGRvIG5vIHJlZ2lzdGVyIHNldC11cCBvciBhbnl0aGluZywKKyMgd2UgbGV0IHRoZSBnbnUtY29tcGlsZWQgMzItYml0IHByb2dyYW1zIGRvIHRoYXQuIFdlIGp1c3QganVtcCB0bworIyBhYnNvbHV0ZSBhZGRyZXNzIDB4MTAwMCAob3IgdGhlIGxvYWRlciBzdXBwbGllZCBvbmUpLAorIyBpbiAzMi1iaXQgcHJvdGVjdGVkIG1vZGUuCisjCisjIE5vdGUgdGhhdCB0aGUgc2hvcnQganVtcCBpc24ndCBzdHJpY3RseSBuZWVkZWQsIGFsdGhvdWdoIHRoZXJlIGFyZQorIyByZWFzb25zIHdoeSBpdCBtaWdodCBiZSBhIGdvb2QgaWRlYS4gSXQgd29uJ3QgaHVydCBpbiBhbnkgY2FzZS4KKwltb3Z3CSQxLCAlYXgJCQkJIyBwcm90ZWN0ZWQgbW9kZSAoUEUpIGJpdAorCWxtc3cJJWF4CQkJCSMgVGhpcyBpcyBpdCEKKwlqbXAJZmx1c2hfaW5zdHIKKworZmx1c2hfaW5zdHI6CisJeG9ydwklYngsICVieAkJCSMgRmxhZyB0byBpbmRpY2F0ZSBhIGJvb3QKKwl4b3JsCSVlc2ksICVlc2kJCQkjIFBvaW50ZXIgdG8gcmVhbC1tb2RlIGNvZGUKKwltb3Z3CSVjcywgJXNpCisJc3VidwkkREVMVEFfSU5JVFNFRywgJXNpCisJc2hsbAkkNCwgJWVzaQkJCSMgQ29udmVydCB0byAzMi1iaXQgcG9pbnRlcgorCisjIGp1bXAgdG8gc3RhcnR1cF8zMiBpbiBhcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL2hlYWQuUworIwkKKyMgTk9URTogRm9yIGhpZ2ggbG9hZGVkIGJpZyBrZXJuZWxzIHdlIG5lZWQgYQorIwlqbXBpICAgIDB4MTAwMDAwLF9fQk9PVF9DUworIworIwlidXQgd2UgeWV0IGhhdmVuJ3QgcmVsb2FkZWQgdGhlIENTIHJlZ2lzdGVyLCBzbyB0aGUgZGVmYXVsdCBzaXplIAorIwlvZiB0aGUgdGFyZ2V0IG9mZnNldCBzdGlsbCBpcyAxNiBiaXQuCisjICAgICAgIEhvd2V2ZXIsIHVzaW5nIGFuIG9wZXJhbmQgcHJlZml4ICgweDY2KSwgdGhlIENQVSB3aWxsIHByb3Blcmx5CisjCXRha2Ugb3VyIDQ4IGJpdCBmYXIgcG9pbnRlci4gKElOVGVMIDgwMzg2IFByb2dyYW1tZXIncyBSZWZlcmVuY2UKKyMJTWFudWFsLCBNaXhpbmcgMTYtYml0IGFuZCAzMi1iaXQgY29kZSwgcGFnZSAxNi02KQorCisJLmJ5dGUgMHg2NiwgMHhlYQkJCSMgcHJlZml4ICsgam1waS1vcGNvZGUKK2NvZGUzMjoJLmxvbmcJMHgxMDAwCQkJCSMgd2lsbCBiZSBzZXQgdG8gMHgxMDAwMDAKKwkJCQkJCSMgZm9yIGJpZyBrZXJuZWxzCisJLndvcmQJX19CT09UX0NTCisKKyMgSGVyZSdzIGEgYnVuY2ggb2YgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBjdXJyZW50IGtlcm5lbC4uCitrZXJuZWxfdmVyc2lvbjoJLmFzY2lpCVVUU19SRUxFQVNFCisJCS5hc2NpaQkiICgiCisJCS5hc2NpaQlMSU5VWF9DT01QSUxFX0JZCisJCS5hc2NpaQkiQCIKKwkJLmFzY2lpCUxJTlVYX0NPTVBJTEVfSE9TVAorCQkuYXNjaWkJIikgIgorCQkuYXNjaWkJVVRTX1ZFUlNJT04KKwkJLmJ5dGUJMAorCisjIFRoaXMgaXMgdGhlIGRlZmF1bHQgcmVhbCBtb2RlIHN3aXRjaCByb3V0aW5lLgorIyB0byBiZSBjYWxsZWQganVzdCBiZWZvcmUgcHJvdGVjdGVkIG1vZGUgdHJhbnNpdGlvbgorZGVmYXVsdF9zd2l0Y2g6CisJY2xpCQkJCQkjIG5vIGludGVycnVwdHMgYWxsb3dlZCAhCisJbW92YgkkMHg4MCwgJWFsCQkJIyBkaXNhYmxlIE5NSSBmb3IgYm9vdHVwCisJCQkJCQkjIHNlcXVlbmNlCisJb3V0YgklYWwsICQweDcwCisJbHJldAorCisKKyNpZm5kZWYgQ09ORklHX1g4Nl9WT1lBR0VSCisjIFRoaXMgcm91dGluZSB0ZXN0cyB3aGV0aGVyIG9yIG5vdCBBMjAgaXMgZW5hYmxlZC4gIElmIHNvLCBpdAorIyBleGl0cyB3aXRoIHpmID0gMC4KKyMKKyMgVGhlIG1lbW9yeSBhZGRyZXNzIHVzZWQsIDB4MjAwLCBpcyB0aGUgaW50ICQweDgwIHZlY3Rvciwgd2hpY2gKKyMgc2hvdWxkIGJlIHNhZmUuCisKK0EyMF9URVNUX0FERFIgPSA0KjB4ODAKKworYTIwX3Rlc3Q6CisJcHVzaHcJJWN4CisJcHVzaHcJJWF4CisJeG9ydwklY3gsICVjeAorCW1vdncJJWN4LCAlZnMJCQkjIExvdyBtZW1vcnkKKwlkZWN3CSVjeAorCW1vdncJJWN4LCAlZ3MJCQkjIEhpZ2ggbWVtb3J5IGFyZWEKKwltb3Z3CSRBMjBfVEVTVF9MT09QUywgJWN4CisJbW92dwklZnM6KEEyMF9URVNUX0FERFIpLCAlYXgKKwlwdXNodwklYXgKK2EyMF90ZXN0X3dhaXQ6CisJaW5jdwklYXgKKwltb3Z3CSVheCwgJWZzOihBMjBfVEVTVF9BRERSKQorCWNhbGwJZGVsYXkJCQkJIyBTZXJpYWxpemUgYW5kIG1ha2UgZGVsYXkgY29uc3RhbnQKKwljbXB3CSVnczooQTIwX1RFU1RfQUREUisweDEwKSwgJWF4CisJbG9vcGUJYTIwX3Rlc3Rfd2FpdAorCisJcG9wdwklZnM6KEEyMF9URVNUX0FERFIpCisJcG9wdwklYXgKKwlwb3B3CSVjeAorCXJldAkKKworI2VuZGlmIC8qIENPTkZJR19YODZfVk9ZQUdFUiAqLworCisjIFRoaXMgcm91dGluZSBjaGVja3MgdGhhdCB0aGUga2V5Ym9hcmQgY29tbWFuZCBxdWV1ZSBpcyBlbXB0eQorIyAoYWZ0ZXIgZW1wdHlpbmcgdGhlIG91dHB1dCBidWZmZXJzKQorIworIyBTb21lIG1hY2hpbmVzIGhhdmUgZGVsdXNpb25zIHRoYXQgdGhlIGtleWJvYXJkIGJ1ZmZlciBpcyBhbHdheXMgZnVsbAorIyB3aXRoIG5vIGtleWJvYXJkIGF0dGFjaGVkLi4uCisjCisjIElmIHRoZXJlIGlzIG5vIGtleWJvYXJkIGNvbnRyb2xsZXIsIHdlIHdpbGwgdXN1YWxseSBnZXQgMHhmZgorIyB0byBhbGwgdGhlIHJlYWRzLiAgV2l0aCBlYWNoIElPIHRha2luZyBhIG1pY3Jvc2Vjb25kIGFuZAorIyBhIHRpbWVvdXQgb2YgMTAwLDAwMCBpdGVyYXRpb25zLCB0aGlzIGNhbiB0YWtlIGFib3V0IGhhbGYgYQorIyBzZWNvbmQgKCJkZWxheSIgPT0gb3V0YiB0byBwb3J0IDB4ODApLiBUaGF0IHNob3VsZCBiZSBvaywKKyMgYW5kIHNob3VsZCBhbHNvIGJlIHBsZW50eSBvZiB0aW1lIGZvciBhIHJlYWwga2V5Ym9hcmQgY29udHJvbGxlcgorIyB0byBlbXB0eS4KKyMKKworZW1wdHlfODA0MjoKKwlwdXNobAklZWN4CisJbW92bAkkMTAwMDAwLCAlZWN4CisKK2VtcHR5XzgwNDJfbG9vcDoKKwlkZWNsCSVlY3gKKwlqegllbXB0eV84MDQyX2VuZF9sb29wCisKKwljYWxsCWRlbGF5CisKKwlpbmIJJDB4NjQsICVhbAkJCSMgODA0MiBzdGF0dXMgcG9ydAorCXRlc3RiCSQxLCAlYWwJCQkJIyBvdXRwdXQgYnVmZmVyPworCWp6CW5vX291dHB1dAorCisJY2FsbAlkZWxheQorCWluYgkkMHg2MCwgJWFsCQkJIyByZWFkIGl0CisJam1wCWVtcHR5XzgwNDJfbG9vcAorCitub19vdXRwdXQ6CisJdGVzdGIJJDIsICVhbAkJCQkjIGlzIGlucHV0IGJ1ZmZlciBmdWxsPworCWpuegllbXB0eV84MDQyX2xvb3AJCQkjIHllcyAtIGxvb3AKK2VtcHR5XzgwNDJfZW5kX2xvb3A6CisJcG9wbAklZWN4CisJcmV0CisKKyMgUmVhZCB0aGUgY21vcyBjbG9jay4gUmV0dXJuIHRoZSBzZWNvbmRzIGluIGFsCitnZXR0aW1lOgorCXB1c2h3CSVjeAorCW1vdmIJJDB4MDIsICVhaAorCWludAkkMHgxYQorCW1vdmIJJWRoLCAlYWwJCQkjICVkaCBjb250YWlucyB0aGUgc2Vjb25kcworCWFuZGIJJDB4MGYsICVhbAorCW1vdmIJJWRoLCAlYWgKKwltb3ZiCSQweDA0LCAlY2wKKwlzaHJiCSVjbCwgJWFoCisJYWFkCisJcG9wdwklY3gKKwlyZXQKKworIyBEZWxheSBpcyBuZWVkZWQgYWZ0ZXIgZG9pbmcgSS9PCitkZWxheToKKwlvdXRiCSVhbCwkMHg4MAorCXJldAorCisjIERlc2NyaXB0b3IgdGFibGVzCisjCisjIE5PVEU6IFRoZSBpbnRlbCBtYW51YWwgc2F5cyBnZHQgc2hvdWxkIGJlIHNpeHRlZW4gYnl0ZXMgYWxpZ25lZCBmb3IKKyMgZWZmaWNpZW5jeSByZWFzb25zLiAgSG93ZXZlciwgdGhlcmUgYXJlIG1hY2hpbmVzIHdoaWNoIGFyZSBrbm93biBub3QKKyMgdG8gYm9vdCB3aXRoIG1pc2FsaWduZWQgR0RUcywgc28gYWx0ZXIgdGhpcyBhdCB5b3VyIHBlcmlsISAgSWYgeW91IGFsdGVyCisjIEdEVF9FTlRSWV9CT09UX0NTIChpbiBhc20vc2VnbWVudC5oKSByZW1lbWJlciB0byBsZWF2ZSBhdCBsZWFzdCB0d28KKyMgZW1wdHkgR0RUIGVudHJpZXMgKG9uZSBmb3IgTlVMTCBhbmQgb25lIHJlc2VydmVkKS4KKyMKKyMgTk9URToJT24gc29tZSBDUFVzLCB0aGUgR0RUIG11c3QgYmUgOCBieXRlIGFsaWduZWQuICBUaGlzIGlzCisjIHRydWUgZm9yIHRoZSBWb3lhZ2VyIFF1YWQgQ1BVIGNhcmQgd2hpY2ggd2lsbCBub3QgYm9vdCB3aXRob3V0CisjIFRoaXMgZGlyZWN0aXZlLiAgMTYgYnl0ZSBhbGlnbWVudCBpcyByZWNvbW1lbmRlZCBieSBpbnRlbC4KKyMKKwkuYWxpZ24gMTYKK2dkdDoKKwkuZmlsbCBHRFRfRU5UUllfQk9PVF9DUyw4LDAKKworCS53b3JkCTB4RkZGRgkJCQkjIDRHYiAtICgweDEwMDAwMCoweDEwMDAgPSA0R2IpCisJLndvcmQJMAkJCQkjIGJhc2UgYWRkcmVzcyA9IDAKKwkud29yZAkweDlBMDAJCQkJIyBjb2RlIHJlYWQvZXhlYworCS53b3JkCTB4MDBDRgkJCQkjIGdyYW51bGFyaXR5ID0gNDA5NiwgMzg2CisJCQkJCQkjICAoKzV0aCBuaWJibGUgb2YgbGltaXQpCisKKwkud29yZAkweEZGRkYJCQkJIyA0R2IgLSAoMHgxMDAwMDAqMHgxMDAwID0gNEdiKQorCS53b3JkCTAJCQkJIyBiYXNlIGFkZHJlc3MgPSAwCisJLndvcmQJMHg5MjAwCQkJCSMgZGF0YSByZWFkL3dyaXRlCisJLndvcmQJMHgwMENGCQkJCSMgZ3JhbnVsYXJpdHkgPSA0MDk2LCAzODYKKwkJCQkJCSMgICgrNXRoIG5pYmJsZSBvZiBsaW1pdCkKK2dkdF9lbmQ6CisJLmFsaWduCTQKKwkKKwkud29yZAkwCQkJCSMgYWxpZ25tZW50IGJ5dGUKK2lkdF80ODoKKwkud29yZAkwCQkJCSMgaWR0IGxpbWl0ID0gMAorCS53b3JkCTAsIDAJCQkJIyBpZHQgYmFzZSA9IDBMCisKKwkud29yZAkwCQkJCSMgYWxpZ25tZW50IGJ5dGUKK2dkdF80ODoKKwkud29yZAlnZHRfZW5kIC0gZ2R0IC0gMQkJIyBnZHQgbGltaXQKKwkud29yZAkwLCAwCQkJCSMgZ2R0IGJhc2UgKGZpbGxlZCBpbiBsYXRlcikKKworIyBJbmNsdWRlIHZpZGVvIHNldHVwICYgZGV0ZWN0aW9uIGNvZGUKKworI2luY2x1ZGUgInZpZGVvLlMiCisKKyMgU2V0dXAgc2lnbmF0dXJlIC0tIG11c3QgYmUgbGFzdAorc2V0dXBfc2lnMToJLndvcmQJU0lHMQorc2V0dXBfc2lnMjoJLndvcmQJU0lHMgorCisjIEFmdGVyIHRoaXMgcG9pbnQsIHRoZXJlIGlzIHNvbWUgZnJlZSBzcGFjZSB3aGljaCBpcyB1c2VkIGJ5IHRoZSB2aWRlbyBtb2RlCisjIGhhbmRsaW5nIGNvZGUgdG8gc3RvcmUgdGhlIHRlbXBvcmFyeSBtb2RlIHRhYmxlIChub3QgdXNlZCBieSB0aGUga2VybmVsKS4KKworbW9kZWxpc3Q6CisKKy50ZXh0CitlbmR0ZXh0OgorLmRhdGEKK2VuZGRhdGE6CisuYnNzCitlbmRic3M6CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC90b29scy9idWlsZC5jIGIvYXJjaC9pMzg2L2Jvb3QvdG9vbHMvYnVpbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUwOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2Jvb3QvdG9vbHMvYnVpbGQuYwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqICAkSWQ6IGJ1aWxkLmMsdiAxLjUgMTk5Ny8wNS8xOSAxMjoyOTo1OCBtaiBFeHAgJAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IE1hcnRpbiBNYXJlcworICovCisKKy8qCisgKiBUaGlzIGZpbGUgYnVpbGRzIGEgZGlzay1pbWFnZSBmcm9tIHRocmVlIGRpZmZlcmVudCBmaWxlczoKKyAqCisgKiAtIGJvb3RzZWN0OiBleGFjdGx5IDUxMiBieXRlcyBvZiA4MDg2IG1hY2hpbmUgY29kZSwgbG9hZHMgdGhlIHJlc3QKKyAqIC0gc2V0dXA6IDgwODYgbWFjaGluZSBjb2RlLCBzZXRzIHVwIHN5c3RlbSBwYXJtCisgKiAtIHN5c3RlbTogODAzODYgY29kZSBmb3IgYWN0dWFsIHN5c3RlbQorICoKKyAqIEl0IGRvZXMgc29tZSBjaGVja2luZyB0aGF0IGFsbCBmaWxlcyBhcmUgb2YgdGhlIGNvcnJlY3QgdHlwZSwgYW5kCisgKiBqdXN0IHdyaXRlcyB0aGUgcmVzdWx0IHRvIHN0ZG91dCwgcmVtb3ZpbmcgaGVhZGVycyBhbmQgcGFkZGluZyB0bworICogdGhlIHJpZ2h0IGFtb3VudC4gSXQgYWxzbyB3cml0ZXMgc29tZSBzeXN0ZW0gZGF0YSB0byBzdGRlcnIuCisgKi8KKworLyoKKyAqIENoYW5nZXMgYnkgdHl0c28gdG8gYWxsb3cgcm9vdCBkZXZpY2Ugc3BlY2lmaWNhdGlvbgorICogSGlnaCBsb2FkZWQgc3R1ZmYgYnkgSGFucyBMZXJtZW4gJiBXZXJuZXIgQWxtZXNiZXJnZXIsIEZlYi4gMTk5NgorICogQ3Jvc3MgY29tcGlsaW5nIGZpeGVzIGJ5IEdlcnRqYW4gdmFuIFdpbmdlcmRlLCBKdWx5IDE5OTYKKyAqIFJld3JpdHRlbiBieSBNYXJ0aW4gTWFyZXMsIEFwcmlsIDE5OTcKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGFzbS9ib290Lmg+CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBieXRlOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB3b3JkOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHUzMjsKKworI2RlZmluZSBERUZBVUxUX01BSk9SX1JPT1QgMAorI2RlZmluZSBERUZBVUxUX01JTk9SX1JPT1QgMAorCisvKiBNaW5pbWFsIG51bWJlciBvZiBzZXR1cCBzZWN0b3JzIChzZWUgYWxzbyBib290c2VjdC5TKSAqLworI2RlZmluZSBTRVRVUF9TRUNUUyA0CisKK2J5dGUgYnVmWzEwMjRdOworaW50IGZkOworaW50IGlzX2JpZ19rZXJuZWw7CisKK3ZvaWQgZGllKGNvbnN0IGNoYXIgKiBzdHIsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJdmFfc3RhcnQoYXJncywgc3RyKTsKKwl2ZnByaW50ZihzdGRlcnIsIHN0ciwgYXJncyk7CisJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwlleGl0KDEpOworfQorCit2b2lkIGZpbGVfb3Blbihjb25zdCBjaGFyICpuYW1lKQoreworCWlmICgoZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZLCAwKSkgPCAwKQorCQlkaWUoIlVuYWJsZSB0byBvcGVuIGAlcyc6ICVtIiwgbmFtZSk7Cit9CisKK3ZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlkaWUoIlVzYWdlOiBidWlsZCBbLWJdIGJvb3RzZWN0IHNldHVwIHN5c3RlbSBbcm9vdGRldl0gWz4gaW1hZ2VdIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCit7CisJdW5zaWduZWQgaW50IGksIGMsIHN6LCBzZXR1cF9zZWN0b3JzOworCXUzMiBzeXNfc2l6ZTsKKwlieXRlIG1ham9yX3Jvb3QsIG1pbm9yX3Jvb3Q7CisJc3RydWN0IHN0YXQgc2I7CisKKwlpZiAoYXJnYyA+IDIgJiYgIXN0cmNtcChhcmd2WzFdLCAiLWIiKSkKKwkgIHsKKwkgICAgaXNfYmlnX2tlcm5lbCA9IDE7CisJICAgIGFyZ2MtLSwgYXJndisrOworCSAgfQorCWlmICgoYXJnYyA8IDQpIHx8IChhcmdjID4gNSkpCisJCXVzYWdlKCk7CisJaWYgKGFyZ2MgPiA0KSB7CisJCWlmICghc3RyY21wKGFyZ3ZbNF0sICJDVVJSRU5UIikpIHsKKwkJCWlmIChzdGF0KCIvIiwgJnNiKSkgeworCQkJCXBlcnJvcigiLyIpOworCQkJCWRpZSgiQ291bGRuJ3Qgc3RhdCAvIik7CisJCQl9CisJCQltYWpvcl9yb290ID0gbWFqb3Ioc2Iuc3RfZGV2KTsKKwkJCW1pbm9yX3Jvb3QgPSBtaW5vcihzYi5zdF9kZXYpOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzRdLCAiRkxPUFBZIikpIHsKKwkJCWlmIChzdGF0KGFyZ3ZbNF0sICZzYikpIHsKKwkJCQlwZXJyb3IoYXJndls0XSk7CisJCQkJZGllKCJDb3VsZG4ndCBzdGF0IHJvb3QgZGV2aWNlLiIpOworCQkJfQorCQkJbWFqb3Jfcm9vdCA9IG1ham9yKHNiLnN0X3JkZXYpOworCQkJbWlub3Jfcm9vdCA9IG1pbm9yKHNiLnN0X3JkZXYpOworCQl9IGVsc2UgeworCQkJbWFqb3Jfcm9vdCA9IDA7CisJCQltaW5vcl9yb290ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCW1ham9yX3Jvb3QgPSBERUZBVUxUX01BSk9SX1JPT1Q7CisJCW1pbm9yX3Jvb3QgPSBERUZBVUxUX01JTk9SX1JPT1Q7CisJfQorCWZwcmludGYoc3RkZXJyLCAiUm9vdCBkZXZpY2UgaXMgKCVkLCAlZClcbiIsIG1ham9yX3Jvb3QsIG1pbm9yX3Jvb3QpOworCisJZmlsZV9vcGVuKGFyZ3ZbMV0pOworCWkgPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTsKKwlmcHJpbnRmKHN0ZGVyciwiQm9vdCBzZWN0b3IgJWQgYnl0ZXMuXG4iLGkpOworCWlmIChpICE9IDUxMikKKwkJZGllKCJCb290IGJsb2NrIG11c3QgYmUgZXhhY3RseSA1MTIgYnl0ZXMiKTsKKwlpZiAoYnVmWzUxMF0gIT0gMHg1NSB8fCBidWZbNTExXSAhPSAweGFhKQorCQlkaWUoIkJvb3QgYmxvY2sgaGFzbid0IGdvdCBib290IGZsYWcgKDB4QUE1NSkiKTsKKwlidWZbNTA4XSA9IG1pbm9yX3Jvb3Q7CisJYnVmWzUwOV0gPSBtYWpvcl9yb290OworCWlmICh3cml0ZSgxLCBidWYsIDUxMikgIT0gNTEyKQorCQlkaWUoIldyaXRlIGNhbGwgZmFpbGVkIik7CisJY2xvc2UgKGZkKTsKKworCWZpbGVfb3Blbihhcmd2WzJdKTsJCQkJICAgIC8qIENvcHkgdGhlIHNldHVwIGNvZGUgKi8KKwlmb3IgKGk9MCA7IChjPXJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKT4wIDsgaSs9YyApCisJCWlmICh3cml0ZSgxLCBidWYsIGMpICE9IGMpCisJCQlkaWUoIldyaXRlIGNhbGwgZmFpbGVkIik7CisJaWYgKGMgIT0gMCkKKwkJZGllKCJyZWFkLWVycm9yIG9uIGBzZXR1cCciKTsKKwljbG9zZSAoZmQpOworCisJc2V0dXBfc2VjdG9ycyA9IChpICsgNTExKSAvIDUxMjsJLyogUGFkIHVudXNlZCBzcGFjZSB3aXRoIHplcm9zICovCisJLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhbmNpZW50IHZlcnNpb25zIG9mIExJTE8uICovCisJaWYgKHNldHVwX3NlY3RvcnMgPCBTRVRVUF9TRUNUUykKKwkJc2V0dXBfc2VjdG9ycyA9IFNFVFVQX1NFQ1RTOworCWZwcmludGYoc3RkZXJyLCAiU2V0dXAgaXMgJWQgYnl0ZXMuXG4iLCBpKTsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJd2hpbGUgKGkgPCBzZXR1cF9zZWN0b3JzICogNTEyKSB7CisJCWMgPSBzZXR1cF9zZWN0b3JzICogNTEyIC0gaTsKKwkJaWYgKGMgPiBzaXplb2YoYnVmKSkKKwkJCWMgPSBzaXplb2YoYnVmKTsKKwkJaWYgKHdyaXRlKDEsIGJ1ZiwgYykgIT0gYykKKwkJCWRpZSgiV3JpdGUgY2FsbCBmYWlsZWQiKTsKKwkJaSArPSBjOworCX0KKworCWZpbGVfb3Blbihhcmd2WzNdKTsKKwlpZiAoZnN0YXQgKGZkLCAmc2IpKQorCQlkaWUoIlVuYWJsZSB0byBzdGF0IGAlcyc6ICVtIiwgYXJndlszXSk7CisJc3ogPSBzYi5zdF9zaXplOworCWZwcmludGYgKHN0ZGVyciwgIlN5c3RlbSBpcyAlZCBrQlxuIiwgc3ovMTAyNCk7CisJc3lzX3NpemUgPSAoc3ogKyAxNSkgLyAxNjsKKwlpZiAoIWlzX2JpZ19rZXJuZWwgJiYgc3lzX3NpemUgPiBERUZfU1lTU0laRSkKKwkJZGllKCJTeXN0ZW0gaXMgdG9vIGJpZy4gVHJ5IHVzaW5nIGJ6SW1hZ2Ugb3IgbW9kdWxlcy4iKTsKKwl3aGlsZSAoc3ogPiAwKSB7CisJCWludCBsLCBuOworCisJCWwgPSAoc3ogPiBzaXplb2YoYnVmKSkgPyBzaXplb2YoYnVmKSA6IHN6OworCQlpZiAoKG49cmVhZChmZCwgYnVmLCBsKSkgIT0gbCkgeworCQkJaWYgKG4gPCAwKQorCQkJCWRpZSgiRXJyb3IgcmVhZGluZyAlczogJW0iLCBhcmd2WzNdKTsKKwkJCWVsc2UKKwkJCQlkaWUoIiVzOiBVbmV4cGVjdGVkIEVPRiIsIGFyZ3ZbM10pOworCQl9CisJCWlmICh3cml0ZSgxLCBidWYsIGwpICE9IGwpCisJCQlkaWUoIldyaXRlIGZhaWxlZCIpOworCQlzeiAtPSBsOworCX0KKwljbG9zZShmZCk7CisKKwlpZiAobHNlZWsoMSwgNDk3LCBTRUVLX1NFVCkgIT0gNDk3KQkJICAgIC8qIFdyaXRlIHNpemVzIHRvIHRoZSBib290c2VjdG9yICovCisJCWRpZSgiT3V0cHV0OiBzZWVrIGZhaWxlZCIpOworCWJ1ZlswXSA9IHNldHVwX3NlY3RvcnM7CisJaWYgKHdyaXRlKDEsIGJ1ZiwgMSkgIT0gMSkKKwkJZGllKCJXcml0ZSBvZiBzZXR1cCBzZWN0b3IgY291bnQgZmFpbGVkIik7CisJaWYgKGxzZWVrKDEsIDUwMCwgU0VFS19TRVQpICE9IDUwMCkKKwkJZGllKCJPdXRwdXQ6IHNlZWsgZmFpbGVkIik7CisJYnVmWzBdID0gKHN5c19zaXplICYgMHhmZik7CisJYnVmWzFdID0gKChzeXNfc2l6ZSA+PiA4KSAmIDB4ZmYpOworCWlmICh3cml0ZSgxLCBidWYsIDIpICE9IDIpCisJCWRpZSgiV3JpdGUgb2YgaW1hZ2UgbGVuZ3RoIGZhaWxlZCIpOworCisJcmV0dXJuIDA7CQkJCQkgICAgLyogRXZlcnl0aGluZyBpcyBPSyAqLworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2Jvb3QvdmlkZW8uUyBiL2FyY2gvaTM4Ni9ib290L3ZpZGVvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1ZDNmNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9ib290L3ZpZGVvLlMKQEAgLTAsMCArMSwyMDA3IEBACisvKgl2aWRlby5TCisgKgorICoJRGlzcGxheSBhZGFwdGVyICYgdmlkZW8gbW9kZSBzZXR1cCwgdmVyc2lvbiAyLjEzICgxNC1NYXktOTkpCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk1IC0tIDE5OTggTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+CisgKglCYXNlZCBvbiB0aGUgb3JpZ2luYWwgc2V0dXAuUyBjb2RlIChDKSBMaW51cyBUb3J2YWxkcyBhbmQgTWF0cyBBbmRlcnNvbgorICoKKyAqCVJld3JpdHRlbiB0byB1c2UgR05VICdhcycgYnkgQ2hyaXMgTm9lIDxzdGlrZXJAbm9ydGhsaW5rLmNvbT4gTWF5IDE5OTkKKyAqCisgKglGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgbG9vayBhdCBEb2N1bWVudGF0aW9uL3N2Z2EudHh0LgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IC8qIGZvciBDT05GSUdfVklERU9fKiAqLworCisvKiBFbmFibGUgYXV0b2RldGVjdGlvbiBvZiBTVkdBIGFkYXB0ZXJzIGFuZCBtb2Rlcy4gKi8KKyN1bmRlZiBDT05GSUdfVklERU9fU1ZHQQorCisvKiBFbmFibGUgYXV0b2RldGVjdGlvbiBvZiBWRVNBIG1vZGVzICovCisjZGVmaW5lIENPTkZJR19WSURFT19WRVNBCisKKy8qIEVuYWJsZSBjb21wYWN0aW5nIG9mIG1vZGUgdGFibGUgKi8KKyNkZWZpbmUgQ09ORklHX1ZJREVPX0NPTVBBQ1QKKworLyogUmV0YWluIHNjcmVlbiBjb250ZW50cyB3aGVuIHN3aXRjaGluZyBtb2RlcyAqLworI2RlZmluZSBDT05GSUdfVklERU9fUkVUQUlOCisKKy8qIEVuYWJsZSBsb2NhbCBtb2RlIGxpc3QgKi8KKyN1bmRlZiBDT05GSUdfVklERU9fTE9DQUwKKworLyogRm9yY2UgNDAwIHNjYW4gbGluZXMgZm9yIHN0YW5kYXJkIG1vZGVzIChoYWNrIHRvIGZpeCBiYWQgQklPUyBiZWhhdmlvdXIgKi8KKyN1bmRlZiBDT05GSUdfVklERU9fNDAwX0hBQ0sKKworLyogSGFjayB0aGF0IGxldHMgeW91IGZvcmNlIHNwZWNpZmljIEJJT1MgbW9kZSBJRCBhbmQgc3BlY2lmaWMgZGltZW5zaW9ucyAqLworI3VuZGVmIENPTkZJR19WSURFT19HRlhfSEFDSworI2RlZmluZSBWSURFT19HRlhfQklPU19BWCAweDRmMDIJLyogODAweDYwMCBvbiBUaGlua1BhZCAqLworI2RlZmluZSBWSURFT19HRlhfQklPU19CWCAweDAxMDIKKyNkZWZpbmUgVklERU9fR0ZYX0RVTU1ZX1JFU09MVVRJT04gMHg2NDI1CS8qIDEwMHgzNyAqLworCisvKiBUaGlzIGNvZGUgdXNlcyBhbiBleHRlbmRlZCBzZXQgb2YgdmlkZW8gbW9kZSBudW1iZXJzLiBUaGVzZSBpbmNsdWRlOgorICogQWxpYXNlcyBmb3Igc3RhbmRhcmQgbW9kZXMKKyAqCU5PUk1BTF9WR0EgKC0xKQorICoJRVhURU5ERURfVkdBICgtMikKKyAqCUFTS19WR0EgKC0zKQorICogVmlkZW8gbW9kZXMgbnVtYmVyZWQgYnkgbWVudSBwb3NpdGlvbiAtLSBOT1QgUkVDT01NRU5ERUQgYmVjYXVzZSBvZiBsYWNrCisgKiBvZiBjb21wYXRpYmlsaXR5IHdoZW4gZXh0ZW5kaW5nIHRoZSB0YWJsZS4gVGhlc2UgYXJlIGJldHdlZW4gMHgwMCBhbmQgMHhmZi4KKyAqLworI2RlZmluZSBWSURFT19GSVJTVF9NRU5VIDB4MDAwMAorCisvKiBTdGFuZGFyZCBCSU9TIHZpZGVvIG1vZGVzIChCSU9TIG51bWJlciArIDB4MDEwMCkgKi8KKyNkZWZpbmUgVklERU9fRklSU1RfQklPUyAweDAxMDAKKworLyogVkVTQSBCSU9TIHZpZGVvIG1vZGVzIChWRVNBIG51bWJlciArIDB4MDIwMCkgKi8KKyNkZWZpbmUgVklERU9fRklSU1RfVkVTQSAweDAyMDAKKworLyogVmlkZW83IHNwZWNpYWwgbW9kZXMgKEJJT1MgbnVtYmVyICsgMHgwOTAwKSAqLworI2RlZmluZSBWSURFT19GSVJTVF9WNyAweDA5MDAKKworLyogU3BlY2lhbCB2aWRlbyBtb2RlcyAqLworI2RlZmluZSBWSURFT19GSVJTVF9TUEVDSUFMIDB4MGYwMAorI2RlZmluZSBWSURFT184MHgyNSAweDBmMDAKKyNkZWZpbmUgVklERU9fOFBPSU5UIDB4MGYwMQorI2RlZmluZSBWSURFT184MHg0MyAweDBmMDIKKyNkZWZpbmUgVklERU9fODB4MjggMHgwZjAzCisjZGVmaW5lIFZJREVPX0NVUlJFTlRfTU9ERSAweDBmMDQKKyNkZWZpbmUgVklERU9fODB4MzAgMHgwZjA1CisjZGVmaW5lIFZJREVPXzgweDM0IDB4MGYwNgorI2RlZmluZSBWSURFT184MHg2MCAweDBmMDcKKyNkZWZpbmUgVklERU9fR0ZYX0hBQ0sgMHgwZjA4CisjZGVmaW5lIFZJREVPX0xBU1RfU1BFQ0lBTCAweDBmMDkKKworLyogVmlkZW8gbW9kZXMgZ2l2ZW4gYnkgcmVzb2x1dGlvbiAqLworI2RlZmluZSBWSURFT19GSVJTVF9SRVNPTFVUSU9OIDB4MTAwMAorCisvKiBUaGUgInJlY2FsY3VsYXRlIHRpbWluZ3MiIGZsYWcgKi8KKyNkZWZpbmUgVklERU9fUkVDQUxDIDB4ODAwMAorCisvKiBQb3NpdGlvbnMgb2YgdmFyaW91cyB2aWRlbyBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUga2VybmVsICovCisvKiAoc2VlIGFsc28gaW5jbHVkZS9saW51eC90dHkuaCkgKi8KKyNkZWZpbmUgUEFSQU1fQ1VSU09SX1BPUwkweDAwCisjZGVmaW5lIFBBUkFNX1ZJREVPX1BBR0UJMHgwNAorI2RlZmluZSBQQVJBTV9WSURFT19NT0RFCTB4MDYKKyNkZWZpbmUgUEFSQU1fVklERU9fQ09MUwkweDA3CisjZGVmaW5lIFBBUkFNX1ZJREVPX0VHQV9CWAkweDBhCisjZGVmaW5lIFBBUkFNX1ZJREVPX0xJTkVTCTB4MGUKKyNkZWZpbmUgUEFSQU1fSEFWRV9WR0EJCTB4MGYKKyNkZWZpbmUgUEFSQU1fRk9OVF9QT0lOVFMJMHgxMAorCisjZGVmaW5lIFBBUkFNX0xGQl9XSURUSAkJMHgxMgorI2RlZmluZSBQQVJBTV9MRkJfSEVJR0hUCTB4MTQKKyNkZWZpbmUgUEFSQU1fTEZCX0RFUFRICQkweDE2CisjZGVmaW5lIFBBUkFNX0xGQl9CQVNFCQkweDE4CisjZGVmaW5lIFBBUkFNX0xGQl9TSVpFCQkweDFjCisjZGVmaW5lIFBBUkFNX0xGQl9MSU5FTEVOR1RICTB4MjQKKyNkZWZpbmUgUEFSQU1fTEZCX0NPTE9SUwkweDI2CisjZGVmaW5lIFBBUkFNX1ZFU0FQTV9TRUcJMHgyZQorI2RlZmluZSBQQVJBTV9WRVNBUE1fT0ZGCTB4MzAKKyNkZWZpbmUgUEFSQU1fTEZCX1BBR0VTCQkweDMyCisjZGVmaW5lIFBBUkFNX1ZFU0FfQVRUUklCCTB4MzQKKworLyogRGVmaW5lIERPX1NUT1JFIGFjY29yZGluZyB0byBDT05GSUdfVklERU9fUkVUQUlOICovCisjaWZkZWYgQ09ORklHX1ZJREVPX1JFVEFJTgorI2RlZmluZSBET19TVE9SRSBjYWxsIHN0b3JlX3NjcmVlbgorI2Vsc2UKKyNkZWZpbmUgRE9fU1RPUkUKKyNlbmRpZiAvKiBDT05GSUdfVklERU9fUkVUQUlOICovCisKKyMgVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBjYWxsZWQgYnkgc2V0dXAuUworIyAlZHMgKm11c3QqIGJlIHBvaW50aW5nIHRvIHRoZSBib290c2VjdG9yCit2aWRlbzoJcHVzaHcJJWRzCQkjIFdlIHVzZSBkaWZmZXJlbnQgc2VnbWVudHMKKwlwdXNodwklZHMJCSMgRlMgY29udGFpbnMgb3JpZ2luYWwgRFMKKwlwb3B3CSVmcworCXB1c2h3CSVjcwkJIyBEUyBpcyBlcXVhbCB0byBDUworCXBvcHcJJWRzCisJcHVzaHcJJWNzCQkjIEVTIGlzIGVxdWFsIHRvIENTCisJcG9wdwklZXMKKwl4b3J3CSVheCwgJWF4CisJbW92dwklYXgsICVncwkjIEdTIGlzIHplcm8KKwljbGQKKwljYWxsCWJhc2ljX2RldGVjdAkjIEJhc2ljIGFkYXB0ZXIgdHlwZSB0ZXN0aW5nIChFR0EvVkdBL01EQS9DR0EpCisjaWZkZWYgQ09ORklHX1ZJREVPX1NFTEVDVAorCW1vdncJJWZzOigweDAxZmEpLCAlYXgJCSMgVXNlciBzZWxlY3RlZCB2aWRlbyBtb2RlCisJY21wdwkkQVNLX1ZHQSwgJWF4CQkJIyBCcmluZyB1cCB0aGUgbWVudQorCWp6CXZpZDIKKworCWNhbGwJbW9kZV9zZXQJCQkjIFNldCB0aGUgbW9kZQorCWpjCXZpZDEKKworCWxlYXcJYmFkbWR0LCAlc2kJCQkjIEludmFsaWQgbW9kZSBJRAorCWNhbGwJcHJ0c3RyCit2aWQyOgljYWxsCW1vZGVfbWVudQordmlkMToKKyNpZmRlZiBDT05GSUdfVklERU9fUkVUQUlOCisJY2FsbAlyZXN0b3JlX3NjcmVlbgkJCSMgUmVzdG9yZSBzY3JlZW4gY29udGVudHMKKyNlbmRpZiAvKiBDT05GSUdfVklERU9fUkVUQUlOICovCisJY2FsbAlzdG9yZV9lZGlkCisjZW5kaWYgLyogQ09ORklHX1ZJREVPX1NFTEVDVCAqLworCWNhbGwJbW9kZV9wYXJhbXMJCQkjIFN0b3JlIG1vZGUgcGFyYW1ldGVycworCXBvcHcJJWRzCQkJCSMgUmVzdG9yZSBvcmlnaW5hbCBEUworCXJldAorCisjIERldGVjdCBpZiB3ZSBoYXZlIENHQSwgTURBLCBFR0Egb3IgVkdBIGFuZCBwYXNzIGl0IHRvIHRoZSBrZXJuZWwuCitiYXNpY19kZXRlY3Q6CisJbW92YgkkMCwgJWZzOihQQVJBTV9IQVZFX1ZHQSkKKwltb3ZiCSQweDEyLCAlYWgJIyBDaGVjayBFR0EvVkdBCisJbW92YgkkMHgxMCwgJWJsCisJaW50CSQweDEwCisJbW92dwklYngsICVmczooUEFSQU1fVklERU9fRUdBX0JYKQkjIElkZW50aWZpZXMgRUdBIHRvIHRoZSBrZXJuZWwKKwljbXBiCSQweDEwLCAlYmwJCQkjIE5vLCBpdCdzIGEgQ0dBL01EQS9IR0EgY2FyZC4KKwlqZQliYXNyZXQKKworCWluY2IJYWRhcHRlcgorCW1vdncJJDB4MWEwMCwgJWF4CQkJIyBDaGVjayBFR0Egb3IgVkdBPworCWludAkkMHgxMAorCWNtcGIJJDB4MWEsICVhbAkJCSMgMWEgbWVhbnMgVkdBLi4uCisJam5lCWJhc3JldAkJCQkjIGFueXRoaW5nIGVsc2UgaXMgRUdBLgorCQorCWluY2IJJWZzOihQQVJBTV9IQVZFX1ZHQSkJCSMgV2UndmUgZGV0ZWN0ZWQgYSBWR0EKKwlpbmNiCWFkYXB0ZXIKK2Jhc3JldDoJcmV0CisKKyMgU3RvcmUgdGhlIHZpZGVvIG1vZGUgcGFyYW1ldGVycyBmb3IgbGF0ZXIgdXNhZ2UgYnkgdGhlIGtlcm5lbC4KKyMgVGhpcyBpcyBkb25lIGJ5IGFza2luZyB0aGUgQklPUyBleGNlcHQgZm9yIHRoZSByb3dzL2NvbHVtbnMKKyMgcGFyYW1ldGVycyBpbiB0aGUgZGVmYXVsdCA4MHgyNSBtb2RlIC0tIHRoZXNlIGFyZSBzZXQgZGlyZWN0bHksCisjIGJlY2F1c2Ugc29tZSB2ZXJ5IG9ic2N1cmUgQklPU2VzIHN1cHBseSBpbnNhbmUgdmFsdWVzLgorbW9kZV9wYXJhbXM6CisjaWZkZWYgQ09ORklHX1ZJREVPX1NFTEVDVAorCWNtcGIJJDAsIGdyYXBoaWNfbW9kZQorCWpuegltb3Bhcl9ncgorI2VuZGlmCisJbW92YgkkMHgwMywgJWFoCQkJIyBSZWFkIGN1cnNvciBwb3NpdGlvbgorCXhvcmIJJWJoLCAlYmgKKwlpbnQJJDB4MTAKKwltb3Z3CSVkeCwgJWZzOihQQVJBTV9DVVJTT1JfUE9TKQorCW1vdmIJJDB4MGYsICVhaAkJCSMgUmVhZCBwYWdlL21vZGUvd2lkdGgKKwlpbnQJJDB4MTAKKwltb3Z3CSVieCwgJWZzOihQQVJBTV9WSURFT19QQUdFKQorCW1vdncJJWF4LCAlZnM6KFBBUkFNX1ZJREVPX01PREUpCSMgVmlkZW8gbW9kZSBhbmQgc2NyZWVuIHdpZHRoCisJY21wYgkkMHg3LCAlYWwJCQkjIE1EQS9IR0EgPT4gc2VnbWVudCBkaWZmZXJzCisJam56CW1vcGFyMAorCisJbW92dwkkMHhiMDAwLCB2aWRlb19zZWdtZW50Cittb3BhcjA6IG1vdncJJWdzOigweDQ4NSksICVheAkJIyBGb250IHNpemUKKwltb3Z3CSVheCwgJWZzOihQQVJBTV9GT05UX1BPSU5UUykJIyAodmFsaWQgb25seSBvbiBFR0EvVkdBKQorCW1vdncJZm9yY2Vfc2l6ZSwgJWF4CQkJIyBGb3JjZWQgc2l6ZT8KKwlvcncJJWF4LCAlYXgKKwlqegltb3BhcjEKKworCW1vdmIJJWFoLCAlZnM6KFBBUkFNX1ZJREVPX0NPTFMpCisJbW92YgklYWwsICVmczooUEFSQU1fVklERU9fTElORVMpCisJcmV0CisKK21vcGFyMToJbW92YgkkMjUsICVhbAorCWNtcGIJJDAsIGFkYXB0ZXIJCQkjIElmIHdlIGFyZSBvbiBDR0EvTURBL0hHQSwgdGhlCisJanoJbW9wYXIyCQkJCSMgc2NyZWVuIG11c3QgaGF2ZSAyNSBsaW5lcy4KKworCW1vdmIJJWdzOigweDQ4NCksICVhbAkJIyBPbiBFR0EvVkdBLCB1c2UgdGhlIEVHQSsgQklPUworCWluY2IJJWFsCQkJCSMgbG9jYXRpb24gb2YgbWF4IGxpbmVzLgorbW9wYXIyOiBtb3ZiCSVhbCwgJWZzOihQQVJBTV9WSURFT19MSU5FUykKKwlyZXQKKworI2lmZGVmIENPTkZJR19WSURFT19TRUxFQ1QKKyMgRmV0Y2hpbmcgb2YgVkVTQSBmcmFtZSBidWZmZXIgcGFyYW1ldGVycworbW9wYXJfZ3I6CisJbGVhdwltb2RlbGlzdCsxMDI0LCAlZGkKKwltb3ZiCSQweDIzLCAlZnM6KFBBUkFNX0hBVkVfVkdBKQorCW1vdncJMTYoJWRpKSwgJWF4CisJbW92dwklYXgsICVmczooUEFSQU1fTEZCX0xJTkVMRU5HVEgpCisJbW92dwkxOCglZGkpLCAlYXgKKwltb3Z3CSVheCwgJWZzOihQQVJBTV9MRkJfV0lEVEgpCisJbW92dwkyMCglZGkpLCAlYXgKKwltb3Z3CSVheCwgJWZzOihQQVJBTV9MRkJfSEVJR0hUKQorCW1vdmIJMjUoJWRpKSwgJWFsCisJbW92YgkkMCwgJWFoCisJbW92dwklYXgsICVmczooUEFSQU1fTEZCX0RFUFRIKQorCW1vdmIJMjkoJWRpKSwgJWFsCQorCW1vdmIJJDAsICVhaAorCW1vdncJJWF4LCAlZnM6KFBBUkFNX0xGQl9QQUdFUykKKwltb3ZsCTQwKCVkaSksICVlYXgKKwltb3ZsCSVlYXgsICVmczooUEFSQU1fTEZCX0JBU0UpCisJbW92bAkzMSglZGkpLCAlZWF4CisJbW92bAklZWF4LCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMpCisJbW92bAkzNSglZGkpLCAlZWF4CisJbW92bAklZWF4LCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrNCkKKwltb3Z3CTAoJWRpKSwgJWF4CisJbW92dwklYXgsICVmczooUEFSQU1fVkVTQV9BVFRSSUIpCisKKyMgZ2V0IHZpZGVvIG1lbSBzaXplCisJbGVhdwltb2RlbGlzdCsxMDI0LCAlZGkKKwltb3Z3CSQweDRmMDAsICVheAorCWludAkkMHgxMAorCXhvcmwJJWVheCwgJWVheAorCW1vdncJMTgoJWRpKSwgJWF4CisJbW92bAklZWF4LCAlZnM6KFBBUkFNX0xGQl9TSVpFKQorCisjIHN3aXRjaGluZyB0aGUgREFDIHRvIDgtYml0IGlzIGZvciA8PSA4IGJwcCBvbmx5CisJbW92dwklZnM6KFBBUkFNX0xGQl9ERVBUSCksICVheAorCWNtcHcJJDgsICVheAorCWpnCWRhY19kb25lCisKKyMgZ2V0IERBQyBzd2l0Y2hpbmcgY2FwYWJpbGl0eQorCXhvcmwJJWVheCwgJWVheAorCW1vdmIJMTAoJWRpKSwgJWFsCisJdGVzdGIJJDEsICVhbAorCWp6CWRhY19zZXQKKworIyBhdHRlbXB0IHRvIHN3aXRjaCBEQUMgdG8gOC1iaXQKKwltb3Z3CSQweDRmMDgsICVheAorCW1vdncJJDB4MDgwMCwgJWJ4CisJaW50CSQweDEwCisJY21wdwkkMHgwMDRmLCAlYXgKKwlqbmUgICAgIGRhY19zZXQKKwltb3ZiICAgICViaCwgZGFjX3NpemUJCSMgc3RvcmUgYWN0dWFsIERBQyBzaXplCisKK2RhY19zZXQ6CisjIHNldCBjb2xvciBzaXplIHRvIERBQyBzaXplCisJbW92YglkYWNfc2l6ZSwgJWFsCisJbW92YgklYWwsICVmczooUEFSQU1fTEZCX0NPTE9SUyswKQorCW1vdmIJJWFsLCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrMikKKwltb3ZiCSVhbCwgJWZzOihQQVJBTV9MRkJfQ09MT1JTKzQpCisJbW92YgklYWwsICVmczooUEFSQU1fTEZCX0NPTE9SUys2KQorCisjIHNldCBjb2xvciBvZmZzZXRzIHRvIDAKKwltb3ZiCSQwLCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrMSkKKwltb3ZiCSQwLCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrMykKKwltb3ZiCSQwLCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrNSkKKwltb3ZiCSQwLCAlZnM6KFBBUkFNX0xGQl9DT0xPUlMrNykKKworZGFjX2RvbmU6CisjIGdldCBwcm90ZWN0ZWQgbW9kZSBpbnRlcmZhY2UgaW5mb3JtYXRpb25zCisJbW92dwkkMHg0ZjBhLCAlYXgKKwl4b3J3CSVieCwgJWJ4CisJeG9ydwklZGksICVkaQorCWludAkkMHgxMAorCWNtcAkkMHgwMDRmLCAlYXgKKwlqbnoJbm9fcG0KKworCW1vdncJJWVzLCAlZnM6KFBBUkFNX1ZFU0FQTV9TRUcpCisJbW92dwklZGksICVmczooUEFSQU1fVkVTQVBNX09GRikKK25vX3BtOglyZXQKKworIyBUaGUgdmlkZW8gbW9kZSBtZW51Cittb2RlX21lbnU6CisJbGVhdwlrZXltc2csICVzaQkJCSMgIlJldHVybi9TcGFjZS9UaW1lb3V0IiBtZXNzYWdlCisJY2FsbAlwcnRzdHIKKwljYWxsCWZsdXNoCitub2tleToJY2FsbAlnZXRrdAorCisJY21wYgkkMHgwZCwgJWFsCQkJIyBFTlRFUiA/CisJamUJbGlzdG0JCQkJIyB5ZXMgLSBtYW51YWwgbW9kZSBzZWxlY3Rpb24KKworCWNtcGIJJDB4MjAsICVhbAkJCSMgU1BBQ0UgPworCWplCWRlZm1kMQkJCQkjIG5vIC0gcmVwZWF0CisKKwljYWxsIAliZWVwCisJam1wCW5va2V5CisKK2RlZm1kMToJcmV0CQkJCQkjIE5vIG1vZGUgY2hvc2VuPyBEZWZhdWx0IDgweDI1CisKK2xpc3RtOgljYWxsCW1vZGVfdGFibGUJCQkjIExpc3QgbW9kZSB0YWJsZQorbGlzdG0wOglsZWF3CW5hbWVfYmFubiwgJXNpCQkJIyBQcmludCBhZGFwdGVyIG5hbWUKKwljYWxsCXBydHN0cgorCW1vdncJY2FyZF9uYW1lLCAlc2kKKwlvcncJJXNpLCAlc2kKKwlqbnoJYW4yCisKKwltb3ZiCWFkYXB0ZXIsICVhbAorCWxlYXcJb2xkX25hbWUsICVzaQorCW9yYgklYWwsICVhbAorCWp6CWFuMQorCisJbGVhdwllZ2FfbmFtZSwgJXNpCisJZGVjYgklYWwKKwlqeglhbjEKKworCWxlYXcJdmdhX25hbWUsICVzaQorCWptcAlhbjEKKworYW4yOgljYWxsCXBydHN0cgorCWxlYXcJc3ZnYV9uYW1lLCAlc2kKK2FuMToJY2FsbAlwcnRzdHIKKwlsZWF3CWxpc3RoZHIsICVzaQkJCSMgVGFibGUgaGVhZGVyCisJY2FsbAlwcnRzdHIKKwltb3ZiCSQweDMwLCAlZGwJCQkjIERMIGhvbGRzIG1vZGUgbnVtYmVyCisJbGVhdwltb2RlbGlzdCwgJXNpCitsbTE6CWNtcHcJJEFTS19WR0EsICglc2kpCQkJIyBFbmQ/CisJanoJbG0yCisKKwltb3ZiCSVkbCwgJWFsCQkJIyBNZW51IHNlbGVjdGlvbiBudW1iZXIKKwljYWxsCXBydGNocgorCWNhbGwJcHJ0c3AyCisJbG9kc3cKKwljYWxsCXBydGh3CQkJCSMgTW9kZSBJRAorCWNhbGwJcHJ0c3AyCisJbW92YgkweDEoJXNpKSwgJWFsCisJY2FsbAlwcnRkZWMJCQkJIyBSb3dzCisJbW92YgkkMHg3OCwgJWFsCQkJIyB0aGUgbGV0dGVyICd4JworCWNhbGwJcHJ0Y2hyCisJbG9kc3cKKwljYWxsCXBydGRlYwkJCQkjIENvbHVtbnMKKwltb3ZiCSQweDBkLCAlYWwJCQkjIE5ldyBsaW5lCisJY2FsbAlwcnRjaHIKKwltb3ZiCSQweDBhLCAlYWwKKwljYWxsCXBydGNocgorCWluY2IJJWRsCQkJCSMgTmV4dCBjaGFyYWN0ZXIKKwljbXBiCSQweDNhLCAlZGwKKwlqbnoJbG0xCisKKwltb3ZiCSQweDYxLCAlZGwKKwlqbXAJbG0xCisKK2xtMjoJbGVhdwlwcm9tcHQsICVzaQkJCSMgTW9kZSBwcm9tcHQKKwljYWxsCXBydHN0cgorCWxlYXcJZWRpdF9idWYsICVkaQkJCSMgRWRpdG9yIGJ1ZmZlcgorbG0zOgljYWxsCWdldGtleQorCWNtcGIJJDB4MGQsICVhbAkJCSMgRW50ZXI/CisJanoJbG1lbnQKKworCWNtcGIJJDB4MDgsICVhbAkJCSMgQmFja3NwYWNlPworCWp6CWxtYnMKKworCWNtcGIJJDB4MjAsICVhbAkJCSMgUHJpbnRhYmxlPworCWpjCWxtMworCisJY21wdwkkZWRpdF9idWYrNCwgJWRpCQkjIEVub3VnaCBzcGFjZT8KKwlqeglsbTMKKworCXN0b3NiCisJY2FsbAlwcnRjaHIKKwlqbXAJbG0zCisKK2xtYnM6CWNtcHcJJGVkaXRfYnVmLCAlZGkJCQkjIEJhY2tzcGFjZQorCWp6CWxtMworCisJZGVjdwklZGkKKwltb3ZiCSQweDA4LCAlYWwKKwljYWxsCXBydGNocgorCWNhbGwJcHJ0c3BjCisJbW92YgkkMHgwOCwgJWFsCisJY2FsbAlwcnRjaHIKKwlqbXAJbG0zCisJCitsbWVudDoJbW92YgkkMCwgKCVkaSkKKwlsZWF3CWNybGZ0LCAlc2kKKwljYWxsCXBydHN0cgorCWxlYXcJZWRpdF9idWYsICVzaQorCWNtcGIJJDAsICglc2kpCQkJIyBFbXB0eSBzdHJpbmcgPSBkZWZhdWx0IG1vZGUKKwlqeglsbWRlZgorCisJY21wYgkkMCwgMSglc2kpCQkJIyBPbmUgY2hhcmFjdGVyID0gbWVudSBzZWxlY3Rpb24KKwlqegltbnVzZWwKKworCWNtcHcJJDB4NjM3MywgKCVzaSkJCQkjICJzY2FuIiA9PiBtb2RlIHNjYW5uaW5nCisJam56CWxtaHgKKworCWNtcHcJJDB4NmU2MSwgMiglc2kpCisJanoJbG1zY2FuCisKK2xtaHg6CXhvcncJJWJ4LCAlYngJCQkjIEVsc2UgPT4gbW9kZSBJRCBpbiBoZXgKK2xtaGV4Oglsb2RzYgorCW9yYgklYWwsICVhbAorCWp6CWxtdXNlMQorCisJc3ViYgkkMHgzMCwgJWFsCisJamMJbG1iYWQKKworCWNtcGIJJDEwLCAlYWwKKwlqYwlsbWh4MQorCisJc3ViYgkkNywgJWFsCisJYW5kYgkkMHhkZiwgJWFsCisJY21wYgkkMTAsICVhbAorCWpjCWxtYmFkCisKKwljbXBiCSQxNiwgJWFsCisJam5jCWxtYmFkCisKK2xtaHgxOglzaGx3CSQ0LCAlYngKKwlvcmIJJWFsLCAlYmwKKwlqbXAJbG1oZXgKKworbG11c2UxOgltb3Z3CSVieCwgJWF4CisJam1wCWxtdXNlCisKK21udXNlbDoJbG9kc2IJCQkJCSMgTWVudSBzZWxlY3Rpb24KKwl4b3JiCSVhaCwgJWFoCisJc3ViYgkkMHgzMCwgJWFsCisJamMJbG1iYWQKKworCWNtcGIJJDEwLCAlYWwKKwlqYwlsbXVzZQorCQorCWNtcGIJJDB4NjEtMHgzMCwgJWFsCisJamMJbG1iYWQKKwkKKwlzdWJiCSQweDYxLTB4MzAtMTAsICVhbAorCWNtcGIJJDM2LCAlYWwKKwlqbmMJbG1iYWQKKworbG11c2U6CWNhbGwJbW9kZV9zZXQKKwlqYwlsbWRlZgorCitsbWJhZDoJbGVhdwl1bmtudCwgJXNpCisJY2FsbAlwcnRzdHIKKwlqbXAJbG0yCitsbXNjYW46CWNtcGIJJDAsIGFkYXB0ZXIJCQkjIFNjYW5uaW5nIG9ubHkgb24gRUdBL1ZHQQorCWp6CWxtYmFkCisKKwltb3Z3CSQwLCBtdF9lbmQJCQkjIFNjYW5uaW5nIG9mIG1vZGVzIGlzCisJbW92YgkkMSwgc2Nhbm5pbmcJCQkjIGRvbmUgYXMgbmV3IGF1dG9kZXRlY3Rpb24uCisJY2FsbAltb2RlX3RhYmxlCisJam1wCWxpc3RtMAorbG1kZWY6CXJldAorCisjIEFkZGl0aW9uYWwgcGFydHMgb2YgbW9kZV9zZXQuLi4gKHJlbGF0aXZlIGp1bXBzLCB5b3Uga25vdykKK3NldHY3OgkJCQkJCSMgVmlkZW83IGV4dGVuZGVkIG1vZGVzCisJRE9fU1RPUkUKKwlzdWJiCSRWSURFT19GSVJTVF9WNz4+OCwgJWJoCisJbW92dwkkMHg2ZjA1LCAlYXgKKwlpbnQJJDB4MTAKKwlzdGMKKwlyZXQKKworX3NldHJlYzoJam1wCXNldHJlYwkJCSMgVWdseS4uLgorX3NldF84MHgyNToJam1wCXNldF84MHgyNQorCisjIEFsaWFzZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCitzZXRhbGlhczoKKwltb3Z3CSRWSURFT184MHgyNSwgJWF4CisJaW5jdwklYngKKwlqegltb2RlX3NldAorCisJbW92YgkkVklERU9fOFBPSU5ULVZJREVPX0ZJUlNUX1NQRUNJQUwsICVhbAorCWluY3cJJWJ4CisJam56CXNldGJhZAkJCQkjIEZhbGwtdGhyb3VnaCEKKworIyBTZXR0aW5nIG9mIHVzZXIgbW9kZSAoQVg9bW9kZSBJRCkgPT4gQ0Y9c3VjY2VzcworbW9kZV9zZXQ6CisJbW92dwklYXgsICVmczooMHgwMWZhKQkJIyBTdG9yZSBtb2RlIGZvciB1c2UgaW4gYWNwaV93YWtldXAuUworCW1vdncJJWF4LCAlYngKKwljbXBiCSQweGZmLCAlYWgKKwlqeglzZXRhbGlhcworCisJdGVzdGIJJFZJREVPX1JFQ0FMQz4+OCwgJWFoCisJam56CV9zZXRyZWMKKworCWNtcGIJJFZJREVPX0ZJUlNUX1JFU09MVVRJT04+PjgsICVhaAorCWpuYwlzZXRyZXMKKwkKKwljbXBiCSRWSURFT19GSVJTVF9TUEVDSUFMPj44LCAlYWgKKwlqeglzZXRzcGMKKwkKKwljbXBiCSRWSURFT19GSVJTVF9WNz4+OCwgJWFoCisJanoJc2V0djcKKwkKKwljbXBiCSRWSURFT19GSVJTVF9WRVNBPj44LCAlYWgKKwlqbmMJY2hlY2tfdmVzYQorCQorCW9yYgklYWgsICVhaAorCWp6CXNldG1lbnUKKwkKKwlkZWNiCSVhaAorCWp6CXNldGJpb3MKKworc2V0YmFkOgljbGMKKwltb3ZiCSQwLCBkb19yZXN0b3JlCQkJIyBUaGUgc2NyZWVuIG5lZWRuJ3QgYmUgcmVzdG9yZWQKKwlyZXQKKworc2V0dmVzYToKKwlET19TVE9SRQorCXN1YmIJJFZJREVPX0ZJUlNUX1ZFU0E+PjgsICViaAorCW1vdncJJDB4NGYwMiwgJWF4CQkJIyBWRVNBIEJJT1MgbW9kZSBzZXQgY2FsbAorCWludAkkMHgxMAorCWNtcHcJJDB4MDA0ZiwgJWF4CQkJIyBBTD00ZiBpZiBpbXBsZW1lbnRlZAorCWpueglzZXRiYWQJCQkJIyBBSD0wIGlmIE9LCisKKwlzdGMKKwlyZXQKKworc2V0YmlvczoKKwlET19TVE9SRQorCWludAkkMHgxMAkJCQkjIFN0YW5kYXJkIEJJT1MgbW9kZSBzZXQgY2FsbAorCXB1c2h3CSVieAorCW1vdmIJJDB4MGYsICVhaAkJCSMgQ2hlY2sgaWYgcmVhbGx5IHNldAorCWludAkkMHgxMAorCXBvcHcJJWJ4CisJY21wYgklYmwsICVhbAorCWpueglzZXRiYWQKKwkKKwlzdGMKKwlyZXQKKworc2V0c3BjOgl4b3JiCSViaCwgJWJoCQkJIyBTZXQgc3BlY2lhbCBtb2RlCisJY21wYgkkVklERU9fTEFTVF9TUEVDSUFMLVZJREVPX0ZJUlNUX1NQRUNJQUwsICVibAorCWpuYwlzZXRiYWQKKwkKKwlhZGR3CSVieCwgJWJ4CisJam1wCSpzcGVjX2luaXRzKCVieCkKKworc2V0bWVudToKKwlvcmIJJWFsLCAlYWwJCQkjIDgweDI1IGlzIGFuIGV4Y2VwdGlvbgorCWp6CV9zZXRfODB4MjUKKwkKKwlwdXNodwklYngJCQkJIyBTZXQgbW9kZSBjaG9zZW4gZnJvbSBtZW51CisJY2FsbAltb2RlX3RhYmxlCQkJIyBCdWlsZCB0aGUgbW9kZSB0YWJsZQorCXBvcHcJJWF4CisJc2hsdwkkMiwgJWF4CisJYWRkdwklYXgsICVzaQorCWNtcHcJJWRpLCAlc2kKKwlqbmMJc2V0YmFkCisJCisJbW92dwkoJXNpKSwgJWF4CQkJIyBGZXRjaCBtb2RlIElECitfbV9zOglqbXAJbW9kZV9zZXQKKworc2V0cmVzOglwdXNodwklYngJCQkJIyBTZXQgbW9kZSBjaG9zZW4gYnkgcmVzb2x1dGlvbgorCWNhbGwJbW9kZV90YWJsZQorCXBvcHcJJWJ4CisJeGNoZ2IJJWJsLCAlYmgKK3NldHIxOglsb2RzdworCWNtcHcJJEFTS19WR0EsICVheAkJCSMgRW5kIG9mIHRoZSBsaXN0PworCWp6CXNldGJhZAorCQorCWxvZHN3CisJY21wdwklYngsICVheAorCWpueglzZXRyMQorCQorCW1vdncJLTQoJXNpKSwgJWF4CQkJIyBGZXRjaCBtb2RlIElECisJam1wCV9tX3MKKworY2hlY2tfdmVzYToKKwlsZWF3CW1vZGVsaXN0KzEwMjQsICVkaQorCXN1YmIJJFZJREVPX0ZJUlNUX1ZFU0E+PjgsICViaAorCW1vdncJJWJ4LCAlY3gJCQkjIEdldCBtb2RlIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorCW1vdncJJDB4NGYwMSwgJWF4CisJaW50CSQweDEwCisJYWRkYgkkVklERU9fRklSU1RfVkVTQT4+OCwgJWJoCisJY21wdwkkMHgwMDRmLCAlYXgKKwlqbnoJc2V0YmFkCisKKwltb3ZiCSglZGkpLCAlYWwJCQkjIENoZWNrIGNhcGFiaWxpdGllcy4KKwlhbmRiCSQweDE5LCAlYWwKKwljbXBiCSQweDA5LCAlYWwKKwlqeglzZXR2ZXNhCQkJCSMgVGhpcyBpcyBhIHRleHQgbW9kZQorCisJbW92YgkoJWRpKSwgJWFsCQkJIyBDaGVjayBjYXBhYmlsaXRpZXMuCisJYW5kYgkkMHg5OSwgJWFsCisJY21wYgkkMHg5OSwgJWFsCisJam56CV9zZXRiYWQJCQkJIyBEb2ghIE5vIGxpbmVhciBmcmFtZSBidWZmZXIuCisKKwlzdWJiCSRWSURFT19GSVJTVF9WRVNBPj44LCAlYmgKKwlvcncJJDB4NDAwMCwgJWJ4CQkJIyBVc2UgbGluZWFyIGZyYW1lIGJ1ZmZlcgorCW1vdncJJDB4NGYwMiwgJWF4CQkJIyBWRVNBIEJJT1MgbW9kZSBzZXQgY2FsbAorCWludAkkMHgxMAorCWNtcHcJJDB4MDA0ZiwgJWF4CQkJIyBBTD00ZiBpZiBpbXBsZW1lbnRlZAorCWpueglfc2V0YmFkCQkJCSMgQUg9MCBpZiBPSworCisJbW92YgkkMSwgZ3JhcGhpY19tb2RlCQkjIGZsYWcgZ3JhcGhpYyBtb2RlCisJbW92YgkkMCwgZG9fcmVzdG9yZQkJCSMgbm8gc2NyZWVuIHJlc3RvcmUKKwlzdGMKKwlyZXQKKworX3NldGJhZDoJam1wCXNldGJhZCAgICAgICAgICAJIyBVZ2x5Li4uCisKKyMgUmVjYWxjdWxhdGUgdmVydGljYWwgZGlzcGxheSBlbmQgcmVnaXN0ZXJzIC0tIHRoaXMgZml4ZXMgdmFyaW91cworIyBpbmNvbnNpc3RlbmNpZXMgb2YgZXh0ZW5kZWQgbW9kZXMgb24gbWFueSBhZGFwdGVycy4gQ2FsbGVkIHdoZW4KKyMgdGhlIFZJREVPX1JFQ0FMQyBmbGFnIGlzIHNldCBpbiB0aGUgbW9kZSBJRC4KKworc2V0cmVjOglzdWJiCSRWSURFT19SRUNBTEM+PjgsICVhaAkJIyBTZXQgdGhlIGJhc2UgbW9kZQorCWNhbGwJbW9kZV9zZXQKKwlqbmMJcmN0MworCisJbW92dwklZ3M6KDB4NDg1KSwgJWF4CQkjIEZvbnQgc2l6ZSBpbiBwaXhlbHMKKwltb3ZiCSVnczooMHg0ODQpLCAlYmwJCSMgTnVtYmVyIG9mIHJvd3MKKwlpbmNiCSVibAorCW11bGIJJWJsCQkJCSMgTnVtYmVyIG9mIHZpc2libGUKKwlkZWN3CSVheAkJCQkjIHNjYW4gbGluZXMgLSAxCisJbW92dwkkMHgzZDQsICVkeAorCW1vdncJJWF4LCAlYngKKwltb3ZiCSQweDEyLCAlYWwJCQkjIExvd2VyIDggYml0cworCW1vdmIJJWJsLCAlYWgKKwlvdXR3CSVheCwgJWR4CisJbW92YgkkMHgwNywgJWFsCQkjIEJpdHMgOCBhbmQgOSBpbiB0aGUgb3ZlcmZsb3cgcmVnaXN0ZXIKKwljYWxsCWluaWR4CisJeGNoZ2IJJWFsLCAlYWgKKwlhbmRiCSQweGJkLCAlYWgKKwlzaHJiCSViaAorCWpuYwlyY3QxCisJb3JiCSQweDAyLCAlYWgKK3JjdDE6CXNocmIJJWJoCisJam5jCXJjdDIKKwlvcmIJJDB4NDAsICVhaAorcmN0MjoJbW92YgkkMHgwNywgJWFsCisJb3V0dwklYXgsICVkeAorCXN0YworcmN0MzoJcmV0CisKKyMgVGFibGUgb2Ygcm91dGluZXMgZm9yIHNldHRpbmcgb2YgdGhlIHNwZWNpYWwgbW9kZXMuCitzcGVjX2luaXRzOgorCS53b3JkCXNldF84MHgyNQorCS53b3JkCXNldF84cGl4ZWwKKwkud29yZAlzZXRfODB4NDMKKwkud29yZAlzZXRfODB4MjgKKwkud29yZAlzZXRfY3VycmVudAorCS53b3JkCXNldF84MHgzMAorCS53b3JkCXNldF84MHgzNAorCS53b3JkCXNldF84MHg2MAorCS53b3JkCXNldF9nZngKKworIyBTZXQgdGhlIDgweDI1IG1vZGUuIElmIGFscmVhZHkgc2V0LCBkbyBub3RoaW5nLgorc2V0XzgweDI1OgorCW1vdncJJDB4NTAxOSwgZm9yY2Vfc2l6ZQkJIyBPdmVycmlkZSBwb3NzaWJseSBicm9rZW4gQklPUwordXNlXzgweDI1OgorI2lmZGVmIENPTkZJR19WSURFT180MDBfSEFDSworCW1vdncJJDB4MTIwMiwgJWF4CQkJIyBGb3JjZSA0MDAgc2NhbiBsaW5lcworCW1vdmIJJDB4MzAsICVibAorCWludAkkMHgxMAorI2Vsc2UKKwltb3ZiCSQweDBmLCAlYWgJCQkjIEdldCBjdXJyZW50IG1vZGUgSUQKKwlpbnQJJDB4MTAKKwljbXB3CSQweDUwMDcsICVheAkjIE1vZGUgNyAoODB4MjUgbW9ubykgaXMgdGhlIG9ubHkgb25lIGF2YWlsYWJsZQorCWp6CXN0ODAJCSMgb24gQ0dBL01EQS9IR0EgYW5kIGlzIGFsc28gYXZhaWxhYmxlIG9uIEVHQU0KKworCWNtcHcJJDB4NTAwMywgJWF4CSMgVW5rbm93biBtb2RlLCBmb3JjZSA4MHgyNSBjb2xvcgorCWpueglmb3JjZTMKKworc3Q4MDoJY21wYgkkMCwgYWRhcHRlcgkjIENHQS9NREEvSEdBID0+IG1vZGUgMy83IGlzIGFsd2F5cyA4MHgyNQorCWp6CXNldDgwCisKKwltb3ZiCSVnczooMHgwNDg0KSwgJWFsCSMgVGhpcyBpcyBFR0ErIC0tIGJld2FyZSBvZiA4MHg1MCBldGMuCisJb3JiCSVhbCwgJWFsCQkjIFNvbWUgYnVnZ3kgQklPUydlcyBzZXQgMCByb3dzCisJanoJc2V0ODAKKwkKKwljbXBiCSQyNCwgJWFsCQkjIEl0J3MgaG9wZWZ1bGx5IGNvcnJlY3QKKwlqeglzZXQ4MAorI2VuZGlmIC8qIENPTkZJR19WSURFT180MDBfSEFDSyAqLworZm9yY2UzOglET19TVE9SRQorCW1vdncJJDB4MDAwMywgJWF4CQkJIyBGb3JjZWQgc2V0CisJaW50CSQweDEwCitzZXQ4MDoJc3RjCisJcmV0CisKKyMgU2V0IHRoZSA4MHg1MC84MHg0MyA4LXBpeGVsIG1vZGUuIFNpbXBsZSBCSU9TIGNhbGxzLgorc2V0XzhwaXhlbDoKKwlET19TVE9SRQorCWNhbGwJdXNlXzgweDI1CQkJIyBUaGUgYmFzZSBpcyA4MHgyNQorc2V0XzhwdDoKKwltb3Z3CSQweDExMTIsICVheAkJCSMgVXNlIDh4OCBmb250CisJeG9yYgklYmwsICVibAorCWludAkkMHgxMAorCW1vdncJJDB4MTIwMCwgJWF4CQkJIyBVc2UgYWx0ZXJuYXRlIHByaW50IHNjcmVlbgorCW1vdmIJJDB4MjAsICVibAorCWludAkkMHgxMAorCW1vdncJJDB4MTIwMSwgJWF4CQkJIyBUdXJuIG9mZiBjdXJzb3IgZW11bGF0aW9uCisJbW92YgkkMHgzNCwgJWJsCisJaW50CSQweDEwCisJbW92YgkkMHgwMSwgJWFoCQkJIyBEZWZpbmUgY3Vyc29yIHNjYW4gbGluZXMgNi03CisJbW92dwkkMHgwNjA3LCAlY3gKKwlpbnQJJDB4MTAKK3NldF9jdXJyZW50OgorCXN0YworCXJldAorCisjIFNldCB0aGUgODB4MjggbW9kZS4gVGhpcyBtb2RlIHdvcmtzIG9uIGFsbCBWR0EncywgYmVjYXVzZSBpdCdzIGEgc3RhbmRhcmQKKyMgODB4MjUgbW9kZSB3aXRoIDE0LXBvaW50IGZvbnRzIGluc3RlYWQgb2YgMTYtcG9pbnQuCitzZXRfODB4Mjg6CisJRE9fU1RPUkUKKwljYWxsCXVzZV84MHgyNQkJCSMgVGhlIGJhc2UgaXMgODB4MjUKK3NldDE0Ogltb3Z3CSQweDExMTEsICVheAkJCSMgVXNlIDl4MTQgZm9udAorCXhvcmIJJWJsLCAlYmwKKwlpbnQJJDB4MTAKKwltb3ZiCSQweDAxLCAlYWgJCQkjIERlZmluZSBjdXJzb3Igc2NhbiBsaW5lcyAxMS0xMgorCW1vdncJJDB4MGIwYywgJWN4CisJaW50CSQweDEwCisJc3RjCisJcmV0CisKKyMgU2V0IHRoZSA4MHg0MyBtb2RlLiBUaGlzIG1vZGUgaXMgd29ya3Mgb24gYWxsIFZHQSdzLgorIyBJdCdzIGEgMzUwLXNjYW5saW5lIG1vZGUgd2l0aCA4LXBpeGVsIGZvbnQuCitzZXRfODB4NDM6CisJRE9fU1RPUkUKKwltb3Z3CSQweDEyMDEsICVheAkJCSMgU2V0IDM1MCBzY2FucworCW1vdmIJJDB4MzAsICVibAorCWludAkkMHgxMAorCW1vdncJJDB4MDAwMywgJWF4CQkJIyBSZXNldCB2aWRlbyBtb2RlCisJaW50CSQweDEwCisJam1wCXNldF84cHQJCQkJIyBVc2UgOC1waXhlbCBmb250CisKKyMgU2V0IHRoZSA4MHgzMCBtb2RlIChhbGwgVkdBJ3MpLiA0ODAgc2NhbmxpbmVzLCAxNi1waXhlbCBmb250Lgorc2V0XzgweDMwOgorCWNhbGwJdXNlXzgweDI1CQkJIyBTdGFydCB3aXRoIHJlYWwgODB4MjUKKwlET19TVE9SRQorCW1vdncJJDB4M2NjLCAlZHgJCQkjIEdldCBDUlRDIHBvcnQKKwlpbmIJJWR4LCAlYWwKKwltb3ZiCSQweGQ0LCAlZGwKKwlyb3JiCSVhbAkJCQkjIE1vbm8gb3IgY29sb3I/CisJamMJc2V0NDhhCisKKwltb3ZiCSQweGI0LCAlZGwKK3NldDQ4YToJbW92dwkkMHgwYzExLCAlYXgJCSMgVmVydGljYWwgc3luYyBlbmQgKGFsc28gdW5sb2NrcyBDUjAtNykKKyAJY2FsbAlvdXRpZHgKKwltb3Z3CSQweDBiMDYsICVheAkJCSMgVmVydGljYWwgdG90YWwKKyAJY2FsbAlvdXRpZHgKKwltb3Z3CSQweDNlMDcsICVheAkJCSMgKFZlcnRpY2FsKSBvdmVyZmxvdworIAljYWxsCW91dGlkeAorCW1vdncJJDB4ZWExMCwgJWF4CQkJIyBWZXJ0aWNhbCBzeW5jIHN0YXJ0CisgCWNhbGwJb3V0aWR4CisJbW92dwkkMHhkZjEyLCAlYXgJCQkjIFZlcnRpY2FsIGRpc3BsYXkgZW5kCisJY2FsbAlvdXRpZHgKKwltb3Z3CSQweGU3MTUsICVheAkJCSMgVmVydGljYWwgYmxhbmsgc3RhcnQKKyAJY2FsbAlvdXRpZHgKKwltb3Z3CSQweDA0MTYsICVheAkJCSMgVmVydGljYWwgYmxhbmsgZW5kCisgCWNhbGwJb3V0aWR4CisJcHVzaHcJJWR4CisJbW92YgkkMHhjYywgJWRsCQkJIyBNaXNjIG91dHB1dCByZWdpc3RlciAocmVhZCkKKyAJaW5iCSVkeCwgJWFsCisgCW1vdmIJJDB4YzIsICVkbAkJCSMgKHdyaXRlKQorIAlhbmRiCSQweDBkLCAlYWwJIyBQcmVzZXJ2ZSBjbG9jayBzZWxlY3QgYml0cyBhbmQgY29sb3IgYml0CisgCW9yYgkkMHhlMiwgJWFsCQkJIyBTZXQgY29ycmVjdCBzeW5jIHBvbGFyaXR5CisgCW91dGIJJWFsLCAlZHgKKwlwb3B3CSVkeAorCW1vdncJJDB4NTAxZSwgZm9yY2Vfc2l6ZQorCXN0YwkJCQkJIyBUaGF0J3MgYWxsLgorCXJldAorCisjIFNldCB0aGUgODB4MzQgbW9kZSAoYWxsIFZHQSdzKS4gNDgwIHNjYW5zLCAxNC1waXhlbCBmb250Lgorc2V0XzgweDM0OgorCWNhbGwJc2V0XzgweDMwCQkJIyBTZXQgNDgwIHNjYW5zCisJY2FsbAlzZXQxNAkJCQkjIEFuZCAxNC1wdCBmb250CisJbW92dwkkMHhkYjEyLCAlYXgJCQkjIFZHQSB2ZXJ0aWNhbCBkaXNwbGF5IGVuZAorCW1vdncJJDB4NTAyMiwgZm9yY2Vfc2l6ZQorc2V0dmRlOgljYWxsCW91dGlkeAorCXN0YworCXJldAorCisjIFNldCB0aGUgODB4NjAgbW9kZSAoYWxsIFZHQSdzKS4gNDgwIHNjYW5zLCA4LXBpeGVsIGZvbnQuCitzZXRfODB4NjA6CisJY2FsbAlzZXRfODB4MzAJCQkjIFNldCA0ODAgc2NhbnMKKwljYWxsCXNldF84cHQJCQkJIyBBbmQgOC1wdCBmb250CisJbW92dwkkMHhkZjEyLCAlYXgJCQkjIFZHQSB2ZXJ0aWNhbCBkaXNwbGF5IGVuZAorCW1vdncJJDB4NTAzYywgZm9yY2Vfc2l6ZQorCWptcAlzZXR2ZGUKKworIyBTcGVjaWFsIGhhY2sgZm9yIFRoaW5rUGFkIGdyYXBoaWNzCitzZXRfZ2Z4OgorI2lmZGVmIENPTkZJR19WSURFT19HRlhfSEFDSworCW1vdncJJFZJREVPX0dGWF9CSU9TX0FYLCAlYXgKKwltb3Z3CSRWSURFT19HRlhfQklPU19CWCwgJWJ4CisJaW50CSQweDEwCisJbW92dwkkVklERU9fR0ZYX0RVTU1ZX1JFU09MVVRJT04sIGZvcmNlX3NpemUKKwlzdGMKKyNlbmRpZgorCXJldAorCisjaWZkZWYgQ09ORklHX1ZJREVPX1JFVEFJTgorCisjIFN0b3JlIHNjcmVlbiBjb250ZW50cyB0byB0ZW1wb3JhcnkgYnVmZmVyLgorc3RvcmVfc2NyZWVuOgorCWNtcGIJJDAsIGRvX3Jlc3RvcmUJCQkjIEFscmVhZHkgc3RvcmVkPworCWpueglzdHNyCisKKwl0ZXN0YgkkQ0FOX1VTRV9IRUFQLCBsb2FkZmxhZ3MJIyBIYXZlIHdlIHNwYWNlIGZvciBzdG9yaW5nPworCWp6CXN0c3IKKwkKKwlwdXNodwklYXgKKwlwdXNodwklYngKKwlwdXNodwlmb3JjZV9zaXplCQkJIyBEb24ndCBmb3JjZSBzcGVjaWZpYyBzaXplCisJbW92dwkkMCwgZm9yY2Vfc2l6ZQorCWNhbGwJbW9kZV9wYXJhbXMJCQkjIE9idGFpbiBwYXJhbXMgb2YgY3VycmVudCBtb2RlCisJcG9wdwlmb3JjZV9zaXplCisJbW92YgklZnM6KFBBUkFNX1ZJREVPX0xJTkVTKSwgJWFoCisJbW92YgklZnM6KFBBUkFNX1ZJREVPX0NPTFMpLCAlYWwKKwltb3Z3CSVheCwgJWJ4CQkJIyBCWD1kaW1lbnNpb25zCisJbXVsYgklYWgKKwltb3Z3CSVheCwgJWN4CQkJIyBDWD1udW1iZXIgb2YgY2hhcmFjdGVycworCWFkZHcJJWF4LCAlYXgJCQkjIENhbGN1bGF0ZSBpbWFnZSBzaXplCisJYWRkdwkkbW9kZWxpc3QrMTAyNCs0LCAlYXgKKwljbXB3CWhlYXBfZW5kX3B0ciwgJWF4CisJam5jCXN0czEJCQkJIyBVbmZvcnR1bmF0ZWx5LCBvdXQgb2YgbWVtb3J5CisKKwltb3Z3CSVmczooUEFSQU1fQ1VSU09SX1BPUyksICVheAkjIFN0b3JlIG1vZGUgcGFyYW1zCisJbGVhdwltb2RlbGlzdCsxMDI0LCAlZGkKKwlzdG9zdworCW1vdncJJWJ4LCAlYXgKKwlzdG9zdworCXB1c2h3CSVkcwkJCQkjIFN0b3JlIHRoZSBzY3JlZW4KKwltb3Z3CXZpZGVvX3NlZ21lbnQsICVkcworCXhvcncJJXNpLCAlc2kKKwlyZXAKKwltb3ZzdworCXBvcHcJJWRzCisJaW5jYglkb19yZXN0b3JlCQkJIyBTY3JlZW4gd2lsbCBiZSByZXN0b3JlZCBsYXRlcgorc3RzMToJcG9wdwklYngKKwlwb3B3CSVheAorc3RzcjoJcmV0CisKKyMgUmVzdG9yZSBzY3JlZW4gY29udGVudHMgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyLgorcmVzdG9yZV9zY3JlZW46CisJY21wYgkkMCwgZG9fcmVzdG9yZQkJCSMgSGFzIHRoZSBzY3JlZW4gYmVlbiBzdG9yZWQ/CisJanoJcmVzMQorCisJY2FsbAltb2RlX3BhcmFtcwkJCSMgR2V0IHBhcmFtZXRlcnMgb2YgY3VycmVudCBtb2RlCisJbW92YgklZnM6KFBBUkFNX1ZJREVPX0xJTkVTKSwgJWNsCisJbW92YgklZnM6KFBBUkFNX1ZJREVPX0NPTFMpLCAlY2gKKwlsZWF3CW1vZGVsaXN0KzEwMjQsICVzaQkJIyBTY3JlZW4gYnVmZmVyCisJbG9kc3cJCQkJCSMgU2V0IGN1cnNvciBwb3NpdGlvbgorCW1vdncJJWF4LCAlZHgKKwljbXBiCSVjbCwgJWRoCisJamMJcmVzMgorCQorCW1vdmIJJWNsLCAlZGgKKwlkZWNiCSVkaAorcmVzMjoJY21wYgklY2gsICVkbAorCWpjCXJlczMKKwkKKwltb3ZiCSVjaCwgJWRsCisJZGVjYgklZGwKK3JlczM6CW1vdmIJJDB4MDIsICVhaAorCW1vdmIJJDB4MDAsICViaAorCWludAkkMHgxMAorCWxvZHN3CQkJCQkjIERpc3BsYXkgc2l6ZQorCW1vdmIJJWFoLCAlZGwJCQkjIERMPW51bWJlciBvZiBsaW5lcworCW1vdmIJJDAsICVhaAkJCQkjIEJYPXBoeXMuIGxlbmd0aCBvZiBvcmlnLiBsaW5lCisJbW92dwklYXgsICVieAorCWNtcGIJJWNsLCAlZGwJCQkjIFRvbyBtYW55PworCWpjCXJlczQKKworCXB1c2h3CSVheAorCW1vdmIJJWRsLCAlYWwKKwlzdWJiCSVjbCwgJWFsCisJbXVsYgklYmwKKwlhZGR3CSVheCwgJXNpCisJYWRkdwklYXgsICVzaQorCXBvcHcJJWF4CisJbW92YgklY2wsICVkbAorcmVzNDoJY21wYgklY2gsICVhbAkJCSMgVG9vIHdpZGU/CisJamMJcmVzNQorCQorCW1vdmIJJWNoLCAlYWwJCQkjIEFYPXdpZHRoIG9mIHNyYy4gbGluZQorcmVzNToJbW92YgkkMCwgJWNsCisJeGNoZ2IJJWNoLCAlY2wKKwltb3Z3CSVjeCwgJWJwCQkJIyBCUD13aWR0aCBvZiBkZXN0LiBsaW5lCisJcHVzaHcJJWVzCisJbW92dwl2aWRlb19zZWdtZW50LCAlZXMKKwl4b3J3CSVkaSwgJWRpCQkJIyBNb3ZlIHRoZSBkYXRhCisJYWRkdwklYngsICVieAkJCSMgQ29udmVydCBCWCBhbmQgQlAgdG8gX2J5dGVzXworCWFkZHcJJWJwLCAlYnAKK3JlczY6CXB1c2h3CSVzaQorCXB1c2h3CSVkaQorCW1vdncJJWF4LCAlY3gKKwlyZXAKKwltb3ZzdworCXBvcHcJJWRpCisJcG9wdwklc2kKKwlhZGR3CSVicCwgJWRpCisJYWRkdwklYngsICVzaQorCWRlY2IJJWRsCisJam56CXJlczYKKwkKKwlwb3B3CSVlcwkJCQkjIERvbmUKK3JlczE6CXJldAorI2VuZGlmIC8qIENPTkZJR19WSURFT19SRVRBSU4gKi8KKworIyBXcml0ZSB0byBpbmRleGVkIFZHQSByZWdpc3RlciAoQUw9aW5kZXgsIEFIPWRhdGEsIERYPWluZGV4IHJlZy4gcG9ydCkKK291dGlkeDoJb3V0YgklYWwsICVkeAorCXB1c2h3CSVheAorCW1vdmIJJWFoLCAlYWwKKwlpbmN3CSVkeAorCW91dGIJJWFsLCAlZHgKKwlkZWN3CSVkeAorCXBvcHcJJWF4CisJcmV0CisKKyMgQnVpbGQgdGhlIHRhYmxlIG9mIHZpZGVvIG1vZGVzIChzdG9yZWQgYWZ0ZXIgdGhlIHNldHVwLlMgY29kZSBhdCB0aGUKKyMgYG1vZGVsaXN0JyBsYWJlbC4gRWFjaCB2aWRlbyBtb2RlIHJlY29yZCBsb29rcyBsaWtlOgorIwkud29yZAlNT0RFLUlECQkob3VyIHNwZWNpYWwgbW9kZSBJRCAoc2VlIGFib3ZlKSkKKyMJLmJ5dGUJcm93cwkJKG51bWJlciBvZiByb3dzKQorIwkuYnl0ZQljb2x1bW5zCQkobnVtYmVyIG9mIGNvbHVtbnMpCisjIFJldHVybnMgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSB0YWJsZSBpbiBESSwgdGhlIGVuZCBpcyBtYXJrZWQKKyMgd2l0aCBhIEFTS19WR0EgSUQuCittb2RlX3RhYmxlOgorCW1vdncJbXRfZW5kLCAlZGkJCQkjIEFscmVhZHkgZmlsbGVkPworCW9ydwklZGksICVkaQorCWpuegltdGFiMXgKKwkKKwlsZWF3CW1vZGVsaXN0LCAlZGkJCQkjIFN0b3JlIHN0YW5kYXJkIG1vZGVzOgorCW1vdmwJJFZJREVPXzgweDI1ICsgMHg1MDE5MDAwMCwgJWVheAkjIFRoZSA4MHgyNSBtb2RlIChBTEwpCisJc3Rvc2wKKwltb3ZiCWFkYXB0ZXIsICVhbAkJCSMgQ0dBL01EQS9IR0EgLS0gbm8gbW9yZSBtb2RlcworCW9yYgklYWwsICVhbAorCWp6CW10YWJlCisJCisJZGVjYgklYWwKKwlqbnoJbXRhYnYKKwkKKwltb3ZsCSRWSURFT184UE9JTlQgKyAweDUwMmIwMDAwLCAlZWF4CSMgVGhlIDgweDQzIEVHQSBtb2RlCisJc3Rvc2wKKwlqbXAJbXRhYmUKKworbXRhYjF4OglqbXAJbXRhYjEKKworbXRhYnY6CWxlYXcJdmdhX21vZGVzLCAlc2kJCQkjIEFsbCBtb2RlcyBmb3Igc3RkIFZHQQorCW1vdncJJHZnYV9tb2Rlc19lbmQtdmdhX21vZGVzLCAlY3gKKwlyZXAJIyBJJ20gdW5hYmxlIHRvIHVzZSBtb3ZzdyBhcyBJIGRvbid0IGtub3cgaG93IHRvIHN0b3JlIGEgaGFsZgorCW1vdnNiCSMgb2YgdGhlIGV4cHJlc3Npb24gYWJvdmUgdG8gY3ggd2l0aG91dCB1c2luZyBleHBsaWNpdCBzaHIuCisKKwljbXBiCSQwLCBzY2FubmluZwkJCSMgTW9kZSBzY2FuIHJlcXVlc3RlZD8KKwlqegltc2NhbjEKKwkKKwljYWxsCW1vZGVfc2NhbgorbXNjYW4xOgorCisjaWZkZWYgQ09ORklHX1ZJREVPX0xPQ0FMCisJY2FsbAlsb2NhbF9tb2RlcworI2VuZGlmIC8qIENPTkZJR19WSURFT19MT0NBTCAqLworCisjaWZkZWYgQ09ORklHX1ZJREVPX1ZFU0EKKwljYWxsCXZlc2FfbW9kZXMJCQkjIERldGVjdCBWRVNBIFZHQSBtb2RlcworI2VuZGlmIC8qIENPTkZJR19WSURFT19WRVNBICovCisKKyNpZmRlZiBDT05GSUdfVklERU9fU1ZHQQorCWNtcGIJJDAsIHNjYW5uaW5nCQkJIyBCeXBhc3Mgd2hlbiBzY2FubmluZworCWpuegltc2NhbjIKKwkKKwljYWxsCXN2Z2FfbW9kZXMJCQkjIERldGVjdCBTVkdBIGNhcmRzICYgbW9kZXMKK21zY2FuMjoKKyNlbmRpZiAvKiBDT05GSUdfVklERU9fU1ZHQSAqLworCittdGFiZToKKworI2lmZGVmIENPTkZJR19WSURFT19DT01QQUNUCisJbGVhdwltb2RlbGlzdCwgJXNpCisJbW92dwklZGksICVkeAorCW1vdncJJXNpLCAlZGkKK2NtdDE6CWNtcHcJJWR4LCAlc2kJCQkjIFNjYW4gYWxsIG1vZGVzCisJanoJY210MgorCisJbGVhdwltb2RlbGlzdCwgJWJ4CQkJIyBGaW5kIGluIHByZXZpb3VzIGVudHJpZXMKKwltb3Z3CTIoJXNpKSwgJWN4CitjbXQzOgljbXB3CSVieCwgJXNpCisJanoJY210NAorCisJY21wdwkyKCVieCksICVjeAkJCSMgRm91bmQgPT4gZG9uJ3QgY29weSB0aGlzIGVudHJ5CisJanoJY210NQorCisJYWRkdwkkNCwgJWJ4CisJam1wCWNtdDMKKworY210NDoJbW92c2wJCQkJCSMgQ29weSBlbnRyeQorCWptcAljbXQxCisKK2NtdDU6CWFkZHcJJDQsICVzaQkJCQkjIFNraXAgZW50cnkKKwlqbXAJY210MQorCitjbXQyOgorI2VuZGlmCS8qIENPTkZJR19WSURFT19DT01QQUNUICovCisKKwltb3Z3CSRBU0tfVkdBLCAoJWRpKQkJCSMgRW5kIG1hcmtlcgorCW1vdncJJWRpLCBtdF9lbmQKK210YWIxOglsZWF3CW1vZGVsaXN0LCAlc2kJCQkjIFNJPW1vZGUgbGlzdCwgREk9bGlzdCBlbmQKK3JldDA6CXJldAorCisjIE1vZGVzIHVzYWJsZSBvbiBhbGwgc3RhbmRhcmQgVkdBcwordmdhX21vZGVzOgorCS53b3JkCVZJREVPXzhQT0lOVAorCS53b3JkCTB4NTAzMgkJCQkjIDgweDUwCisJLndvcmQJVklERU9fODB4NDMKKwkud29yZAkweDUwMmIJCQkJIyA4MHg0MworCS53b3JkCVZJREVPXzgweDI4CisJLndvcmQJMHg1MDFjCQkJCSMgODB4MjgKKwkud29yZAlWSURFT184MHgzMAorCS53b3JkCTB4NTAxZQkJCQkjIDgweDMwCisJLndvcmQJVklERU9fODB4MzQKKwkud29yZAkweDUwMjIJCQkJIyA4MHgzNAorCS53b3JkCVZJREVPXzgweDYwCisJLndvcmQJMHg1MDNjCQkJCSMgODB4NjAKKyNpZmRlZiBDT05GSUdfVklERU9fR0ZYX0hBQ0sKKwkud29yZAlWSURFT19HRlhfSEFDSworCS53b3JkCVZJREVPX0dGWF9EVU1NWV9SRVNPTFVUSU9OCisjZW5kaWYKKwordmdhX21vZGVzX2VuZDoKKyMgRGV0ZWN0IFZFU0EgbW9kZXMuCisKKyNpZmRlZiBDT05GSUdfVklERU9fVkVTQQordmVzYV9tb2RlczoKKwljbXBiCSQyLCBhZGFwdGVyCQkJIyBWR0Egb25seQorCWpueglyZXQwCisKKwltb3Z3CSVkaSwgJWJwCQkJIyBCUD1vcmlnaW5hbCBtb2RlIHRhYmxlIGVuZAorCWFkZHcJJDB4MjAwLCAlZGkJCQkjIEJ1ZmZlciBzcGFjZQorCW1vdncJJDB4NGYwMCwgJWF4CQkJIyBWRVNBIEdldCBjYXJkIGluZm8gY2FsbAorCWludAkkMHgxMAorCW1vdncJJWJwLCAlZGkKKwljbXB3CSQweDAwNGYsICVheAkJCSMgU3VjY2Vzc2Z1bD8KKwlqbnoJcmV0MAorCQorCWNtcHcJJDB4NDU1NiwgMHgyMDAoJWRpKQorCWpueglyZXQwCisJCisJY21wdwkkMHg0MTUzLCAweDIwMiglZGkpCisJam56CXJldDAKKwkKKwltb3Z3CSR2ZXNhX25hbWUsIGNhcmRfbmFtZQkJIyBTZXQgbmFtZSB0byAiVkVTQSBWR0EiCisJcHVzaHcJJWdzCisJbGdzdwkweDIwZSglZGkpLCAlc2kJCQkjIEdTOlNJPW1vZGUgbGlzdAorCW1vdncJJDEyOCwgJWN4CQkJIyBJdGVyYXRpb24gbGltaXQKK3Zlc2ExOgorIyBnYXMgdmVyc2lvbiAyLjkuMSwgdXNpbmcgQkZEIHZlcnNpb24gMi45LjEuMC4yMyBidWdnZXJzIHRoZSBuZXh0IGluc3QuCisjIFhYWDoJbG9kc3cJJWdzOiglc2kpLCAlYXgJCQkjIEdldCBuZXh0IG1vZGUgaW4gdGhlIGxpc3QKKwlnczsgbG9kc3cKKwljbXB3CSQweGZmZmYsICVheAkJCSMgRW5kIG9mIHRoZSB0YWJsZT8KKwlqegl2ZXNhcgorCQorCWNtcHcJJDB4MDA4MCwgJWF4CQkJIyBDaGVjayB2YWxpZGl0eSBvZiBtb2RlIElECisJamMJdmVzYTIKKwkKKwlvcmIJJWFoLCAlYWgJCSMgVmFsaWQgSURzOiAweDAwMDAtMHgwMDdmLzB4MDEwMC0weDA3ZmYKKwlqegl2ZXNhbgkJCSMgQ2VydGFpbiBCSU9TZXMgcmVwb3J0IDB4ODAtMHhmZiEKKworCWNtcHcJJDB4MDgwMCwgJWF4CisJam5jCXZlc2FlCisKK3Zlc2EyOglwdXNodwklY3gKKwltb3Z3CSVheCwgJWN4CQkJIyBHZXQgbW9kZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKwltb3Z3CSQweDRmMDEsICVheAorCWludAkkMHgxMAorCW1vdncJJWN4LCAlYngJCQkjIEJYPW1vZGUgbnVtYmVyCisJYWRkYgkkVklERU9fRklSU1RfVkVTQT4+OCwgJWJoCisJcG9wdwklY3gKKwljbXB3CSQweDAwNGYsICVheAorCWpuegl2ZXNhbgkJCSMgRG9uJ3QgcmVwb3J0IGVycm9ycyAoYnVnZ3kgQklPU0VTKQorCisJbW92YgkoJWRpKSwgJWFsCQkJIyBDaGVjayBjYXBhYmlsaXRpZXMuIFdlIHJlcXVpcmUKKwlhbmRiCSQweDE5LCAlYWwJCQkjIGEgY29sb3IgdGV4dCBtb2RlLgorCWNtcGIJJDB4MDksICVhbAorCWpuegl2ZXNhbgorCQorCWNtcHcJJDB4YjgwMCwgOCglZGkpCQkjIFN0YW5kYXJkIHZpZGVvIG1lbW9yeSBhZGRyZXNzIHJlcXVpcmVkCisJam56CXZlc2FuCisKKwl0ZXN0YgkkMiwgKCVkaSkJCQkjIE1vZGUgY2hhcmFjdGVyaXN0aWNzIHN1cHBsaWVkPworCW1vdncJJWJ4LCAoJWRpKQkJCSMgU3RvcmUgbW9kZSBudW1iZXIKKwlqegl2ZXNhMworCQorCXhvcncJJWR4LCAlZHgKKwltb3Z3CTB4MTIoJWRpKSwgJWJ4CQkJIyBXaWR0aAorCW9yYgklYmgsICViaAorCWpuegl2ZXNhbgorCQorCW1vdmIJJWJsLCAweDMoJWRpKQorCW1vdncJMHgxNCglZGkpLCAlYXgJCQkjIEhlaWdodAorCW9yYgklYWgsICVhaAorCWpuegl2ZXNhbgorCQorCW1vdmIJJWFsLCAyKCVkaSkKKwltdWxiCSVibAorCWNtcHcJJDgxOTMsICVheAkJIyBTbWFsbCBlbm91Z2ggZm9yIExpbnV4IGNvbnNvbGUgZHJpdmVyPworCWpuYwl2ZXNhbgorCisJam1wCXZlc2FvaworCit2ZXNhMzoJc3VidwkkMHg4MTA4LCAlYngJIyBUaGlzIG1vZGUgaGFzIG5vIGRldGFpbGVkIGluZm8gc3BlY2lmaWVkLAorCWpjCXZlc2FuCQkjIHNvIGl0IG11c3QgYmUgYSBzdGFuZGFyZCBWRVNBIG1vZGUuCisKKwljbXB3CSQ1LCAlYngKKwlqbmMJdmVzYW4KKworCW1vdncJdmVzYV90ZXh0X21vZGVfdGFibGUoJWJ4KSwgJWF4CisJbW92dwklYXgsIDIoJWRpKQordmVzYW9rOglhZGR3CSQ0LCAlZGkJCQkJIyBUaGUgbW9kZSBpcyB2YWxpZC4gU3RvcmUgaXQuCit2ZXNhbjoJbG9vcAl2ZXNhMQkJCSMgTmV4dCBtb2RlLiBMaW1pdCBleGNlZWRlZCA9PiBlcnJvcgordmVzYWU6CWxlYXcJdmVzYWVyLCAlc2kKKwljYWxsCXBydHN0cgorCW1vdncJJWJwLCAlZGkJCQkjIERpc2NhcmQgYWxyZWFkeSBmb3VuZCBtb2Rlcy4KK3Zlc2FyOglwb3B3CSVncworCXJldAorCisjIERpbWVuc2lvbnMgb2Ygc3RhbmRhcmQgVkVTQSB0ZXh0IG1vZGVzCit2ZXNhX3RleHRfbW9kZV90YWJsZToKKwkuYnl0ZQk2MCwgODAJCQkJIyAwMTA4CisJLmJ5dGUJMjUsIDEzMgkJCQkjIDAxMDkKKwkuYnl0ZQk0MywgMTMyCQkJCSMgMDEwQQorCS5ieXRlCTUwLCAxMzIJCQkJIyAwMTBCCisJLmJ5dGUJNjAsIDEzMgkJCQkjIDAxMEMKKyNlbmRpZgkvKiBDT05GSUdfVklERU9fVkVTQSAqLworCisjIFNjYW4gZm9yIHZpZGVvIG1vZGVzLiBBIGJpdCBkaXJ0eSwgYnV0IHNob3VsZCB3b3JrLgorbW9kZV9zY2FuOgorCW1vdncJJDB4MDEwMCwgJWN4CQkJIyBTdGFydCB3aXRoIG1vZGUgMAorc2NtMToJbW92YgkkMCwgJWFoCQkJCSMgVGVzdCB0aGUgbW9kZQorCW1vdmIJJWNsLCAlYWwKKwlpbnQJJDB4MTAKKwltb3ZiCSQweDBmLCAlYWgKKwlpbnQJJDB4MTAKKwljbXBiCSVjbCwgJWFsCisJam56CXNjbTIJCQkJIyBNb2RlIG5vdCBzZXQKKworCW1vdncJJDB4M2MwLCAlZHgJCQkjIFRlc3QgaWYgaXQncyBhIHRleHQgbW9kZQorCW1vdmIJJDB4MTAsICVhbAkJCSMgTW9kZSBiaXRzCisJY2FsbAlpbmlkeAorCWFuZGIJJDB4MDMsICVhbAorCWpueglzY20yCisJCisJbW92YgkkMHhjZSwgJWRsCQkJIyBBbm90aGVyIHNldCBvZiBtb2RlIGJpdHMKKwltb3ZiCSQweDA2LCAlYWwKKwljYWxsCWluaWR4CisJc2hyYgklYWwKKwlqYwlzY20yCisJCisJbW92YgkkMHhkNCwgJWRsCQkJIyBDdXJzb3IgbG9jYXRpb24KKwltb3ZiCSQweDBmLCAlYWwKKwljYWxsCWluaWR4CisJb3JiCSVhbCwgJWFsCisJam56CXNjbTIKKwkKKwltb3Z3CSVjeCwgJWF4CQkJIyBPaywgc3RvcmUgdGhlIG1vZGUKKwlzdG9zdworCW1vdmIJJWdzOigweDQ4NCksICVhbAkJIyBOdW1iZXIgb2Ygcm93cworCWluY2IJJWFsCisJc3Rvc2IKKwltb3Z3CSVnczooMHg0NGEpLCAlYXgJCSMgTnVtYmVyIG9mIGNvbHVtbnMKKwlzdG9zYgorc2NtMjoJaW5jYgklY2wKKwlqbnMJc2NtMQorCQorCW1vdncJJDB4MDAwMywgJWF4CQkJIyBSZXR1cm4gYmFjayB0byBtb2RlIDMKKwlpbnQJJDB4MTAKKwlyZXQKKwordHN0aWR4OglvdXR3CSVheCwgJWR4CQkJIyBPVVQgRFgsQVggYW5kIGluaWR4CitpbmlkeDoJb3V0YgklYWwsICVkeAkJCSMgUmVhZCBmcm9tIGluZGV4ZWQgVkdBIHJlZ2lzdGVyCisJaW5jdwklZHgJCQkjIEFMPWluZGV4LCBEWD1pbmRleCByZWcgcG9ydCAtPiBBTD1kYXRhCisJaW5iCSVkeCwgJWFsCisJZGVjdwklZHgKKwlyZXQKKworIyBUcnkgdG8gZGV0ZWN0IHR5cGUgb2YgU1ZHQSBjYXJkIGFuZCBzdXBwbHkgKHVzdWFsbHkgYXBwcm94aW1hdGUpIHZpZGVvCisjIG1vZGUgdGFibGUgZm9yIGl0LgorCisjaWZkZWYgQ09ORklHX1ZJREVPX1NWR0EKK3N2Z2FfbW9kZXM6CisJbGVhdwlzdmdhX3RhYmxlLCAlc2kJCQkjIFRlc3QgYWxsIGtub3duIFNWR0EgYWRhcHRlcnMKK2Rvc3ZnYToJbG9kc3cKKwltb3Z3CSVheCwgJWJwCQkJIyBEZWZhdWx0IG1vZGUgdGFibGUKKwlvcncJJWF4LCAlYXgKKwlqeglkaWRzdjEKKworCWxvZHN3CQkJCQkjIFBvaW50ZXIgdG8gdGVzdCByb3V0aW5lCisJcHVzaHcJJXNpCisJcHVzaHcJJWRpCisJcHVzaHcJJWVzCisJbW92dwkkMHhjMDAwLCAlYngKKwltb3Z3CSVieCwgJWVzCisJY2FsbAkqJWF4CQkJCSMgQ2FsbCB0ZXN0IHJvdXRpbmUKKwlwb3B3CSVlcworCXBvcHcJJWRpCisJcG9wdwklc2kKKwlvcncJJWJwLCAlYnAKKwlqeglkb3N2Z2EKKwkKKwltb3Z3CSVicCwgJXNpCQkJIyBGb3VuZCwgY29weSB0aGUgbW9kZXMKKwltb3ZiCXN2Z2FfcHJlZml4LCAlYWgKK2Nwc3ZnYToJbG9kc2IKKwlvcmIJJWFsLCAlYWwKKwlqeglkaWRzdgorCQorCXN0b3N3CisJbW92c3cKKwlqbXAJY3BzdmdhCisKK2RpZHN2Ogltb3Z3CSVzaSwgY2FyZF9uYW1lCQkJIyBTdG9yZSBwb2ludGVyIHRvIGNhcmQgbmFtZQorZGlkc3YxOglyZXQKKworIyBUYWJsZSBvZiBhbGwga25vd24gU1ZHQSBjYXJkcy4gRm9yIGVhY2ggY2FyZCwgd2Ugc3RvcmUgYSBwb2ludGVyIHRvCisjIGEgdGFibGUgb2YgdmlkZW8gbW9kZXMgc3VwcG9ydGVkIGJ5IHRoZSBjYXJkIGFuZCBhIHBvaW50ZXIgdG8gYSByb3V0aW5lCisjIHVzZWQgZm9yIHRlc3Rpbmcgb2YgcHJlc2VuY2Ugb2YgdGhlIGNhcmQuIFRoZSB2aWRlbyBtb2RlIHRhYmxlIGlzIGFsd2F5cworIyBmb2xsb3dlZCBieSB0aGUgbmFtZSBvZiB0aGUgY2FyZCBvciB0aGUgY2hpcHNldC4KK3N2Z2FfdGFibGU6CisJLndvcmQJYXRpX21kLCBhdGlfdGVzdAorCS53b3JkCW9ha19tZCwgb2FrX3Rlc3QKKwkud29yZAlwYXJhZGlzZV9tZCwgcGFyYWRpc2VfdGVzdAorCS53b3JkCXJlYWx0ZWtfbWQsIHJlYWx0ZWtfdGVzdAorCS53b3JkCXMzX21kLCBzM190ZXN0CisJLndvcmQJY2hpcHNfbWQsIGNoaXBzX3Rlc3QKKwkud29yZAl2aWRlbzdfbWQsIHZpZGVvN190ZXN0CisJLndvcmQJY2lycnVzNV9tZCwgY2lycnVzNV90ZXN0CisJLndvcmQJY2lycnVzNl9tZCwgY2lycnVzNl90ZXN0CisJLndvcmQJY2lycnVzMV9tZCwgY2lycnVzMV90ZXN0CisJLndvcmQJYWhlYWRfbWQsIGFoZWFkX3Rlc3QKKwkud29yZAlldmVyZXhfbWQsIGV2ZXJleF90ZXN0CisJLndvcmQJZ2Vub2FfbWQsIGdlbm9hX3Rlc3QKKwkud29yZAl0cmlkZW50X21kLCB0cmlkZW50X3Rlc3QKKwkud29yZAl0c2VuZ19tZCwgdHNlbmdfdGVzdAorCS53b3JkCTAKKworIyBUZXN0IHJvdXRpbmVzIGFuZCBtb2RlIHRhYmxlczoKKworIyBTMyAtIFRoZSB0ZXN0IGFsZ29yaXRobSB3YXMgdGFrZW4gZnJvbSB0aGUgU3VwZXJQcm9iZSBwYWNrYWdlCisjIGZvciBYRnJlZTg2IDEuMi4xLiBSZXBvcnQgYnVncyB0byBDaHJpc3RvcGguTmllbWFubkBsaW51eC5vcmcKK3MzX3Rlc3Q6CisJbW92dwkkMHgwZjM1LCAlY3gJIyB3ZSBzdG9yZSBzb21lIGNvbnN0YW50cyBpbiBjbC9jaAorCW1vdncJJDB4MDNkNCwgJWR4CisJbW92YgkkMHgzOCwgJWFsCisJY2FsbAlpbmlkeAorCW1vdmIJJWFsLCAlYmgJIyBzdG9yZSBjdXJyZW50IENSVC1yZWdpc3RlciAweDM4CisJbW92dwkkMHgwMDM4LCAlYXgKKwljYWxsCW91dGlkeAkJIyBkaXNhYmxlIHdyaXRpbmcgdG8gc3BlY2lhbCByZWdzCisJbW92YgklY2wsICVhbAkjIGNoZWNrIHdoZXRoZXIgd2UgY2FuIHdyaXRlIHNwZWNpYWwgcmVnIDB4MzUKKwljYWxsCWluaWR4CisJbW92YgklYWwsICVibAkjIHNhdmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgQ1JUIHJlZyAweDM1CisJYW5kYgkkMHhmMCwgJWFsCSMgY2xlYXIgYml0cyAwLTMKKwltb3ZiCSVhbCwgJWFoCisJbW92YgklY2wsICVhbAkjIGFuZCB3cml0ZSBpdCB0byBDUlQgcmVnIDB4MzUKKwljYWxsCW91dGlkeAorCWNhbGwJaW5pZHgJCSMgbm93IHJlYWQgaXQgYmFjaworCWFuZGIJJWNoLCAlYWwJIyBjbGVhciB0aGUgdXBwZXIgNCBiaXRzCisJanoJczNfMgkJIyB0aGUgZmlyc3QgdGVzdCBmYWlsZWQuIEJ1dCB3ZSBoYXZlIGEKKworCW1vdmIJJWJsLCAlYWgJIyBzZWNvbmQgY2hhbmNlCisJbW92YgklY2wsICVhbAorCWNhbGwJb3V0aWR4CisJam1wCXMzXzEJCSMgZG8gdGhlIG90aGVyIHRlc3RzCisKK3MzXzI6CW1vdncJJWN4LCAlYXgJIyBsb2FkIGFoIHdpdGggMHhmIGFuZCBhbCB3aXRoIDB4MzUKKwlvcmIJJWJsLCAlYWgJIyBzZXQgdGhlIHVwcGVyIDQgYml0cyBvZiBhaCB3aXRoIHRoZSBvcmlnIHZhbHVlCisJY2FsbAlvdXRpZHgJCSMgd3JpdGUgLi4uCisJY2FsbAlpbmlkeAkJIyAuLi4gYW5kIHJlcmVhZCAKKwlhbmRiCSVjbCwgJWFsCSMgdHVybiBvZmYgdGhlIHVwcGVyIDQgYml0cworCXB1c2h3CSVheAorCW1vdmIJJWJsLCAlYWgJIyByZXN0b3JlIG9sZCB2YWx1ZSBpbiByZWdpc3RlciAweDM1CisJbW92YgklY2wsICVhbAorCWNhbGwJb3V0aWR4CisJcG9wdwklYXgKKwljbXBiCSVjaCwgJWFsCSMgc2V0dGluZyBsb3dlciA0IGJpdHMgd2FzIHN1Y2Nlc3NmdWwgPT4gYmFkCisJamUJbm9fczMJCSMgd3JpdGluZyBpcyBhbGxvd2VkID0+IHRoaXMgaXMgbm90IGFuIFMzCisKK3MzXzE6CW1vdncJJDB4NDgzOCwgJWF4CSMgYWxsb3cgd3JpdGluZyB0byBzcGVjaWFsIHJlZ3MgYnkgcHV0dGluZworCWNhbGwJb3V0aWR4CQkjIG1hZ2ljIG51bWJlciBpbnRvIENSVC1yZWdpc3RlciAweDM4CisJbW92YgklY2wsICVhbAkjIGNoZWNrIHdoZXRoZXIgd2UgY2FuIHdyaXRlIHNwZWNpYWwgcmVnIDB4MzUKKwljYWxsCWluaWR4CisJbW92YgklYWwsICVibAorCWFuZGIJJDB4ZjAsICVhbAorCW1vdmIJJWFsLCAlYWgKKwltb3ZiCSVjbCwgJWFsCisJY2FsbAlvdXRpZHgKKwljYWxsCWluaWR4CisJYW5kYgklY2gsICVhbAorCWpueglub19zMwkJIyBubywgd2UgY2FuJ3Qgd3JpdGUgPT4gbm8gUzMKKworCW1vdncJJWN4LCAlYXgKKwlvcmIJJWJsLCAlYWgKKwljYWxsCW91dGlkeAorCWNhbGwJaW5pZHgKKwlhbmRiCSVjaCwgJWFsCisJcHVzaHcJJWF4CisJbW92YgklYmwsICVhaAkjIHJlc3RvcmUgb2xkIHZhbHVlIGluIHJlZ2lzdGVyIDB4MzUKKwltb3ZiCSVjbCwgJWFsCisJY2FsbAlvdXRpZHgKKwlwb3B3CSVheAorCWNtcGIJJWNoLCAlYWwKKwlqbmUJbm9fczMxCQkjIHdyaXRpbmcgbm90IHBvc3NpYmxlID0+IG5vIFMzCisJbW92YgkkMHgzMCwgJWFsCisJY2FsbAlpbmlkeAkJIyBub3cgZ2V0IHRoZSBTMyBpZCAuLi4KKwlsZWF3CWlkUzMsICVkaQorCW1vdncJJDB4MTAsICVjeAorCXJlcG5lCisJc2Nhc2IKKwlqZQlub19zMzEKKworCW1vdmIJJWJoLCAlYWgKKwltb3ZiCSQweDM4LCAlYWwKKwlqbXAJczNyZXN0CisKK25vX3MzOgltb3ZiCSQweDM1LCAlYWwJIyByZXN0b3JlIENSVCByZWdpc3RlciAweDM1CisJbW92YgklYmwsICVhaAorCWNhbGwJb3V0aWR4Citub19zMzE6CXhvcncJJWJwLCAlYnAJIyBEZXRlY3Rpb24gZmFpbGVkCitzM3Jlc3Q6CW1vdmIJJWJoLCAlYWgKKwltb3ZiCSQweDM4LCAlYWwJIyByZXN0b3JlIG9sZCB2YWx1ZSBvZiBDUlQgcmVnaXN0ZXIgMHgzOAorCWptcAlvdXRpZHgKKworaWRTMzoJLmJ5dGUJMHg4MSwgMHg4MiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NQorCS5ieXRlCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTgsIDB4YjAKKworczNfbWQ6CS5ieXRlCTB4NTQsIDB4MmIsIDB4ODQKKwkuYnl0ZQkweDU1LCAweDE5LCAweDg0CisJLmJ5dGUJMAorCS5hc2NpaQkiUzMiCisJLmJ5dGUJMAorCisjIEFUSSBjYXJkcy4KK2F0aV90ZXN0OgorCWxlYXcgCWlkYXRpLCAlc2kKKwltb3Z3CSQweDMxLCAlZGkKKwltb3Z3CSQweDA5LCAlY3gKKwlyZXBlCisJY21wc2IKKwlqZQlhdGlvaworCisJeG9ydwklYnAsICVicAorYXRpb2s6CXJldAorCitpZGF0aToJLmFzY2lpCSI3NjEyOTU1MjAiCisKK2F0aV9tZDoJLmJ5dGUJMHgyMywgMHgxOSwgMHg4NAorCS5ieXRlCTB4MzMsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDIyLCAweDFlLCAweDY0CisJLmJ5dGUJMHgyMSwgMHgxOSwgMHg2NAorCS5ieXRlCTB4NTgsIDB4MjEsIDB4NTAKKwkuYnl0ZQkweDViLCAweDFlLCAweDUwCisJLmJ5dGUJMAorCS5hc2NpaQkiQVRJIgorCS5ieXRlCTAKKworIyBBSEVBRAorYWhlYWRfdGVzdDoKKwltb3Z3CSQweDIwMGYsICVheAorCW1vdncJJDB4M2NlLCAlZHgKKwlvdXR3CSVheCwgJWR4CisJaW5jdwklZHgKKwlpbmIJJWR4LCAlYWwKKwljbXBiCSQweDIwLCAlYWwKKwlqZQlpc2FoZWQKKworCWNtcGIJJDB4MjEsICVhbAorCWplCWlzYWhlZAorCQorCXhvcncJJWJwLCAlYnAKK2lzYWhlZDoJcmV0CisKK2FoZWFkX21kOgorCS5ieXRlCTB4MjIsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDIzLCAweDE5LCAweDg0CisJLmJ5dGUJMHgyNCwgMHgxYywgMHg4NAorCS5ieXRlCTB4MmYsIDB4MzIsIDB4YTAKKwkuYnl0ZQkweDMyLCAweDIyLCAweDUwCisJLmJ5dGUJMHgzNCwgMHg0MiwgMHg1MAorCS5ieXRlCTAKKwkuYXNjaWkJIkFoZWFkIgorCS5ieXRlCTAKKworIyBDaGlwcyAmIFRlY2guCitjaGlwc190ZXN0OgorCW1vdncJJDB4M2MzLCAlZHgKKwlpbmIJJWR4LCAlYWwKKwlvcmIJJDB4MTAsICVhbAorCW91dGIJJWFsLCAlZHgKKwltb3Z3CSQweDEwNCwgJWR4CisJaW5iCSVkeCwgJWFsCisJbW92YgklYWwsICVibAorCW1vdncJJDB4M2MzLCAlZHgKKwlpbmIJJWR4LCAlYWwKKwlhbmRiCSQweGVmLCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJY21wYgkkMHhhNSwgJWJsCisJamUJY2FudG9rCisJCisJeG9ydwklYnAsICVicAorY2FudG9rOglyZXQKKworY2hpcHNfbWQ6CisJLmJ5dGUJMHg2MCwgMHgxOSwgMHg4NAorCS5ieXRlCTB4NjEsIDB4MzIsIDB4ODQKKwkuYnl0ZQkwCisJLmFzY2lpCSJDaGlwcyAmIFRlY2hub2xvZ2llcyIKKwkuYnl0ZQkwCisKKyMgQ2lycnVzIExvZ2ljIDVYMAorY2lycnVzMV90ZXN0OgorCW1vdncJJDB4M2Q0LCAlZHgKKwltb3ZiCSQweDBjLCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJaW5jdwklZHgKKwlpbmIJJWR4LCAlYWwKKwltb3ZiCSVhbCwgJWJsCisJeG9yYgklYWwsICVhbAorCW91dGIJJWFsLCAlZHgKKwlkZWN3CSVkeAorCW1vdmIJJDB4MWYsICVhbAorCW91dGIJJWFsLCAlZHgKKwlpbmN3CSVkeAorCWluYgklZHgsICVhbAorCW1vdmIJJWFsLCAlYmgKKwl4b3JiCSVhaCwgJWFoCisJc2hsYgkkNCwgJWFsCisJbW92dwklYXgsICVjeAorCW1vdmIJJWJoLCAlYWwKKwlzaHJiCSQ0LCAlYWwKKwlhZGR3CSVheCwgJWN4CisJc2hsdwkkOCwgJWN4CisJYWRkdwkkNiwgJWN4CisJbW92dwklY3gsICVheAorCW1vdncJJDB4M2M0LCAlZHgKKwlvdXR3CSVheCwgJWR4CisJaW5jdwklZHgKKwlpbmIJJWR4LCAlYWwKKwlhbmRiCSVhbCwgJWFsCisJam56CW5vY2lycgorCQorCW1vdmIJJWJoLCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJaW5iCSVkeCwgJWFsCisJY21wYgkkMHgwMSwgJWFsCisJamUJaXNjaXJyCisKK25vY2lycjoJeG9ydwklYnAsICVicAoraXNjaXJyOiBtb3Z3CSQweDNkNCwgJWR4CisJbW92YgklYmwsICVhbAorCXhvcmIJJWFoLCAlYWgKKwlzaGx3CSQ4LCAlYXgKKwlhZGR3CSQweDBjLCAlYXgKKwlvdXR3CSVheCwgJWR4CisJcmV0CisKK2NpcnJ1czFfbWQ6CisJLmJ5dGUJMHgxZiwgMHgxOSwgMHg4NAorCS5ieXRlCTB4MjAsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDIyLCAweDFlLCAweDg0CisJLmJ5dGUJMHgzMSwgMHgyNSwgMHg2NAorCS5ieXRlCTAKKwkuYXNjaWkJIkNpcnJ1cyBMb2dpYyA1WDAiCisJLmJ5dGUJMAorCisjIENpcnJ1cyBMb2dpYyA1NFhYCitjaXJydXM1X3Rlc3Q6CisJbW92dwkkMHgzYzQsICVkeAorCW1vdmIJJDYsICVhbAorCWNhbGwJaW5pZHgKKwltb3ZiCSVhbCwgJWJsCQkJIyBCTD1iYWNrdXAKKwltb3Z3CSQ2LCAlYXgKKwljYWxsCXRzdGlkeAorCWNtcGIJJDB4MGYsICVhbAorCWpuZQljNWZhaWwKKwkKKwltb3Z3CSQweDEyMDYsICVheAorCWNhbGwJdHN0aWR4CisJY21wYgkkMHgxMiwgJWFsCisJam5lCWM1ZmFpbAorCQorCW1vdmIJJDB4MWUsICVhbAorCWNhbGwJaW5pZHgKKwltb3ZiCSVhbCwgJWJoCisJbW92YgklYmgsICVhaAorCWFuZGIJJDB4YzAsICVhaAorCW1vdmIJJDB4MWUsICVhbAorCWNhbGwJdHN0aWR4CisJYW5kYgkkMHgzZiwgJWFsCisJam5lCWM1eHgKKwkKKwltb3ZiCSQweDFlLCAlYWwKKwltb3ZiCSViaCwgJWFoCisJb3JiCSQweDNmLCAlYWgKKwljYWxsCXRzdGlkeAorCXhvcmIJJDB4M2YsICVhbAorCWFuZGIJJDB4M2YsICVhbAorYzV4eDoJcHVzaGYKKwltb3ZiCSQweDFlLCAlYWwKKwltb3ZiCSViaCwgJWFoCisJb3V0dwklYXgsICVkeAorCXBvcGYKKwlqZQljNWRvbmUKKworYzVmYWlsOgl4b3J3CSVicCwgJWJwCitjNWRvbmU6CW1vdmIJJDYsICVhbAorCW1vdmIJJWJsLCAlYWgKKwlvdXR3CSVheCwgJWR4CisJcmV0CisKK2NpcnJ1czVfbWQ6CisJLmJ5dGUJMHgxNCwgMHgxOSwgMHg4NAorCS5ieXRlCTB4NTQsIDB4MmIsIDB4ODQKKwkuYnl0ZQkwCisJLmFzY2lpCSJDaXJydXMgTG9naWMgNTRYWCIKKwkuYnl0ZQkwCisKKyMgQ2lycnVzIExvZ2ljIDY0WFggLS0gbm8ga25vd24gZXh0cmEgbW9kZXMsIGJ1dCBtdXN0IGJlIGlkZW50aWZpZWQsIGJlY2F1c2UKKyMgaXQncyBtaXNpZGVudGlmaWVkIGJ5IHRoZSBBaGVhZCB0ZXN0LgorY2lycnVzNl90ZXN0OgorCW1vdncJJDB4M2NlLCAlZHgKKwltb3ZiCSQweDBhLCAlYWwKKwljYWxsCWluaWR4CisJbW92YgklYWwsICVibAkjIEJMPWJhY2t1cAorCW1vdncJJDB4Y2UwYSwgJWF4CisJY2FsbAl0c3RpZHgKKwlvcmIJJWFsLCAlYWwKKwlqbmUJYzJmYWlsCisJCisJbW92dwkkMHhlYzBhLCAlYXgKKwljYWxsCXRzdGlkeAorCWNtcGIJJDB4MDEsICVhbAorCWpuZQljMmZhaWwKKwkKKwltb3ZiCSQweGFhLCAlYWwKKwljYWxsCWluaWR4CQkjIDRYLCA1WCwgN1ggYW5kIDhYIGFyZSB2YWxpZCA2NFhYIGNoaXAgSUQncy4gCisJc2hyYgkkNCwgJWFsCisJc3ViYgkkNCwgJWFsCisJanoJYzZkb25lCisJCisJZGVjYgklYWwKKwlqegljNmRvbmUKKwkKKwlzdWJiCSQyLCAlYWwKKwlqegljNmRvbmUKKwkKKwlkZWNiCSVhbAorCWp6CWM2ZG9uZQorCQorYzJmYWlsOgl4b3J3CSVicCwgJWJwCitjNmRvbmU6CW1vdmIJJDB4MGEsICVhbAorCW1vdmIJJWJsLCAlYWgKKwlvdXR3CSVheCwgJWR4CisJcmV0CisKK2NpcnJ1czZfbWQ6CisJLmJ5dGUJMAorCS5hc2NpaQkiQ2lycnVzIExvZ2ljIDY0WFgiCisJLmJ5dGUJMAorCisjIEV2ZXJleCAvIFRyaWRlbnQKK2V2ZXJleF90ZXN0OgorCW1vdncJJDB4NzAwMCwgJWF4CisJeG9ydwklYngsICVieAorCWludAkkMHgxMAorCWNtcGIJJDB4NzAsICVhbAorCWpuZQlub2V2cngKKwkKKwlzaHJ3CSQ0LCAlZHgKKwljbXB3CSQweDY3OCwgJWR4CisJamUJZXZ0cmlkCisJCisJY21wdwkkMHgyMzYsICVkeAorCWpuZQlldnJ4b2sKKworZXZ0cmlkOglsZWF3CXRyaWRlbnRfbWQsICVicAorZXZyeG9rOglyZXQKKworbm9ldnJ4Ogl4b3J3CSVicCwgJWJwCisJcmV0CisKK2V2ZXJleF9tZDoKKwkuYnl0ZQkweDAzLCAweDIyLCAweDUwCisJLmJ5dGUJMHgwNCwgMHgzYywgMHg1MAorCS5ieXRlCTB4MDcsIDB4MmIsIDB4NjQKKwkuYnl0ZQkweDA4LCAweDRiLCAweDY0CisJLmJ5dGUJMHgwYSwgMHgxOSwgMHg4NAorCS5ieXRlCTB4MGIsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDE2LCAweDFlLCAweDUwCisJLmJ5dGUJMHgxOCwgMHgxYiwgMHg2NAorCS5ieXRlCTB4MjEsIDB4NDAsIDB4YTAKKwkuYnl0ZQkweDQwLCAweDFlLCAweDg0CisJLmJ5dGUJMAorCS5hc2NpaQkiRXZlcmV4L1RyaWRlbnQiCisJLmJ5dGUJMAorCisjIEdlbm9hLgorZ2Vub2FfdGVzdDoKKwlsZWF3CWlkZ2Vub2EsICVzaQkJCSMgQ2hlY2sgR2Vub2EgJ2NsdWVzJworCXhvcncJJWF4LCAlYXgKKwltb3ZiCSVlczooMHgzNyksICVhbAorCW1vdncJJWF4LCAlZGkKKwltb3Z3CSQweDA0LCAlY3gKKwlkZWN3CSVzaQorCWRlY3cJJWRpCitsMToJaW5jdwklc2kKKwlpbmN3CSVkaQorCW1vdmIJKCVzaSksICVhbAorCXRlc3RiCSVhbCwgJWFsCisJanoJbDIKKworCWNtcGIJJWVzOiglZGkpLCAlYWwKK2wyOglsb29wZSAJbDEKKwlvcncJJWN4LCAlY3gKKwlqZQlpc2dlbgorCQorCXhvcncJJWJwLCAlYnAKK2lzZ2VuOglyZXQKKworaWRnZW5vYTogLmJ5dGUJMHg3NywgMHgwMCwgMHg5OSwgMHg2NgorCitnZW5vYV9tZDoKKwkuYnl0ZQkweDU4LCAweDIwLCAweDUwCisJLmJ5dGUJMHg1YSwgMHgyYSwgMHg2NAorCS5ieXRlCTB4NjAsIDB4MTksIDB4ODQKKwkuYnl0ZQkweDYxLCAweDFkLCAweDg0CisJLmJ5dGUJMHg2MiwgMHgyMCwgMHg4NAorCS5ieXRlCTB4NjMsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDY0LCAweDNjLCAweDg0CisJLmJ5dGUJMHg2YiwgMHg0ZiwgMHg2NAorCS5ieXRlCTB4NzIsIDB4M2MsIDB4NTAKKwkuYnl0ZQkweDc0LCAweDQyLCAweDUwCisJLmJ5dGUJMHg3OCwgMHg0YiwgMHg2NAorCS5ieXRlCTAKKwkuYXNjaWkJIkdlbm9hIgorCS5ieXRlCTAKKworIyBPQUsKK29ha190ZXN0OgorCWxlYXcJaWRvYWt2Z2EsICVzaQorCW1vdncJJDB4MDgsICVkaQorCW1vdncJJDB4MDgsICVjeAorCXJlcGUKKwljbXBzYgorCWplCWlzb2FrCisJCisJeG9ydwklYnAsICVicAoraXNvYWs6CXJldAorCitpZG9ha3ZnYTogLmFzY2lpICAiT0FLIFZHQSAiCisKK29ha19tZDogLmJ5dGUJMHg0ZSwgMHgzYywgMHg1MAorCS5ieXRlCTB4NGYsIDB4M2MsIDB4ODQKKwkuYnl0ZQkweDUwLCAweDE5LCAweDg0CisJLmJ5dGUJMHg1MSwgMHgyYiwgMHg4NAorCS5ieXRlCTAKKwkuYXNjaWkJIk9BSyIKKwkuYnl0ZQkwCisKKyMgV0QgUGFyYWRpc2UuCitwYXJhZGlzZV90ZXN0OgorCWxlYXcJaWRwYXJhZGlzZSwgJXNpCisJbW92dwkkMHg3ZCwgJWRpCisJbW92dwkkMHgwNCwgJWN4CisJcmVwZQorCWNtcHNiCisJamUJaXNwYXJhCisJCisJeG9ydwklYnAsICVicAoraXNwYXJhOglyZXQKKworaWRwYXJhZGlzZToJLmFzY2lpCSJWR0E9IgorCitwYXJhZGlzZV9tZDoKKwkuYnl0ZQkweDQxLCAweDIyLCAweDUwCisJLmJ5dGUJMHg0NywgMHgxYywgMHg4NAorCS5ieXRlCTB4NTUsIDB4MTksIDB4ODQKKwkuYnl0ZQkweDU0LCAweDJjLCAweDg0CisJLmJ5dGUJMAorCS5hc2NpaQkiUGFyYWRpc2UiCisJLmJ5dGUJMAorCisjIFRyaWRlbnQuCit0cmlkZW50X3Rlc3Q6CisJbW92dwkkMHgzYzQsICVkeAorCW1vdmIJJDB4MGUsICVhbAorCW91dGIJJWFsLCAlZHgKKwlpbmN3CSVkeAorCWluYgklZHgsICVhbAorCXhjaGdiCSVhbCwgJWFoCisJeG9yYgklYWwsICVhbAorCW91dGIJJWFsLCAlZHgKKwlpbmIJJWR4LCAlYWwKKwl4Y2hnYgklYWgsICVhbAorCW1vdmIJJWFsLCAlYmwJIyBTdHJhbmdlIHRoaW5nIC4uLiBpbiB0aGUgYm9vayB0aGlzIHdhc24ndAorCWFuZGIJJDB4MDIsICVibAkjIG5lY2Vzc2FyeSBidXQgaXQgd29ya2VkIG9uIG15IGNhcmQgd2hpY2gKKwlqeglzZXRiMgkJIyBpcyBhIHRyaWRlbnQuIFdpdGhvdXQgaXQgdGhlIHNjcmVlbiBnb2VzCisJCQkJIyBibHVycmVkIC4uLgorCWFuZGIJJDB4ZmQsICVhbAorCWptcAljbHJiMgkJCisKK3NldGIyOglvcmIJJDB4MDIsICVhbAkKK2NscmIyOglvdXRiCSVhbCwgJWR4CisJYW5kYgkkMHgwZiwgJWFoCisJY21wYgkkMHgwMiwgJWFoCisJamUJaXN0cmlkCisKKwl4b3J3CSVicCwgJWJwCitpc3RyaWQ6CXJldAorCit0cmlkZW50X21kOgorCS5ieXRlCTB4NTAsIDB4MWUsIDB4NTAKKwkuYnl0ZQkweDUxLCAweDJiLCAweDUwCisJLmJ5dGUJMHg1MiwgMHgzYywgMHg1MAorCS5ieXRlCTB4NTcsIDB4MTksIDB4ODQKKwkuYnl0ZQkweDU4LCAweDFlLCAweDg0CisJLmJ5dGUJMHg1OSwgMHgyYiwgMHg4NAorCS5ieXRlCTB4NWEsIDB4M2MsIDB4ODQKKwkuYnl0ZQkwCisJLmFzY2lpCSJUcmlkZW50IgorCS5ieXRlCTAKKworIyBUc2VuZy4KK3RzZW5nX3Rlc3Q6CisJbW92dwkkMHgzY2QsICVkeAorCWluYgklZHgsICVhbAkjIENvdWxkIHRoaW5ncyBiZSB0aGlzIHNpbXBsZSAhIDotKQorCW1vdmIJJWFsLCAlYmwKKwltb3ZiCSQweDU1LCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJaW5iCSVkeCwgJWFsCisJbW92YgklYWwsICVhaAorCW1vdmIJJWJsLCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJY21wYgkkMHg1NSwgJWFoCisgCWplCWlzdHNlbgorCitpc25vdDoJeG9ydwklYnAsICVicAoraXN0c2VuOglyZXQKKwordHNlbmdfbWQ6CisJLmJ5dGUJMHgyNiwgMHgzYywgMHg1MAorCS5ieXRlCTB4MmEsIDB4MjgsIDB4NjQKKwkuYnl0ZQkweDIzLCAweDE5LCAweDg0CisJLmJ5dGUJMHgyNCwgMHgxYywgMHg4NAorCS5ieXRlCTB4MjIsIDB4MmMsIDB4ODQKKwkuYnl0ZQkweDIxLCAweDNjLCAweDg0CisJLmJ5dGUJMAorCS5hc2NpaQkiVHNlbmciCisJLmJ5dGUJMAorCisjIFZpZGVvNy4KK3ZpZGVvN190ZXN0OgorCW1vdncJJDB4M2NjLCAlZHgKKwlpbmIJJWR4LCAlYWwKKwltb3Z3CSQweDNiNCwgJWR4CisJYW5kYgkkMHgwMSwgJWFsCisJanoJZXZlbjcKKworCW1vdncJJDB4M2Q0LCAlZHgKK2V2ZW43Ogltb3ZiCSQweDBjLCAlYWwKKwlvdXRiCSVhbCwgJWR4CisJaW5jdwklZHgKKwlpbmIJJWR4LCAlYWwKKwltb3ZiCSVhbCwgJWJsCisJbW92YgkkMHg1NSwgJWFsCisJb3V0YgklYWwsICVkeAorCWluYgklZHgsICVhbAorCWRlY3cJJWR4CisJbW92YgkkMHgxZiwgJWFsCisJb3V0YgklYWwsICVkeAorCWluY3cJJWR4CisJaW5iCSVkeCwgJWFsCisJbW92YgklYWwsICViaAorCWRlY3cJJWR4CisJbW92YgkkMHgwYywgJWFsCisJb3V0YgklYWwsICVkeAorCWluY3cJJWR4CisJbW92YgklYmwsICVhbAorCW91dGIJJWFsLCAlZHgKKwltb3ZiCSQweDU1LCAlYWwKKwl4b3JiCSQweGVhLCAlYWwKKwljbXBiCSViaCwgJWFsCisJam5lCWlzbm90CisJCisJbW92YgkkVklERU9fRklSU1RfVjc+PjgsIHN2Z2FfcHJlZml4ICMgVXNlIHNwZWNpYWwgbW9kZSBzd2l0Y2hpbmcKKwlyZXQKKwordmlkZW83X21kOgorCS5ieXRlCTB4NDAsIDB4MmIsIDB4NTAKKwkuYnl0ZQkweDQzLCAweDNjLCAweDUwCisJLmJ5dGUJMHg0NCwgMHgzYywgMHg2NAorCS5ieXRlCTB4NDEsIDB4MTksIDB4ODQKKwkuYnl0ZQkweDQyLCAweDJjLCAweDg0CisJLmJ5dGUJMHg0NSwgMHgxYywgMHg4NAorCS5ieXRlCTAKKwkuYXNjaWkJIlZpZGVvIDciCisJLmJ5dGUJMAorCisjIFJlYWx0ZWsgVkdBCityZWFsdGVrX3Rlc3Q6CisJbGVhdwlpZHJ0dmdhLCAlc2kKKwltb3Z3CSQweDQ1LCAlZGkKKwltb3Z3CSQweDBiLCAlY3gKKwlyZXBlCisJY21wc2IKKwlqZQlpc3J0CisJCisJeG9ydwklYnAsICVicAoraXNydDoJcmV0CisKK2lkcnR2Z2E6CS5hc2NpaQkiUkVBTFRFSyBWR0EiCisKK3JlYWx0ZWtfbWQ6CisJLmJ5dGUJMHgxYSwgMHgzYywgMHg1MAorCS5ieXRlCTB4MWIsIDB4MTksIDB4ODQKKwkuYnl0ZQkweDFjLCAweDFlLCAweDg0CisJLmJ5dGUJMHgxZCwgMHgyYiwgMHg4NAorCS5ieXRlCTB4MWUsIDB4M2MsIDB4ODQKKwkuYnl0ZQkwCisJLmFzY2lpCSJSRUFMVEVLIgorCS5ieXRlCTAKKworI2VuZGlmCS8qIENPTkZJR19WSURFT19TVkdBICovCisKKyMgVXNlci1kZWZpbmVkIGxvY2FsIG1vZGUgdGFibGUgKFZHQSBvbmx5KQorI2lmZGVmIENPTkZJR19WSURFT19MT0NBTAorbG9jYWxfbW9kZXM6CisJbGVhdwlsb2NhbF9tb2RlX3RhYmxlLCAlc2kKK2xvY20xOglsb2RzdworCW9ydwklYXgsICVheAorCWp6CWxvY20yCisJCisJc3Rvc3cKKwltb3ZzdworCWptcAlsb2NtMQorCitsb2NtMjoJcmV0CisKKyMgVGhpcyBpcyB0aGUgdGFibGUgb2YgbG9jYWwgdmlkZW8gbW9kZXMgd2hpY2ggY2FuIGJlIHN1cHBsaWVkIG1hbnVhbGx5CisjIGJ5IHRoZSB1c2VyLiBFYWNoIGVudHJ5IGNvbnNpc3RzIG9mIG1vZGUgSUQgKHdvcmQpIGFuZCBkaW1lbnNpb25zCisjIChieXRlIGZvciBjb2x1bW4gY291bnQgYW5kIGFub3RoZXIgYnl0ZSBmb3Igcm93IGNvdW50KS4gVGhlc2UgbW9kZXMKKyMgYXJlIHBsYWNlZCBiZWZvcmUgYWxsIFNWR0EgYW5kIFZFU0EgbW9kZXMgYW5kIG92ZXJyaWRlIHRoZW0gaWYgdGFibGUKKyMgY29tcGFjdGluZyBpcyBlbmFibGVkLiBUaGUgdGFibGUgbXVzdCBlbmQgd2l0aCBhIHplcm8gd29yZCBmb2xsb3dlZAorIyBieSBOVUwtdGVybWluYXRlZCB2aWRlbyBhZGFwdGVyIG5hbWUuCitsb2NhbF9tb2RlX3RhYmxlOgorCS53b3JkCTB4MDEwMAkJCQkjIEV4YW1wbGU6IDQweDI1CisJLmJ5dGUJMjUsNDAKKwkud29yZAkwCisJLmFzY2lpCSJMb2NhbCIKKwkuYnl0ZQkwCisjZW5kaWYJLyogQ09ORklHX1ZJREVPX0xPQ0FMICovCisKKyMgUmVhZCBhIGtleSBhbmQgcmV0dXJuIHRoZSBBU0NJSSBjb2RlIGluIGFsLCBzY2FuIGNvZGUgaW4gYWgKK2dldGtleToJeG9yYgklYWgsICVhaAorCWludAkkMHgxNgorCXJldAorCisjIFJlYWQgYSBrZXkgd2l0aCBhIHRpbWVvdXQgb2YgMzAgc2Vjb25kcy4KKyMgVGhlIGhhcmR3YXJlIGNsb2NrIGlzIHVzZWQgdG8gZ2V0IHRoZSB0aW1lLgorZ2V0a3Q6CWNhbGwJZ2V0dGltZQorCWFkZGIJJDMwLCAlYWwJCQkjIFdhaXQgMzAgc2Vjb25kcworCWNtcGIJJDYwLCAlYWwKKwlqbAlsbWludXRlCisKKwlzdWJiCSQ2MCwgJWFsCitsbWludXRlOgorCW1vdmIJJWFsLCAlY2wKK2FnYWluOgltb3ZiCSQweDAxLCAlYWgKKwlpbnQJJDB4MTYKKwlqbnoJZ2V0a2V5CQkJCSMga2V5IHByZXNzZWQsIHNvIGdldCBpdAorCisJY2FsbAlnZXR0aW1lCisJY21wYgklY2wsICVhbAorCWpuZQlhZ2FpbgorCisJbW92YgkkMHgyMCwgJWFsCQkJIyB0aW1lb3V0LCByZXR1cm4gYHNwYWNlJworCXJldAorCisjIEZsdXNoIHRoZSBrZXlib2FyZCBidWZmZXIKK2ZsdXNoOgltb3ZiCSQweDAxLCAlYWgKKwlpbnQJJDB4MTYKKwlqegllbXB0eQorCQorCXhvcmIJJWFoLCAlYWgKKwlpbnQJJDB4MTYKKwlqbXAJZmx1c2gKKworZW1wdHk6CXJldAorCisjIFByaW50IGhleGFkZWNpbWFsIG51bWJlci4KK3BydGh3OglwdXNodwklYXgKKwltb3ZiCSVhaCwgJWFsCisJY2FsbAlwcnRoYgorCXBvcHcJJWF4CitwcnRoYjoJcHVzaHcJJWF4CisJc2hyYgkkNCwgJWFsCisJY2FsbAlwcnRobgorCXBvcHcJJWF4CisJYW5kYgkkMHgwZiwgJWFsCitwcnRobjoJY21wYgkkMHgwYSwgJWFsCisJamMJcHJ0aDEKKworCWFkZGIJJDB4MDcsICVhbAorcHJ0aDE6CWFkZGIJJDB4MzAsICVhbAorCWptcAlwcnRjaHIKKworIyBQcmludCBkZWNpbWFsIG51bWJlciBpbiBhbAorcHJ0ZGVjOglwdXNodwklYXgKKwlwdXNodwklY3gKKwl4b3JiCSVhaCwgJWFoCisJbW92YgkkMHgwYSwgJWNsCisJaWRpdmIJJWNsCisJY21wYgkkMHgwOSwgJWFsCisJamJlCWx0MTAwCisKKwljYWxsCXBydGRlYworCWptcAlza2lwMTAKKworbHQxMDA6CWFkZGIJJDB4MzAsICVhbAorCWNhbGwJcHJ0Y2hyCitza2lwMTA6CW1vdmIJJWFoLCAlYWwKKwlhZGRiCSQweDMwLCAlYWwKKwljYWxsCXBydGNocgkKKwlwb3B3CSVjeAorCXBvcHcJJWF4CisJcmV0CisKK3N0b3JlX2VkaWQ6CisJcHVzaHcJJWVzCQkJCSMganVzdCBzYXZlIGFsbCByZWdpc3RlcnMgCisJcHVzaHcJJWF4CQkJCQorCXB1c2h3CSVieAorCXB1c2h3ICAgJWN4CisJcHVzaHcJJWR4CisJcHVzaHcgICAlZGkKKworCXB1c2h3CSVmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJcG9wdyAgICAlZXMKKworCW1vdmwJJDB4MTMxMzEzMTMsICVlYXgJCSMgbWVtc2V0IGJsb2NrIHdpdGggMHgxMworCW1vdncgICAgJDMyLCAlY3gKKwltb3Z3CSQweDE0MCwgJWRpCisJY2xkCisJcmVwIAorCXN0b3NsICAKKworCW1vdncJJDB4NGYxNSwgJWF4ICAgICAgICAgICAgICAgICAgICAjIGRvIFZCRS9EREMgCisJbW92dwkkMHgwMSwgJWJ4CisJbW92dwkkMHgwMCwgJWN4CisJbW92dyAgICAkMHgwMSwgJWR4CisJbW92dwkkMHgxNDAsICVkaQorCWludAkkMHgxMAkKKworCXBvcHcJJWRpCQkJCSMgcmVzdG9yZSBhbGwgcmVnaXN0ZXJzICAgICAgICAKKwlwb3B3CSVkeAorCXBvcHcJJWN4CisJcG9wdwklYngKKwlwb3B3CSVheAorCXBvcHcJJWVzCQorCXJldAorCisjIFZJREVPX1NFTEVDVC1vbmx5IHZhcmlhYmxlcworbXRfZW5kOgkJLndvcmQJMAkjIEVuZCBvZiB2aWRlbyBtb2RlIHRhYmxlIGlmIGJ1aWx0CitlZGl0X2J1ZjoJLnNwYWNlCTYJIyBMaW5lIGVkaXRvciBidWZmZXIKK2NhcmRfbmFtZToJLndvcmQJMAkjIFBvaW50ZXIgdG8gYWRhcHRlciBuYW1lCitzY2FubmluZzoJLmJ5dGUJMAkjIFBlcmZvcm1pbmcgbW9kZSBzY2FuCitkb19yZXN0b3JlOgkuYnl0ZQkwCSMgU2NyZWVuIGNvbnRlbnRzIGFsdGVyZWQgZHVyaW5nIG1vZGUgY2hhbmdlCitzdmdhX3ByZWZpeDoJLmJ5dGUJVklERU9fRklSU1RfQklPUz4+OAkjIERlZmF1bHQgcHJlZml4IGZvciBCSU9TIG1vZGVzCitncmFwaGljX21vZGU6CS5ieXRlCTAJIyBHcmFwaGljIG1vZGUgd2l0aCBhIGxpbmVhciBmcmFtZSBidWZmZXIKK2RhY19zaXplOgkuYnl0ZQk2CSMgREFDIGJpdCBkZXB0aAorCisjIFN0YXR1cyBtZXNzYWdlcwora2V5bXNnOgkJLmFzY2lpCSJQcmVzcyA8UkVUVVJOPiB0byBzZWUgdmlkZW8gbW9kZXMgYXZhaWxhYmxlLCAiCisJCS5hc2NpaQkiPFNQQUNFPiB0byBjb250aW51ZSBvciB3YWl0IDMwIHNlY3MiCisJCS5ieXRlCTB4MGQsIDB4MGEsIDAKKworbGlzdGhkcjoJLmJ5dGUJMHgwZCwgMHgwYQorCQkuYXNjaWkJIk1vZGU6ICAgIENPTFN4Uk9XUzoiCisKK2NybGZ0OgkJLmJ5dGUJMHgwZCwgMHgwYSwgMAorCitwcm9tcHQ6CQkuYnl0ZQkweDBkLCAweDBhCisJCS5hc2NpegkiRW50ZXIgbW9kZSBudW1iZXIgb3IgYHNjYW4nOiAiCisKK3Vua250OgkJLmFzY2l6CSJVbmtub3duIG1vZGUgSUQuIFRyeSBhZ2Fpbi4iCisKK2JhZG1kdDoJCS5hc2NpaQkiWW91IHBhc3NlZCBhbiB1bmRlZmluZWQgbW9kZSBudW1iZXIuIgorCQkuYnl0ZQkweDBkLCAweDBhLCAwCisKK3Zlc2FlcjoJCS5hc2NpaQkiRXJyb3I6IFNjYW5uaW5nIG9mIFZFU0EgbW9kZXMgZmFpbGVkLiBQbGVhc2UgIgorCQkuYXNjaWkJInJlcG9ydCB0byA8bWpAdWN3LmN6Pi4iCisJCS5ieXRlCTB4MGQsIDB4MGEsIDAKKworb2xkX25hbWU6CS5hc2NpegkiQ0dBL01EQS9IR0EiCisKK2VnYV9uYW1lOgkuYXNjaXoJIkVHQSIKKworc3ZnYV9uYW1lOgkuYXNjaWkJIiAiCisKK3ZnYV9uYW1lOgkuYXNjaXoJIlZHQSIKKwordmVzYV9uYW1lOgkuYXNjaXoJIlZFU0EiCisKK25hbWVfYmFubjoJLmFzY2l6CSJWaWRlbyBhZGFwdGVyOiAiCisjZW5kaWYgLyogQ09ORklHX1ZJREVPX1NFTEVDVCAqLworCisjIE90aGVyIHZhcmlhYmxlczoKK2FkYXB0ZXI6CS5ieXRlCTAJIyBWaWRlbyBhZGFwdGVyOiAwPUNHQS9NREEvSEdBLDE9RUdBLDI9VkdBCit2aWRlb19zZWdtZW50Ogkud29yZAkweGI4MDAJIyBWaWRlbyBtZW1vcnkgc2VnbWVudAorZm9yY2Vfc2l6ZToJLndvcmQJMAkjIFVzZSB0aGlzIHNpemUgaW5zdGVhZCBvZiB0aGUgb25lIGluIEJJT1MgdmFycwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2NyeXB0by9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9jcnlwdG8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzYzM1MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9jcnlwdG8vTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjIAorIyBpMzg2L2NyeXB0by9NYWtlZmlsZSAKKyMgCisjIEFyY2gtc3BlY2lmaWMgQ3J5cHRvQVBJIG1vZHVsZXMuCisjIAorCitvYmotJChDT05GSUdfQ1JZUFRPX0FFU181ODYpICs9IGFlcy1pNTg2Lm8KKworYWVzLWk1ODYteSA6PSBhZXMtaTU4Ni1hc20ubyBhZXMubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2NyeXB0by9hZXMtaTU4Ni1hc20uUyBiL2FyY2gvaTM4Ni9jcnlwdG8vYWVzLWk1ODYtYXNtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3M2M2NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9jcnlwdG8vYWVzLWk1ODYtYXNtLlMKQEAgLTAsMCArMSwzNzYgQEAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvcHlyaWdodCAoYykgMjAwMSwgRHIgQnJpYW4gR2xhZG1hbiA8ICAgICAgICAgICAgICAgICA+LCBXb3JjZXN0ZXIsIFVLLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vCisvLyBMSUNFTlNFIFRFUk1TCisvLworLy8gVGhlIGZyZWUgZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBib3RoIHNvdXJjZSBhbmQgYmluYXJ5IAorLy8gZm9ybSBpcyBhbGxvd2VkICh3aXRoIG9yIHdpdGhvdXQgY2hhbmdlcykgcHJvdmlkZWQgdGhhdDoKKy8vCisvLyAgIDEuIGRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCisvLyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci8vCisvLworLy8gICAyLiBkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vICAgICAgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIGFzc29jaWF0ZWQgbWF0ZXJpYWxzLy8KKy8vCisvLyAgIDMuIHRoZSBjb3B5cmlnaHQgaG9sZGVyJ3MgbmFtZSBpcyBub3QgdXNlZCB0byBlbmRvcnNlIHByb2R1Y3RzIAorLy8gICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vCisvLyBBTFRFUk5BVElWRUxZLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHJldGFpbmVkIGluIGZ1bGwsIHRoaXMgcHJvZHVjdAorLy8gbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksCisvLyBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXBwbHkgSU5TVEVBRCBPRiB0aG9zZSBnaXZlbiBhYm92ZS4KKy8vCisvLyBDb3B5cmlnaHQgKGMpIDIwMDQgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorLy8gQ29weXJpZ2h0IChjKSAyMDA0IFJlZCBIYXQsIEluYy4sIEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgorCisvLyBESVNDTEFJTUVSCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMgaXMnIHdpdGggbm8gZXhwbGljaXQgb3IgaW1wbGllZCB3YXJyYW50aWVzCisvLyBpbiByZXNwZWN0IG9mIGl0cyBwcm9wZXJ0aWVzIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcyAKKy8vIGFuZCBmaXRuZXNzIGZvciBwdXJwb3NlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSXNzdWUgRGF0ZTogMjkvMDcvMjAwMgorCisuZmlsZSAiYWVzLWk1ODYtYXNtLlMiCisudGV4dAorCisvLyBhZXNfcnZhbCBhZXNfZW5jX2Jsayhjb25zdCB1bnNpZ25lZCBjaGFyIGluX2Jsa1tdLCB1bnNpZ25lZCBjaGFyIG91dF9ibGtbXSwgY29uc3QgYWVzX2N0eCBjeFsxXSkvLworLy8gYWVzX3J2YWwgYWVzX2RlY19ibGsoY29uc3QgdW5zaWduZWQgY2hhciBpbl9ibGtbXSwgdW5zaWduZWQgY2hhciBvdXRfYmxrW10sIGNvbnN0IGFlc19jdHggY3hbMV0pLy8KKwkKKyNkZWZpbmUgdGxlbiAxMDI0ICAgLy8gbGVuZ3RoIG9mIGVhY2ggb2YgNCAneG9yJyBhcnJheXMgKDI1NiAzMi1iaXQgd29yZHMpCisKKy8vIG9mZnNldHMgdG8gcGFyYW1ldGVycyB3aXRoIG9uZSByZWdpc3RlciBwdXNoZWQgb250byBzdGFjaworCisjZGVmaW5lIGluX2JsayAgICA4ICAvLyBpbnB1dCBieXRlIGFycmF5IGFkZHJlc3MgcGFyYW1ldGVyCisjZGVmaW5lIG91dF9ibGsgIDEyICAvLyBvdXRwdXQgYnl0ZSBhcnJheSBhZGRyZXNzIHBhcmFtZXRlcgorI2RlZmluZSBjdHggICAgICAxNiAgLy8gQUVTIGNvbnRleHQgc3RydWN0dXJlCisKKy8vIG9mZnNldHMgaW4gY29udGV4dCBzdHJ1Y3R1cmUKKworI2RlZmluZSBla2V5ICAgICAwICAgLy8gZW5jcnlwdGlvbiBrZXkgc2NoZWR1bGUgYmFzZSBhZGRyZXNzCisjZGVmaW5lIG5ybmQgICAyNTYgICAvLyBudW1iZXIgb2Ygcm91bmRzCisjZGVmaW5lIGRrZXkgICAyNjAgICAvLyBkZWNyeXB0aW9uIGtleSBzY2hlZHVsZSBiYXNlIGFkZHJlc3MKKworLy8gcmVnaXN0ZXIgbWFwcGluZyBmb3IgZW5jcnlwdCBhbmQgZGVjcnlwdCBzdWJyb3V0aW5lcworCisjZGVmaW5lIHIwICBlYXgKKyNkZWZpbmUgcjEgIGVieAorI2RlZmluZSByMiAgZWN4CisjZGVmaW5lIHIzICBlZHgKKyNkZWZpbmUgcjQgIGVzaQorI2RlZmluZSByNSAgZWRpCisKKyNkZWZpbmUgZWF4bCAgYWwKKyNkZWZpbmUgZWF4aCAgYWgKKyNkZWZpbmUgZWJ4bCAgYmwKKyNkZWZpbmUgZWJ4aCAgYmgKKyNkZWZpbmUgZWN4bCAgY2wKKyNkZWZpbmUgZWN4aCAgY2gKKyNkZWZpbmUgZWR4bCAgZGwKKyNkZWZpbmUgZWR4aCAgZGgKKworI2RlZmluZSBfaChyZWcpIHJlZyMjaAorI2RlZmluZSBoKHJlZykgX2gocmVnKQorCisjZGVmaW5lIF9sKHJlZykgcmVnIyNsCisjZGVmaW5lIGwocmVnKSBfbChyZWcpCisKKy8vIFRoaXMgbWFjcm8gdGFrZXMgYSAzMi1iaXQgd29yZCByZXByZXNlbnRpbmcgYSBjb2x1bW4gYW5kIHVzZXMKKy8vIGVhY2ggb2YgaXRzIGZvdXIgYnl0ZXMgdG8gaW5kZXggaW50byBmb3VyIHRhYmxlcyBvZiAyNTYgMzItYml0CisvLyB3b3JkcyB0byBvYnRhaW4gdmFsdWVzIHRoYXQgYXJlIHRoZW4geG9yZWQgaW50byB0aGUgYXBwcm9wcmlhdGUKKy8vIG91dHB1dCByZWdpc3RlcnMgcjAsIHIxLCByNCBvciByNS4gIAorCisvLyBQYXJhbWV0ZXJzOgorLy8gdGFibGUgdGFibGUgYmFzZSBhZGRyZXNzCisvLyAgICUxICBvdXRfc3RhdGVbMF0KKy8vICAgJTIgIG91dF9zdGF0ZVsxXQorLy8gICAlMyAgb3V0X3N0YXRlWzJdCisvLyAgICU0ICBvdXRfc3RhdGVbM10KKy8vICAgaWR4IGlucHV0IHJlZ2lzdGVyIGZvciB0aGUgcm91bmQgKGRlc3Ryb3llZCkKKy8vICAgdG1wIHNjcmF0Y2ggcmVnaXN0ZXIgZm9yIHRoZSByb3VuZAorLy8gc2NoZWQga2V5IHNjaGVkdWxlCisKKyNkZWZpbmUgZG9fY29sKHRhYmxlLCBhMSxhMixhMyxhNCwgaWR4LCB0bXApCVwKKwltb3Z6eCAgICVsKGlkeCksJXRtcDsJCQlcCisJeG9yICAgICB0YWJsZSgsJXRtcCw0KSwlYTE7CQlcCisJbW92enggICAlaChpZHgpLCV0bXA7CQkJXAorCXNociAgICAgJDE2LCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrdGxlbigsJXRtcCw0KSwlYTI7CVwKKwltb3Z6eCAgICVsKGlkeCksJXRtcDsJCQlcCisJbW92enggICAlaChpZHgpLCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrMip0bGVuKCwldG1wLDQpLCVhMzsJXAorCXhvciAgICAgdGFibGUrMyp0bGVuKCwlaWR4LDQpLCVhNDsKKworLy8gaW5pdGlhbGlzZSBvdXRwdXQgcmVnaXN0ZXJzIGZyb20gdGhlIGtleSBzY2hlZHVsZQorLy8gTkIxOiBvcmlnaW5hbCB2YWx1ZSBvZiBhMyBpcyBpbiBpZHggb24gZXhpdAorLy8gTkIyOiBvcmlnaW5hbCB2YWx1ZXMgb2YgYTEsYTIsYTQgYXJlbid0IHVzZWQKKyNkZWZpbmUgZG9fZmNvbCh0YWJsZSwgYTEsYTIsYTMsYTQsIGlkeCwgdG1wLCBzY2hlZCkgXAorCW1vdiAgICAgMCBzY2hlZCwlYTE7CQkJXAorCW1vdnp4ICAgJWwoaWR4KSwldG1wOwkJCVwKKwltb3YgICAgIDEyIHNjaGVkLCVhMjsJCQlcCisJeG9yICAgICB0YWJsZSgsJXRtcCw0KSwlYTE7CQlcCisJbW92ICAgICA0IHNjaGVkLCVhNDsJCQlcCisJbW92enggICAlaChpZHgpLCV0bXA7CQkJXAorCXNociAgICAgJDE2LCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrdGxlbigsJXRtcCw0KSwlYTI7CVwKKwltb3Z6eCAgICVsKGlkeCksJXRtcDsJCQlcCisJbW92enggICAlaChpZHgpLCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrMyp0bGVuKCwlaWR4LDQpLCVhNDsJXAorCW1vdiAgICAgJWEzLCVpZHg7CQkJXAorCW1vdiAgICAgOCBzY2hlZCwlYTM7CQkJXAorCXhvciAgICAgdGFibGUrMip0bGVuKCwldG1wLDQpLCVhMzsKKworLy8gaW5pdGlhbGlzZSBvdXRwdXQgcmVnaXN0ZXJzIGZyb20gdGhlIGtleSBzY2hlZHVsZQorLy8gTkIxOiBvcmlnaW5hbCB2YWx1ZSBvZiBhMyBpcyBpbiBpZHggb24gZXhpdAorLy8gTkIyOiBvcmlnaW5hbCB2YWx1ZXMgb2YgYTEsYTIsYTQgYXJlbid0IHVzZWQKKyNkZWZpbmUgZG9faWNvbCh0YWJsZSwgYTEsYTIsYTMsYTQsIGlkeCwgdG1wLCBzY2hlZCkgXAorCW1vdiAgICAgMCBzY2hlZCwlYTE7CQkJXAorCW1vdnp4ICAgJWwoaWR4KSwldG1wOwkJCVwKKwltb3YgICAgIDQgc2NoZWQsJWEyOwkJCVwKKwl4b3IgICAgIHRhYmxlKCwldG1wLDQpLCVhMTsJCVwKKwltb3YgICAgIDEyIHNjaGVkLCVhNDsJCQlcCisJbW92enggICAlaChpZHgpLCV0bXA7CQkJXAorCXNociAgICAgJDE2LCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrdGxlbigsJXRtcCw0KSwlYTI7CVwKKwltb3Z6eCAgICVsKGlkeCksJXRtcDsJCQlcCisJbW92enggICAlaChpZHgpLCVpZHg7CQkJXAorCXhvciAgICAgdGFibGUrMyp0bGVuKCwlaWR4LDQpLCVhNDsJXAorCW1vdiAgICAgJWEzLCVpZHg7CQkJXAorCW1vdiAgICAgOCBzY2hlZCwlYTM7CQkJXAorCXhvciAgICAgdGFibGUrMip0bGVuKCwldG1wLDQpLCVhMzsKKworCisvLyBvcmlnaW5hbCBHbGFkbWFuIGhhZCBjb25kaXRpb25hbCBzYXZlcyB0byBNTVggcmVncy4KKyNkZWZpbmUgc2F2ZShhMSwgYTIpCQlcCisJbW92ICAgICAlYTIsNCphMSglZXNwKQorCisjZGVmaW5lIHJlc3RvcmUoYTEsIGEyKQkJXAorCW1vdiAgICAgNCphMiglZXNwKSwlYTEKKworLy8gVGhlc2UgbWFjcm9zIHBlcmZvcm0gYSBmb3J3YXJkIGVuY3J5cHRpb24gY3ljbGUuIFRoZXkgYXJlIGVudGVyZWQgd2l0aAorLy8gdGhlIGZpcnN0IHByZXZpb3VzIHJvdW5kIGNvbHVtbiB2YWx1ZXMgaW4gcjAscjEscjQscjUgYW5kCisvLyBleGl0IHdpdGggdGhlIGZpbmFsIHZhbHVlcyBpbiB0aGUgc2FtZSByZWdpc3RlcnMsIHVzaW5nIHN0YWNrCisvLyBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2UuCisKKy8vIHJvdW5kIGNvbHVtbiB2YWx1ZXMKKy8vIG9uIGVudHJ5OiByMCxyMSxyNCxyNQorLy8gb24gZXhpdDogIHIyLHIxLHI0LHI1CisjZGVmaW5lIGZ3ZF9ybmQxKGFyZywgdGFibGUpCQkJCQkJXAorCXNhdmUgICAoMCxyMSk7CQkJCQkJCVwKKwlzYXZlICAgKDEscjUpOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJLyogY29tcHV0ZSBuZXcgY29sdW1uIHZhbHVlcyAqLwkJCQkJXAorCWRvX2Zjb2wodGFibGUsIHIyLHI1LHI0LHIxLCByMCxyMywgYXJnKTsJLyogaWR4PXIwICovCVwKKwlkb19jb2wgKHRhYmxlLCByNCxyMSxyMixyNSwgcjAscjMpOwkJLyogaWR4PXI0ICovCVwKKwlyZXN0b3JlKHIwLDApOwkJCQkJCQlcCisJZG9fY29sICh0YWJsZSwgcjEscjIscjUscjQsIHIwLHIzKTsJCS8qIGlkeD1yMSAqLwlcCisJcmVzdG9yZShyMCwxKTsJCQkJCQkJXAorCWRvX2NvbCAodGFibGUsIHI1LHI0LHIxLHIyLCByMCxyMyk7CQkvKiBpZHg9cjUgKi8KKworLy8gcm91bmQgY29sdW1uIHZhbHVlcworLy8gb24gZW50cnk6IHIyLHIxLHI0LHI1CisvLyBvbiBleGl0OiAgcjAscjEscjQscjUKKyNkZWZpbmUgZndkX3JuZDIoYXJnLCB0YWJsZSkJCQkJCQlcCisJc2F2ZSAgICgwLHIxKTsJCQkJCQkJXAorCXNhdmUgICAoMSxyNSk7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkvKiBjb21wdXRlIG5ldyBjb2x1bW4gdmFsdWVzICovCQkJCQlcCisJZG9fZmNvbCh0YWJsZSwgcjAscjUscjQscjEsIHIyLHIzLCBhcmcpOwkvKiBpZHg9cjIgKi8JXAorCWRvX2NvbCAodGFibGUsIHI0LHIxLHIwLHI1LCByMixyMyk7CQkvKiBpZHg9cjQgKi8JXAorCXJlc3RvcmUocjIsMCk7CQkJCQkJCVwKKwlkb19jb2wgKHRhYmxlLCByMSxyMCxyNSxyNCwgcjIscjMpOwkJLyogaWR4PXIxICovCVwKKwlyZXN0b3JlKHIyLDEpOwkJCQkJCQlcCisJZG9fY29sICh0YWJsZSwgcjUscjQscjEscjAsIHIyLHIzKTsJCS8qIGlkeD1yNSAqLworCisvLyBUaGVzZSBtYWNyb3MgcGVyZm9ybXMgYW4gaW52ZXJzZSBlbmNyeXB0aW9uIGN5Y2xlLiBUaGV5IGFyZSBlbnRlcmVkIHdpdGgKKy8vIHRoZSBmaXJzdCBwcmV2aW91cyByb3VuZCBjb2x1bW4gdmFsdWVzIGluIHIwLHIxLHI0LHI1IGFuZAorLy8gZXhpdCB3aXRoIHRoZSBmaW5hbCB2YWx1ZXMgaW4gdGhlIHNhbWUgcmVnaXN0ZXJzLCB1c2luZyBzdGFjaworLy8gZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisKKy8vIHJvdW5kIGNvbHVtbiB2YWx1ZXMKKy8vIG9uIGVudHJ5OiByMCxyMSxyNCxyNQorLy8gb24gZXhpdDogIHIyLHIxLHI0LHI1CisjZGVmaW5lIGludl9ybmQxKGFyZywgdGFibGUpCQkJCQkJXAorCXNhdmUgICAgKDAscjEpOwkJCQkJCQlcCisJc2F2ZSAgICAoMSxyNSk7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkvKiBjb21wdXRlIG5ldyBjb2x1bW4gdmFsdWVzICovCQkJCQlcCisJZG9faWNvbCh0YWJsZSwgcjIscjEscjQscjUsIHIwLHIzLCBhcmcpOwkvKiBpZHg9cjAgKi8JXAorCWRvX2NvbCAodGFibGUsIHI0LHI1LHIyLHIxLCByMCxyMyk7CQkvKiBpZHg9cjQgKi8JXAorCXJlc3RvcmUocjAsMCk7CQkJCQkJCVwKKwlkb19jb2wgKHRhYmxlLCByMSxyNCxyNSxyMiwgcjAscjMpOwkJLyogaWR4PXIxICovCVwKKwlyZXN0b3JlKHIwLDEpOwkJCQkJCQlcCisJZG9fY29sICh0YWJsZSwgcjUscjIscjEscjQsIHIwLHIzKTsJCS8qIGlkeD1yNSAqLworCisvLyByb3VuZCBjb2x1bW4gdmFsdWVzCisvLyBvbiBlbnRyeTogcjIscjEscjQscjUKKy8vIG9uIGV4aXQ6ICByMCxyMSxyNCxyNQorI2RlZmluZSBpbnZfcm5kMihhcmcsIHRhYmxlKQkJCQkJCVwKKwlzYXZlICAgICgwLHIxKTsJCQkJCQkJXAorCXNhdmUgICAgKDEscjUpOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJLyogY29tcHV0ZSBuZXcgY29sdW1uIHZhbHVlcyAqLwkJCQkJXAorCWRvX2ljb2wodGFibGUsIHIwLHIxLHI0LHI1LCByMixyMywgYXJnKTsJLyogaWR4PXIyICovCVwKKwlkb19jb2wgKHRhYmxlLCByNCxyNSxyMCxyMSwgcjIscjMpOwkJLyogaWR4PXI0ICovCVwKKwlyZXN0b3JlKHIyLDApOwkJCQkJCQlcCisJZG9fY29sICh0YWJsZSwgcjEscjQscjUscjAsIHIyLHIzKTsJCS8qIGlkeD1yMSAqLwlcCisJcmVzdG9yZShyMiwxKTsJCQkJCQkJXAorCWRvX2NvbCAodGFibGUsIHI1LHIwLHIxLHI0LCByMixyMyk7CQkvKiBpZHg9cjUgKi8KKworLy8gQUVTIChSaWpuZGFlbCkgRW5jcnlwdGlvbiBTdWJyb3V0aW5lCisKKy5nbG9iYWwgIGFlc19lbmNfYmxrCisKKy5leHRlcm4gIGZ0X3RhYgorLmV4dGVybiAgZmxfdGFiCisKKy5hbGlnbiA0CisKK2Flc19lbmNfYmxrOgorCXB1c2ggICAgJWVicAorCW1vdiAgICAgY3R4KCVlc3ApLCVlYnAgICAgICAvLyBwb2ludGVyIHRvIGNvbnRleHQKKworLy8gQ0FVVElPTjogdGhlIG9yZGVyIGFuZCB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlc2UgYXNzaWducyAKKy8vIHJlbHkgb24gdGhlIHJlZ2lzdGVyIG1hcHBpbmdzCisKKzE6CXB1c2ggICAgJWVieAorCW1vdiAgICAgaW5fYmxrKzQoJWVzcCksJXIyCisJcHVzaCAgICAlZXNpCisJbW92ICAgICBucm5kKCVlYnApLCVyMyAgIC8vIG51bWJlciBvZiByb3VuZHMKKwlwdXNoICAgICVlZGkKKyNpZiBla2V5ICE9IDAKKwlsZWEgICAgIGVrZXkoJWVicCksJWVicCAgLy8ga2V5IHBvaW50ZXIKKyNlbmRpZgorCisvLyBpbnB1dCBmb3VyIGNvbHVtbnMgYW5kIHhvciBpbiBmaXJzdCByb3VuZCBrZXkKKworCW1vdiAgICAgKCVyMiksJXIwCisJbW92ICAgICA0KCVyMiksJXIxCisJbW92ICAgICA4KCVyMiksJXI0CisJbW92ICAgICAxMiglcjIpLCVyNQorCXhvciAgICAgKCVlYnApLCVyMAorCXhvciAgICAgNCglZWJwKSwlcjEKKwl4b3IgICAgIDgoJWVicCksJXI0CisJeG9yICAgICAxMiglZWJwKSwlcjUKKworCXN1YiAgICAgJDgsJWVzcCAgICAgICAgICAgLy8gc3BhY2UgZm9yIHJlZ2lzdGVyIHNhdmVzIG9uIHN0YWNrCisJYWRkICAgICAkMTYsJWVicCAgICAgICAgICAvLyBpbmNyZW1lbnQgdG8gbmV4dCByb3VuZCBrZXkKKwlzdWIgICAgICQxMCwlcjMgICAgICAgICAgCisJamUgICAgICA0ZiAgICAgICAgICAgICAgLy8gMTAgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWFkZCAgICAgJDMyLCVlYnAKKwlzdWIgICAgICQyLCVyMworCWplICAgICAgM2YgICAgICAgICAgICAgIC8vIDEyIHJvdW5kcyBmb3IgMTI4LWJpdCBrZXkKKwlhZGQgICAgICQzMiwlZWJwCisKKzI6CWZ3ZF9ybmQxKCAtNjQoJWVicCkgLGZ0X3RhYikJLy8gMTQgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWZ3ZF9ybmQyKCAtNDgoJWVicCkgLGZ0X3RhYikKKzM6CWZ3ZF9ybmQxKCAtMzIoJWVicCkgLGZ0X3RhYikJLy8gMTIgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWZ3ZF9ybmQyKCAtMTYoJWVicCkgLGZ0X3RhYikKKzQ6CWZ3ZF9ybmQxKCAgICAoJWVicCkgLGZ0X3RhYikJLy8gMTAgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWZ3ZF9ybmQyKCArMTYoJWVicCkgLGZ0X3RhYikKKwlmd2Rfcm5kMSggKzMyKCVlYnApICxmdF90YWIpCisJZndkX3JuZDIoICs0OCglZWJwKSAsZnRfdGFiKQorCWZ3ZF9ybmQxKCArNjQoJWVicCkgLGZ0X3RhYikKKwlmd2Rfcm5kMiggKzgwKCVlYnApICxmdF90YWIpCisJZndkX3JuZDEoICs5NiglZWJwKSAsZnRfdGFiKQorCWZ3ZF9ybmQyKCsxMTIoJWVicCkgLGZ0X3RhYikKKwlmd2Rfcm5kMSgrMTI4KCVlYnApICxmdF90YWIpCisJZndkX3JuZDIoKzE0NCglZWJwKSAsZmxfdGFiKQkvLyBsYXN0IHJvdW5kIHVzZXMgYSBkaWZmZXJlbnQgdGFibGUKKworLy8gbW92ZSBmaW5hbCB2YWx1ZXMgdG8gdGhlIG91dHB1dCBhcnJheS4gIENBVVRJT046IHRoZSAKKy8vIG9yZGVyIG9mIHRoZXNlIGFzc2lnbnMgcmVseSBvbiB0aGUgcmVnaXN0ZXIgbWFwcGluZ3MKKworCWFkZCAgICAgJDgsJWVzcAorCW1vdiAgICAgb3V0X2JsaysxMiglZXNwKSwlZWJwCisJbW92ICAgICAlcjUsMTIoJWVicCkKKwlwb3AgICAgICVlZGkKKwltb3YgICAgICVyNCw4KCVlYnApCisJcG9wICAgICAlZXNpCisJbW92ICAgICAlcjEsNCglZWJwKQorCXBvcCAgICAgJWVieAorCW1vdiAgICAgJXIwLCglZWJwKQorCXBvcCAgICAgJWVicAorCW1vdiAgICAgJDEsJWVheAorCXJldAorCisvLyBBRVMgKFJpam5kYWVsKSBEZWNyeXB0aW9uIFN1YnJvdXRpbmUKKworLmdsb2JhbCAgYWVzX2RlY19ibGsKKworLmV4dGVybiAgaXRfdGFiCisuZXh0ZXJuICBpbF90YWIKKworLmFsaWduIDQKKworYWVzX2RlY19ibGs6CisJcHVzaCAgICAlZWJwCisJbW92ICAgICBjdHgoJWVzcCksJWVicCAgICAgICAvLyBwb2ludGVyIHRvIGNvbnRleHQKKworLy8gQ0FVVElPTjogdGhlIG9yZGVyIGFuZCB0aGUgdmFsdWVzIHVzZWQgaW4gdGhlc2UgYXNzaWducyAKKy8vIHJlbHkgb24gdGhlIHJlZ2lzdGVyIG1hcHBpbmdzCisKKzE6CXB1c2ggICAgJWVieAorCW1vdiAgICAgaW5fYmxrKzQoJWVzcCksJXIyCisJcHVzaCAgICAlZXNpCisJbW92ICAgICBucm5kKCVlYnApLCVyMyAgIC8vIG51bWJlciBvZiByb3VuZHMKKwlwdXNoICAgICVlZGkKKyNpZiBka2V5ICE9IDAKKwlsZWEgICAgIGRrZXkoJWVicCksJWVicCAgLy8ga2V5IHBvaW50ZXIKKyNlbmRpZgorCW1vdiAgICAgJXIzLCVyMAorCXNobCAgICAgJDQsJXIwCisJYWRkICAgICAlcjAsJWVicAorCQorLy8gaW5wdXQgZm91ciBjb2x1bW5zIGFuZCB4b3IgaW4gZmlyc3Qgcm91bmQga2V5CisKKwltb3YgICAgICglcjIpLCVyMAorCW1vdiAgICAgNCglcjIpLCVyMQorCW1vdiAgICAgOCglcjIpLCVyNAorCW1vdiAgICAgMTIoJXIyKSwlcjUKKwl4b3IgICAgICglZWJwKSwlcjAKKwl4b3IgICAgIDQoJWVicCksJXIxCisJeG9yICAgICA4KCVlYnApLCVyNAorCXhvciAgICAgMTIoJWVicCksJXI1CisKKwlzdWIgICAgICQ4LCVlc3AgICAgICAgICAvLyBzcGFjZSBmb3IgcmVnaXN0ZXIgc2F2ZXMgb24gc3RhY2sKKwlzdWIgICAgICQxNiwlZWJwICAgICAgICAvLyBpbmNyZW1lbnQgdG8gbmV4dCByb3VuZCBrZXkKKwlzdWIgICAgICQxMCwlcjMgICAgICAgICAgCisJamUgICAgICA0ZiAgICAgICAgICAgICAgLy8gMTAgcm91bmRzIGZvciAxMjgtYml0IGtleQorCXN1YiAgICAgJDMyLCVlYnAKKwlzdWIgICAgICQyLCVyMworCWplICAgICAgM2YgICAgICAgICAgICAgIC8vIDEyIHJvdW5kcyBmb3IgMTI4LWJpdCBrZXkKKwlzdWIgICAgICQzMiwlZWJwCisKKzI6CWludl9ybmQxKCArNjQoJWVicCksIGl0X3RhYikJLy8gMTQgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWludl9ybmQyKCArNDgoJWVicCksIGl0X3RhYikKKzM6CWludl9ybmQxKCArMzIoJWVicCksIGl0X3RhYikJLy8gMTIgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWludl9ybmQyKCArMTYoJWVicCksIGl0X3RhYikKKzQ6CWludl9ybmQxKCAgICAoJWVicCksIGl0X3RhYikJLy8gMTAgcm91bmRzIGZvciAxMjgtYml0IGtleQorCWludl9ybmQyKCAtMTYoJWVicCksIGl0X3RhYikKKwlpbnZfcm5kMSggLTMyKCVlYnApLCBpdF90YWIpCisJaW52X3JuZDIoIC00OCglZWJwKSwgaXRfdGFiKQorCWludl9ybmQxKCAtNjQoJWVicCksIGl0X3RhYikKKwlpbnZfcm5kMiggLTgwKCVlYnApLCBpdF90YWIpCisJaW52X3JuZDEoIC05NiglZWJwKSwgaXRfdGFiKQorCWludl9ybmQyKC0xMTIoJWVicCksIGl0X3RhYikKKwlpbnZfcm5kMSgtMTI4KCVlYnApLCBpdF90YWIpCisJaW52X3JuZDIoLTE0NCglZWJwKSwgaWxfdGFiKQkvLyBsYXN0IHJvdW5kIHVzZXMgYSBkaWZmZXJlbnQgdGFibGUKKworLy8gbW92ZSBmaW5hbCB2YWx1ZXMgdG8gdGhlIG91dHB1dCBhcnJheS4gIENBVVRJT046IHRoZSAKKy8vIG9yZGVyIG9mIHRoZXNlIGFzc2lnbnMgcmVseSBvbiB0aGUgcmVnaXN0ZXIgbWFwcGluZ3MKKworCWFkZCAgICAgJDgsJWVzcAorCW1vdiAgICAgb3V0X2JsaysxMiglZXNwKSwlZWJwCisJbW92ICAgICAlcjUsMTIoJWVicCkKKwlwb3AgICAgICVlZGkKKwltb3YgICAgICVyNCw4KCVlYnApCisJcG9wICAgICAlZXNpCisJbW92ICAgICAlcjEsNCglZWJwKQorCXBvcCAgICAgJWVieAorCW1vdiAgICAgJXIwLCglZWJwKQorCXBvcCAgICAgJWVicAorCW1vdiAgICAgJDEsJWVheAorCXJldAorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvY3J5cHRvL2Flcy5jIGIvYXJjaC9pMzg2L2NyeXB0by9hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDE5NDMwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2NyeXB0by9hZXMuYwpAQCAtMCwwICsxLDUyMCBAQAorLyogCisgKiAKKyAqIEdsdWUgQ29kZSBmb3Igb3B0aW1pemVkIDU4NiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBBRVMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIERyIEJyaWFuIEdsYWRtYW4gPD4sIFdvcmNlc3RlciwgVUsuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExJQ0VOU0UgVEVSTVMKKyAqCisgKiBUaGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpIHByb3ZpZGVkIHRoYXQ6CisgKgorICogICAxLiBkaXN0cmlidXRpb25zIG9mIHRoaXMgc291cmNlIGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKKyAqCisgKiAgIDIuIGRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgYXNzb2NpYXRlZCBtYXRlcmlhbHM7CisgKgorICogICAzLiB0aGUgY29weXJpZ2h0IGhvbGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cworICogICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcyBwcm9kdWN0CisgKiBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcHBseSBJTlNURUFEIE9GIHRob3NlIGdpdmVuIGFib3ZlLgorICoKKyAqIERJU0NMQUlNRVIKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKKyAqIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcworICogYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4gKGNvbnZlcnNpb24gdG8KKyAqIDIuNSBBUEkpLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IEZydWh3aXJ0aCBDbGVtZW5zIDxjbGVtZW5zQGVuZG9ycGhpbi5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgUmVkIEhhdCwgSW5jLiwgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+CisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorCithc21saW5rYWdlIHZvaWQgYWVzX2VuY19ibGsoY29uc3QgdTggKnNyYywgdTggKmRzdCwgdm9pZCAqY3R4KTsKK2FzbWxpbmthZ2Ugdm9pZCBhZXNfZGVjX2Jsayhjb25zdCB1OCAqc3JjLCB1OCAqZHN0LCB2b2lkICpjdHgpOworCisjZGVmaW5lIEFFU19NSU5fS0VZX1NJWkUJMTYKKyNkZWZpbmUgQUVTX01BWF9LRVlfU0laRQkzMgorI2RlZmluZSBBRVNfQkxPQ0tfU0laRQkJMTYKKyNkZWZpbmUgQUVTX0tTX0xFTkdUSAkJNCAqIEFFU19CTE9DS19TSVpFCisjZGVmaW5lIFJDX0xFTkdUSAkJMjkKKworc3RydWN0IGFlc19jdHggeworCXUzMiBla2V5W0FFU19LU19MRU5HVEhdOworCXUzMiByb3VuZHM7CisJdTMyIGRrZXlbQUVTX0tTX0xFTkdUSF07Cit9OworCisjZGVmaW5lIFdQT0xZIDB4MDExYgorI2RlZmluZSB1MzJfaW4oeCkgbGUzMl90b19jcHUoKihjb25zdCB1MzIgKikoeCkpCisjZGVmaW5lIGJ5dGVzMndvcmQoYjAsIGIxLCBiMiwgYjMpICBcCisJKCgodTMyKShiMykgPDwgMjQpIHwgKCh1MzIpKGIyKSA8PCAxNikgfCAoKHUzMikoYjEpIDw8IDgpIHwgKGIwKSkKKworLyogZGVmaW5lIHRoZSBmaW5pdGUgZmllbGQgbXVsdGlwbGllcyByZXF1aXJlZCBmb3IgUmlqbmRhZWwgKi8KKyNkZWZpbmUgZjIoeCkgKCh4KSA/IHBvd1tsb2dbeF0gKyAweDE5XSA6IDApCisjZGVmaW5lIGYzKHgpICgoeCkgPyBwb3dbbG9nW3hdICsgMHgwMV0gOiAwKQorI2RlZmluZSBmOSh4KSAoKHgpID8gcG93W2xvZ1t4XSArIDB4YzddIDogMCkKKyNkZWZpbmUgZmIoeCkgKCh4KSA/IHBvd1tsb2dbeF0gKyAweDY4XSA6IDApCisjZGVmaW5lIGZkKHgpICgoeCkgPyBwb3dbbG9nW3hdICsgMHhlZV0gOiAwKQorI2RlZmluZSBmZSh4KSAoKHgpID8gcG93W2xvZ1t4XSArIDB4ZGZdIDogMCkKKyNkZWZpbmUgZmkoeCkgKCh4KSA/ICAgcG93WzI1NSAtIGxvZ1t4XV06IDApCisKK3N0YXRpYyBpbmxpbmUgdTMyIHVwcih1MzIgeCwgaW50IG4pCit7CisJcmV0dXJuICh4IDw8IDggKiBuKSB8ICh4ID4+ICgzMiAtIDggKiBuKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggYnZhbCh1MzIgeCwgaW50IG4pCit7CisJcmV0dXJuIHggPj4gOCAqIG47Cit9CisKKy8qIFRoZSBmb3J3YXJkIGFuZCBpbnZlcnNlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbnMgdXNlZCBpbiB0aGUgUy1ib3ggKi8KKyNkZWZpbmUgZndkX2FmZmluZSh4KSBcCisJKHcgPSAodTMyKXgsIHcgXj0gKHc8PDEpXih3PDwyKV4odzw8MyleKHc8PDQpLCAweDYzXih1OCkod14odz4+OCkpKQorCisjZGVmaW5lIGludl9hZmZpbmUoeCkgXAorCSh3ID0gKHUzMil4LCB3ID0gKHc8PDEpXih3PDwzKV4odzw8NiksIDB4MDVeKHU4KSh3Xih3Pj44KSkpCisKK3N0YXRpYyB1MzIgcmNvbl90YWJbUkNfTEVOR1RIXTsKKwordTMyIGZ0X3RhYls0XVsyNTZdOwordTMyIGZsX3RhYls0XVsyNTZdOworc3RhdGljIHUzMiBsc190YWJbNF1bMjU2XTsKK3N0YXRpYyB1MzIgaW1fdGFiWzRdWzI1Nl07Cit1MzIgaWxfdGFiWzRdWzI1Nl07Cit1MzIgaXRfdGFiWzRdWzI1Nl07CisKK3N0YXRpYyB2b2lkIGdlbl90YWJzKHZvaWQpCit7CisJdTMyIGksIHc7CisJdTggcG93WzUxMl0sIGxvZ1syNTZdOworCisJLyoKKwkgKiBsb2cgYW5kIHBvd2VyIHRhYmxlcyBmb3IgR0YoMl44KSBmaW5pdGUgZmllbGQgd2l0aAorCSAqIFdQT0xZIGFzIG1vZHVsYXIgcG9seW5vbWlhbCAtIHRoZSBzaW1wbGVzdCBwcmltaXRpdmUKKwkgKiByb290IGlzIDB4MDMsIHVzZWQgaGVyZSB0byBnZW5lcmF0ZSB0aGUgdGFibGVzLgorCSAqLworCWkgPSAwOyB3ID0gMTsgCisJCisJZG8geworCQlwb3dbaV0gPSAodTgpdzsKKwkJcG93W2kgKyAyNTVdID0gKHU4KXc7CisJCWxvZ1t3XSA9ICh1OClpKys7CisJCXcgXj0gICh3IDw8IDEpIF4gKHcgJiAweDgwID8gV1BPTFkgOiAwKTsKKwl9IHdoaWxlICh3ICE9IDEpOworCQorCWZvcihpID0gMCwgdyA9IDE7IGkgPCBSQ19MRU5HVEg7ICsraSkgeworCQlyY29uX3RhYltpXSA9IGJ5dGVzMndvcmQodywgMCwgMCwgMCk7CisJCXcgPSBmMih3KTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworCQl1OCBiOworCQkKKwkJYiA9IGZ3ZF9hZmZpbmUoZmkoKHU4KWkpKTsKKwkJdyA9IGJ5dGVzMndvcmQoZjIoYiksIGIsIGIsIGYzKGIpKTsKKworCQkvKiB0YWJsZXMgZm9yIGEgbm9ybWFsIGVuY3J5cHRpb24gcm91bmQgKi8KKwkJZnRfdGFiWzBdW2ldID0gdzsKKwkJZnRfdGFiWzFdW2ldID0gdXByKHcsIDEpOworCQlmdF90YWJbMl1baV0gPSB1cHIodywgMik7CisJCWZ0X3RhYlszXVtpXSA9IHVwcih3LCAzKTsKKwkJdyA9IGJ5dGVzMndvcmQoYiwgMCwgMCwgMCk7CisJCQorCQkvKgorCQkgKiB0YWJsZXMgZm9yIGxhc3QgZW5jcnlwdGlvbiByb3VuZAorCQkgKiAobWF5IGFsc28gYmUgdXNlZCBpbiB0aGUga2V5IHNjaGVkdWxlKQorCQkgKi8KKwkJZmxfdGFiWzBdW2ldID0gdzsKKwkJZmxfdGFiWzFdW2ldID0gdXByKHcsIDEpOworCQlmbF90YWJbMl1baV0gPSB1cHIodywgMik7CisJCWZsX3RhYlszXVtpXSA9IHVwcih3LCAzKTsKKwkJCisJCS8qCisJCSAqIHRhYmxlIGZvciBrZXkgc2NoZWR1bGUgaWYgZmxfdGFiIGFib3ZlIGlzCisJCSAqIG5vdCBvZiB0aGUgcmVxdWlyZWQgZm9ybQorCQkgKi8KKwkJbHNfdGFiWzBdW2ldID0gdzsKKwkJbHNfdGFiWzFdW2ldID0gdXByKHcsIDEpOworCQlsc190YWJbMl1baV0gPSB1cHIodywgMik7CisJCWxzX3RhYlszXVtpXSA9IHVwcih3LCAzKTsKKwkJCisJCWIgPSBmaShpbnZfYWZmaW5lKCh1OClpKSk7CisJCXcgPSBieXRlczJ3b3JkKGZlKGIpLCBmOShiKSwgZmQoYiksIGZiKGIpKTsKKworCQkvKiB0YWJsZXMgZm9yIHRoZSBpbnZlcnNlIG1peCBjb2x1bW4gb3BlcmF0aW9uICAqLworCQlpbV90YWJbMF1bYl0gPSB3OworCQlpbV90YWJbMV1bYl0gPSB1cHIodywgMSk7CisJCWltX3RhYlsyXVtiXSA9IHVwcih3LCAyKTsKKwkJaW1fdGFiWzNdW2JdID0gdXByKHcsIDMpOworCisJCS8qIHRhYmxlcyBmb3IgYSBub3JtYWwgZGVjcnlwdGlvbiByb3VuZCAqLworCQlpdF90YWJbMF1baV0gPSB3OworCQlpdF90YWJbMV1baV0gPSB1cHIodywxKTsKKwkJaXRfdGFiWzJdW2ldID0gdXByKHcsMik7CisJCWl0X3RhYlszXVtpXSA9IHVwcih3LDMpOworCisJCXcgPSBieXRlczJ3b3JkKGIsIDAsIDAsIDApOworCQkKKwkJLyogdGFibGVzIGZvciBsYXN0IGRlY3J5cHRpb24gcm91bmQgKi8KKwkJaWxfdGFiWzBdW2ldID0gdzsKKwkJaWxfdGFiWzFdW2ldID0gdXByKHcsMSk7CisJCWlsX3RhYlsyXVtpXSA9IHVwcih3LDIpOworCQlpbF90YWJbM11baV0gPSB1cHIodywzKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgZm91cl90YWJsZXMoeCx0YWIsdmYscmYsYykJCVwKKygJdGFiWzBdW2J2YWwodmYoeCwwLGMpLHJmKDAsYykpXQleCVwKKwl0YWJbMV1bYnZhbCh2Zih4LDEsYykscmYoMSxjKSldIF4JXAorCXRhYlsyXVtidmFsKHZmKHgsMixjKSxyZigyLGMpKV0gXglcCisJdGFiWzNdW2J2YWwodmYoeCwzLGMpLHJmKDMsYykpXQkJXAorKQorCisjZGVmaW5lIHZmMSh4LHIsYykgICh4KQorI2RlZmluZSByZjEocixjKSAgICAocikKKyNkZWZpbmUgcmYyKHIsYykgICAgKChyLWMpJjMpCisKKyNkZWZpbmUgaW52X21jb2woeCkgZm91cl90YWJsZXMoeCxpbV90YWIsdmYxLHJmMSwwKQorI2RlZmluZSBsc19ib3goeCxjKSBmb3VyX3RhYmxlcyh4LGZsX3RhYix2ZjEscmYyLGMpCisKKyNkZWZpbmUgZmYoeCkgaW52X21jb2woeCkKKworI2RlZmluZSBrZTQoayxpKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCWtbNCooaSkrNF0gPSBzc1swXSBePSBsc19ib3goc3NbM10sMykgXiByY29uX3RhYltpXTsJCVwKKwlrWzQqKGkpKzVdID0gc3NbMV0gXj0gc3NbMF07CQkJCQlcCisJa1s0KihpKSs2XSA9IHNzWzJdIF49IHNzWzFdOwkJCQkJXAorCWtbNCooaSkrN10gPSBzc1szXSBePSBzc1syXTsJCQkJCVwKK30KKworI2RlZmluZSBrZWw0KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlrWzQqKGkpKzRdID0gc3NbMF0gXj0gbHNfYm94KHNzWzNdLDMpIF4gcmNvbl90YWJbaV07CQlcCisJa1s0KihpKSs1XSA9IHNzWzFdIF49IHNzWzBdOwkJCQkJXAorCWtbNCooaSkrNl0gPSBzc1syXSBePSBzc1sxXTsga1s0KihpKSs3XSA9IHNzWzNdIF49IHNzWzJdOwlcCit9CisKKyNkZWZpbmUga2U2KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlrWzYqKGkpKyA2XSA9IHNzWzBdIF49IGxzX2JveChzc1s1XSwzKSBeIHJjb25fdGFiW2ldOwkJXAorCWtbNiooaSkrIDddID0gc3NbMV0gXj0gc3NbMF07CQkJCQlcCisJa1s2KihpKSsgOF0gPSBzc1syXSBePSBzc1sxXTsJCQkJCVwKKwlrWzYqKGkpKyA5XSA9IHNzWzNdIF49IHNzWzJdOwkJCQkJXAorCWtbNiooaSkrMTBdID0gc3NbNF0gXj0gc3NbM107CQkJCQlcCisJa1s2KihpKSsxMV0gPSBzc1s1XSBePSBzc1s0XTsJCQkJCVwKK30KKworI2RlZmluZSBrZWw2KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlrWzYqKGkpKyA2XSA9IHNzWzBdIF49IGxzX2JveChzc1s1XSwzKSBeIHJjb25fdGFiW2ldOwkJXAorCWtbNiooaSkrIDddID0gc3NbMV0gXj0gc3NbMF07CQkJCQlcCisJa1s2KihpKSsgOF0gPSBzc1syXSBePSBzc1sxXTsJCQkJCVwKKwlrWzYqKGkpKyA5XSA9IHNzWzNdIF49IHNzWzJdOwkJCQkJXAorfQorCisjZGVmaW5lIGtlOChrLGkpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJa1s4KihpKSsgOF0gPSBzc1swXSBePSBsc19ib3goc3NbN10sMykgXiByY29uX3RhYltpXTsJCVwKKwlrWzgqKGkpKyA5XSA9IHNzWzFdIF49IHNzWzBdOwkJCQkJXAorCWtbOCooaSkrMTBdID0gc3NbMl0gXj0gc3NbMV07CQkJCQlcCisJa1s4KihpKSsxMV0gPSBzc1szXSBePSBzc1syXTsJCQkJCVwKKwlrWzgqKGkpKzEyXSA9IHNzWzRdIF49IGxzX2JveChzc1szXSwwKTsJCQkJXAorCWtbOCooaSkrMTNdID0gc3NbNV0gXj0gc3NbNF07CQkJCQlcCisJa1s4KihpKSsxNF0gPSBzc1s2XSBePSBzc1s1XTsJCQkJCVwKKwlrWzgqKGkpKzE1XSA9IHNzWzddIF49IHNzWzZdOwkJCQkJXAorfQorCisjZGVmaW5lIGtlbDgoayxpKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCWtbOCooaSkrIDhdID0gc3NbMF0gXj0gbHNfYm94KHNzWzddLDMpIF4gcmNvbl90YWJbaV07CQlcCisJa1s4KihpKSsgOV0gPSBzc1sxXSBePSBzc1swXTsJCQkJCVwKKwlrWzgqKGkpKzEwXSA9IHNzWzJdIF49IHNzWzFdOwkJCQkJXAorCWtbOCooaSkrMTFdID0gc3NbM10gXj0gc3NbMl07CQkJCQlcCit9CisKKyNkZWZpbmUga2RmNChrLGkpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3NbMF0gPSBzc1swXSBeIHNzWzJdIF4gc3NbMV0gXiBzc1szXTsJCQkJXAorCXNzWzFdID0gc3NbMV0gXiBzc1szXTsJCQkJCQlcCisJc3NbMl0gPSBzc1syXSBeIHNzWzNdOwkJCQkJCVwKKwlzc1szXSA9IHNzWzNdOwkJCQkJCQlcCisJc3NbNF0gPSBsc19ib3goc3NbKGkrMykgJSA0XSwgMykgXiByY29uX3RhYltpXTsJCQlcCisJc3NbaSAlIDRdIF49IHNzWzRdOwkJCQkJCVwKKwlzc1s0XSBePSBrWzQqKGkpXTsJCQkJCQlcCisJa1s0KihpKSs0XSA9IGZmKHNzWzRdKTsJCQkJCQlcCisJc3NbNF0gXj0ga1s0KihpKSsxXTsJCQkJCQlcCisJa1s0KihpKSs1XSA9IGZmKHNzWzRdKTsJCQkJCQlcCisJc3NbNF0gXj0ga1s0KihpKSsyXTsJCQkJCQlcCisJa1s0KihpKSs2XSA9IGZmKHNzWzRdKTsJCQkJCQlcCisJc3NbNF0gXj0ga1s0KihpKSszXTsJCQkJCQlcCisJa1s0KihpKSs3XSA9IGZmKHNzWzRdKTsJCQkJCQlcCit9CisKKyNkZWZpbmUga2Q0KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlzc1s0XSA9IGxzX2JveChzc1soaSszKSAlIDRdLCAzKSBeIHJjb25fdGFiW2ldOwkJCVwKKwlzc1tpICUgNF0gXj0gc3NbNF07CQkJCQkJXAorCXNzWzRdID0gZmYoc3NbNF0pOwkJCQkJCVwKKwlrWzQqKGkpKzRdID0gc3NbNF0gXj0ga1s0KihpKV07CQkJCQlcCisJa1s0KihpKSs1XSA9IHNzWzRdIF49IGtbNCooaSkrMV07CQkJCVwKKwlrWzQqKGkpKzZdID0gc3NbNF0gXj0ga1s0KihpKSsyXTsJCQkJXAorCWtbNCooaSkrN10gPSBzc1s0XSBePSBrWzQqKGkpKzNdOwkJCQlcCit9CisKKyNkZWZpbmUga2RsNChrLGkpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3NbNF0gPSBsc19ib3goc3NbKGkrMykgJSA0XSwgMykgXiByY29uX3RhYltpXTsJCQlcCisJc3NbaSAlIDRdIF49IHNzWzRdOwkJCQkJCVwKKwlrWzQqKGkpKzRdID0gKHNzWzBdIF49IHNzWzFdKSBeIHNzWzJdIF4gc3NbM107CQkJXAorCWtbNCooaSkrNV0gPSBzc1sxXSBeIHNzWzNdOwkJCQkJXAorCWtbNCooaSkrNl0gPSBzc1swXTsJCQkJCQlcCisJa1s0KihpKSs3XSA9IHNzWzFdOwkJCQkJCVwKK30KKworI2RlZmluZSBrZGY2KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlzc1swXSBePSBsc19ib3goc3NbNV0sMykgXiByY29uX3RhYltpXTsJCQkJXAorCWtbNiooaSkrIDZdID0gZmYoc3NbMF0pOwkJCQkJXAorCXNzWzFdIF49IHNzWzBdOwkJCQkJCQlcCisJa1s2KihpKSsgN10gPSBmZihzc1sxXSk7CQkJCQlcCisJc3NbMl0gXj0gc3NbMV07CQkJCQkJCVwKKwlrWzYqKGkpKyA4XSA9IGZmKHNzWzJdKTsJCQkJCVwKKwlzc1szXSBePSBzc1syXTsJCQkJCQkJXAorCWtbNiooaSkrIDldID0gZmYoc3NbM10pOwkJCQkJXAorCXNzWzRdIF49IHNzWzNdOwkJCQkJCQlcCisJa1s2KihpKSsxMF0gPSBmZihzc1s0XSk7CQkJCQlcCisJc3NbNV0gXj0gc3NbNF07CQkJCQkJCVwKKwlrWzYqKGkpKzExXSA9IGZmKHNzWzVdKTsJCQkJCVwKK30KKworI2RlZmluZSBrZDYoayxpKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCXNzWzZdID0gbHNfYm94KHNzWzVdLDMpIF4gcmNvbl90YWJbaV07CQkJCVwKKwlzc1swXSBePSBzc1s2XTsgc3NbNl0gPSBmZihzc1s2XSk7CQkJCVwKKwlrWzYqKGkpKyA2XSA9IHNzWzZdIF49IGtbNiooaSldOwkJCQlcCisJc3NbMV0gXj0gc3NbMF07CQkJCQkJCVwKKwlrWzYqKGkpKyA3XSA9IHNzWzZdIF49IGtbNiooaSkrIDFdOwkJCQlcCisJc3NbMl0gXj0gc3NbMV07CQkJCQkJCVwKKwlrWzYqKGkpKyA4XSA9IHNzWzZdIF49IGtbNiooaSkrIDJdOwkJCQlcCisJc3NbM10gXj0gc3NbMl07CQkJCQkJCVwKKwlrWzYqKGkpKyA5XSA9IHNzWzZdIF49IGtbNiooaSkrIDNdOwkJCQlcCisJc3NbNF0gXj0gc3NbM107CQkJCQkJCVwKKwlrWzYqKGkpKzEwXSA9IHNzWzZdIF49IGtbNiooaSkrIDRdOwkJCQlcCisJc3NbNV0gXj0gc3NbNF07CQkJCQkJCVwKKwlrWzYqKGkpKzExXSA9IHNzWzZdIF49IGtbNiooaSkrIDVdOwkJCQlcCit9CisKKyNkZWZpbmUga2RsNihrLGkpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3NbMF0gXj0gbHNfYm94KHNzWzVdLDMpIF4gcmNvbl90YWJbaV07CQkJCVwKKwlrWzYqKGkpKyA2XSA9IHNzWzBdOwkJCQkJCVwKKwlzc1sxXSBePSBzc1swXTsJCQkJCQkJXAorCWtbNiooaSkrIDddID0gc3NbMV07CQkJCQkJXAorCXNzWzJdIF49IHNzWzFdOwkJCQkJCQlcCisJa1s2KihpKSsgOF0gPSBzc1syXTsJCQkJCQlcCisJc3NbM10gXj0gc3NbMl07CQkJCQkJCVwKKwlrWzYqKGkpKyA5XSA9IHNzWzNdOwkJCQkJCVwKK30KKworI2RlZmluZSBrZGY4KGssaSkJCQkJCQkJXAorewkJCQkJCQkJCVwKKwlzc1swXSBePSBsc19ib3goc3NbN10sMykgXiByY29uX3RhYltpXTsJCQkJXAorCWtbOCooaSkrIDhdID0gZmYoc3NbMF0pOwkJCQkJXAorCXNzWzFdIF49IHNzWzBdOwkJCQkJCQlcCisJa1s4KihpKSsgOV0gPSBmZihzc1sxXSk7CQkJCQlcCisJc3NbMl0gXj0gc3NbMV07CQkJCQkJCVwKKwlrWzgqKGkpKzEwXSA9IGZmKHNzWzJdKTsJCQkJCVwKKwlzc1szXSBePSBzc1syXTsJCQkJCQkJXAorCWtbOCooaSkrMTFdID0gZmYoc3NbM10pOwkJCQkJXAorCXNzWzRdIF49IGxzX2JveChzc1szXSwwKTsJCQkJCVwKKwlrWzgqKGkpKzEyXSA9IGZmKHNzWzRdKTsJCQkJCVwKKwlzc1s1XSBePSBzc1s0XTsJCQkJCQkJXAorCWtbOCooaSkrMTNdID0gZmYoc3NbNV0pOwkJCQkJXAorCXNzWzZdIF49IHNzWzVdOwkJCQkJCQlcCisJa1s4KihpKSsxNF0gPSBmZihzc1s2XSk7CQkJCQlcCisJc3NbN10gXj0gc3NbNl07CQkJCQkJCVwKKwlrWzgqKGkpKzE1XSA9IGZmKHNzWzddKTsJCQkJCVwKK30KKworI2RlZmluZSBrZDgoayxpKQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCXUzMiBfX2cgPSBsc19ib3goc3NbN10sMykgXiByY29uX3RhYltpXTsJCQlcCisJc3NbMF0gXj0gX19nOwkJCQkJCQlcCisJX19nID0gZmYoX19nKTsJCQkJCQkJXAorCWtbOCooaSkrIDhdID0gX19nIF49IGtbOCooaSldOwkJCQkJXAorCXNzWzFdIF49IHNzWzBdOwkJCQkJCQlcCisJa1s4KihpKSsgOV0gPSBfX2cgXj0ga1s4KihpKSsgMV07CQkJCVwKKwlzc1syXSBePSBzc1sxXTsJCQkJCQkJXAorCWtbOCooaSkrMTBdID0gX19nIF49IGtbOCooaSkrIDJdOwkJCQlcCisJc3NbM10gXj0gc3NbMl07CQkJCQkJCVwKKwlrWzgqKGkpKzExXSA9IF9fZyBePSBrWzgqKGkpKyAzXTsJCQkJXAorCV9fZyA9IGxzX2JveChzc1szXSwwKTsJCQkJCQlcCisJc3NbNF0gXj0gX19nOwkJCQkJCQlcCisJX19nID0gZmYoX19nKTsJCQkJCQkJXAorCWtbOCooaSkrMTJdID0gX19nIF49IGtbOCooaSkrIDRdOwkJCQlcCisJc3NbNV0gXj0gc3NbNF07CQkJCQkJCVwKKwlrWzgqKGkpKzEzXSA9IF9fZyBePSBrWzgqKGkpKyA1XTsJCQkJXAorCXNzWzZdIF49IHNzWzVdOwkJCQkJCQlcCisJa1s4KihpKSsxNF0gPSBfX2cgXj0ga1s4KihpKSsgNl07CQkJCVwKKwlzc1s3XSBePSBzc1s2XTsJCQkJCQkJXAorCWtbOCooaSkrMTVdID0gX19nIF49IGtbOCooaSkrIDddOwkJCQlcCit9CisKKyNkZWZpbmUga2RsOChrLGkpCQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3NbMF0gXj0gbHNfYm94KHNzWzddLDMpIF4gcmNvbl90YWJbaV07CQkJCVwKKwlrWzgqKGkpKyA4XSA9IHNzWzBdOwkJCQkJCVwKKwlzc1sxXSBePSBzc1swXTsJCQkJCQkJXAorCWtbOCooaSkrIDldID0gc3NbMV07CQkJCQkJXAorCXNzWzJdIF49IHNzWzFdOwkJCQkJCQlcCisJa1s4KihpKSsxMF0gPSBzc1syXTsJCQkJCQlcCisJc3NbM10gXj0gc3NbMl07CQkJCQkJCVwKKwlrWzgqKGkpKzExXSA9IHNzWzNdOwkJCQkJCVwKK30KKworc3RhdGljIGludAorYWVzX3NldF9rZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCit7CisJaW50IGk7CisJdTMyIHNzWzhdOworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOworCisJLyogZW5jcnlwdGlvbiBzY2hlZHVsZSAqLworCQorCWN0eC0+ZWtleVswXSA9IHNzWzBdID0gdTMyX2luKGluX2tleSk7CisJY3R4LT5la2V5WzFdID0gc3NbMV0gPSB1MzJfaW4oaW5fa2V5ICsgNCk7CisJY3R4LT5la2V5WzJdID0gc3NbMl0gPSB1MzJfaW4oaW5fa2V5ICsgOCk7CisJY3R4LT5la2V5WzNdID0gc3NbM10gPSB1MzJfaW4oaW5fa2V5ICsgMTIpOworCisJc3dpdGNoKGtleV9sZW4pIHsKKwljYXNlIDE2OgorCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQkJa2U0KGN0eC0+ZWtleSwgaSk7CisJCWtlbDQoY3R4LT5la2V5LCA5KTsKKwkJY3R4LT5yb3VuZHMgPSAxMDsKKwkJYnJlYWs7CisJCQorCWNhc2UgMjQ6CisJCWN0eC0+ZWtleVs0XSA9IHNzWzRdID0gdTMyX2luKGluX2tleSArIDE2KTsKKwkJY3R4LT5la2V5WzVdID0gc3NbNV0gPSB1MzJfaW4oaW5fa2V5ICsgMjApOworCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorCQkJa2U2KGN0eC0+ZWtleSwgaSk7CisJCWtlbDYoY3R4LT5la2V5LCA3KTsgCisJCWN0eC0+cm91bmRzID0gMTI7CisJCWJyZWFrOworCisJY2FzZSAzMjoKKwkJY3R4LT5la2V5WzRdID0gc3NbNF0gPSB1MzJfaW4oaW5fa2V5ICsgMTYpOworCQljdHgtPmVrZXlbNV0gPSBzc1s1XSA9IHUzMl9pbihpbl9rZXkgKyAyMCk7CisJCWN0eC0+ZWtleVs2XSA9IHNzWzZdID0gdTMyX2luKGluX2tleSArIDI0KTsKKwkJY3R4LT5la2V5WzddID0gc3NbN10gPSB1MzJfaW4oaW5fa2V5ICsgMjgpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJa2U4KGN0eC0+ZWtleSwgaSk7CisJCWtlbDgoY3R4LT5la2V5LCA2KTsKKwkJY3R4LT5yb3VuZHMgPSAxNDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwkvKiBkZWNyeXB0aW9uIHNjaGVkdWxlICovCisJCisJY3R4LT5ka2V5WzBdID0gc3NbMF0gPSB1MzJfaW4oaW5fa2V5KTsKKwljdHgtPmRrZXlbMV0gPSBzc1sxXSA9IHUzMl9pbihpbl9rZXkgKyA0KTsKKwljdHgtPmRrZXlbMl0gPSBzc1syXSA9IHUzMl9pbihpbl9rZXkgKyA4KTsKKwljdHgtPmRrZXlbM10gPSBzc1szXSA9IHUzMl9pbihpbl9rZXkgKyAxMik7CisKKwlzd2l0Y2ggKGtleV9sZW4pIHsKKwljYXNlIDE2OgorCQlrZGY0KGN0eC0+ZGtleSwgMCk7CisJCWZvciAoaSA9IDE7IGkgPCA5OyBpKyspCisJCQlrZDQoY3R4LT5ka2V5LCBpKTsKKwkJa2RsNChjdHgtPmRrZXksIDkpOworCQlicmVhazsKKwkJCisJY2FzZSAyNDoKKwkJY3R4LT5ka2V5WzRdID0gZmYoc3NbNF0gPSB1MzJfaW4oaW5fa2V5ICsgMTYpKTsKKwkJY3R4LT5ka2V5WzVdID0gZmYoc3NbNV0gPSB1MzJfaW4oaW5fa2V5ICsgMjApKTsKKwkJa2RmNihjdHgtPmRrZXksIDApOworCQlmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKQorCQkJa2Q2KGN0eC0+ZGtleSwgaSk7CisJCWtkbDYoY3R4LT5ka2V5LCA3KTsKKwkJYnJlYWs7CisKKwljYXNlIDMyOgorCQljdHgtPmRrZXlbNF0gPSBmZihzc1s0XSA9IHUzMl9pbihpbl9rZXkgKyAxNikpOworCQljdHgtPmRrZXlbNV0gPSBmZihzc1s1XSA9IHUzMl9pbihpbl9rZXkgKyAyMCkpOworCQljdHgtPmRrZXlbNl0gPSBmZihzc1s2XSA9IHUzMl9pbihpbl9rZXkgKyAyNCkpOworCQljdHgtPmRrZXlbN10gPSBmZihzc1s3XSA9IHUzMl9pbihpbl9rZXkgKyAyOCkpOworCQlrZGY4KGN0eC0+ZGtleSwgMCk7CisJCWZvciAoaSA9IDE7IGkgPCA2OyBpKyspCisJCQlrZDgoY3R4LT5ka2V5LCBpKTsKKwkJa2RsOChjdHgtPmRrZXksIDYpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZXNfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCit7CisJYWVzX2VuY19ibGsoc3JjLCBkc3QsIGN0eCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWVzX2RlY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQoreworCWFlc19kZWNfYmxrKHNyYywgZHN0LCBjdHgpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnID0geworCS5jcmFfbmFtZQkJPQkiYWVzIiwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYWVzX2N0eCksCisJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFlc19hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJCT0JeworCQkuY2lwaGVyID0geworCQkJLmNpYV9taW5fa2V5c2l6ZQk9CUFFU19NSU5fS0VZX1NJWkUsCisJCQkuY2lhX21heF9rZXlzaXplCT0JQUVTX01BWF9LRVlfU0laRSwKKwkJCS5jaWFfc2V0a2V5CSAgIAk9IAlhZXNfc2V0X2tleSwKKwkJCS5jaWFfZW5jcnlwdAkgCT0JYWVzX2VuY3J5cHQsCisJCQkuY2lhX2RlY3J5cHQJICAJPQlhZXNfZGVjcnlwdAorCQl9CisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgYWVzX2luaXQodm9pZCkKK3sKKwlnZW5fdGFicygpOworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFlc19maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKK30KKworbW9kdWxlX2luaXQoYWVzX2luaXQpOworbW9kdWxlX2V4aXQoYWVzX2ZpbmkpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlJpam5kYWVsIChBRVMpIENpcGhlciBBbGdvcml0aG0sIGk1ODYgYXNtIG9wdGltaXplZCIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FVVEhPUigiRnJ1aHdpcnRoIENsZW1lbnMsIEphbWVzIE1vcnJpcywgQnJpYW4gR2xhZG1hbiwgQWRhbSBSaWNodGVyIik7CitNT0RVTEVfQUxJQVMoImFlcyIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2RlZmNvbmZpZyBiL2FyY2gvaTM4Ni9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlNjIwMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9kZWZjb25maWcKQEAgLTAsMCArMSwxMjQ3IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjCitDT05GSUdfWDg2PXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19HRU5FUklDX0lTQV9ETUE9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfU1RBTkRBTE9ORT15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0FVRElUPXkKK0NPTkZJR19BVURJVFNZU0NBTEw9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTUKK0NPTkZJR19IT1RQTFVHPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCisjCitDT05GSUdfWDg2X1BDPXkKKyMgQ09ORklHX1g4Nl9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9WT1lBR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9OVU1BUSBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfU1VNTUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9CSUdTTVAgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X1ZJU1dTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl9HRU5FUklDQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfRVM3MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX00zODYgaXMgbm90IHNldAorIyBDT05GSUdfTTQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19NNTg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX001ODZUU0MgaXMgbm90IHNldAorIyBDT05GSUdfTTU4Nk1NWCBpcyBub3Qgc2V0CisjIENPTkZJR19NNjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01QRU5USVVNSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVBFTlRJVU1JSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVBFTlRJVU1NIGlzIG5vdCBzZXQKK0NPTkZJR19NUEVOVElVTTQ9eQorIyBDT05GSUdfTUs2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01LNyBpcyBub3Qgc2V0CisjIENPTkZJR19NSzggaXMgbm90IHNldAorIyBDT05GSUdfTUNSVVNPRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUZGSUNFT04gaXMgbm90IHNldAorIyBDT05GSUdfTVdJTkNISVBDNiBpcyBub3Qgc2V0CisjIENPTkZJR19NV0lOQ0hJUDIgaXMgbm90IHNldAorIyBDT05GSUdfTVdJTkNISVAzRCBpcyBub3Qgc2V0CisjIENPTkZJR19NQ1lSSVhJSUkgaXMgbm90IHNldAorIyBDT05GSUdfTVZJQUMzXzIgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X0dFTkVSSUMgaXMgbm90IHNldAorQ09ORklHX1g4Nl9DTVBYQ0hHPXkKK0NPTkZJR19YODZfWEFERD15CitDT05GSUdfWDg2X0wxX0NBQ0hFX1NISUZUPTcKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfWDg2X1dQX1dPUktTX09LPXkKK0NPTkZJR19YODZfSU5WTFBHPXkKK0NPTkZJR19YODZfQlNXQVA9eQorQ09ORklHX1g4Nl9QT1BBRF9PSz15CitDT05GSUdfWDg2X0dPT0RfQVBJQz15CitDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZPXkKK0NPTkZJR19YODZfVVNFX1BQUk9fQ0hFQ0tTVU09eQorIyBDT05GSUdfSFBFVF9USU1FUiBpcyBub3Qgc2V0CisjIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDIGlzIG5vdCBzZXQKK0NPTkZJR19TTVA9eQorQ09ORklHX05SX0NQVVM9OAorQ09ORklHX1NDSEVEX1NNVD15CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfWDg2X0xPQ0FMX0FQSUM9eQorQ09ORklHX1g4Nl9JT19BUElDPXkKK0NPTkZJR19YODZfVFNDPXkKK0NPTkZJR19YODZfTUNFPXkKK0NPTkZJR19YODZfTUNFX05PTkZBVEFMPXkKK0NPTkZJR19YODZfTUNFX1A0VEhFUk1BTD15CisjIENPTkZJR19UT1NISUJBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0k4SyBpcyBub3Qgc2V0CisjIENPTkZJR19NSUNST0NPREUgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X01TUiBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfQ1BVSUQgaXMgbm90IHNldAorCisjCisjIEZpcm13YXJlIERyaXZlcnMKKyMKKyMgQ09ORklHX0VERCBpcyBub3Qgc2V0CitDT05GSUdfTk9ISUdITUVNPXkKKyMgQ09ORklHX0hJR0hNRU00RyBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNNjRHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BVEhfRU1VTEFUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NVFJSPXkKKyMgQ09ORklHX0VGSSBpcyBub3Qgc2V0CitDT05GSUdfSVJRQkFMQU5DRT15CitDT05GSUdfSEFWRV9ERUNfTE9DSz15CisjIENPTkZJR19SRUdQQVJNIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEFDUEksIEFQTSkKKyMKK0NPTkZJR19QTT15CitDT05GSUdfU09GVFdBUkVfU1VTUEVORD15CisjIENPTkZJR19QTV9ESVNLIGlzIG5vdCBzZXQKKworIworIyBBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQKKyMKK0NPTkZJR19BQ1BJPXkKK0NPTkZJR19BQ1BJX0JPT1Q9eQorQ09ORklHX0FDUElfSU5URVJQUkVURVI9eQorQ09ORklHX0FDUElfU0xFRVA9eQorQ09ORklHX0FDUElfU0xFRVBfUFJPQ19GUz15CitDT05GSUdfQUNQSV9BQz15CitDT05GSUdfQUNQSV9CQVRURVJZPXkKK0NPTkZJR19BQ1BJX0JVVFRPTj15CitDT05GSUdfQUNQSV9GQU49eQorQ09ORklHX0FDUElfUFJPQ0VTU09SPXkKK0NPTkZJR19BQ1BJX1RIRVJNQUw9eQorIyBDT05GSUdfQUNQSV9BU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDUElfVE9TSElCQSBpcyBub3Qgc2V0CisjIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19BQ1BJX0JVUz15CitDT05GSUdfQUNQSV9FQz15CitDT05GSUdfQUNQSV9QT1dFUj15CitDT05GSUdfQUNQSV9QQ0k9eQorQ09ORklHX0FDUElfU1lTVEVNPXkKKyMgQ09ORklHX1g4Nl9QTV9USU1FUiBpcyBub3Qgc2V0CisKKyMKKyMgQVBNIChBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50KSBCSU9TIFN1cHBvcnQKKyMKKyMgQ09ORklHX0FQTSBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkKKyMKK0NPTkZJR19QQ0k9eQorIyBDT05GSUdfUENJX0dPQklPUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfR09NTUNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfR09ESVJFQ1QgaXMgbm90IHNldAorQ09ORklHX1BDSV9HT0FOWT15CitDT05GSUdfUENJX0JJT1M9eQorQ09ORklHX1BDSV9ESVJFQ1Q9eQorQ09ORklHX1BDSV9NTUNPTkZJRz15CisjIENPTkZJR19QQ0lfVVNFX1ZFQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfUENJX0xFR0FDWV9QUk9DPXkKK0NPTkZJR19QQ0lfTkFNRVM9eQorQ09ORklHX0lTQT15CisjIENPTkZJR19FSVNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01DQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ3gyMDAgaXMgbm90IHNldAorCisjCisjIFBDTUNJQS9DYXJkQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDTUNJQSBpcyBub3Qgc2V0CitDT05GSUdfUENNQ0lBX1BST0JFPXkKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfQU9VVD15CitDT05GSUdfQklORk1UX01JU0M9eQorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX0ZXX0xPQURFUj1tCisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19QQVJQT1JUPXkKK0NPTkZJR19QQVJQT1JUX1BDPXkKK0NPTkZJR19QQVJQT1JUX1BDX0NNTDE9eQorIyBDT05GSUdfUEFSUE9SVF9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVF9QQ19GSUZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfUENfU1VQRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUX09USEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlRfMTI4NCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCitDT05GSUdfUE5QPXkKKyMgQ09ORklHX1BOUF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUHJvdG9jb2xzCisjCisjIENPTkZJR19JU0FQTlAgaXMgbm90IHNldAorIyBDT05GSUdfUE5QQklPUyBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworQ09ORklHX0JMS19ERVZfRkQ9eQorIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJJREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NBUk1FTCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CitDT05GSUdfTEJEPXkKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0hEX0lERSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKK0NPTkZJR19JREVESVNLX01VTFRJX01PREU9eQorQ09ORklHX0JMS19ERVZfSURFQ0Q9eQorIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CitDT05GSUdfSURFX1RBU0tGSUxFX0lPPXkKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCitDT05GSUdfSURFX0dFTkVSSUM9eQorQ09ORklHX0JMS19ERVZfQ01ENjQwPXkKKyMgQ09ORklHX0JMS19ERVZfQ01ENjQwX0VOSEFOQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFUE5QIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERVBDST15CitDT05GSUdfSURFUENJX1NIQVJFX0lSUT15CisjIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0dFTkVSSUM9eQorIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JaMTAwMD15CitDT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0CitDT05GSUdfSURFRE1BX1BDSV9BVVRPPXkKKyMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9BRE1BPXkKKyMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NZODJDNjkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1BJSVg9eQorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0lTNTUxMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorIyBDT05GSUdfSURFX0NISVBTRVRTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQT15CisjIENPTkZJR19JREVETUFfSVZCIGlzIG5vdCBzZXQKK0NPTkZJR19JREVETUFfQVVUTz15CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CitDT05GSUdfQ0hSX0RFVl9TRz15CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfNzAwMEZBU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSEExNTJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUhBMTU0MiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0RQVF9JMk89bQorIyBDT05GSUdfU0NTSV9BRFZBTlNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX01FR0FSQUlEIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1NBVEE9eQorIyBDT05GSUdfU0NTSV9TQVRBX1NWVyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9BVEFfUElJWD15CisjIENPTkZJR19TQ1NJX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9TQVRBX1NYND1tCisjIENPTkZJR19TQ1NJX1NBVEFfU0lMIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1NBVEFfU0lTPW0KKyMgQ09ORklHX1NDU0lfU0FUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVRBX1ZJVEVTU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NQUUZDVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RUQzMyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRUFUQV9QSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0RUSCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MF9NTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1BQQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lNTSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05DUjUzQzQwNkEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9JUFI9bQorIyBDT05GSUdfU0NTSV9JUFJfVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFJfRFVNUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1BBUzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUFNJMjQwSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ19GQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfSVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUUxBMlhYWD15CisjIENPTkZJR19TQ1NJX1FMQTIxWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIzMjIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEE2MzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBNjMyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzQxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1QxMjggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9VMTRfMzRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfVUxUUkFTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgT2xkIENELVJPTSBkcml2ZXJzIChub3QgU0NTSSwgbm90IElERSkKKyMKKyMgQ09ORklHX0NEX05PX0lERVNDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCitDT05GSUdfSUVFRTEzOTQ9eQorCisjCisjIFN1YnN5c3RlbSBPcHRpb25zCisjCisjIENPTkZJR19JRUVFMTM5NF9WRVJCT1NFREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTRfT1VJX0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0X0VYVFJBX0NPTkZJR19ST01TIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIFRleGFzIEluc3RydW1lbnRzIFBDSUx5bnggcmVxdWlyZXMgSTJDCisjCitDT05GSUdfSUVFRTEzOTRfT0hDSTEzOTQ9eQorCisjCisjIFByb3RvY29sIERyaXZlcnMKKyMKKyMgQ09ORklHX0lFRUUxMzk0X1ZJREVPMTM5NCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFMTM5NF9TQlAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0X0VUSDEzOTQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTRfRFYxMzk0IGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFMTM5NF9SQVdJTz15CisjIENPTkZJR19JRUVFMTM5NF9DTVAgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0lQX05GX0NPTk5UUkFDSz15CisjIENPTkZJR19JUF9ORl9GVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfSVJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX1RGVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfQU1BTkRBIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9RVUVVRT15CitDT05GSUdfSVBfTkZfSVBUQUJMRVM9eQorQ09ORklHX0lQX05GX01BVENIX0xJTUlUPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9NQUM9eQorQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEU9eQorQ09ORklHX0lQX05GX01BVENIX01BUks9eQorQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD15CitDT05GSUdfSVBfTkZfTUFUQ0hfVE9TPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQ9eQorQ09ORklHX0lQX05GX01BVENIX0VDTj15CitDT05GSUdfSVBfTkZfTUFUQ0hfRFNDUD15CitDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9MRU5HVEg9eQorQ09ORklHX0lQX05GX01BVENIX1RUTD15CitDT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9IRUxQRVI9eQorQ09ORklHX0lQX05GX01BVENIX1NUQVRFPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0s9eQorQ09ORklHX0lQX05GX01BVENIX09XTkVSPXkKK0NPTkZJR19JUF9ORl9GSUxURVI9eQorQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9eQorQ09ORklHX0lQX05GX05BVD15CitDT05GSUdfSVBfTkZfTkFUX05FRURFRD15CitDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9eQorQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVD15CitDT05GSUdfSVBfTkZfVEFSR0VUX05FVE1BUD15CitDT05GSUdfSVBfTkZfVEFSR0VUX1NBTUU9eQorIyBDT05GSUdfSVBfTkZfTkFUX1NOTVBfQkFTSUMgaXMgbm90IHNldAorQ09ORklHX0lQX05GX01BTkdMRT15CitDT05GSUdfSVBfTkZfVEFSR0VUX1RPUz15CitDT05GSUdfSVBfTkZfVEFSR0VUX0VDTj15CitDT05GSUdfSVBfTkZfVEFSR0VUX0RTQ1A9eQorQ09ORklHX0lQX05GX1RBUkdFVF9NQVJLPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfQ0xBU1NJRlk9eQorQ09ORklHX0lQX05GX1RBUkdFVF9MT0c9eQorQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfVENQTVNTPXkKK0NPTkZJR19JUF9ORl9BUlBUQUJMRVM9eQorQ09ORklHX0lQX05GX0FSUEZJTFRFUj15CitDT05GSUdfSVBfTkZfQVJQX01BTkdMRT15CitDT05GSUdfSVBfTkZfVEFSR0VUX05PVFJBQ0s9bQorQ09ORklHX0lQX05GX1JBVz1tCisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkFTVFJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9IV19GTE9XQ09OVFJPTCBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9bQorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQjEwMDAgaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU01DIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDMzIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFJJQ09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfQ1M4OXgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RHUlMgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk8xMDAgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorQ09ORklHXzgxMzlUT089eQorQ09ORklHXzgxMzlUT09fUElPPXkKKyMgQ09ORklHXzgxMzlUT09fVFVORV9UV0lTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT09fODEyOSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKK0NPTkZJR19TMklPPW0KKyMgQ09ORklHX1MySU9fTkFQSSBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBJL08gZHJpdmVycworIworIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fSTgwNDI9eQorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19DVDgyQzcxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19QQVJLQkQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9JTlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfTE9HSUJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BDMTEwUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfODI1MF9BQ1BJIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CitDT05GSUdfUFJJTlRFUj15CisjIENPTkZJR19MUF9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FJQzAyX1RBUEUgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPTllQSSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCitDT05GSUdfQUdQPXkKKyMgQ09ORklHX0FHUF9BTEkgaXMgbm90IHNldAorIyBDT05GSUdfQUdQX0FUSSBpcyBub3Qgc2V0CisjIENPTkZJR19BR1BfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FHUF9BTUQ2NCBpcyBub3Qgc2V0CitDT05GSUdfQUdQX0lOVEVMPXkKKyMgQ09ORklHX0FHUF9OVklESUEgaXMgbm90IHNldAorIyBDT05GSUdfQUdQX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19BR1BfU1dPUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FHUF9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfQUdQX0VGRklDRU9OIGlzIG5vdCBzZXQKK0NPTkZJR19EUk09eQorIyBDT05GSUdfRFJNX1RERlggaXMgbm90IHNldAorIyBDT05GSUdfRFJNX0dBTU1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTV9SMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTV9SQURFT04gaXMgbm90IHNldAorIyBDT05GSUdfRFJNX0k4MTAgaXMgbm90IHNldAorQ09ORklHX0RSTV9JODMwPXkKKyMgQ09ORklHX0RSTV9NR0EgaXMgbm90IHNldAorIyBDT05GSUdfRFJNX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19NV0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19JQk1fQVNNIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19TRUxFQ1QgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworQ09ORklHX1ZHQV9DT05TT0xFPXkKKyMgQ09ORklHX01EQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPXkKKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKK0NPTkZJR19TTkQ9eQorQ09ORklHX1NORF9USU1FUj15CitDT05GSUdfU05EX1BDTT15CitDT05GSUdfU05EX1JBV01JREk9eQorQ09ORklHX1NORF9TRVFVRU5DRVI9eQorIyBDT05GSUdfU05EX1NFUV9EVU1NWSBpcyBub3Qgc2V0CitDT05GSUdfU05EX09TU0VNVUw9eQorQ09ORklHX1NORF9NSVhFUl9PU1M9eQorQ09ORklHX1NORF9QQ01fT1NTPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSX09TUz15CisjIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBHZW5lcmljIGRldmljZXMKKyMKK0NPTkZJR19TTkRfTVBVNDAxX1VBUlQ9eQorIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSVJNSURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKKworIworIyBJU0EgZGV2aWNlcworIworIyBDT05GSUdfU05EX0FEMTg0OCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ1M0MjMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzQyMzIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDIzNiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxNjg4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9FUzE4WFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dVU0NMQVNTSUMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dVU0VYVFJFTUUgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dVU01BWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5URVJXQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTlRFUldBVkVfU1RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9PUFRJOTJYX0FEMTg0OCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfT1BUSTkyWF9DUzQyMzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX09QVEk5M1ggaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NCOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0IxNiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0JBV0UgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1dBVkVGUk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQ01JODMzMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfT1BMM1NBMiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0dBTEFYWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU1NDQVBFIGlzIG5vdCBzZXQKKworIworIyBQQ0kgZGV2aWNlcworIworQ09ORklHX1NORF9BQzk3X0NPREVDPXkKKyMgQ09ORklHX1NORF9BTEk1NDUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FVODgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQVU4ODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BVTg4MzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FaVDMzMjggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0JUODdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DUzQ2WFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU1VMTBLMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfS09SRzEyMTIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1JNRTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9STUU5NiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUk1FOTY1MiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSERTUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfWU1GUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9BTFM0MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9DTUlQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VOUzEzNzAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VOUzEzNzEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VTMTkzOCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRVMxOTY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NQUVTVFJPMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRk04MDEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lDRTE3MTIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lDRTE3MjQgaXMgbm90IHNldAorQ09ORklHX1NORF9JTlRFTDhYMD15CisjIENPTkZJR19TTkRfSU5URUw4WDBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSUE4MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WWDIyMiBpcyBub3Qgc2V0CisKKyMKKyMgQUxTQSBVU0IgZGV2aWNlcworIworIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQj15CisjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX1VTQl9FSENJX0hDRD15CisjIENPTkZJR19VU0JfRUhDSV9TUExJVF9JU08gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09IQ0lfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfVUhDSV9IQ0Q9eQorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FVRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9CTFVFVE9PVEhfVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorQ09ORklHX1VTQl9QUklOVEVSPXkKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSFA4MjAwZSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKworIworIyBVU0IgSHVtYW4gSW50ZXJmYWNlIERldmljZXMgKEhJRCkKKyMKK0NPTkZJR19VU0JfSElEPXkKK0NPTkZJR19VU0JfSElESU5QVVQ9eQorIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01UT1VDSCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VHQUxBWD1tCisjIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hQVVNCU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CisKKyMKKyMgVmlkZW80TGludXggc3VwcG9ydCBpcyBuZWVkZWQgZm9yIFVTQiBNdWx0aW1lZGlhIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIE5ldHdvcmsgYWRhcHRvcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworIyBDT05GSUdfVVNCX1VTUzcyMCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVElHTCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorQ09ORklHX1VTQl9DWVRIRVJNPW0KK0NPTkZJR19VU0JfUEhJREdFVFNFUlZPPW0KKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19BVVRPRlM0X0ZTPXkKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfSVNPOTY2MF9GUz15CitDT05GSUdfSk9MSUVUPXkKKyMgQ09ORklHX1pJU09GUyBpcyBub3Qgc2V0CitDT05GSUdfVURGX0ZTPXkKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CisjIENPTkZJR19ORlNEX1YzIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEX1RDUD15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9eQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCitDT05GSUdfUFJPRklMSU5HPXkKK0NPTkZJR19PUFJPRklMRT15CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUD15CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKK0NPTkZJR180S1NUQUNLUz15CitDT05GSUdfWDg2X0ZJTkRfU01QX0NPTkZJRz15CitDT05GSUdfWDg2X01QUEFSU0U9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0NSQzMyPXkKK0NPTkZJR19MSUJDUkMzMkM9bQorQ09ORklHX1g4Nl9TTVA9eQorQ09ORklHX1g4Nl9IVD15CitDT05GSUdfWDg2X0JJT1NfUkVCT09UPXkKK0NPTkZJR19YODZfVFJBTVBPTElORT15CitDT05GSUdfWDg2X1NURF9SRVNPVVJDRVM9eQorQ09ORklHX1BDPXkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzc4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsNzEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK2V4dHJhLXkgOj0gaGVhZC5vIGluaXRfdGFzay5vIHZtbGludXgubGRzCisKK29iai15CTo9IHByb2Nlc3MubyBzZW1hcGhvcmUubyBzaWduYWwubyBlbnRyeS5vIHRyYXBzLm8gaXJxLm8gdm04Ni5vIFwKKwkJcHRyYWNlLm8gdGltZS5vIGlvcG9ydC5vIGxkdC5vIHNldHVwLm8gaTgyNTkubyBzeXNfaTM4Ni5vIFwKKwkJcGNpLWRtYS5vIGkzODZfa3N5bXMubyBpMzg3Lm8gZG1pX3NjYW4ubyBib290ZmxhZy5vIFwKKwkJZG91YmxlZmF1bHQubyBxdWlya3MubworCitvYmoteQkJCQkrPSBjcHUvCitvYmoteQkJCQkrPSB0aW1lcnMvCitvYmotJChDT05GSUdfQUNQSV9CT09UKQkJKz0gYWNwaS8KK29iai0kKENPTkZJR19YODZfQklPU19SRUJPT1QpCSs9IHJlYm9vdC5vCitvYmotJChDT05GSUdfTUNBKQkJKz0gbWNhLm8KK29iai0kKENPTkZJR19YODZfTVNSKQkJKz0gbXNyLm8KK29iai0kKENPTkZJR19YODZfQ1BVSUQpCQkrPSBjcHVpZC5vCitvYmotJChDT05GSUdfTUlDUk9DT0RFKQkJKz0gbWljcm9jb2RlLm8KK29iai0kKENPTkZJR19BUE0pCQkrPSBhcG0ubworb2JqLSQoQ09ORklHX1g4Nl9TTVApCQkrPSBzbXAubyBzbXBib290Lm8KK29iai0kKENPTkZJR19YODZfVFJBTVBPTElORSkJKz0gdHJhbXBvbGluZS5vCitvYmotJChDT05GSUdfWDg2X01QUEFSU0UpCSs9IG1wcGFyc2Uubworb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQkrPSBhcGljLm8gbm1pLm8KK29iai0kKENPTkZJR19YODZfSU9fQVBJQykJKz0gaW9fYXBpYy5vCitvYmotJChDT05GSUdfWDg2X05VTUFRKQkJKz0gbnVtYXEubworb2JqLSQoQ09ORklHX1g4Nl9TVU1NSVRfTlVNQSkJKz0gc3VtbWl0Lm8KK29iai0kKENPTkZJR19LUFJPQkVTKQkJKz0ga3Byb2Jlcy5vCitvYmotJChDT05GSUdfTU9EVUxFUykJCSs9IG1vZHVsZS5vCitvYmoteQkJCQkrPSBzeXNlbnRlci5vIHZzeXNjYWxsLm8KK29iai0kKENPTkZJR19BQ1BJX1NSQVQpIAkrPSBzcmF0Lm8KK29iai0kKENPTkZJR19IUEVUX1RJTUVSKSAJKz0gdGltZV9ocGV0Lm8KK29iai0kKENPTkZJR19FRkkpIAkJKz0gZWZpLm8gZWZpX3N0dWIubworb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5USykJKz0gZWFybHlfcHJpbnRrLm8KKworRVhUUkFfQUZMQUdTICAgOj0gLXRyYWRpdGlvbmFsCisKK29iai0kKENPTkZJR19TQ3gyMDApCQkrPSBzY3gyMDAubworCisjIHZzeXNjYWxsLm8gY29udGFpbnMgdGhlIHZzeXNjYWxsIERTTyBpbWFnZXMgYXMgX19pbml0ZGF0YS4KKyMgV2UgbXVzdCBidWlsZCBib3RoIGltYWdlcyBiZWZvcmUgd2UgY2FuIGFzc2VtYmxlIGl0LgorIyBOb3RlOiBrYnVpbGQgZG9lcyBub3QgdHJhY2sgdGhpcyBkZXBlbmRlbmN5IGR1ZSB0byB1c2FnZSBvZiAuaW5jYmluCiskKG9iaikvdnN5c2NhbGwubzogJChvYmopL3ZzeXNjYWxsLWludDgwLnNvICQob2JqKS92c3lzY2FsbC1zeXNlbnRlci5zbwordGFyZ2V0cyArPSAkKGZvcmVhY2ggRixpbnQ4MCBzeXNlbnRlcix2c3lzY2FsbC0kRi5vIHZzeXNjYWxsLSRGLnNvKQordGFyZ2V0cyArPSB2c3lzY2FsbC5sZHMKKworIyBUaGUgRFNPIGltYWdlcyBhcmUgYnVpbHQgdXNpbmcgYSBzcGVjaWFsIGxpbmtlciBzY3JpcHQuCitxdWlldF9jbWRfc3lzY2FsbCA9IFNZU0NBTEwgJEAKKyAgICAgIGNtZF9zeXNjYWxsID0gJChDQykgLW0gZWxmX2kzODYgLW5vc3RkbGliICQoU1lTQ0ZMQUdTXyQoQEYpKSBcCisJCSAgICAgICAgICAtV2wsLVQsJChmaWx0ZXItb3V0IEZPUkNFLCReKSAtbyAkQAorCitleHBvcnQgQ1BQRkxBR1NfdnN5c2NhbGwubGRzICs9IC1QIC1DIC1VJChBUkNIKQorCit2c3lzY2FsbC1mbGFncyA9IC1zaGFyZWQgLXMgLVdsLC1zb25hbWU9bGludXgtZ2F0ZS5zby4xCitTWVNDRkxBR1NfdnN5c2NhbGwtc3lzZW50ZXIuc28JPSAkKHZzeXNjYWxsLWZsYWdzKQorU1lTQ0ZMQUdTX3ZzeXNjYWxsLWludDgwLnNvCT0gJCh2c3lzY2FsbC1mbGFncykKKworJChvYmopL3ZzeXNjYWxsLWludDgwLnNvICQob2JqKS92c3lzY2FsbC1zeXNlbnRlci5zbzogXAorJChvYmopL3ZzeXNjYWxsLSUuc286ICQoc3JjKS92c3lzY2FsbC5sZHMgJChvYmopL3ZzeXNjYWxsLSUubyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHN5c2NhbGwpCisKKyMgV2UgYWxzbyBjcmVhdGUgYSBzcGVjaWFsIHJlbG9jYXRhYmxlIG9iamVjdCB0aGF0IHNob3VsZCBtaXJyb3IgdGhlIHN5bWJvbAorIyB0YWJsZSBhbmQgbGF5b3V0IG9mIHRoZSBsaW5rZWQgRFNPLiAgV2l0aCBsZCAtUiB3ZSBjYW4gdGhlbiByZWZlciB0bworIyB0aGVzZSBzeW1ib2xzIGluIHRoZSBrZXJuZWwgY29kZSByYXRoZXIgdGhhbiBoYW5kLWNvZGVkIGFkZHJlc3Nlcy4KK2V4dHJhLXkgKz0gdnN5c2NhbGwtc3ltcy5vCiskKG9iaikvYnVpbHQtaW4ubzogJChvYmopL3ZzeXNjYWxsLXN5bXMubworJChvYmopL2J1aWx0LWluLm86IGxkX2ZsYWdzICs9IC1SICQob2JqKS92c3lzY2FsbC1zeW1zLm8KKworU1lTQ0ZMQUdTX3ZzeXNjYWxsLXN5bXMubyA9IC1yCiskKG9iaikvdnN5c2NhbGwtc3ltcy5vOiAkKHNyYykvdnN5c2NhbGwubGRzICQob2JqKS92c3lzY2FsbC1zeXNlbnRlci5vIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsc3lzY2FsbCkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc1Y2IyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorb2JqLSQoQ09ORklHX0FDUElfQk9PVCkJCTo9IGJvb3Qubworb2JqLSQoQ09ORklHX1g4Nl9JT19BUElDKQkrPSBlYXJseXF1aXJrLm8KK29iai0kKENPTkZJR19BQ1BJX1NMRUVQKQkrPSBzbGVlcC5vIHdha2V1cC5vCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTBiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCkBAIC0wLDAgKzEsOTA4IEBACisvKgorICogIGJvb3QuYyAtIEFyY2hpdGVjdHVyZS1TcGVjaWZpYyBMb3ctTGV2ZWwgQUNQSSBCb290IFN1cHBvcnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFBhdWwgRGllZmVuYmF1Z2ggPHBhdWwucy5kaWVmZW5iYXVnaEBpbnRlbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIEp1biBOYWthamltYSA8anVuLm5ha2FqaW1hQGludGVsLmNvbT4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorCisjaWZkZWYJQ09ORklHX1g4Nl82NAorCitzdGF0aWMgaW5saW5lIHZvaWQgIGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpIHsgfQorZXh0ZXJuIHZvaWQgX19pbml0IGNsdXN0ZXJlZF9hcGljX2NoZWNrKHZvaWQpOworc3RhdGljIGlubGluZSBpbnQgaW9hcGljX3NldHVwX2Rpc2FibGVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNpbmNsdWRlIDxhc20vcHJvdG8uaD4KKworI2Vsc2UJLyogWDg2ICovCisKKyNpZmRlZglDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKyNpbmNsdWRlIDxtYWNoX21wcGFyc2UuaD4KKyNlbmRpZgkvKiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KKworI2VuZGlmCS8qIFg4NiAqLworCisjZGVmaW5lIEJBRF9NQURUX0VOVFJZKGVudHJ5LCBlbmQpICgJCQkJCSAgICBcCisJCSghZW50cnkpIHx8ICh1bnNpZ25lZCBsb25nKWVudHJ5ICsgc2l6ZW9mKCplbnRyeSkgPiBlbmQgfHwgIFwKKwkJKChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqKWVudHJ5KS0+bGVuZ3RoICE9IHNpemVvZigqZW50cnkpKQorCisjZGVmaW5lIFBSRUZJWAkJCSJBQ1BJOiAiCisKKyNpZmRlZiBDT05GSUdfQUNQSV9QQ0kKK2ludCBhY3BpX25vaXJxIF9faW5pdGRhdGE7CS8qIHNraXAgQUNQSSBJUlEgaW5pdGlhbGl6YXRpb24gKi8KK2ludCBhY3BpX3BjaV9kaXNhYmxlZCBfX2luaXRkYXRhOyAvKiBza2lwIEFDUEkgUENJIHNjYW4gYW5kIElSUSBpbml0aWFsaXphdGlvbiAqLworI2Vsc2UKK2ludCBhY3BpX25vaXJxIF9faW5pdGRhdGEgPSAxOworaW50IGFjcGlfcGNpX2Rpc2FibGVkIF9faW5pdGRhdGEgPSAxOworI2VuZGlmCitpbnQgYWNwaV9odCBfX2luaXRkYXRhID0gMTsJLyogZW5hYmxlIEhUICovCisKK2ludCBhY3BpX2xhcGljOworaW50IGFjcGlfaW9hcGljOworaW50IGFjcGlfc3RyaWN0OworRVhQT1JUX1NZTUJPTChhY3BpX3N0cmljdCk7CisKK2FjcGlfaW50ZXJydXB0X2ZsYWdzIGFjcGlfc2NpX2ZsYWdzIF9faW5pdGRhdGE7CitpbnQgYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpIF9faW5pdGRhdGE7CitpbnQgYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlIF9faW5pdGRhdGE7CisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKK3N0YXRpYyB1NjQgYWNwaV9sYXBpY19hZGRyIF9faW5pdGRhdGEgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfQ01QWENIRworI3dhcm5pbmcgQUNQSSB1c2VzIENNUFhDSEcsIGk0ODYgYW5kIGxhdGVyIGhhcmR3YXJlCisjZW5kaWYKKworI2RlZmluZSBNQVhfTUFEVF9FTlRSSUVTCTI1NgordTggeDg2X2FjcGlpZF90b19hcGljaWRbTUFYX01BRFRfRU5UUklFU10gPQorCQkJeyBbMCAuLi4gTUFYX01BRFRfRU5UUklFUy0xXSA9IDB4ZmYgfTsKK0VYUE9SVF9TWU1CT0woeDg2X2FjcGlpZF90b19hcGljaWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdC10aW1lIENvbmZpZ3VyYXRpb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBUaGUgZGVmYXVsdCBpbnRlcnJ1cHQgcm91dGluZyBtb2RlbCBpcyBQSUMgKDgyNTkpLiAgVGhpcyBnZXRzCisgKiBvdmVycmlkZW4gaWYgSU9BUElDcyBhcmUgZW51bWVyYXRlZCAoYmVsb3cpLgorICovCitlbnVtIGFjcGlfaXJxX21vZGVsX2lkCQlhY3BpX2lycV9tb2RlbCA9IEFDUElfSVJRX01PREVMX1BJQzsKKworI2lmZGVmCUNPTkZJR19YODZfNjQKKworLyogcmVseSBvbiBhbGwgQUNQSSB0YWJsZXMgYmVpbmcgaW4gdGhlIGRpcmVjdCBtYXBwaW5nICovCitjaGFyICpfX2FjcGlfbWFwX3RhYmxlKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCisJcmV0dXJuIE5VTEw7CisKKwlpZiAocGh5c19hZGRyIDwgKGVuZF9wZm5fbWFwIDw8IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gX192YShwaHlzX2FkZHIpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKyNlbHNlCisKKy8qCisgKiBUZW1wb3JhcmlseSB1c2UgdGhlIHZpcnR1YWwgYXJlYSBzdGFydGluZyBmcm9tIEZJWF9JT19BUElDX0JBU0VfRU5ELAorICogdG8gbWFwIHRoZSB0YXJnZXQgcGh5c2ljYWwgYWRkcmVzcy4gVGhlIHByb2JsZW0gaXMgdGhhdCBzZXRfZml4bWFwKCkKKyAqIHByb3ZpZGVzIGEgc2luZ2xlIHBhZ2UsIGFuZCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBwYWdlIGlzIG5vdAorICogc3VmZmljaWVudC4KKyAqIEJ5IHVzaW5nIHRoaXMgYXJlYSwgd2UgY2FuIG1hcCB1cCB0byBNQVhfSU9fQVBJQ1MgcGFnZXMgdGVtcG9yYXJpbHksCisgKiBpLmUuIHVudGlsIHRoZSBuZXh0IF9fdmFfcmFuZ2UoKSBjYWxsLgorICoKKyAqIEltcG9ydGFudCBTYWZldHkgTm90ZTogIFRoZSBmaXhlZCBJL08gQVBJQyBwYWdlIG51bWJlcnMgYXJlICpzdWJ0cmFjdGVkKgorICogZnJvbSB0aGUgZml4ZWQgYmFzZS4gIFRoYXQncyB3aHkgd2Ugc3RhcnQgYXQgRklYX0lPX0FQSUNfQkFTRV9FTkQgYW5kCisgKiBjb3VudCBpZHggZG93biB3aGlsZSBpbmNyZW1lbnRpbmcgdGhlIHBoeXMgYWRkcmVzcy4KKyAqLworY2hhciAqX19hY3BpX21hcF90YWJsZSh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2UsIG9mZnNldCwgbWFwcGVkX3NpemU7CisJaW50IGlkeDsKKworCWlmIChwaHlzICsgc2l6ZSA8IDgqMTAyNCoxMDI0KSAKKwkJcmV0dXJuIF9fdmEocGh5cyk7IAorCisJb2Zmc2V0ID0gcGh5cyAmIChQQUdFX1NJWkUgLSAxKTsKKwltYXBwZWRfc2l6ZSA9IFBBR0VfU0laRSAtIG9mZnNldDsKKwlzZXRfZml4bWFwKEZJWF9BQ1BJX0VORCwgcGh5cyk7CisJYmFzZSA9IGZpeF90b192aXJ0KEZJWF9BQ1BJX0VORCk7CisKKwkvKgorCSAqIE1vc3QgY2FzZXMgY2FuIGJlIGNvdmVyZWQgYnkgdGhlIGJlbG93LgorCSAqLworCWlkeCA9IEZJWF9BQ1BJX0VORDsKKwl3aGlsZSAobWFwcGVkX3NpemUgPCBzaXplKSB7CisJCWlmICgtLWlkeCA8IEZJWF9BQ1BJX0JFR0lOKQorCQkJcmV0dXJuIE5VTEw7CS8qIGNhbm5vdCBoYW5kbGUgdGhpcyAqLworCQlwaHlzICs9IFBBR0VfU0laRTsKKwkJc2V0X2ZpeG1hcChpZHgsIHBoeXMpOworCQltYXBwZWRfc2l6ZSArPSBQQUdFX1NJWkU7CisJfQorCisJcmV0dXJuICgodW5zaWduZWQgY2hhciAqKSBiYXNlICsgb2Zmc2V0KTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSV9NTUNPTkZJRworc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9tY2ZnKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGFjcGlfdGFibGVfbWNmZyAqbWNmZzsKKworCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1jZmcgPSAoc3RydWN0IGFjcGlfdGFibGVfbWNmZyAqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXNfYWRkciwgc2l6ZSk7CisJaWYgKCFtY2ZnKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIE1DRkdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobWNmZy0+YmFzZV9yZXNlcnZlZCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJNTUNPTkZJRyBub3QgaW4gbG93IDRHQiBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwY2lfbW1jZmdfYmFzZV9hZGRyID0gbWNmZy0+YmFzZV9hZGRyZXNzOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZQlhY3BpX3BhcnNlX21jZmcgTlVMTAorI2VuZGlmIC8qICFDT05GSUdfUENJX01NQ09ORklHICovCisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX21hZHQgKAorCXVuc2lnbmVkIGxvbmcJCXBoeXNfYWRkciwKKwl1bnNpZ25lZCBsb25nCQlzaXplKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX21hZHQJKm1hZHQgPSBOVUxMOworCisJaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICopIF9fYWNwaV9tYXBfdGFibGUocGh5c19hZGRyLCBzaXplKTsKKwlpZiAoIW1hZHQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgTUFEVFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChtYWR0LT5sYXBpY19hZGRyZXNzKSB7CisJCWFjcGlfbGFwaWNfYWRkciA9ICh1NjQpIG1hZHQtPmxhcGljX2FkZHJlc3M7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICJMb2NhbCBBUElDIGFkZHJlc3MgMHglMDh4XG4iLAorCQkJbWFkdC0+bGFwaWNfYWRkcmVzcyk7CisJfQorCisJYWNwaV9tYWR0X29lbV9jaGVjayhtYWR0LT5oZWFkZXIub2VtX2lkLCBtYWR0LT5oZWFkZXIub2VtX3RhYmxlX2lkKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdAorYWNwaV9wYXJzZV9sYXBpYyAoCisJYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IGFjcGlfdGFibGVfbGFwaWMJKnByb2Nlc3NvciA9IE5VTEw7CisKKwlwcm9jZXNzb3IgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWMqKSBoZWFkZXI7CisKKwlpZiAoQkFEX01BRFRfRU5UUlkocHJvY2Vzc29yLCBlbmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShoZWFkZXIpOworCisJLyogbm8gdXRpbGl0eSBpbiByZWdpc3RlcmluZyBhIGRpc2FibGVkIHByb2Nlc3NvciAqLworCWlmIChwcm9jZXNzb3ItPmZsYWdzLmVuYWJsZWQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl4ODZfYWNwaWlkX3RvX2FwaWNpZFtwcm9jZXNzb3ItPmFjcGlfaWRdID0gcHJvY2Vzc29yLT5pZDsKKworCW1wX3JlZ2lzdGVyX2xhcGljICgKKwkJcHJvY2Vzc29yLT5pZCwJCQkJCSAgIC8qIEFQSUMgSUQgKi8KKwkJcHJvY2Vzc29yLT5mbGFncy5lbmFibGVkKTsJCQkgIC8qIEVuYWJsZWQ/ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQKK2FjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICpsYXBpY19hZGRyX292ciA9IE5VTEw7CisKKwlsYXBpY19hZGRyX292ciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciopIGhlYWRlcjsKKworCWlmIChCQURfTUFEVF9FTlRSWShsYXBpY19hZGRyX292ciwgZW5kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhY3BpX2xhcGljX2FkZHIgPSBsYXBpY19hZGRyX292ci0+YWRkcmVzczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAorYWNwaV9wYXJzZV9sYXBpY19ubWkgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX25taSAqbGFwaWNfbm1pID0gTlVMTDsKKworCWxhcGljX25taSA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19ubWkqKSBoZWFkZXI7CisKKwlpZiAoQkFEX01BRFRfRU5UUlkobGFwaWNfbm1pLCBlbmQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShoZWFkZXIpOworCisJaWYgKGxhcGljX25taS0+bGludCAhPSAxKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiTk1JIG5vdCBjb25uZWN0ZWQgdG8gTElOVCAxIVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCisjZW5kaWYgLypDT05GSUdfWDg2X0xPQ0FMX0FQSUMqLworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpCisKK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX2lvYXBpYyAoCisJYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IGFjcGlfdGFibGVfaW9hcGljICppb2FwaWMgPSBOVUxMOworCisJaW9hcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2lvYXBpYyopIGhlYWRlcjsKKworCWlmIChCQURfTUFEVF9FTlRSWShpb2FwaWMsIGVuZCkpCisJCXJldHVybiAtRUlOVkFMOworIAorCWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShoZWFkZXIpOworCisJbXBfcmVnaXN0ZXJfaW9hcGljICgKKwkJaW9hcGljLT5pZCwKKwkJaW9hcGljLT5hZGRyZXNzLAorCQlpb2FwaWMtPmdsb2JhbF9pcnFfYmFzZSk7CisgCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQYXJzZSBJbnRlcnJ1cHQgU291cmNlIE92ZXJyaWRlIGZvciB0aGUgQUNQSSBTQ0kKKyAqLworc3RhdGljIHZvaWQKK2FjcGlfc2NpX2lvYXBpY19zZXR1cCh1MzIgZ3NpLCB1MTYgcG9sYXJpdHksIHUxNiB0cmlnZ2VyKQoreworCWlmICh0cmlnZ2VyID09IDApCS8qIGNvbXBhdGlibGUgU0NJIHRyaWdnZXIgaXMgbGV2ZWwgKi8KKwkJdHJpZ2dlciA9IDM7CisKKwlpZiAocG9sYXJpdHkgPT0gMCkJLyogY29tcGF0aWJsZSBTQ0kgcG9sYXJpdHkgaXMgbG93ICovCisJCXBvbGFyaXR5ID0gMzsKKworCS8qIENvbW1hbmQtbGluZSBvdmVyLXJpZGUgdmlhIGFjcGlfc2NpPSAqLworCWlmIChhY3BpX3NjaV9mbGFncy50cmlnZ2VyKQorCQl0cmlnZ2VyID0gYWNwaV9zY2lfZmxhZ3MudHJpZ2dlcjsKKworCWlmIChhY3BpX3NjaV9mbGFncy5wb2xhcml0eSkKKwkJcG9sYXJpdHkgPSBhY3BpX3NjaV9mbGFncy5wb2xhcml0eTsKKworCS8qCisgCSAqIG1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzKCkgYWxyZWFkeSBzZXR1cCBJUlFzIDwgMTYKKwkgKiBJZiBHU0kgaXMgPCAxNiwgdGhpcyB3aWxsIHVwZGF0ZSBpdHMgZmxhZ3MsCisJICogZWxzZSBpdCB3aWxsIGNyZWF0ZSBhIG5ldyBtcF9pcnFzW10gZW50cnkuCisJICovCisJbXBfb3ZlcnJpZGVfbGVnYWN5X2lycShnc2ksIHBvbGFyaXR5LCB0cmlnZ2VyLCBnc2kpOworCisJLyoKKwkgKiBzdGFzaCBvdmVyLXJpZGUgdG8gaW5kaWNhdGUgd2UndmUgYmVlbiBoZXJlCisJICogYW5kIGZvciBsYXRlciB1cGRhdGUgb2YgYWNwaV9mYWR0CisJICovCisJYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpID0gZ3NpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBfX2luaXQKK2FjcGlfcGFyc2VfaW50X3NyY19vdnIgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyICppbnRzcmMgPSBOVUxMOworCisJaW50c3JjID0gKHN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyKikgaGVhZGVyOworCisJaWYgKEJBRF9NQURUX0VOVFJZKGludHNyYywgZW5kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhY3BpX3RhYmxlX3ByaW50X21hZHRfZW50cnkoaGVhZGVyKTsKKworCWlmIChpbnRzcmMtPmJ1c19pcnEgPT0gYWNwaV9mYWR0LnNjaV9pbnQpIHsKKwkJYWNwaV9zY2lfaW9hcGljX3NldHVwKGludHNyYy0+Z2xvYmFsX2lycSwKKwkJCWludHNyYy0+ZmxhZ3MucG9sYXJpdHksIGludHNyYy0+ZmxhZ3MudHJpZ2dlcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgJiYKKwkJaW50c3JjLT5idXNfaXJxID09IDAgJiYgaW50c3JjLT5nbG9iYWxfaXJxID09IDIpIHsKKwkJCXByaW50ayhQUkVGSVggIkJJT1MgSVJRMCBwaW4yIG92ZXJyaWRlIGlnbm9yZWQuXG4iKTsKKwkJCXJldHVybiAwOworCX0KKworCW1wX292ZXJyaWRlX2xlZ2FjeV9pcnEgKAorCQlpbnRzcmMtPmJ1c19pcnEsCisJCWludHNyYy0+ZmxhZ3MucG9sYXJpdHksCisJCWludHNyYy0+ZmxhZ3MudHJpZ2dlciwKKwkJaW50c3JjLT5nbG9iYWxfaXJxKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX25taV9zcmMgKAorCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMgKm5taV9zcmMgPSBOVUxMOworCisJbm1pX3NyYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9ubWlfc3JjKikgaGVhZGVyOworCisJaWYgKEJBRF9NQURUX0VOVFJZKG5taV9zcmMsIGVuZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWNwaV90YWJsZV9wcmludF9tYWR0X2VudHJ5KGhlYWRlcik7CisKKwkvKiBUQkQ6IFN1cHBvcnQgbmltc3JjIGVudHJpZXM/ICovCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19YODZfSU9fQVBJQyAqLworCisjaWZkZWYJQ09ORklHX0FDUElfQlVTCisKKy8qCisgKiBhY3BpX3BpY19zY2lfc2V0X3RyaWdnZXIoKQorICogCisgKiB1c2UgRUxDUiB0byBzZXQgUElDLW1vZGUgdHJpZ2dlciB0eXBlIGZvciBTQ0kKKyAqCisgKiBJZiBhIFBJQy1tb2RlIFNDSSBpcyBub3QgcmVjb2duaXplZCBvciBnaXZlcyBzcHVyaW91cyBJUlE3J3MKKyAqIGl0IG1heSByZXF1aXJlIEVkZ2UgVHJpZ2dlciAtLSB1c2UgImFjcGlfc2NpPWVkZ2UiCisgKgorICogUG9ydCAweDRkMC00ZDEgYXJlIEVDTFIxIGFuZCBFQ0xSMiwgdGhlIEVkZ2UvTGV2ZWwgQ29udHJvbCBSZWdpc3RlcnMKKyAqIGZvciB0aGUgODI1OSBQSUMuICBiaXRbbl0gPSAxIG1lYW5zIGlycVtuXSBpcyBMZXZlbCwgb3RoZXJ3aXNlIEVkZ2UuCisgKiBFQ0xSMSBpcyBJUlEncyAwLTcgKElSUSAwLCAxLCAyIG11c3QgYmUgMCkKKyAqIEVDTFIyIGlzIElSUSdzIDgtMTUgKElSUSA4LCAxMyBtdXN0IGJlIDApCisgKi8KKwordm9pZCBfX2luaXQKK2FjcGlfcGljX3NjaV9zZXRfdHJpZ2dlcih1bnNpZ25lZCBpbnQgaXJxLCB1MTYgdHJpZ2dlcikKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgaXJxOworCXVuc2lnbmVkIGludCBvbGQsIG5ldzsKKworCS8qIFJlYWwgb2xkIEVMQ1IgbWFzayAqLworCW9sZCA9IGluYigweDRkMCkgfCAoaW5iKDB4NGQxKSA8PCA4KTsKKworCS8qCisJICogSWYgd2UgdXNlIEFDUEkgdG8gc2V0IFBDSSBpcnEncywgdGhlbiB3ZSBzaG91bGQgY2xlYXIgRUxDUgorCSAqIHNpbmNlIHdlIHdpbGwgc2V0IGl0IGNvcnJlY3RseSBhcyB3ZSBlbmFibGUgdGhlIFBDSSBpcnEKKwkgKiByb3V0aW5nLgorCSAqLworCW5ldyA9IGFjcGlfbm9pcnEgPyBvbGQgOiAwOworCisJLyoKKwkgKiBVcGRhdGUgU0NJIGluZm9ybWF0aW9uIGluIHRoZSBFTENSLCBpdCBpc24ndCBpbiB0aGUgUENJCisJICogcm91dGluZyB0YWJsZXMuLgorCSAqLworCXN3aXRjaCAodHJpZ2dlcikgeworCWNhc2UgMToJLyogRWRnZSAtIGNsZWFyICovCisJCW5ldyAmPSB+bWFzazsKKwkJYnJlYWs7CisJY2FzZSAzOiAvKiBMZXZlbCAtIHNldCAqLworCQluZXcgfD0gbWFzazsKKwkJYnJlYWs7CisJfQorCisJaWYgKG9sZCA9PSBuZXcpCisJCXJldHVybjsKKworCXByaW50ayhQUkVGSVggInNldHRpbmcgRUxDUiB0byAlMDR4IChmcm9tICUwNHgpXG4iLCBuZXcsIG9sZCk7CisJb3V0YihuZXcsIDB4NGQwKTsKKwlvdXRiKG5ldyA+PiA4LCAweDRkMSk7Cit9CisKKworI2VuZGlmIC8qIENPTkZJR19BQ1BJX0JVUyAqLworCitpbnQgYWNwaV9nc2lfdG9faXJxKHUzMiBnc2ksIHVuc2lnbmVkIGludCAqaXJxKQoreworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWlmICh1c2VfcGNpX3ZlY3RvcigpICYmICFwbGF0Zm9ybV9sZWdhY3lfaXJxKGdzaSkpCisgCQkqaXJxID0gSU9fQVBJQ19WRUNUT1IoZ3NpKTsKKwllbHNlCisjZW5kaWYKKwkJKmlycSA9IGdzaTsKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KQoreworCXVuc2lnbmVkIGludCBpcnE7CisJdW5zaWduZWQgaW50IHBsYXRfZ3NpID0gZ3NpOworCisjaWZkZWYgQ09ORklHX1BDSQorCS8qCisJICogTWFrZSBzdXJlIGFsbCAobGVnYWN5KSBQQ0kgSVJRcyBhcmUgc2V0IGFzIGxldmVsLXRyaWdnZXJlZC4KKwkgKi8KKwlpZiAoYWNwaV9pcnFfbW9kZWwgPT0gQUNQSV9JUlFfTU9ERUxfUElDKSB7CisJCWV4dGVybiB2b2lkIGVpc2Ffc2V0X2xldmVsX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworCQlpZiAoZWRnZV9sZXZlbCA9PSBBQ1BJX0xFVkVMX1NFTlNJVElWRSkKKwkJCQllaXNhX3NldF9sZXZlbF9pcnEoZ3NpKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWlmIChhY3BpX2lycV9tb2RlbCA9PSBBQ1BJX0lSUV9NT0RFTF9JT0FQSUMpIHsKKwkJcGxhdF9nc2kgPSBtcF9yZWdpc3Rlcl9nc2koZ3NpLCBlZGdlX2xldmVsLCBhY3RpdmVfaGlnaF9sb3cpOworCX0KKyNlbmRpZgorCWFjcGlfZ3NpX3RvX2lycShwbGF0X2dzaSwgJmlycSk7CisJcmV0dXJuIGlycTsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9yZWdpc3Rlcl9nc2kpOworCisvKgorICogIEFDUEkgYmFzZWQgaG90cGx1ZyBzdXBwb3J0IGZvciBDUFUKKyAqLworI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVCitpbnQKK2FjcGlfbWFwX2xzYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqcGNwdSkKK3sKKwkvKiBUQkQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9tYXBfbHNhcGljKTsKKworCitpbnQKK2FjcGlfdW5tYXBfbHNhcGljKGludCBjcHUpCit7CisJLyogVEJEICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfdW5tYXBfbHNhcGljKTsKKyNlbmRpZiAvKiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQKK2FjcGlfc2Nhbl9yc2RwICgKKwl1bnNpZ25lZCBsb25nCQlzdGFydCwKKwl1bnNpZ25lZCBsb25nCQlsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZwkJb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBsb25nCQlzaWdfbGVuID0gc2l6ZW9mKCJSU0QgUFRSICIpIC0gMTsKKworCS8qCisJICogU2NhbiBhbGwgMTYtYnl0ZSBib3VuZGFyaWVzIG9mIHRoZSBwaHlzaWNhbCBtZW1vcnkgcmVnaW9uIGZvciB0aGUKKwkgKiBSU0RQIHNpZ25hdHVyZS4KKwkgKi8KKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGxlbmd0aDsgb2Zmc2V0ICs9IDE2KSB7CisJCWlmIChzdHJuY21wKChjaGFyICopIChzdGFydCArIG9mZnNldCksICJSU0QgUFRSICIsIHNpZ19sZW4pKQorCQkJY29udGludWU7CisJCXJldHVybiAoc3RhcnQgKyBvZmZzZXQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX3NiZih1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX3NiZiAqc2I7CisKKwlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKKwlyZXR1cm4gLUVJTlZBTDsKKworCXNiID0gKHN0cnVjdCBhY3BpX3RhYmxlX3NiZiAqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXNfYWRkciwgc2l6ZSk7CisJaWYgKCFzYikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBTQkZcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzYmZfcG9ydCA9IHNiLT5zYmZfY21vczsgLyogU2F2ZSBDTU9TIHBvcnQgKi8KKworCXJldHVybiAwOworfQorCisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX2hwZXQodW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGFjcGlfdGFibGVfaHBldCAqaHBldF90Ymw7CisKKwlpZiAoIXBoeXMgfHwgIXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaHBldF90YmwgPSAoc3RydWN0IGFjcGlfdGFibGVfaHBldCAqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXMsIHNpemUpOworCWlmICghaHBldF90YmwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgSFBFVFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChocGV0X3RibC0+YWRkci5zcGFjZV9pZCAhPSBBQ1BJX1NQQUNFX01FTSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiSFBFVCB0aW1lcnMgbXVzdCBiZSBsb2NhdGVkIGluICIKKwkJICAgICAgICJtZW1vcnkuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmCUNPTkZJR19YODZfNjQKKyAgICAgICAgdnh0aW1lLmhwZXRfYWRkcmVzcyA9IGhwZXRfdGJsLT5hZGRyLmFkZHJsIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIGhwZXRfdGJsLT5hZGRyLmFkZHJoIDw8IDMyKTsKKworICAgICAgICBwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSFBFVCBpZDogJSN4IGJhc2U6ICUjbHhcbiIsCisgICAgICAgICAgICAgICBocGV0X3RibC0+aWQsIHZ4dGltZS5ocGV0X2FkZHJlc3MpOworI2Vsc2UJLyogWDg2ICovCisJeworCQlleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7CisKKwkJaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHIuYWRkcmw7CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJIUEVUIGlkOiAlI3ggYmFzZTogJSNseFxuIiwKKwkJCWhwZXRfdGJsLT5pZCwgaHBldF9hZGRyZXNzKTsKKwl9CisjZW5kaWYJLyogWDg2ICovCisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lCWFjcGlfcGFyc2VfaHBldAlOVUxMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKK2V4dGVybiB1MzIgcG10bXJfaW9wb3J0OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfZmFkdCh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKmZhZHQgPSBOVUxMOworCisJZmFkdCA9IChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIqKSBfX2FjcGlfbWFwX3RhYmxlKHBoeXMsc2l6ZSk7CisJaWYoIWZhZHQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgRkFEVFxuIik7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmCUNPTkZJR19BQ1BJX0lOVEVSUFJFVEVSCisJLyogaW5pdGlhbGl6ZSBzY2lfaW50IGVhcmx5IGZvciBJTlRfU1JDX09WUiBNQURUIHBhcnNpbmcgKi8KKwlhY3BpX2ZhZHQuc2NpX2ludCA9IGZhZHQtPnNjaV9pbnQ7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKKwkvKiBkZXRlY3QgdGhlIGxvY2F0aW9uIG9mIHRoZSBBQ1BJIFBNIFRpbWVyICovCisJaWYgKGZhZHQtPnJldmlzaW9uID49IEZBRFQyX1JFVklTSU9OX0lEKSB7CisJCS8qIEZBRFQgcmV2LiAyICovCisJCWlmIChmYWR0LT54cG1fdG1yX2Jsay5hZGRyZXNzX3NwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykKKwkJCXJldHVybiAwOworCisJCXBtdG1yX2lvcG9ydCA9IGZhZHQtPnhwbV90bXJfYmxrLmFkZHJlc3M7CisJfSBlbHNlIHsKKwkJLyogRkFEVCByZXYuIDEgKi8KKwkJcG10bXJfaW9wb3J0ID0gZmFkdC0+VjFfcG1fdG1yX2JsazsKKwl9CisJaWYgKHBtdG1yX2lvcG9ydCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlBNLVRpbWVyIElPIFBvcnQ6ICUjeFxuIiwgcG10bXJfaW9wb3J0KTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3Vuc2lnbmVkIGxvbmcgX19pbml0CithY3BpX2ZpbmRfcnNkcCAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nCQlyc2RwX3BoeXMgPSAwOworCisJaWYgKGVmaV9lbmFibGVkKSB7CisJCWlmIChlZmkuYWNwaTIwKQorCQkJcmV0dXJuIF9fcGEoZWZpLmFjcGkyMCk7CisJCWVsc2UgaWYgKGVmaS5hY3BpKQorCQkJcmV0dXJuIF9fcGEoZWZpLmFjcGkpOworCX0KKwkvKgorCSAqIFNjYW4gbWVtb3J5IGxvb2tpbmcgZm9yIHRoZSBSU0RQIHNpZ25hdHVyZS4gRmlyc3Qgc2VhcmNoIEVCREEgKGxvdworCSAqIG1lbW9yeSkgcGFyYWdyYXBocyBhbmQgdGhlbiBzZWFyY2ggdXBwZXIgbWVtb3J5IChFMDAwMC1GRkZGRikuCisJICovCisJcnNkcF9waHlzID0gYWNwaV9zY2FuX3JzZHAgKDAsIDB4NDAwKTsKKwlpZiAoIXJzZHBfcGh5cykKKwkJcnNkcF9waHlzID0gYWNwaV9zY2FuX3JzZHAgKDB4RTAwMDAsIDB4RkZGRkYpOworCisJcmV0dXJuIHJzZHBfcGh5czsKK30KKworI2lmZGVmCUNPTkZJR19YODZfTE9DQUxfQVBJQworLyoKKyAqIFBhcnNlIExBUElDIGVudHJpZXMgaW4gTUFEVAorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwgMCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faW5pdAorYWNwaV9wYXJzZV9tYWR0X2xhcGljX2VudHJpZXModm9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwkvKiAKKwkgKiBOb3RlIHRoYXQgdGhlIExBUElDIGFkZHJlc3MgaXMgb2J0YWluZWQgZnJvbSB0aGUgTUFEVCAoMzItYml0IHZhbHVlKQorCSAqIGFuZCAob3B0aW9uYWxseSkgb3ZlcnJpZGVuIGJ5IGEgTEFQSUNfQUREUl9PVlIgZW50cnkgKDY0LWJpdCB2YWx1ZSkuCisJICovCisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTEFQSUNfQUREUl9PVlIsIGFjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIsIDApOworCWlmIChjb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBhZGRyZXNzIG92ZXJyaWRlIGVudHJ5XG4iKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCW1wX3JlZ2lzdGVyX2xhcGljX2FkZHJlc3MoYWNwaV9sYXBpY19hZGRyKTsKKworCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MQVBJQywgYWNwaV9wYXJzZV9sYXBpYywKKwkJCQkgICAgICAgTUFYX0FQSUNTKTsKKwlpZiAoIWNvdW50KSB7IAorCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJObyBMQVBJQyBlbnRyaWVzIHByZXNlbnRcbiIpOworCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCisJCXJldHVybiAtRU5PREVWOworCX0KKwllbHNlIGlmIChjb3VudCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBlbnRyeVxuIik7CisJCS8qIFRCRDogQ2xlYW51cCB0byBhbGxvdyBmYWxsYmFjayB0byBNUFMgKi8KKwkJcmV0dXJuIGNvdW50OworCX0KKworCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MQVBJQ19OTUksIGFjcGlfcGFyc2VfbGFwaWNfbm1pLCAwKTsKKwlpZiAoY291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTEFQSUMgTk1JIGVudHJ5XG4iKTsKKwkJLyogVEJEOiBDbGVhbnVwIHRvIGFsbG93IGZhbGxiYWNrIHRvIE1QUyAqLworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19YODZfTE9DQUxfQVBJQyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX0FDUElfSU5URVJQUkVURVIpCisvKgorICogUGFyc2UgSU9BUElDIHJlbGF0ZWQgZW50cmllcyBpbiBNQURUCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPCAwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CithY3BpX3BhcnNlX21hZHRfaW9hcGljX2VudHJpZXModm9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwkvKgorCSAqIEFDUEkgaW50ZXJwcmV0ZXIgaXMgcmVxdWlyZWQgdG8gY29tcGxldGUgaW50ZXJydXB0IHNldHVwLAorCSAqIHNvIGlmIGl0IGlzIG9mZiwgZG9uJ3QgZW51bWVyYXRlIHRoZSBpby1hcGljcyB3aXRoIEFDUEkuCisJICogSWYgTVBTIGlzIHByZXNlbnQsIGl0IHdpbGwgaGFuZGxlIHRoZW0sCisJICogb3RoZXJ3aXNlIHRoZSBzeXN0ZW0gd2lsbCBzdGF5IGluIFBJQyBtb2RlCisJICovCisJaWYgKGFjcGlfZGlzYWJsZWQgfHwgYWNwaV9ub2lycSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfQorCisJLyoKKyAJICogaWYgIm5vYXBpYyIgYm9vdCBvcHRpb24sIGRvbid0IGxvb2sgZm9yIElPLUFQSUNzCisJICovCisJaWYgKHNraXBfaW9hcGljX3NldHVwKSB7CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJTa2lwcGluZyBJT0FQSUMgcHJvYmUgIgorCQkJImR1ZSB0byAnbm9hcGljJyBvcHRpb24uXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0lPQVBJQywgYWNwaV9wYXJzZV9pb2FwaWMsIE1BWF9JT19BUElDUyk7CisJaWYgKCFjb3VudCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJObyBJT0FQSUMgZW50cmllcyBwcmVzZW50XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWVsc2UgaWYgKGNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBwYXJzaW5nIElPQVBJQyBlbnRyeVxuIik7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfSU5UX1NSQ19PVlIsIGFjcGlfcGFyc2VfaW50X3NyY19vdnIsIE5SX0lSUV9WRUNUT1JTKTsKKwlpZiAoY291bnQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgaW50ZXJydXB0IHNvdXJjZSBvdmVycmlkZXMgZW50cnlcbiIpOworCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKgorCSAqIElmIEJJT1MgZGlkIG5vdCBzdXBwbHkgYW4gSU5UX1NSQ19PVlIgZm9yIHRoZSBTQ0kKKwkgKiBwcmV0ZW5kIHdlIGdvdCBvbmUgc28gd2UgY2FuIHNldCB0aGUgU0NJIGZsYWdzLgorCSAqLworCWlmICghYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpKQorCQlhY3BpX3NjaV9pb2FwaWNfc2V0dXAoYWNwaV9mYWR0LnNjaV9pbnQsIDAsIDApOworCisJLyogRmlsbCBpbiBpZGVudGl0eSBsZWdhY3kgbWFwaW5ncyB3aGVyZSBubyBvdmVycmlkZSAqLworCW1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzKCk7CisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTk1JX1NSQywgYWNwaV9wYXJzZV9ubWlfc3JjLCBOUl9JUlFfVkVDVE9SUyk7CisJaWYgKGNvdW50IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBwYXJzaW5nIE5NSSBTUkMgZW50cnlcbiIpOworCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCisJCXJldHVybiBjb3VudDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBhY3BpX3BhcnNlX21hZHRfaW9hcGljX2VudHJpZXModm9pZCkKK3sKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYgLyogIShDT05GSUdfWDg2X0lPX0FQSUMgJiYgQ09ORklHX0FDUElfSU5URVJQUkVURVIpICovCisKKworc3RhdGljIHZvaWQgX19pbml0CithY3BpX3Byb2Nlc3NfbWFkdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCWludCBjb3VudCwgZXJyb3I7CisKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2UoQUNQSV9BUElDLCBhY3BpX3BhcnNlX21hZHQpOworCWlmIChjb3VudCA+PSAxKSB7CisKKwkJLyoKKwkJICogUGFyc2UgTUFEVCBMQVBJQyBlbnRyaWVzCisJCSAqLworCQllcnJvciA9IGFjcGlfcGFyc2VfbWFkdF9sYXBpY19lbnRyaWVzKCk7CisJCWlmICghZXJyb3IpIHsKKwkJCWFjcGlfbGFwaWMgPSAxOworCisJCQkvKgorCQkJICogUGFyc2UgTUFEVCBJTy1BUElDIGVudHJpZXMKKwkJCSAqLworCQkJZXJyb3IgPSBhY3BpX3BhcnNlX21hZHRfaW9hcGljX2VudHJpZXMoKTsKKwkJCWlmICghZXJyb3IpIHsKKwkJCQlhY3BpX2lycV9tb2RlbCA9IEFDUElfSVJRX01PREVMX0lPQVBJQzsKKwkJCQlhY3BpX2lycV9iYWxhbmNlX3NldChOVUxMKTsKKwkJCQlhY3BpX2lvYXBpYyA9IDE7CisKKwkJCQlzbXBfZm91bmRfY29uZmlnID0gMTsKKwkJCQljbHVzdGVyZWRfYXBpY19jaGVjaygpOworCQkJfQorCQl9CisJCWlmIChlcnJvciA9PSAtRUlOVkFMKSB7CisJCQkvKgorCQkJICogRGVsbCBQcmVjaXNpb24gV29ya3N0YXRpb24gNDEwLCA2MTAgY29tZSBoZXJlLgorCQkJICovCisJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJJbnZhbGlkIEJJT1MgTUFEVCwgZGlzYWJsaW5nIEFDUElcbiIpOworCQkJZGlzYWJsZV9hY3BpKCk7CisJCX0KKwl9CisjZW5kaWYKKwlyZXR1cm47Cit9CisKKy8qCisgKiBhY3BpX2Jvb3RfdGFibGVfaW5pdCgpIGFuZCBhY3BpX2Jvb3RfaW5pdCgpCisgKiAgY2FsbGVkIGZyb20gc2V0dXBfYXJjaCgpLCBhbHdheXMuCisgKgkxLiBjaGVja3N1bXMgYWxsIHRhYmxlcworICoJMi4gZW51bWVyYXRlcyBsYXBpY3MKKyAqCTMuIGVudW1lcmF0ZXMgaW8tYXBpY3MKKyAqCisgKiBhY3BpX3RhYmxlX2luaXQoKSBpcyBzZXBhcmF0ZSB0byBhbGxvdyByZWFkaW5nIFNSQVQgd2l0aG91dAorICogb3RoZXIgc2lkZSBlZmZlY3RzLgorICoKKyAqIHNpZGUgZWZmZWN0cyBvZiBhY3BpX2Jvb3RfaW5pdDoKKyAqCWFjcGlfbGFwaWMgPSAxIGlmIExBUElDIGZvdW5kCisgKglhY3BpX2lvYXBpYyA9IDEgaWYgSU9BUElDIGZvdW5kCisgKglpZiAoYWNwaV9sYXBpYyAmJiBhY3BpX2lvYXBpYykgc21wX2ZvdW5kX2NvbmZpZyA9IDE7CisgKglpZiBhY3BpX2JsYWNrbGlzdGVkKCkgYWNwaV9kaXNhYmxlZCA9IDE7CisgKglhY3BpX2lycV9tb2RlbD0uLi4KKyAqCS4uLgorICoKKyAqIHJldHVybiB2YWx1ZTogKGN1cnJlbnRseSBpZ25vcmVkKQorICoJMDogc3VjY2VzcworICoJITA6IGZhaWx1cmUKKyAqLworCitpbnQgX19pbml0CithY3BpX2Jvb3RfdGFibGVfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCS8qCisJICogSWYgYWNwaV9kaXNhYmxlZCwgYmFpbCBvdXQKKwkgKiBPbmUgZXhjZXB0aW9uOiBhY3BpPWh0IGNvbnRpbnVlcyBmYXIgZW5vdWdoIHRvIGVudW1lcmF0ZSBMQVBJQ3MKKwkgKi8KKwlpZiAoYWNwaV9kaXNhYmxlZCAmJiAhYWNwaV9odCkKKwkJIHJldHVybiAxOworCisJLyogCisJICogSW5pdGlhbGl6ZSB0aGUgQUNQSSBib290LXRpbWUgdGFibGUgcGFyc2VyLgorCSAqLworCWVycm9yID0gYWNwaV90YWJsZV9pbml0KCk7CisJaWYgKGVycm9yKSB7CisJCWRpc2FibGVfYWNwaSgpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisjaWZkZWYgX19pMzg2X18KKwljaGVja19hY3BpX3BjaSgpOworI2VuZGlmCisKKwlhY3BpX3RhYmxlX3BhcnNlKEFDUElfQk9PVCwgYWNwaV9wYXJzZV9zYmYpOworCisJLyoKKwkgKiBibGFja2xpc3QgbWF5IGRpc2FibGUgQUNQSSBlbnRpcmVseQorCSAqLworCWVycm9yID0gYWNwaV9ibGFja2xpc3RlZCgpOworCWlmIChlcnJvcikgeworCQlleHRlcm4gaW50IGFjcGlfZm9yY2U7CisKKwkJaWYgKGFjcGlfZm9yY2UpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJhY3BpPWZvcmNlIG92ZXJyaWRlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJEaXNhYmxpbmcgQUNQSSBzdXBwb3J0XG4iKTsKKwkJCWRpc2FibGVfYWNwaSgpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IF9faW5pdCBhY3BpX2Jvb3RfaW5pdCh2b2lkKQoreworCS8qCisJICogSWYgYWNwaV9kaXNhYmxlZCwgYmFpbCBvdXQKKwkgKiBPbmUgZXhjZXB0aW9uOiBhY3BpPWh0IGNvbnRpbnVlcyBmYXIgZW5vdWdoIHRvIGVudW1lcmF0ZSBMQVBJQ3MKKwkgKi8KKwlpZiAoYWNwaV9kaXNhYmxlZCAmJiAhYWNwaV9odCkKKwkJIHJldHVybiAxOworCisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX0JPT1QsIGFjcGlfcGFyc2Vfc2JmKTsKKworCS8qCisJICogc2V0IHNjaV9pbnQgYW5kIFBNIHRpbWVyIGFkZHJlc3MKKwkgKi8KKwlhY3BpX3RhYmxlX3BhcnNlKEFDUElfRkFEVCwgYWNwaV9wYXJzZV9mYWR0KTsKKworCS8qCisJICogUHJvY2VzcyB0aGUgTXVsdGlwbGUgQVBJQyBEZXNjcmlwdGlvbiBUYWJsZSAoTUFEVCksIGlmIHByZXNlbnQKKwkgKi8KKwlhY3BpX3Byb2Nlc3NfbWFkdCgpOworCisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX0hQRVQsIGFjcGlfcGFyc2VfaHBldCk7CisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX01DRkcsIGFjcGlfcGFyc2VfbWNmZyk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2YTVjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKQEAgLTAsMCArMSw1MSBAQAorLyogCisgKiBEbyBlYXJseSBQQ0kgcHJvYmluZyBmb3IgYnVnIGRldGVjdGlvbiB3aGVuIHRoZSBtYWluIFBDSSBzdWJzeXN0ZW0gaXMgCisgKiBub3QgdXAgeWV0LgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktZGlyZWN0Lmg+CisjaW5jbHVkZSA8YXNtL2FjcGkuaD4KKworc3RhdGljIGludCBfX2luaXQgY2hlY2tfYnJpZGdlKGludCB2ZW5kb3IsIGludCBkZXZpY2UpIAoreworCS8qIEFjY29yZGluZyB0byBOdmlkaWEgYWxsIHRpbWVyIG92ZXJyaWRlcyBhcmUgYm9ndXMuIEp1c3QgaWdub3JlCisJICAgdGhlbSBhbGwuICovCisJaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05WSURJQSkgeyAKKwkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsgCQkKKwl9CisJcmV0dXJuIDA7Cit9CisgICAKK3ZvaWQgX19pbml0IGNoZWNrX2FjcGlfcGNpKHZvaWQpIAoreyAKKwlpbnQgbnVtLHNsb3QsZnVuYzsgCisKKwkvKiBBc3N1bWUgdGhlIG1hY2hpbmUgc3VwcG9ydHMgdHlwZSAxLiBJZiBub3QgaXQgd2lsbCAKKwkgICBhbHdheXMgcmVhZCBmZmZmZmZmZiBhbmQgc2hvdWxkIG5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdC4gKi8KKworCS8qIFBvb3IgbWFuJ3MgUENJIGRpc2NvdmVyeSAqLworCWZvciAobnVtID0gMDsgbnVtIDwgMzI7IG51bSsrKSB7IAorCQlmb3IgKHNsb3QgPSAwOyBzbG90IDwgMzI7IHNsb3QrKykgeyAKKwkJCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCA4OyBmdW5jKyspIHsgCisJCQkJdTMyIGNsYXNzOworCQkJCXUzMiB2ZW5kb3I7CisJCQkJY2xhc3MgPSByZWFkX3BjaV9jb25maWcobnVtLHNsb3QsZnVuYywKKwkJCQkJCQlQQ0lfQ0xBU1NfUkVWSVNJT04pOworCQkJCWlmIChjbGFzcyA9PSAweGZmZmZmZmZmKQorCQkJCQlicmVhazsgCisKKwkJCQlpZiAoKGNsYXNzID4+IDE2KSAhPSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkKKwkJCQkJY29udGludWU7IAorCQkJCQorCQkJCXZlbmRvciA9IHJlYWRfcGNpX2NvbmZpZyhudW0sIHNsb3QsIGZ1bmMsIAorCQkJCQkJCSBQQ0lfVkVORE9SX0lEKTsKKwkJCQkKKwkJCQlpZiAoY2hlY2tfYnJpZGdlKHZlbmRvciYweGZmZmYsIHZlbmRvciA+PiAxNikpCisJCQkJCXJldHVybjsgCisJCQl9IAorCQkJCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmIwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYwpAQCAtMCwwICsxLDkzIEBACisvKgorICogc2xlZXAuYyAtIHg4Ni1zcGVjaWZpYyBBQ1BJIHNsZWVwIHN1cHBvcnQuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFBhdHJpY2sgTW9jaGVsCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworLyogYWRkcmVzcyBpbiBsb3cgbWVtb3J5IG9mIHRoZSB3YWtldXAgcm91dGluZS4gKi8KK3Vuc2lnbmVkIGxvbmcgYWNwaV93YWtldXBfYWRkcmVzcyA9IDA7Cit1bnNpZ25lZCBsb25nIGFjcGlfdmlkZW9fZmxhZ3M7CitleHRlcm4gY2hhciB3YWtldXBfc3RhcnQsIHdha2V1cF9lbmQ7CisKK2V4dGVybiB2b2lkIHphcF9sb3dfbWFwcGluZ3Modm9pZCk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIEZBU1RDQUxMKGFjcGlfY29weV93YWtldXBfcm91dGluZSh1bnNpZ25lZCBsb25nKSk7CisKK3N0YXRpYyB2b2lkIGluaXRfbG93X21hcHBpbmcocGdkX3QgKnBnZCwgaW50IHBnZF9saW1pdCkKK3sKKwlpbnQgcGdkX29mcyA9IDA7CisKKwl3aGlsZSAoKHBnZF9vZnMgPCBwZ2RfbGltaXQpICYmIChwZ2Rfb2ZzICsgVVNFUl9QVFJTX1BFUl9QR0QgPCBQVFJTX1BFUl9QR0QpKSB7CisJCXNldF9wZ2QocGdkLCAqKHBnZCtVU0VSX1BUUlNfUEVSX1BHRCkpOworCQlwZ2Rfb2ZzKyssIHBnZCsrOworCX0KKwlmbHVzaF90bGJfYWxsKCk7Cit9CisKKy8qKgorICogYWNwaV9zYXZlX3N0YXRlX21lbSAtIHNhdmUga2VybmVsIHN0YXRlCisgKgorICogQ3JlYXRlIGFuIGlkZW50aXR5IG1hcHBlZCBwYWdlIHRhYmxlIGFuZCBjb3B5IHRoZSB3YWtldXAgcm91dGluZSB0bworICogbG93IG1lbW9yeS4KKyAqLworaW50IGFjcGlfc2F2ZV9zdGF0ZV9tZW0gKHZvaWQpCit7CisJaWYgKCFhY3BpX3dha2V1cF9hZGRyZXNzKQorCQlyZXR1cm4gMTsKKwlpbml0X2xvd19tYXBwaW5nKHN3YXBwZXJfcGdfZGlyLCBVU0VSX1BUUlNfUEVSX1BHRCk7CisJbWVtY3B5KCh2b2lkICopIGFjcGlfd2FrZXVwX2FkZHJlc3MsICZ3YWtldXBfc3RhcnQsICZ3YWtldXBfZW5kIC0gJndha2V1cF9zdGFydCk7CisJYWNwaV9jb3B5X3dha2V1cF9yb3V0aW5lKGFjcGlfd2FrZXVwX2FkZHJlc3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhY3BpX3Jlc3RvcmVfc3RhdGUgLSB1bmRvIGVmZmVjdHMgb2YgYWNwaV9zYXZlX3N0YXRlX21lbQorICovCit2b2lkIGFjcGlfcmVzdG9yZV9zdGF0ZV9tZW0gKHZvaWQpCit7CisJemFwX2xvd19tYXBwaW5ncygpOworfQorCisvKioKKyAqIGFjcGlfcmVzZXJ2ZV9ib290bWVtIC0gZG8gX3ZlcnlfIGVhcmx5IEFDUEkgaW5pdGlhbGlzYXRpb24KKyAqCisgKiBXZSBhbGxvY2F0ZSBhIHBhZ2UgZnJvbSB0aGUgZmlyc3QgMU1CIG9mIG1lbW9yeSBmb3IgdGhlIHdha2V1cAorICogcm91dGluZSBmb3Igd2hlbiB3ZSBjb21lIGJhY2sgZnJvbSBhIHNsZWVwIHN0YXRlLiBUaGUKKyAqIHJ1bnRpbWUgYWxsb2NhdG9yIGFsbG93cyBzcGVjaWZpY2F0aW9uIG9mIDwxNk1CIHBhZ2VzLCBidXQgbm90CisgKiA8MU1CIHBhZ2VzLgorICovCit2b2lkIF9faW5pdCBhY3BpX3Jlc2VydmVfYm9vdG1lbSh2b2lkKQoreworCWlmICgoJndha2V1cF9lbmQgLSAmd2FrZXVwX3N0YXJ0KSA+IFBBR0VfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIkFDUEk6IFdha2V1cCBjb2RlIHdheSB0b28gYmlnLCBTMyBkaXNhYmxlZC5cbiIpOworCQlyZXR1cm47CisJfQorCisJYWNwaV93YWtldXBfYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWFsbG9jX2Jvb3RtZW1fbG93KFBBR0VfU0laRSk7CisJaWYgKCFhY3BpX3dha2V1cF9hZGRyZXNzKQorCQlwcmludGsoS0VSTl9FUlIgIkFDUEk6IENhbm5vdCBhbGxvY2F0ZSBsb3dtZW0sIFMzIGRpc2FibGVkLlxuIik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfc2xlZXBfc2V0dXAoY2hhciAqc3RyKQoreworCXdoaWxlICgoc3RyICE9IE5VTEwpICYmICgqc3RyICE9ICdcMCcpKSB7CisJCWlmIChzdHJuY21wKHN0ciwgInMzX2Jpb3MiLCA3KSA9PSAwKQorCQkJYWNwaV92aWRlb19mbGFncyA9IDE7CisJCWlmIChzdHJuY21wKHN0ciwgInMzX21vZGUiLCA3KSA9PSAwKQorCQkJYWNwaV92aWRlb19mbGFncyB8PSAyOworCQlzdHIgPSBzdHJjaHIoc3RyLCAnLCcpOworCQlpZiAoc3RyICE9IE5VTEwpCisJCQlzdHIgKz0gc3Ryc3BuKHN0ciwgIiwgXHQiKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworX19zZXR1cCgiYWNwaV9zbGVlcD0iLCBhY3BpX3NsZWVwX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQzMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3dha2V1cC5TCkBAIC0wLDAgKzEsMzE4IEBACisudGV4dAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyMKKyMgd2FrZXVwX2NvZGUgcnVucyBpbiByZWFsIG1vZGUsIGFuZCBhdCB1bmtub3duIGFkZHJlc3MgKGRldGVybWluZWQgYXQgcnVuLXRpbWUpLgorIyBUaGVyZWZvcmUgaXQgbXVzdCBvbmx5IHVzZSByZWxhdGl2ZSBqdW1wcy9jYWxscy4gCisjCisjIERvIHdlIG5lZWQgdG8gZGVhbCB3aXRoIEEyMD8gSXQgaXMgb2theTogQUNQSSBzcGVjcyBzYXlzIEEyMCBtdXN0IGJlIGVuYWJsZWQKKyMKKyMgSWYgcGh5c2ljYWwgYWRkcmVzcyBvZiB3YWtldXBfY29kZSBpcyAweDEyMzQ1LCBCSU9TIHNob3VsZCBjYWxsIHVzIHdpdGgKKyMgY3MgPSAweDEyMzQsIGVpcCA9IDB4MDUKKyMgCisKK0FMSUdOCisJLmFsaWduCTQwOTYKK0VOVFJZKHdha2V1cF9zdGFydCkKK3dha2V1cF9jb2RlOgorCXdha2V1cF9jb2RlX3N0YXJ0ID0gLgorCS5jb2RlMTYKKworIAltb3Z3CSQweGI4MDAsICVheAorCW1vdncJJWF4LCVmcworCW1vdncJJDB4MGUwMCArICdMJywgJWZzOigweDEwKQorCisJY2xpCisJY2xkCisKKwkjIHNldHVwIGRhdGEgc2VnbWVudAorCW1vdncJJWNzLCAlYXgKKwltb3Z3CSVheCwgJWRzCQkJCQkjIE1ha2UgZHM6MCBwb2ludCB0byB3YWtldXBfc3RhcnQKKwltb3Z3CSVheCwgJXNzCisJbW92CSQod2FrZXVwX3N0YWNrIC0gd2FrZXVwX2NvZGUpLCAlc3AJCSMgUHJpdmF0ZSBzdGFjayBpcyBuZWVkZWQgZm9yIEFTVVMgYm9hcmQKKwltb3Z3CSQweDBlMDAgKyAnUycsICVmczooMHgxMikKKworCXB1c2hsCSQwCQkJCQkJIyBLaWxsIGFueSBkYW5nZXJvdXMgZmxhZ3MKKwlwb3BmbAorCisJbW92bAlyZWFsX21hZ2ljIC0gd2FrZXVwX2NvZGUsICVlYXgKKwljbXBsCSQweDEyMzQ1Njc4LCAlZWF4CisJam5lCWJvZ3VzX3JlYWxfbWFnaWMKKworCXRlc3RsCSQxLCB2aWRlb19mbGFncyAtIHdha2V1cF9jb2RlCisJanoJMWYKKwlsY2FsbCAgICQweGMwMDAsJDMKKwltb3Z3CSVjcywgJWF4CisJbW92dwklYXgsICVkcwkJCQkJIyBCaW9zIG1pZ2h0IGhhdmUgcGxheWVkIHdpdGggdGhhdAorCW1vdncJJWF4LCAlc3MKKzE6CisKKwl0ZXN0bAkkMiwgdmlkZW9fZmxhZ3MgLSB3YWtldXBfY29kZQorCWp6CTFmCisJbW92CXZpZGVvX21vZGUgLSB3YWtldXBfY29kZSwgJWF4CisJY2FsbAltb2RlX3NldAorMToKKworCSMgc2V0IHVwIHBhZ2UgdGFibGUKKwltb3ZsCSRzd2FwcGVyX3BnX2Rpci1fX1BBR0VfT0ZGU0VULCAlZWF4CisJbW92bAklZWF4LCAlY3IzCisKKwl0ZXN0bAkkMSwgcmVhbF9lZmVyX3NhdmVfcmVzdG9yZSAtIHdha2V1cF9jb2RlCisJanoJNGYKKwkjIHJlc3RvcmUgZWZlciBzZXR0aW5nCisJbW92bAlyZWFsX3NhdmVfZWZlcl9lZHggLSB3YWtldXBfY29kZSwgJWVkeAorCW1vdmwJcmVhbF9zYXZlX2VmZXJfZWF4IC0gd2FrZXVwX2NvZGUsICVlYXgKKwltb3YgICAgICQweGMwMDAwMDgwLCAlZWN4CisJd3Jtc3IKKzQ6CisJIyBtYWtlIHN1cmUgJWNyNCBpcyBzZXQgY29ycmVjdGx5IChmZWF0dXJlcywgZXRjKQorCW1vdmwJcmVhbF9zYXZlX2NyNCAtIHdha2V1cF9jb2RlLCAlZWF4CisJbW92bAklZWF4LCAlY3I0CisJbW92dwkkMHhiODAwLCAlYXgKKwltb3Z3CSVheCwlZnMKKwltb3Z3CSQweDBlMDAgKyAnaScsICVmczooMHgxMikKKwkKKwkjIG5lZWQgYSBnZHQKKwlsZ2R0CXJlYWxfc2F2ZV9nZHQgLSB3YWtldXBfY29kZQorCisJbW92bAlyZWFsX3NhdmVfY3IwIC0gd2FrZXVwX2NvZGUsICVlYXgKKwltb3ZsCSVlYXgsICVjcjAKKwlqbXAgMWYKKzE6CisJbW92dwkkMHgwZTAwICsgJ24nLCAlZnM6KDB4MTQpCisKKwltb3ZsCXJlYWxfbWFnaWMgLSB3YWtldXBfY29kZSwgJWVheAorCWNtcGwJJDB4MTIzNDU2NzgsICVlYXgKKwlqbmUJYm9ndXNfcmVhbF9tYWdpYworCisJbGptcGwJJF9fS0VSTkVMX0NTLCR3YWtldXBfcG1vZGVfcmV0dXJuCisKK3JlYWxfc2F2ZV9nZHQ6CS53b3JkIDAKKwkJLmxvbmcgMAorcmVhbF9zYXZlX2NyMDoJLmxvbmcgMAorcmVhbF9zYXZlX2NyMzoJLmxvbmcgMAorcmVhbF9zYXZlX2NyNDoJLmxvbmcgMAorcmVhbF9tYWdpYzoJLmxvbmcgMAordmlkZW9fbW9kZToJLmxvbmcgMAordmlkZW9fZmxhZ3M6CS5sb25nIDAKK3JlYWxfZWZlcl9zYXZlX3Jlc3RvcmU6CS5sb25nIDAKK3JlYWxfc2F2ZV9lZmVyX2VkeDogCS5sb25nIDAKK3JlYWxfc2F2ZV9lZmVyX2VheDogCS5sb25nIDAKKworYm9ndXNfcmVhbF9tYWdpYzoKKwltb3Z3CSQweDBlMDAgKyAnQicsICVmczooMHgxMikKKwlqbXAgYm9ndXNfcmVhbF9tYWdpYworCisvKiBUaGlzIGNvZGUgdXNlcyBhbiBleHRlbmRlZCBzZXQgb2YgdmlkZW8gbW9kZSBudW1iZXJzLiBUaGVzZSBpbmNsdWRlOgorICogQWxpYXNlcyBmb3Igc3RhbmRhcmQgbW9kZXMKKyAqCU5PUk1BTF9WR0EgKC0xKQorICoJRVhURU5ERURfVkdBICgtMikKKyAqCUFTS19WR0EgKC0zKQorICogVmlkZW8gbW9kZXMgbnVtYmVyZWQgYnkgbWVudSBwb3NpdGlvbiAtLSBOT1QgUkVDT01NRU5ERUQgYmVjYXVzZSBvZiBsYWNrCisgKiBvZiBjb21wYXRpYmlsaXR5IHdoZW4gZXh0ZW5kaW5nIHRoZSB0YWJsZS4gVGhlc2UgYXJlIGJldHdlZW4gMHgwMCBhbmQgMHhmZi4KKyAqLworI2RlZmluZSBWSURFT19GSVJTVF9NRU5VIDB4MDAwMAorCisvKiBTdGFuZGFyZCBCSU9TIHZpZGVvIG1vZGVzIChCSU9TIG51bWJlciArIDB4MDEwMCkgKi8KKyNkZWZpbmUgVklERU9fRklSU1RfQklPUyAweDAxMDAKKworLyogVkVTQSBCSU9TIHZpZGVvIG1vZGVzIChWRVNBIG51bWJlciArIDB4MDIwMCkgKi8KKyNkZWZpbmUgVklERU9fRklSU1RfVkVTQSAweDAyMDAKKworLyogVmlkZW83IHNwZWNpYWwgbW9kZXMgKEJJT1MgbnVtYmVyICsgMHgwOTAwKSAqLworI2RlZmluZSBWSURFT19GSVJTVF9WNyAweDA5MDAKKworIyBTZXR0aW5nIG9mIHVzZXIgbW9kZSAoQVg9bW9kZSBJRCkgPT4gQ0Y9c3VjY2VzcworbW9kZV9zZXQ6CisJbW92dwklYXgsICVieAorI2lmIDAKKwljbXBiCSQweGZmLCAlYWgKKwlqeglzZXRhbGlhcworCisJdGVzdGIJJFZJREVPX1JFQ0FMQz4+OCwgJWFoCisJam56CV9zZXRyZWMKKworCWNtcGIJJFZJREVPX0ZJUlNUX1JFU09MVVRJT04+PjgsICVhaAorCWpuYwlzZXRyZXMKKwkKKwljbXBiCSRWSURFT19GSVJTVF9TUEVDSUFMPj44LCAlYWgKKwlqeglzZXRzcGMKKworCWNtcGIJJFZJREVPX0ZJUlNUX1Y3Pj44LCAlYWgKKwlqeglzZXR2NworI2VuZGlmCisJCisJY21wYgkkVklERU9fRklSU1RfVkVTQT4+OCwgJWFoCisJam5jCWNoZWNrX3Zlc2EKKyNpZiAwCQorCW9yYgklYWgsICVhaAorCWp6CXNldG1lbnUKKyNlbmRpZgorCQorCWRlY2IJJWFoCisjCWp6CXNldGJpb3MJCQkJICBBZGQgYmlvcyBtb2RlcyBsYXRlcgorCitzZXRiYWQ6CWNsYworCXJldAorCitjaGVja192ZXNhOgorCXN1YmIJJFZJREVPX0ZJUlNUX1ZFU0E+PjgsICViaAorCW9ydwkkMHg0MDAwLCAlYngJCQkjIFVzZSBsaW5lYXIgZnJhbWUgYnVmZmVyCisJbW92dwkkMHg0ZjAyLCAlYXgJCQkjIFZFU0EgQklPUyBtb2RlIHNldCBjYWxsCisJaW50CSQweDEwCisJY21wdwkkMHgwMDRmLCAlYXgJCQkjIEFMPTRmIGlmIGltcGxlbWVudGVkCisJam56CV9zZXRiYWQJCQkJIyBBSD0wIGlmIE9LCisKKwlzdGMKKwlyZXQKKworX3NldGJhZDogam1wIHNldGJhZAorCisJLmNvZGUzMgorCUFMSUdOCisKKy5vcmcJMHg4MDAKK3dha2V1cF9zdGFja19iZWdpbjoJIyBTdGFjayBncm93cyBkb3duCisKKy5vcmcJMHhmZjAJCSMgSnVzdCBiZWxvdyBlbmQgb2YgcGFnZQord2FrZXVwX3N0YWNrOgorRU5UUlkod2FrZXVwX2VuZCkKKwkKKy5vcmcJMHgxMDAwCisKK3dha2V1cF9wbW9kZV9yZXR1cm46CisJbW92dwkkX19LRVJORUxfRFMsICVheAorCW1vdncJJWF4LCAlc3MKKwltb3Z3CSVheCwgJWRzCisJbW92dwklYXgsICVlcworCW1vdncJJWF4LCAlZnMKKwltb3Z3CSVheCwgJWdzCisJbW92dwkkMHgwZTAwICsgJ3UnLCAweGI4MDE2CisKKwkjIHJlbG9hZCB0aGUgZ2R0LCBhcyB3ZSBuZWVkIHRoZSBmdWxsIDMyIGJpdCBhZGRyZXNzCisJbGdkdAlzYXZlZF9nZHQKKwlsaWR0CXNhdmVkX2lkdAorCWxsZHQJc2F2ZWRfbGR0CisJbGptcAkkKF9fS0VSTkVMX0NTKSwkMWYKKzE6CisJbW92bAklY3IzLCAlZWF4CisJbW92bAklZWF4LCAlY3IzCisJd2JpbnZkCisKKwkjIGFuZCByZXN0b3JlIHRoZSBzdGFjayAuLi4gYnV0IHlvdSBuZWVkIGdkdCBmb3IgdGhpcyB0byB3b3JrCisJbW92bAlzYXZlZF9jb250ZXh0X2VzcCwgJWVzcAorCisJbW92bAklY3M6c2F2ZWRfbWFnaWMsICVlYXgKKwljbXBsCSQweDEyMzQ1Njc4LCAlZWF4CisJam5lCWJvZ3VzX21hZ2ljCisKKwkjIGp1bXAgdG8gcGxhY2Ugd2hlcmUgd2UgbGVmdCBvZmYKKwltb3ZsCXNhdmVkX2VpcCwlZWF4CisJam1wCSolZWF4CisKK2JvZ3VzX21hZ2ljOgorCW1vdncJJDB4MGUwMCArICdCJywgMHhiODAxOAorCWptcAlib2d1c19tYWdpYworCisKKyMjCisjIGFjcGlfY29weV93YWtldXBfcm91dGluZQorIworIyBDb3B5IHRoZSBhYm92ZSByb3V0aW5lIHRvIGxvdyBtZW1vcnkuCisjCisjIFBhcmFtZXRlcnM6CisjICVlYXg6CXBsYWNlIHRvIGNvcHkgd2FrZXVwIHJvdXRpbmUgdG8KKyMKKyMgUmV0dXJuZWQgYWRkcmVzcyBpcyBsb2NhdGlvbiBvZiBjb2RlIGluIGxvdyBtZW1vcnkgKHBhc3QgZGF0YSBhbmQgc3RhY2spCisjCitFTlRSWShhY3BpX2NvcHlfd2FrZXVwX3JvdXRpbmUpCisKKwlzZ2R0CXNhdmVkX2dkdAorCXNpZHQJc2F2ZWRfaWR0CisJc2xkdAlzYXZlZF9sZHQKKwlzdHIJc2F2ZWRfdHNzCisKKwltb3ZsCW54X2VuYWJsZWQsICVlZHgKKwltb3ZsCSVlZHgsIHJlYWxfZWZlcl9zYXZlX3Jlc3RvcmUgLSB3YWtldXBfc3RhcnQgKCVlYXgpCisJdGVzdGwJJDEsIHJlYWxfZWZlcl9zYXZlX3Jlc3RvcmUgLSB3YWtldXBfc3RhcnQgKCVlYXgpCisJanoJMmYKKwkjIHNhdmUgZWZlciBzZXR0aW5nCisJcHVzaGwJJWVheAorCW1vdmwJJWVheCwgJWVieAorCW1vdiAgICAgJDB4YzAwMDAwODAsICVlY3gKKwlyZG1zcgorCW1vdmwJJWVkeCwgcmVhbF9zYXZlX2VmZXJfZWR4IC0gd2FrZXVwX3N0YXJ0ICglZWJ4KQorCW1vdmwJJWVheCwgcmVhbF9zYXZlX2VmZXJfZWF4IC0gd2FrZXVwX3N0YXJ0ICglZWJ4KQorCXBvcGwJJWVheAorMjoKKworCW1vdmwgICAgJWNyMywgJWVkeAorCW1vdmwgICAgJWVkeCwgcmVhbF9zYXZlX2NyMyAtIHdha2V1cF9zdGFydCAoJWVheCkKKwltb3ZsICAgICVjcjQsICVlZHgKKwltb3ZsICAgICVlZHgsIHJlYWxfc2F2ZV9jcjQgLSB3YWtldXBfc3RhcnQgKCVlYXgpCisJbW92bAklY3IwLCAlZWR4CisJbW92bAklZWR4LCByZWFsX3NhdmVfY3IwIC0gd2FrZXVwX3N0YXJ0ICglZWF4KQorCXNnZHQgICAgcmVhbF9zYXZlX2dkdCAtIHdha2V1cF9zdGFydCAoJWVheCkKKworCW1vdmwJc2F2ZWRfdmlkZW9tb2RlLCAlZWR4CisJbW92bAklZWR4LCB2aWRlb19tb2RlIC0gd2FrZXVwX3N0YXJ0ICglZWF4KQorCW1vdmwJYWNwaV92aWRlb19mbGFncywgJWVkeAorCW1vdmwJJWVkeCwgdmlkZW9fZmxhZ3MgLSB3YWtldXBfc3RhcnQgKCVlYXgpCisJbW92bAkkMHgxMjM0NTY3OCwgcmVhbF9tYWdpYyAtIHdha2V1cF9zdGFydCAoJWVheCkKKwltb3ZsCSQweDEyMzQ1Njc4LCBzYXZlZF9tYWdpYworCXJldAorCisuZGF0YQorQUxJR04KK0VOVFJZKHNhdmVkX21hZ2ljKQkubG9uZwkwCitFTlRSWShzYXZlZF9laXApCS5sb25nCTAKKworc2F2ZV9yZWdpc3RlcnM6CisJbGVhbAk0KCVlc3ApLCAlZWF4CisJbW92bAklZWF4LCBzYXZlZF9jb250ZXh0X2VzcAorCW1vdmwgJWVieCwgc2F2ZWRfY29udGV4dF9lYngKKwltb3ZsICVlYnAsIHNhdmVkX2NvbnRleHRfZWJwCisJbW92bCAlZXNpLCBzYXZlZF9jb250ZXh0X2VzaQorCW1vdmwgJWVkaSwgc2F2ZWRfY29udGV4dF9lZGkKKwlwdXNoZmwgOyBwb3BsIHNhdmVkX2NvbnRleHRfZWZsYWdzCisKKwltb3ZsICRyZXRfcG9pbnQsIHNhdmVkX2VpcAorCXJldAorCisKK3Jlc3RvcmVfcmVnaXN0ZXJzOgorCW1vdmwgc2F2ZWRfY29udGV4dF9lYnAsICVlYnAKKwltb3ZsIHNhdmVkX2NvbnRleHRfZWJ4LCAlZWJ4CisJbW92bCBzYXZlZF9jb250ZXh0X2VzaSwgJWVzaQorCW1vdmwgc2F2ZWRfY29udGV4dF9lZGksICVlZGkKKwlwdXNobCBzYXZlZF9jb250ZXh0X2VmbGFncyA7IHBvcGZsCisJcmV0CQorCitFTlRSWShkb19zdXNwZW5kX2xvd2xldmVsKQorCWNhbGwJc2F2ZV9wcm9jZXNzb3Jfc3RhdGUKKwljYWxsCXNhdmVfcmVnaXN0ZXJzCisJcHVzaGwJJDMKKwljYWxsCWFjcGlfZW50ZXJfc2xlZXBfc3RhdGUKKwlhZGRsCSQ0LCAlZXNwCisJcmV0CisJLnAyYWxpZ24gNCwsNworcmV0X3BvaW50OgorCWNhbGwJcmVzdG9yZV9yZWdpc3RlcnMKKwljYWxsCXJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlCisJcmV0CisKK0VOVFJZKGRvX3N1c3BlbmRfbG93bGV2ZWxfczRiaW9zKQorCWNhbGwgc2F2ZV9wcm9jZXNzb3Jfc3RhdGUKKwljYWxsIHNhdmVfcmVnaXN0ZXJzCisJY2FsbCBhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0YmlvcworCXJldAorCitBTElHTgorIyBzYXZlZCByZWdpc3RlcnMKK3NhdmVkX2dkdDoJLmxvbmcJMCwwCitzYXZlZF9pZHQ6CS5sb25nCTAsMAorc2F2ZWRfbGR0OgkubG9uZwkwCitzYXZlZF90c3M6CS5sb25nCTAKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMgYi9hcmNoL2kzODYva2VybmVsL2FwaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWMxNzUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMKQEAgLTAsMCArMSwxMjc4IEBACisvKgorICoJTG9jYWwgQVBJQyBoYW5kbGluZywgbG9jYWwgQVBJQyB0aW1lcnMKKyAqCisgKgkoYykgMTk5OSwgMjAwMCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKglGaXhlcworICoJTWFjaWVqIFcuIFJvenlja2kJOglCaXRzIGZvciBnZW51aW5lIDgyNDg5RFggQVBJQ3M7CisgKgkJCQkJdGhhbmtzIHRvIEVyaWMgR2lsbW9yZQorICoJCQkJCWFuZCBSb2xmIEcuIFRld3MKKyAqCQkJCQlmb3IgdGVzdGluZyB0aGVzZSBleHRlbnNpdmVseS4KKyAqCU1hY2llaiBXLiBSb3p5Y2tpCToJVmFyaW91cyB1cGRhdGVzIGFuZCBmaXhlcy4KKyAqCU1pa2FlbCBQZXR0ZXJzc29uCToJUG93ZXIgTWFuYWdlbWVudCBmb3IgVVAtQVBJQy4KKyAqCVBhdmVsIE1hY2hlayBhbmQKKyAqCU1pa2FlbCBQZXR0ZXJzc29uCToJUE0gY29udmVydGVkIHRvIGRyaXZlciBtb2RlbC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKworI2luY2x1ZGUgImlvX3BvcnRzLmgiCisKKy8qCisgKiBEZWJ1ZyBsZXZlbAorICovCitpbnQgYXBpY192ZXJib3NpdHk7CisKKworc3RhdGljIHZvaWQgYXBpY19wbV9hY3RpdmF0ZSh2b2lkKTsKKworLyoKKyAqICd3aGF0IHNob3VsZCB3ZSBkbyBpZiB3ZSBnZXQgYSBodyBpcnEgZXZlbnQgb24gYW4gaWxsZWdhbCB2ZWN0b3InLgorICogZWFjaCBhcmNoaXRlY3R1cmUgaGFzIHRvIGFuc3dlciB0aGlzIHRoZW1zZWx2ZXMuCisgKi8KK3ZvaWQgYWNrX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlwcmludGsoInVuZXhwZWN0ZWQgSVJRIHRyYXAgYXQgdmVjdG9yICUwMnhcbiIsIGlycSk7CisJLyoKKwkgKiBDdXJyZW50bHkgdW5leHBlY3RlZCB2ZWN0b3JzIGhhcHBlbiBvbmx5IG9uIFNNUCBhbmQgQVBJQy4KKwkgKiBXZSBfbXVzdF8gYWNrIHRoZXNlIGJlY2F1c2UgZXZlcnkgbG9jYWwgQVBJQyBoYXMgb25seSBOCisJICogaXJxIHNsb3RzIHBlciBwcmlvcml0eSBsZXZlbCwgYW5kIGEgJ2hhbmdpbmcsIHVuYWNrZWQnIElSUQorCSAqIGhvbGRzIHVwIGFuIGlycSBzbG90IC0gaW4gZXhjZXNzaXZlIGNhc2VzICh3aGVuIG11bHRpcGxlCisJICogdW5leHBlY3RlZCB2ZWN0b3JzIG9jY3VyKSB0aGF0IG1pZ2h0IGxvY2sgdXAgdGhlIEFQSUMKKwkgKiBjb21wbGV0ZWx5LgorCSAqLworCWFja19BUElDX2lycSgpOworfQorCit2b2lkIF9faW5pdCBhcGljX2ludHJfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlzbXBfaW50cl9pbml0KCk7CisjZW5kaWYKKwkvKiBzZWxmIGdlbmVyYXRlZCBJUEkgZm9yIGxvY2FsIEFQSUMgdGltZXIgKi8KKwlzZXRfaW50cl9nYXRlKExPQ0FMX1RJTUVSX1ZFQ1RPUiwgYXBpY190aW1lcl9pbnRlcnJ1cHQpOworCisJLyogSVBJIHZlY3RvcnMgZm9yIEFQSUMgc3B1cmlvdXMgYW5kIGVycm9yIGludGVycnVwdHMgKi8KKwlzZXRfaW50cl9nYXRlKFNQVVJJT1VTX0FQSUNfVkVDVE9SLCBzcHVyaW91c19pbnRlcnJ1cHQpOworCXNldF9pbnRyX2dhdGUoRVJST1JfQVBJQ19WRUNUT1IsIGVycm9yX2ludGVycnVwdCk7CisKKwkvKiB0aGVybWFsIG1vbml0b3IgTFZUIGludGVycnVwdCAqLworI2lmZGVmIENPTkZJR19YODZfTUNFX1A0VEhFUk1BTAorCXNldF9pbnRyX2dhdGUoVEhFUk1BTF9BUElDX1ZFQ1RPUiwgdGhlcm1hbF9pbnRlcnJ1cHQpOworI2VuZGlmCit9CisKKy8qIFVzaW5nIEFQSUMgdG8gZ2VuZXJhdGUgc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdD8gKi8KK2ludCB1c2luZ19hcGljX3RpbWVyID0gMDsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgcHJvZl9tdWx0aXBsaWVyKSA9IDE7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwcm9mX29sZF9tdWx0aXBsaWVyKSA9IDE7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwcm9mX2NvdW50ZXIpID0gMTsKKworc3RhdGljIGludCBlbmFibGVkX3ZpYV9hcGljYmFzZTsKKwordm9pZCBlbmFibGVfTk1JX3Rocm91Z2hfTFZUMCAodm9pZCAqIGR1bW15KQoreworCXVuc2lnbmVkIGludCB2LCB2ZXI7CisKKwl2ZXIgPSBhcGljX3JlYWQoQVBJQ19MVlIpOworCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odmVyKTsKKwl2ID0gQVBJQ19ETV9OTUk7CQkJLyogdW5tYXNrIGFuZCBzZXQgdG8gTk1JICovCisJaWYgKCFBUElDX0lOVEVHUkFURUQodmVyKSkJCS8qIDgyNDg5RFggKi8KKwkJdiB8PSBBUElDX0xWVF9MRVZFTF9UUklHR0VSOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdik7Cit9CisKK2ludCBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGx2ciwgdmVyc2lvbjsKKwlsdnIgPSBhcGljX3JlYWQoQVBJQ19MVlIpOworCXZlcnNpb24gPSBHRVRfQVBJQ19WRVJTSU9OKGx2cik7CisJaWYgKCFBUElDX0lOVEVHUkFURUQodmVyc2lvbikgfHwgdmVyc2lvbiA+PSAweDE0KQorCQlyZXR1cm4gMHhmZjsKKwllbHNlCisJCXJldHVybiAweGY7Cit9CisKK2ludCBnZXRfbWF4bHZ0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IHYsIHZlciwgbWF4bHZ0OworCisJdiA9IGFwaWNfcmVhZChBUElDX0xWUik7CisJdmVyID0gR0VUX0FQSUNfVkVSU0lPTih2KTsKKwkvKiA4MjQ4OURYcyBkbyBub3QgcmVwb3J0ICMgb2YgTFZUIGVudHJpZXMuICovCisJbWF4bHZ0ID0gQVBJQ19JTlRFR1JBVEVEKHZlcikgPyBHRVRfQVBJQ19NQVhMVlQodikgOiAyOworCXJldHVybiBtYXhsdnQ7Cit9CisKK3ZvaWQgY2xlYXJfbG9jYWxfQVBJQyh2b2lkKQoreworCWludCBtYXhsdnQ7CisJdW5zaWduZWQgbG9uZyB2OworCisJbWF4bHZ0ID0gZ2V0X21heGx2dCgpOworCisJLyoKKwkgKiBNYXNraW5nIGFuIExWVCBlbnRyeSBvbiBhIFA2IGNhbiB0cmlnZ2VyIGEgbG9jYWwgQVBJQyBlcnJvcgorCSAqIGlmIHRoZSB2ZWN0b3IgaXMgemVyby4gTWFzayBMVlRFUlIgZmlyc3QgdG8gcHJldmVudCB0aGlzLgorCSAqLworCWlmIChtYXhsdnQgPj0gMykgeworCQl2ID0gRVJST1JfQVBJQ19WRUNUT1I7IC8qIGFueSBub24temVybyB2ZWN0b3Igd2lsbCBkbyAqLworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVEVSUiwgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJfQorCS8qCisJICogQ2FyZWZ1bDogd2UgaGF2ZSB0byBzZXQgbWFza3Mgb25seSBmaXJzdCB0byBkZWFzc2VydAorCSAqIGFueSBsZXZlbC10cmlnZ2VyZWQgc291cmNlcy4KKwkgKi8KKwl2ID0gYXBpY19yZWFkKEFQSUNfTFZUVCk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfTFZUMSk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQxLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwlpZiAobWF4bHZ0ID49IDQpIHsKKwkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFBDKTsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRQQywgdiB8IEFQSUNfTFZUX01BU0tFRCk7CisJfQorCisvKiBsZXRzIG5vdCB0b3VjaCB0aGlzIGlmIHdlIGRpZG4ndCBmcm9iIGl0ICovCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCisJaWYgKG1heGx2dCA+PSA1KSB7CisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUSE1SKTsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRUSE1SLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwl9CisjZW5kaWYKKwkvKgorCSAqIENsZWFuIEFQSUMgc3RhdGUgZm9yIG90aGVyIE9TczoKKwkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIEFQSUNfTFZUX01BU0tFRCk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0xWVF9NQVNLRUQpOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMSwgQVBJQ19MVlRfTUFTS0VEKTsKKwlpZiAobWF4bHZ0ID49IDMpCisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZURVJSLCBBUElDX0xWVF9NQVNLRUQpOworCWlmIChtYXhsdnQgPj0gNCkKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRQQywgQVBJQ19MVlRfTUFTS0VEKTsKKworI2lmZGVmIENPTkZJR19YODZfTUNFX1A0VEhFUk1BTAorCWlmIChtYXhsdnQgPj0gNSkKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRUSE1SLCBBUElDX0xWVF9NQVNLRUQpOworI2VuZGlmCisJdiA9IEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CisJaWYgKEFQSUNfSU5URUdSQVRFRCh2KSkgewkvKiAhODI0ODlEWCAqLworCQlpZiAobWF4bHZ0ID4gMykJCS8qIER1ZSB0byBQZW50aXVtIGVycmF0YSAzQVAgYW5kIDExQVAuICovCisJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJYXBpY19yZWFkKEFQSUNfRVNSKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IGNvbm5lY3RfYnNwX0FQSUModm9pZCkKK3sKKwlpZiAocGljX21vZGUpIHsKKwkJLyoKKwkJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KKwkJICovCisJCWNsZWFyX2xvY2FsX0FQSUMoKTsKKwkJLyoKKwkJICogUElDIG1vZGUsIGVuYWJsZSBBUElDIG1vZGUgaW4gdGhlIElNQ1IsIGkuZS4KKwkJICogY29ubmVjdCBCU1AncyBsb2NhbCBBUElDIHRvIElOVCBhbmQgTk1JIGxpbmVzLgorCQkgKi8KKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAibGVhdmluZyBQSUMgbW9kZSwgIgorCQkJCSJlbmFibGluZyBBUElDIG1vZGUuXG4iKTsKKwkJb3V0YigweDcwLCAweDIyKTsKKwkJb3V0YigweDAxLCAweDIzKTsKKwl9CisJZW5hYmxlX2FwaWNfbW9kZSgpOworfQorCit2b2lkIGRpc2Nvbm5lY3RfYnNwX0FQSUModm9pZCkKK3sKKwlpZiAocGljX21vZGUpIHsKKwkJLyoKKwkJICogUHV0IHRoZSBib2FyZCBiYWNrIGludG8gUElDIG1vZGUgKGhhcyBhbiBlZmZlY3QKKwkJICogb25seSBvbiBjZXJ0YWluIG9sZGVyIGJvYXJkcykuICBOb3RlIHRoYXQgQVBJQworCQkgKiBpbnRlcnJ1cHRzLCBpbmNsdWRpbmcgSVBJcywgd29uJ3Qgd29yayBiZXlvbmQKKwkJICogdGhpcyBwb2ludCEgIFRoZSBvbmx5IGV4Y2VwdGlvbiBhcmUgSU5JVCBJUElzLgorCQkgKi8KKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiZGlzYWJsaW5nIEFQSUMgbW9kZSwgIgorCQkJCSJlbnRlcmluZyBQSUMgbW9kZS5cbiIpOworCQlvdXRiKDB4NzAsIDB4MjIpOworCQlvdXRiKDB4MDAsIDB4MjMpOworCX0KK30KKwordm9pZCBkaXNhYmxlX2xvY2FsX0FQSUModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJY2xlYXJfbG9jYWxfQVBJQygpOworCisJLyoKKwkgKiBEaXNhYmxlIEFQSUMgKGltcGxpZXMgY2xlYXJpbmcgb2YgcmVnaXN0ZXJzCisJICogZm9yIDgyNDg5RFghKS4KKwkgKi8KKwl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX1NQSVYpOworCXZhbHVlICY9IH5BUElDX1NQSVZfQVBJQ19FTkFCTEVEOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfU1BJViwgdmFsdWUpOworCisJaWYgKGVuYWJsZWRfdmlhX2FwaWNiYXNlKSB7CisJCXVuc2lnbmVkIGludCBsLCBoOworCQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CisJCWwgJj0gfk1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRTsKKwkJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCX0KK30KKworLyoKKyAqIFRoaXMgaXMgdG8gdmVyaWZ5IHRoYXQgd2UncmUgbG9va2luZyBhdCBhIHJlYWwgbG9jYWwgQVBJQy4KKyAqIENoZWNrIHRoZXNlIGFnYWluc3QgeW91ciBib2FyZCBpZiB0aGUgQ1BVcyBhcmVuJ3QgZ2V0dGluZworICogc3RhcnRlZCBmb3Igbm8gYXBwYXJlbnQgcmVhc29uLgorICovCitpbnQgX19pbml0IHZlcmlmeV9sb2NhbF9BUElDKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHJlZzAsIHJlZzE7CisKKwkvKgorCSAqIFRoZSB2ZXJzaW9uIHJlZ2lzdGVyIGlzIHJlYWQtb25seSBpbiBhIHJlYWwgQVBJQy4KKwkgKi8KKwlyZWcwID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKKwlhcGljX3ByaW50ayhBUElDX0RFQlVHLCAiR2V0dGluZyBWRVJTSU9OOiAleFxuIiwgcmVnMCk7CisJYXBpY193cml0ZShBUElDX0xWUiwgcmVnMCBeIEFQSUNfTFZSX01BU0spOworCXJlZzEgPSBhcGljX3JlYWQoQVBJQ19MVlIpOworCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsICJHZXR0aW5nIFZFUlNJT046ICV4XG4iLCByZWcxKTsKKworCS8qCisJICogVGhlIHR3byB2ZXJzaW9uIHJlYWRzIGFib3ZlIHNob3VsZCBwcmludCB0aGUgc2FtZQorCSAqIG51bWJlcnMuICBJZiB0aGUgc2Vjb25kIG9uZSBpcyBkaWZmZXJlbnQsIHRoZW4gd2UKKwkgKiBwb2tlIGF0IGEgbm9uLUFQSUMuCisJICovCisJaWYgKHJlZzEgIT0gcmVnMCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSB2ZXJzaW9uIGxvb2tzIHJlYXNvbmFibHkuCisJICovCisJcmVnMSA9IEdFVF9BUElDX1ZFUlNJT04ocmVnMCk7CisJaWYgKHJlZzEgPT0gMHgwMCB8fCByZWcxID09IDB4ZmYpCisJCXJldHVybiAwOworCXJlZzEgPSBnZXRfbWF4bHZ0KCk7CisJaWYgKHJlZzEgPCAweDAyIHx8IHJlZzEgPT0gMHhmZikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRoZSBJRCByZWdpc3RlciBpcyByZWFkL3dyaXRlIGluIGEgcmVhbCBBUElDLgorCSAqLworCXJlZzAgPSBhcGljX3JlYWQoQVBJQ19JRCk7CisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgIkdldHRpbmcgSUQ6ICV4XG4iLCByZWcwKTsKKworCS8qCisJICogVGhlIG5leHQgdHdvIGFyZSBqdXN0IHRvIHNlZSBpZiB3ZSBoYXZlIHNhbmUgdmFsdWVzLgorCSAqIFRoZXkncmUgb25seSByZWFsbHkgcmVsZXZhbnQgaWYgd2UncmUgaW4gVmlydHVhbCBXaXJlCisJICogY29tcGF0aWJpbGl0eSBtb2RlLCBidXQgbW9zdCBib3hlcyBhcmUgYW55bW9yZS4KKwkgKi8KKwlyZWcwID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7CisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgIkdldHRpbmcgTFZUMDogJXhcbiIsIHJlZzApOworCXJlZzEgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKKwlhcGljX3ByaW50ayhBUElDX0RFQlVHLCAiR2V0dGluZyBMVlQxOiAleFxuIiwgcmVnMSk7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBfX2luaXQgc3luY19BcmJfSURzKHZvaWQpCit7CisJLyogVW5zdXBwb3J0ZWQgb24gUDQgLSBzZWUgSW50ZWwgRGV2LiBNYW51YWwgVm9sLiAzLCBDaC4gOC42LjEgKi8KKwl1bnNpZ25lZCBpbnQgdmVyID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKKwlpZiAodmVyID49IDB4MTQpCS8qIFA0IG9yIGhpZ2hlciAqLworCQlyZXR1cm47CisJLyoKKwkgKiBXYWl0IGZvciBpZGxlLgorCSAqLworCWFwaWNfd2FpdF9pY3JfaWRsZSgpOworCisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgIlN5bmNocm9uaXppbmcgQXJiIElEcy5cbiIpOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSLCBBUElDX0RFU1RfQUxMSU5DIHwgQVBJQ19JTlRfTEVWRUxUUklHCisJCQkJfCBBUElDX0RNX0lOSVQpOworfQorCitleHRlcm4gdm9pZCBfX2Vycm9yX2luX2FwaWNfYyAodm9pZCk7CisKKy8qCisgKiBBbiBpbml0aWFsIHNldHVwIG9mIHRoZSB2aXJ0dWFsIHdpcmUgbW9kZS4KKyAqLwordm9pZCBfX2luaXQgaW5pdF9ic3BfQVBJQyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWUsIHZlcjsKKworCS8qCisJICogRG9uJ3QgZG8gdGhlIHNldHVwIG5vdyBpZiB3ZSBoYXZlIGEgU01QIEJJT1MgYXMgdGhlCisJICogdGhyb3VnaC1JL08tQVBJQyB2aXJ0dWFsIHdpcmUgbW9kZSBtaWdodCBiZSBhY3RpdmUuCisJICovCisJaWYgKHNtcF9mb3VuZF9jb25maWcgfHwgIWNwdV9oYXNfYXBpYykKKwkJcmV0dXJuOworCisJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlIpOworCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odmFsdWUpOworCisJLyoKKwkgKiBEbyBub3QgdHJ1c3QgdGhlIGxvY2FsIEFQSUMgYmVpbmcgZW1wdHkgYXQgYm9vdHVwLgorCSAqLworCWNsZWFyX2xvY2FsX0FQSUMoKTsKKworCS8qCisJICogRW5hYmxlIEFQSUMuCisJICovCisJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19TUElWKTsKKwl2YWx1ZSAmPSB+QVBJQ19WRUNUT1JfTUFTSzsKKwl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOworCQorCS8qIFRoaXMgYml0IGlzIHJlc2VydmVkIG9uIFA0L1hlb24gYW5kIHNob3VsZCBiZSBjbGVhcmVkICovCisJaWYgKChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgJiYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKKwkJdmFsdWUgJj0gfkFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKKwllbHNlCisJCXZhbHVlIHw9IEFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKKwl2YWx1ZSB8PSBTUFVSSU9VU19BUElDX1ZFQ1RPUjsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1NQSVYsIHZhbHVlKTsKKworCS8qCisJICogU2V0IHVwIHRoZSB2aXJ0dWFsIHdpcmUgbW9kZS4KKwkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfRE1fRVhUSU5UKTsKKwl2YWx1ZSA9IEFQSUNfRE1fTk1JOworCWlmICghQVBJQ19JTlRFR1JBVEVEKHZlcikpCQkvKiA4MjQ4OURYICovCisJCXZhbHVlIHw9IEFQSUNfTFZUX0xFVkVMX1RSSUdHRVI7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQxLCB2YWx1ZSk7Cit9CisKK3ZvaWQgX19pbml0IHNldHVwX2xvY2FsX0FQSUMgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBvbGR2YWx1ZSwgdmFsdWUsIHZlciwgbWF4bHZ0OworCisJLyogUG91bmQgdGhlIEVTUiByZWFsbHkgaGFyZCBvdmVyIHRoZSBoZWFkIHdpdGggYSBiaWcgaGFtbWVyIC0gbWJsaWdoICovCisJaWYgKGVzcl9kaXNhYmxlKSB7CisJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCX0KKworCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKKwl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKHZhbHVlKTsKKworCWlmICgoU1BVUklPVVNfQVBJQ19WRUNUT1IgJiAweDBmKSAhPSAweDBmKQorCQlfX2Vycm9yX2luX2FwaWNfYygpOworCisJLyoKKwkgKiBEb3VibGUtY2hlY2sgd2hldGhlciB0aGlzIEFQSUMgaXMgcmVhbGx5IHJlZ2lzdGVyZWQuCisJICovCisJaWYgKCFhcGljX2lkX3JlZ2lzdGVyZWQoKSkKKwkJQlVHKCk7CisKKwkvKgorCSAqIEludGVsIHJlY29tbWVuZHMgdG8gc2V0IERGUiwgTERSIGFuZCBUUFIgYmVmb3JlIGVuYWJsaW5nCisJICogYW4gQVBJQy4gIFNlZSBlLmcuICJBUC0zODggODI0ODlEWCBVc2VyJ3MgTWFudWFsIiAoSW50ZWwKKwkgKiBkb2N1bWVudCBudW1iZXIgMjkyMTE2KS4gIFNvIGhlcmUgaXQgZ29lcy4uLgorCSAqLworCWluaXRfYXBpY19sZHIoKTsKKworCS8qCisJICogU2V0IFRhc2sgUHJpb3JpdHkgdG8gJ2FjY2VwdCBhbGwnLiBXZSBuZXZlciBjaGFuZ2UgdGhpcworCSAqIGxhdGVyIG9uLgorCSAqLworCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfVEFTS1BSSSk7CisJdmFsdWUgJj0gfkFQSUNfVFBSSV9NQVNLOworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfVEFTS1BSSSwgdmFsdWUpOworCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBhcmUgYWxsIHNldCB1cCwgZW5hYmxlIHRoZSBBUElDCisJICovCisJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19TUElWKTsKKwl2YWx1ZSAmPSB+QVBJQ19WRUNUT1JfTUFTSzsKKwkvKgorCSAqIEVuYWJsZSBBUElDCisJICovCisJdmFsdWUgfD0gQVBJQ19TUElWX0FQSUNfRU5BQkxFRDsKKworCS8qCisJICogU29tZSB1bmtub3duIEludGVsIElPL0FQSUMgKG9yIEFQSUMpIGVycmF0YSBpcyBiaXRpbmcgdXMgd2l0aAorCSAqIGNlcnRhaW4gbmV0d29ya2luZyBjYXJkcy4gSWYgaGlnaCBmcmVxdWVuY3kgaW50ZXJydXB0cyBhcmUKKwkgKiBoYXBwZW5pbmcgb24gYSBwYXJ0aWN1bGFyIElPQVBJQyBwaW4sIHBsdXMgdGhlIElPQVBJQyByb3V0aW5nCisJICogZW50cnkgaXMgbWFza2VkL3VubWFza2VkIGF0IGEgaGlnaCByYXRlIGFzIHdlbGwgdGhlbiBzb29uZXIgb3IKKwkgKiBsYXRlciBJT0FQSUMgbGluZSBnZXRzICdzdHVjaycsIG5vIG1vcmUgaW50ZXJydXB0cyBhcmUgcmVjZWl2ZWQKKwkgKiBmcm9tIHRoZSBkZXZpY2UuIElmIGZvY3VzIENQVSBpcyBkaXNhYmxlZCB0aGVuIHRoZSBoYW5nIGdvZXMKKwkgKiBhd2F5LCBvaCB3ZWxsIDotKAorCSAqCisJICogWyBUaGlzIGJ1ZyBjYW4gYmUgcmVwcm9kdWNlZCBlYXNpbHkgd2l0aCBhIGxldmVsLXRyaWdnZXJlZAorCSAqICAgUENJIE5lMjAwMCBuZXR3b3JraW5nIGNhcmRzIGFuZCBQSUkvUElJSSBwcm9jZXNzb3JzLCBkdWFsCisJICogICBCWCBjaGlwc2V0LiBdCisJICovCisJLyoKKwkgKiBBY3R1YWxseSBkaXNhYmxpbmcgdGhlIGZvY3VzIENQVSBjaGVjayBqdXN0IG1ha2VzIHRoZSBoYW5nIGxlc3MKKwkgKiBmcmVxdWVudCBhcyBpdCBtYWtlcyB0aGUgaW50ZXJydXB0IGRpc3RyaWJ1dG9uIG1vZGVsIGJlIG1vcmUKKwkgKiBsaWtlIExSVSB0aGFuIE1SVSAodGhlIHNob3J0LXRlcm0gbG9hZCBpcyBtb3JlIGV2ZW4gYWNyb3NzIENQVXMpLgorCSAqIFNlZSBhbHNvIHRoZSBjb21tZW50IGluIGVuZF9sZXZlbF9pb2FwaWNfaXJxKCkuICAtLW1hY3JvCisJICovCisjaWYgMQorCS8qIEVuYWJsZSBmb2N1cyBwcm9jZXNzb3IgKGJpdD09MCkgKi8KKwl2YWx1ZSAmPSB+QVBJQ19TUElWX0ZPQ1VTX0RJU0FCTEVEOworI2Vsc2UKKwkvKiBEaXNhYmxlIGZvY3VzIHByb2Nlc3NvciAoYml0PT0xKSAqLworCXZhbHVlIHw9IEFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKKyNlbmRpZgorCS8qCisJICogU2V0IHNwdXJpb3VzIElSUSB2ZWN0b3IKKwkgKi8KKwl2YWx1ZSB8PSBTUFVSSU9VU19BUElDX1ZFQ1RPUjsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1NQSVYsIHZhbHVlKTsKKworCS8qCisJICogU2V0IHVwIExWVDAsIExWVDE6CisJICoKKwkgKiBzZXQgdXAgdGhyb3VnaC1sb2NhbC1BUElDIG9uIHRoZSBCUCdzIExJTlQwLiBUaGlzIGlzIG5vdAorCSAqIHN0cmljdGx5IG5lY2Vzc2VyeSBpbiBwdXJlIHN5bW1ldHJpYy1JTyBtb2RlLCBidXQgc29tZXRpbWVzCisJICogd2UgZGVsZWdhdGUgaW50ZXJydXB0cyB0byB0aGUgODI1OUEuCisJICovCisJLyoKKwkgKiBUT0RPOiBzZXQgdXAgdGhyb3VnaC1sb2NhbC1BUElDIGZyb20gdGhyb3VnaC1JL08tQVBJQz8gLS1tYWNybworCSAqLworCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZUMCkgJiBBUElDX0xWVF9NQVNLRUQ7CisJaWYgKCFzbXBfcHJvY2Vzc29yX2lkKCkgJiYgKHBpY19tb2RlIHx8ICF2YWx1ZSkpIHsKKwkJdmFsdWUgPSBBUElDX0RNX0VYVElOVDsKKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiZW5hYmxlZCBFeHRJTlQgb24gQ1BVIyVkXG4iLAorCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSk7CisJfSBlbHNlIHsKKwkJdmFsdWUgPSBBUElDX0RNX0VYVElOVCB8IEFQSUNfTFZUX01BU0tFRDsKKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAibWFza2VkIEV4dElOVCBvbiBDUFUjJWRcbiIsCisJCQkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl9CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2YWx1ZSk7CisKKwkvKgorCSAqIG9ubHkgdGhlIEJQIHNob3VsZCBzZWUgdGhlIExJTlQxIE5NSSBzaWduYWwsIG9idmlvdXNseS4KKwkgKi8KKwlpZiAoIXNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJdmFsdWUgPSBBUElDX0RNX05NSTsKKwllbHNlCisJCXZhbHVlID0gQVBJQ19ETV9OTUkgfCBBUElDX0xWVF9NQVNLRUQ7CisJaWYgKCFBUElDX0lOVEVHUkFURUQodmVyKSkJCS8qIDgyNDg5RFggKi8KKwkJdmFsdWUgfD0gQVBJQ19MVlRfTEVWRUxfVFJJR0dFUjsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHZhbHVlKTsKKworCWlmIChBUElDX0lOVEVHUkFURUQodmVyKSAmJiAhZXNyX2Rpc2FibGUpIHsJCS8qICE4MjQ4OURYICovCisJCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKwkJaWYgKG1heGx2dCA+IDMpCQkvKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuICovCisJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJb2xkdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19FU1IpOworCisJCXZhbHVlID0gRVJST1JfQVBJQ19WRUNUT1I7ICAgICAgLy8gZW5hYmxlcyBzZW5kaW5nIGVycm9ycworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVEVSUiwgdmFsdWUpOworCQkvKgorCQkgKiBzcGVjIHNheXMgY2xlYXIgZXJyb3JzIGFmdGVyIGVuYWJsaW5nIHZlY3Rvci4KKwkJICovCisJCWlmIChtYXhsdnQgPiAzKQorCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKKwkJaWYgKHZhbHVlICE9IG9sZHZhbHVlKQorCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiRVNSIHZhbHVlIGJlZm9yZSBlbmFibGluZyAiCisJCQkJInZlY3RvcjogMHglMDhseCAgYWZ0ZXI6IDB4JTA4bHhcbiIsCisJCQkJb2xkdmFsdWUsIHZhbHVlKTsKKwl9IGVsc2UgeworCQlpZiAoZXNyX2Rpc2FibGUpCQorCQkJLyogCisJCQkgKiBTb21ldGhpbmcgdW50cmFjZWJsZSBpcyBjcmVhdGluZyBiYWQgaW50ZXJydXB0cyBvbiAKKwkJCSAqIHNlY29uZGFyeSBxdWFkcyAuLi4gZm9yIHRoZSBtb21lbnQsIGp1c3QgbGVhdmUgdGhlCisJCQkgKiBFU1IgZGlzYWJsZWQgLSB3ZSBjYW4ndCBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aCB0aGUKKwkJCSAqIGVycm9ycyBhbnl3YXkgLSBtYmxpZ2gKKwkJCSAqLworCQkJcHJpbnRrKCJMZWF2aW5nIEVTUiBkaXNhYmxlZC5cbiIpOworCQllbHNlIAorCQkJcHJpbnRrKCJObyBFU1IgZm9yIDgyNDg5RFguXG4iKTsKKwl9CisKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKQorCQlzZXR1cF9hcGljX25taV93YXRjaGRvZygpOworCWFwaWNfcG1fYWN0aXZhdGUoKTsKK30KKworLyoKKyAqIElmIExpbnV4IGVuYWJsZWQgdGhlIExBUElDIGFnYWluc3QgdGhlIEJJT1MgZGVmYXVsdAorICogZGlzYWJsZSBpdCBkb3duIGJlZm9yZSByZS1lbnRlcmluZyB0aGUgQklPUyBvbiBzaHV0ZG93bi4KKyAqIE90aGVyd2lzZSB0aGUgQklPUyBtYXkgZ2V0IGNvbmZ1c2VkIGFuZCBub3QgcG93ZXItb2ZmLgorICovCit2b2lkIGxhcGljX3NodXRkb3duKHZvaWQpCit7CisJaWYgKCFjcHVfaGFzX2FwaWMgfHwgIWVuYWJsZWRfdmlhX2FwaWNiYXNlKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWRpc2FibGVfbG9jYWxfQVBJQygpOworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgYWN0aXZlOworCS8qIHIvdyBhcGljIGZpZWxkcyAqLworCXVuc2lnbmVkIGludCBhcGljX2lkOworCXVuc2lnbmVkIGludCBhcGljX3Rhc2twcmk7CisJdW5zaWduZWQgaW50IGFwaWNfbGRyOworCXVuc2lnbmVkIGludCBhcGljX2RmcjsKKwl1bnNpZ25lZCBpbnQgYXBpY19zcGl2OworCXVuc2lnbmVkIGludCBhcGljX2x2dHQ7CisJdW5zaWduZWQgaW50IGFwaWNfbHZ0cGM7CisJdW5zaWduZWQgaW50IGFwaWNfbHZ0MDsKKwl1bnNpZ25lZCBpbnQgYXBpY19sdnQxOworCXVuc2lnbmVkIGludCBhcGljX2x2dGVycjsKKwl1bnNpZ25lZCBpbnQgYXBpY190bWljdDsKKwl1bnNpZ25lZCBpbnQgYXBpY190ZGNyOworCXVuc2lnbmVkIGludCBhcGljX3RobXI7Cit9IGFwaWNfcG1fc3RhdGU7CisKK3N0YXRpYyBpbnQgbGFwaWNfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCB1MzIgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghYXBpY19wbV9zdGF0ZS5hY3RpdmUpCisJCXJldHVybiAwOworCisJYXBpY19wbV9zdGF0ZS5hcGljX2lkID0gYXBpY19yZWFkKEFQSUNfSUQpOworCWFwaWNfcG1fc3RhdGUuYXBpY190YXNrcHJpID0gYXBpY19yZWFkKEFQSUNfVEFTS1BSSSk7CisJYXBpY19wbV9zdGF0ZS5hcGljX2xkciA9IGFwaWNfcmVhZChBUElDX0xEUik7CisJYXBpY19wbV9zdGF0ZS5hcGljX2RmciA9IGFwaWNfcmVhZChBUElDX0RGUik7CisJYXBpY19wbV9zdGF0ZS5hcGljX3NwaXYgPSBhcGljX3JlYWQoQVBJQ19TUElWKTsKKwlhcGljX3BtX3N0YXRlLmFwaWNfbHZ0dCA9IGFwaWNfcmVhZChBUElDX0xWVFQpOworCWFwaWNfcG1fc3RhdGUuYXBpY19sdnRwYyA9IGFwaWNfcmVhZChBUElDX0xWVFBDKTsKKwlhcGljX3BtX3N0YXRlLmFwaWNfbHZ0MCA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCWFwaWNfcG1fc3RhdGUuYXBpY19sdnQxID0gYXBpY19yZWFkKEFQSUNfTFZUMSk7CisJYXBpY19wbV9zdGF0ZS5hcGljX2x2dGVyciA9IGFwaWNfcmVhZChBUElDX0xWVEVSUik7CisJYXBpY19wbV9zdGF0ZS5hcGljX3RtaWN0ID0gYXBpY19yZWFkKEFQSUNfVE1JQ1QpOworCWFwaWNfcG1fc3RhdGUuYXBpY190ZGNyID0gYXBpY19yZWFkKEFQSUNfVERDUik7CisJYXBpY19wbV9zdGF0ZS5hcGljX3RobXIgPSBhcGljX3JlYWQoQVBJQ19MVlRUSE1SKTsKKwkKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZGlzYWJsZV9sb2NhbF9BUElDKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhcGljX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCBsLCBoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWFwaWNfcG1fc3RhdGUuYWN0aXZlKQorCQlyZXR1cm4gMDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBBUElDQkFTRSBwb2ludHMgdG8gdGhlIHJpZ2h0IGFkZHJlc3MKKwkgKgorCSAqIEZJWE1FISBUaGlzIHdpbGwgYmUgd3JvbmcgaWYgd2UgZXZlciBzdXBwb3J0IHN1c3BlbmQgb24KKwkgKiBTTVAhIFdlJ2xsIG5lZWQgdG8gZG8gdGhpcyBhcyBwYXJ0IG9mIHRoZSBDUFUgcmVzdG9yZSEKKwkgKi8KKwlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CisJbCAmPSB+TVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKKwlsIHw9IE1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRSB8IG1wX2xhcGljX2FkZHI7CisJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCisJYXBpY193cml0ZShBUElDX0xWVEVSUiwgRVJST1JfQVBJQ19WRUNUT1IgfCBBUElDX0xWVF9NQVNLRUQpOworCWFwaWNfd3JpdGUoQVBJQ19JRCwgYXBpY19wbV9zdGF0ZS5hcGljX2lkKTsKKwlhcGljX3dyaXRlKEFQSUNfREZSLCBhcGljX3BtX3N0YXRlLmFwaWNfZGZyKTsKKwlhcGljX3dyaXRlKEFQSUNfTERSLCBhcGljX3BtX3N0YXRlLmFwaWNfbGRyKTsKKwlhcGljX3dyaXRlKEFQSUNfVEFTS1BSSSwgYXBpY19wbV9zdGF0ZS5hcGljX3Rhc2twcmkpOworCWFwaWNfd3JpdGUoQVBJQ19TUElWLCBhcGljX3BtX3N0YXRlLmFwaWNfc3Bpdik7CisJYXBpY193cml0ZShBUElDX0xWVDAsIGFwaWNfcG1fc3RhdGUuYXBpY19sdnQwKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUMSwgYXBpY19wbV9zdGF0ZS5hcGljX2x2dDEpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRUSE1SLCBhcGljX3BtX3N0YXRlLmFwaWNfdGhtcik7CisJYXBpY193cml0ZShBUElDX0xWVFBDLCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0cGMpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRULCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0dCk7CisJYXBpY193cml0ZShBUElDX1REQ1IsIGFwaWNfcG1fc3RhdGUuYXBpY190ZGNyKTsKKwlhcGljX3dyaXRlKEFQSUNfVE1JQ1QsIGFwaWNfcG1fc3RhdGUuYXBpY190bWljdCk7CisJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJYXBpY19yZWFkKEFQSUNfRVNSKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZURVJSLCBhcGljX3BtX3N0YXRlLmFwaWNfbHZ0ZXJyKTsKKwlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwlhcGljX3JlYWQoQVBJQ19FU1IpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZGV2aWNlIGhhcyBubyBzaHV0ZG93biBtZXRob2QgLSBmdWxseSBmdW5jdGlvbmluZyBsb2NhbCBBUElDcworICogYXJlIG5lZWRlZCBvbiBldmVyeSBDUFUgdXAgdW50aWwgbWFjaGluZV9oYWx0L3Jlc3RhcnQvcG93ZXJvZmYuCisgKi8KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgbGFwaWNfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgibGFwaWMiKSwKKwkucmVzdW1lCQk9IGxhcGljX3Jlc3VtZSwKKwkuc3VzcGVuZAk9IGxhcGljX3N1c3BlbmQsCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2xhcGljID0geworCS5pZAk9IDAsCisJLmNscwk9ICZsYXBpY19zeXNjbGFzcywKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhcGljX3BtX2FjdGl2YXRlKHZvaWQpCit7CisJYXBpY19wbV9zdGF0ZS5hY3RpdmUgPSAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2xhcGljX3N5c2ZzKHZvaWQpCit7CisJaW50IGVycm9yOworCisJaWYgKCFjcHVfaGFzX2FwaWMpCisJCXJldHVybiAwOworCS8qIFhYWDogcmVtb3ZlIHN1c3BlbmQvcmVzdW1lIHByb2NzIGlmICFhcGljX3BtX3N0YXRlLmFjdGl2ZT8gKi8KKworCWVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZsYXBpY19zeXNjbGFzcyk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV9sYXBpYyk7CisJcmV0dXJuIGVycm9yOworfQorZGV2aWNlX2luaXRjYWxsKGluaXRfbGFwaWNfc3lzZnMpOworCisjZWxzZQkvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHZvaWQgYXBpY19wbV9hY3RpdmF0ZSh2b2lkKSB7IH0KKworI2VuZGlmCS8qIENPTkZJR19QTSAqLworCisvKgorICogRGV0ZWN0IGFuZCBlbmFibGUgbG9jYWwgQVBJQ3Mgb24gbm9uLVNNUCBib2FyZHMuCisgKiBPcmlnaW5hbCBjb2RlIHdyaXR0ZW4gYnkgS2VpciBGcmFzZXIuCisgKi8KKworLyoKKyAqIEtub2IgdG8gY29udHJvbCBvdXIgd2lsbGluZ25lc3MgdG8gZW5hYmxlIHRoZSBsb2NhbCBBUElDLgorICovCitpbnQgZW5hYmxlX2xvY2FsX2FwaWMgX19pbml0ZGF0YSA9IDA7IC8qIC0xPWZvcmNlLWRpc2FibGUsICsxPWZvcmNlLWVuYWJsZSAqLworCitzdGF0aWMgaW50IF9faW5pdCBsYXBpY19kaXNhYmxlKGNoYXIgKnN0cikKK3sKKwllbmFibGVfbG9jYWxfYXBpYyA9IC0xOworCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKKwlyZXR1cm4gMDsKK30KK19fc2V0dXAoIm5vbGFwaWMiLCBsYXBpY19kaXNhYmxlKTsKKworc3RhdGljIGludCBfX2luaXQgbGFwaWNfZW5hYmxlKGNoYXIgKnN0cikKK3sKKwllbmFibGVfbG9jYWxfYXBpYyA9IDE7CisJcmV0dXJuIDA7Cit9CitfX3NldHVwKCJsYXBpYyIsIGxhcGljX2VuYWJsZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IGFwaWNfc2V0X3ZlcmJvc2l0eShjaGFyICpzdHIpCit7CisJaWYgKHN0cmNtcCgiZGVidWciLCBzdHIpID09IDApCisJCWFwaWNfdmVyYm9zaXR5ID0gQVBJQ19ERUJVRzsKKwllbHNlIGlmIChzdHJjbXAoInZlcmJvc2UiLCBzdHIpID09IDApCisJCWFwaWNfdmVyYm9zaXR5ID0gQVBJQ19WRVJCT1NFOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVBJQyBWZXJib3NpdHkgbGV2ZWwgJXMgbm90IHJlY29nbmlzZWQiCisJCQkJIiB1c2UgYXBpYz12ZXJib3NlIG9yIGFwaWM9ZGVidWciLCBzdHIpOworCisJcmV0dXJuIDA7Cit9CisKK19fc2V0dXAoImFwaWM9IiwgYXBpY19zZXRfdmVyYm9zaXR5KTsKKworc3RhdGljIGludCBfX2luaXQgZGV0ZWN0X2luaXRfQVBJQyAodm9pZCkKK3sKKwl1MzIgaCwgbCwgZmVhdHVyZXM7CisJZXh0ZXJuIHZvaWQgZ2V0X2NwdV92ZW5kb3Ioc3RydWN0IGNwdWluZm9feDg2Kik7CisKKwkvKiBEaXNhYmxlZCBieSBrZXJuZWwgb3B0aW9uPyAqLworCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCisJCXJldHVybiAtMTsKKworCS8qIFdvcmthcm91bmQgZm9yIHVzIGJlaW5nIGNhbGxlZCBiZWZvcmUgaWRlbnRpZnlfY3B1KCkuICovCisJZ2V0X2NwdV92ZW5kb3IoJmJvb3RfY3B1X2RhdGEpOworCisJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwljYXNlIFg4Nl9WRU5ET1JfQU1EOgorCQlpZiAoKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAxKSB8fAorCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkJICAgIAorCQkJYnJlYWs7CisJCWdvdG8gbm9fYXBpYzsKKwljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCWlmIChib290X2NwdV9kYXRhLng4NiA9PSA2IHx8IGJvb3RfY3B1X2RhdGEueDg2ID09IDE1IHx8CisJCSAgICAoYm9vdF9jcHVfZGF0YS54ODYgPT0gNSAmJiBjcHVfaGFzX2FwaWMpKQorCQkJYnJlYWs7CisJCWdvdG8gbm9fYXBpYzsKKwlkZWZhdWx0OgorCQlnb3RvIG5vX2FwaWM7CisJfQorCisJaWYgKCFjcHVfaGFzX2FwaWMpIHsKKwkJLyoKKwkJICogT3Zlci1yaWRlIEJJT1MgYW5kIHRyeSB0byBlbmFibGUgdGhlIGxvY2FsCisJCSAqIEFQSUMgb25seSBpZiAibGFwaWMiIHNwZWNpZmllZC4KKwkJICovCisJCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8PSAwKSB7CisJCQlwcmludGsoIkxvY2FsIEFQSUMgZGlzYWJsZWQgYnkgQklPUyAtLSAiCisJCQkgICAgICAgInlvdSBjYW4gZW5hYmxlIGl0IHdpdGggXCJsYXBpY1wiXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKgorCQkgKiBTb21lIEJJT1NlcyBkaXNhYmxlIHRoZSBsb2NhbCBBUElDIGluIHRoZQorCQkgKiBBUElDX0JBU0UgTVNSLiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgaW4KKwkJICogc29mdHdhcmUgZm9yIEludGVsIFA2IG9yIGxhdGVyIGFuZCBBTUQgSzcKKwkJICogKE1vZGVsID4gMSkgb3IgbGF0ZXIuCisJCSAqLworCQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CisJCWlmICghKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpKSB7CisJCQlwcmludGsoIkxvY2FsIEFQSUMgZGlzYWJsZWQgYnkgQklPUyAtLSByZWVuYWJsaW5nLlxuIik7CisJCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9CQVNFOworCQkJbCB8PSBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUgfCBBUElDX0RFRkFVTFRfUEhZU19CQVNFOworCQkJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCQkJZW5hYmxlZF92aWFfYXBpY2Jhc2UgPSAxOworCQl9CisJfQorCS8qCisJICogVGhlIEFQSUMgZmVhdHVyZSBiaXQgc2hvdWxkIG5vdyBiZSBlbmFibGVkCisJICogaW4gYGNwdWlkJworCSAqLworCWZlYXR1cmVzID0gY3B1aWRfZWR4KDEpOworCWlmICghKGZlYXR1cmVzICYgKDEgPDwgWDg2X0ZFQVRVUkVfQVBJQykpKSB7CisJCXByaW50aygiQ291bGQgbm90IGVuYWJsZSBBUElDIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJc2V0X2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKKwltcF9sYXBpY19hZGRyID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKKworCS8qIFRoZSBCSU9TIG1heSBoYXZlIHNldCB1cCB0aGUgQVBJQyBhdCBzb21lIG90aGVyIGFkZHJlc3MgKi8KKwlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CisJaWYgKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpCisJCW1wX2xhcGljX2FkZHIgPSBsICYgTVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKKworCWlmIChubWlfd2F0Y2hkb2cgIT0gTk1JX05PTkUpCisJCW5taV93YXRjaGRvZyA9IE5NSV9MT0NBTF9BUElDOworCisJcHJpbnRrKCJGb3VuZCBhbmQgZW5hYmxlZCBsb2NhbCBBUElDIVxuIik7CisKKwlhcGljX3BtX2FjdGl2YXRlKCk7CisKKwlyZXR1cm4gMDsKKworbm9fYXBpYzoKKwlwcmludGsoIk5vIGxvY2FsIEFQSUMgcHJlc2VudCBvciBoYXJkd2FyZSBkaXNhYmxlZFxuIik7CisJcmV0dXJuIC0xOworfQorCit2b2lkIF9faW5pdCBpbml0X2FwaWNfbWFwcGluZ3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFwaWNfcGh5czsKKworCS8qCisJICogSWYgbm8gbG9jYWwgQVBJQyBjYW4gYmUgZm91bmQgdGhlbiBzZXQgdXAgYSBmYWtlIGFsbAorCSAqIHplcm9lcyBwYWdlIHRvIHNpbXVsYXRlIHRoZSBsb2NhbCBBUElDIGFuZCBhbm90aGVyCisJICogb25lIGZvciB0aGUgSU8tQVBJQy4KKwkgKi8KKwlpZiAoIXNtcF9mb3VuZF9jb25maWcgJiYgZGV0ZWN0X2luaXRfQVBJQygpKSB7CisJCWFwaWNfcGh5cyA9ICh1bnNpZ25lZCBsb25nKSBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSk7CisJCWFwaWNfcGh5cyA9IF9fcGEoYXBpY19waHlzKTsKKwl9IGVsc2UKKwkJYXBpY19waHlzID0gbXBfbGFwaWNfYWRkcjsKKworCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQVBJQ19CQVNFLCBhcGljX3BoeXMpOworCXByaW50ayhLRVJOX0RFQlVHICJtYXBwZWQgQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLCBBUElDX0JBU0UsCisJICAgICAgIGFwaWNfcGh5cyk7CisKKwkvKgorCSAqIEZldGNoIHRoZSBBUElDIElEIG9mIHRoZSBCU1AgaW4gY2FzZSB3ZSBoYXZlIGEKKwkgKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKG9yIHRoZSBNUCB0YWJsZSBpcyBicm9rZW4pLgorCSAqLworCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPT0gLTFVKQorCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpOworCisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCisJeworCQl1bnNpZ25lZCBsb25nIGlvYXBpY19waHlzLCBpZHggPSBGSVhfSU9fQVBJQ19CQVNFXzA7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspIHsKKwkJCWlmIChzbXBfZm91bmRfY29uZmlnKSB7CisJCQkJaW9hcGljX3BoeXMgPSBtcF9pb2FwaWNzW2ldLm1wY19hcGljYWRkcjsKKwkJCQlpZiAoIWlvYXBpY19waHlzKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkgICAgICAgIldBUk5JTkc6IGJvZ3VzIHplcm8gSU8tQVBJQyAiCisJCQkJCSAgICAgICAiYWRkcmVzcyBmb3VuZCBpbiBNUFRBQkxFLCAiCisJCQkJCSAgICAgICAiZGlzYWJsaW5nIElPL0FQSUMgc3VwcG9ydCFcbiIpOworCQkJCQlzbXBfZm91bmRfY29uZmlnID0gMDsKKwkJCQkJc2tpcF9pb2FwaWNfc2V0dXAgPSAxOworCQkJCQlnb3RvIGZha2VfaW9hcGljX3BhZ2U7CisJCQkJfQorCQkJfSBlbHNlIHsKK2Zha2VfaW9hcGljX3BhZ2U6CisJCQkJaW9hcGljX3BoeXMgPSAodW5zaWduZWQgbG9uZykKKwkJCQkJICAgICAgYWxsb2NfYm9vdG1lbV9wYWdlcyhQQUdFX1NJWkUpOworCQkJCWlvYXBpY19waHlzID0gX19wYShpb2FwaWNfcGh5cyk7CisJCQl9CisJCQlzZXRfZml4bWFwX25vY2FjaGUoaWR4LCBpb2FwaWNfcGh5cyk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibWFwcGVkIElPQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLAorCQkJICAgICAgIF9fZml4X3RvX3ZpcnQoaWR4KSwgaW9hcGljX3BoeXMpOworCQkJaWR4Kys7CisJCX0KKwl9CisjZW5kaWYKK30KKworLyoKKyAqIFRoaXMgcGFydCBzZXRzIHVwIHRoZSBBUElDIDMyIGJpdCBjbG9jayBpbiBMVlRUMSwgd2l0aCBIWiBpbnRlcnJ1cHRzCisgKiBwZXIgc2Vjb25kLiBXZSBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IHNldCB1cCB0aGUgbG9jYWwKKyAqIEFQSUMuCisgKgorICogVGhlIEFQSUMgdGltZXIgaXMgbm90IGV4YWN0bHkgc3luYyB3aXRoIHRoZSBleHRlcm5hbCB0aW1lciBjaGlwLCBpdAorICogY2xvc2VseSBmb2xsb3dzIGJ1cyBjbG9ja3MuCisgKi8KKworLyoKKyAqIFRoZSB0aW1lciBjaGlwIGlzIGFscmVhZHkgc2V0IHVwIGF0IEhaIGludGVycnVwdHMgcGVyIHNlY29uZCBoZXJlLAorICogYnV0IHdlIGRvIG5vdCBhY2NlcHQgdGltZXIgaW50ZXJydXB0cyB5ZXQuIFdlIG9ubHkgYWxsb3cgdGhlIEJQCisgKiB0byBjYWxpYnJhdGUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGdldF84MjU0X3RpbWVyX2NvdW50KHZvaWQpCit7CisJZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdW5zaWduZWQgaW50IGNvdW50OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKKworCW91dGJfcCgweDAwLCBQSVRfTU9ERSk7CisJY291bnQgPSBpbmJfcChQSVRfQ0gwKTsKKwljb3VudCB8PSBpbmJfcChQSVRfQ0gwKSA8PCA4OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKiBuZXh0IHRpY2sgaW4gODI1NCBjYW4gYmUgY2F1Z2h0IGJ5IGNhdGNoaW5nIHRpbWVyIHdyYXBhcm91bmQgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCB3YWl0XzgyNTRfd3JhcGFyb3VuZCh2b2lkKQoreworCXVuc2lnbmVkIGludCBjdXJyX2NvdW50LCBwcmV2X2NvdW50OworCisJY3Vycl9jb3VudCA9IGdldF84MjU0X3RpbWVyX2NvdW50KCk7CisJZG8geworCQlwcmV2X2NvdW50ID0gY3Vycl9jb3VudDsKKwkJY3Vycl9jb3VudCA9IGdldF84MjU0X3RpbWVyX2NvdW50KCk7CisKKwkJLyogd29ya2Fyb3VuZCBmb3IgYnJva2VuIE1lcmN1cnkvTmVwdHVuZSAqLworCQlpZiAocHJldl9jb3VudCA+PSBjdXJyX2NvdW50ICsgMHgxMDApCisJCQljdXJyX2NvdW50ID0gZ2V0XzgyNTRfdGltZXJfY291bnQoKTsKKworCX0gd2hpbGUgKHByZXZfY291bnQgPj0gY3Vycl9jb3VudCk7Cit9CisKKy8qCisgKiBEZWZhdWx0IGluaXRpYWxpemF0aW9uIGZvciA4MjU0IHRpbWVycy4gSWYgd2UgdXNlIG90aGVyIHRpbWVycyBsaWtlIEhQRVQsCisgKiB3ZSBvdmVycmlkZSB0aGlzIGxhdGVyCisgKi8KK3ZvaWQgKCp3YWl0X3RpbWVyX3RpY2spKHZvaWQpIF9faW5pdGRhdGEgPSB3YWl0XzgyNTRfd3JhcGFyb3VuZDsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgbG9jYWwgQVBJQyB0aW1lciwgd2l0aCBhIHRpbWVvdXQgb2YKKyAqICdjbG9ja3MnIEFQSUMgYnVzIGNsb2NrLiBEdXJpbmcgY2FsaWJyYXRpb24gd2UgYWN0dWFsbHkgY2FsbAorICogdGhpcyBmdW5jdGlvbiB0d2ljZSBvbiB0aGUgYm9vdCBDUFUsIG9uY2Ugd2l0aCBhIGJvZ3VzIHRpbWVvdXQKKyAqIHZhbHVlLCBzZWNvbmQgdGltZSBmb3IgcmVhbC4gVGhlIG90aGVyIChub25jYWxpYnJhdGluZykgQ1BVcworICogY2FsbCB0aGlzIGZ1bmN0aW9uIG9ubHkgb25jZSwgd2l0aCB0aGUgcmVhbCwgY2FsaWJyYXRlZCB2YWx1ZS4KKyAqCisgKiBXZSBkbyByZWFkcyBiZWZvcmUgd3JpdGVzIGV2ZW4gaWYgdW5uZWNlc3NhcnksIHRvIGdldCBhcm91bmQgdGhlCisgKiBQNSBBUElDIGRvdWJsZSB3cml0ZSBidWcuCisgKi8KKworI2RlZmluZSBBUElDX0RJVklTT1IgMTYKKworc3RhdGljIHZvaWQgX19zZXR1cF9BUElDX0xWVFQodW5zaWduZWQgaW50IGNsb2NrcykKK3sKKwl1bnNpZ25lZCBpbnQgbHZ0dF92YWx1ZSwgdG1wX3ZhbHVlLCB2ZXI7CisKKwl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOworCWx2dHRfdmFsdWUgPSBBUElDX0xWVF9USU1FUl9QRVJJT0RJQyB8IExPQ0FMX1RJTUVSX1ZFQ1RPUjsKKwlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQorCQlsdnR0X3ZhbHVlIHw9IFNFVF9BUElDX1RJTUVSX0JBU0UoQVBJQ19USU1FUl9CQVNFX0RJVik7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCBsdnR0X3ZhbHVlKTsKKworCS8qCisJICogRGl2aWRlIFBJQ0xLIGJ5IDE2CisJICovCisJdG1wX3ZhbHVlID0gYXBpY19yZWFkKEFQSUNfVERDUik7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19URENSLCAodG1wX3ZhbHVlCisJCQkJJiB+KEFQSUNfVERSX0RJVl8xIHwgQVBJQ19URFJfRElWX1RNQkFTRSkpCisJCQkJfCBBUElDX1REUl9ESVZfMTYpOworCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19UTUlDVCwgY2xvY2tzL0FQSUNfRElWSVNPUik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9BUElDX3RpbWVyKHVuc2lnbmVkIGludCBjbG9ja3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qCisJICogV2FpdCBmb3IgSVJRMCdzIHNsaWNlOgorCSAqLworCXdhaXRfdGltZXJfdGljaygpOworCisJX19zZXR1cF9BUElDX0xWVFQoY2xvY2tzKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIEluIHRoaXMgZnVuY3Rpb24gd2UgY2FsaWJyYXRlIEFQSUMgYnVzIGNsb2NrcyB0byB0aGUgZXh0ZXJuYWwKKyAqIHRpbWVyLiBVbmZvcnR1bmF0ZWx5IHdlIGNhbm5vdCB1c2UgamlmZmllcyBhbmQgdGhlIHRpbWVyIGlycQorICogdG8gY2FsaWJyYXRlLCBzaW5jZSBzb21lIGxhdGVyIGJvb3R1cCBjb2RlIGRlcGVuZHMgb24gZ2V0dGluZworICogdGhlIGZpcnN0IGlycT8gVWdoLgorICoKKyAqIFdlIHdhbnQgdG8gZG8gdGhlIGNhbGlicmF0aW9uIG9ubHkgb25jZSBzaW5jZSB3ZQorICogd2FudCB0byBoYXZlIGxvY2FsIHRpbWVyIGlycXMgc3luY3Jvbi4gQ1BVcyBjb25uZWN0ZWQKKyAqIGJ5IHRoZSBzYW1lIEFQSUMgYnVzIGhhdmUgdGhlIHZlcnkgc2FtZSBidXMgZnJlcXVlbmN5LgorICogQW5kIHdlIHdhbnQgdG8gaGF2ZSBpcnFzIG9mZiBhbnl3YXlzLCBubyBhY2NpZGVudGFsCisgKiBBUElDIGlycSB0aGF0IHdheS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBjYWxpYnJhdGVfQVBJQ19jbG9jayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0MSA9IDAsIHQyID0gMDsKKwlsb25nIHR0MSwgdHQyOworCWxvbmcgcmVzdWx0OworCWludCBpOworCWNvbnN0IGludCBMT09QUyA9IEhaLzEwOworCisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiY2FsaWJyYXRpbmcgQVBJQyB0aW1lciAuLi5cbiIpOworCisJLyoKKwkgKiBQdXQgd2hhdGV2ZXIgYXJiaXRyYXJ5IChidXQgbG9uZyBlbm91Z2gpIHRpbWVvdXQKKwkgKiB2YWx1ZSBpbnRvIHRoZSBBUElDIGNsb2NrLCB3ZSBqdXN0IHdhbnQgdG8gZ2V0IHRoZQorCSAqIGNvdW50ZXIgcnVubmluZyBmb3IgY2FsaWJyYXRpb24uCisJICovCisJX19zZXR1cF9BUElDX0xWVFQoMTAwMDAwMDAwMCk7CisKKwkvKgorCSAqIFRoZSB0aW1lciBjaGlwIGNvdW50cyBkb3duIHRvIHplcm8uIExldCdzIHdhaXQKKwkgKiBmb3IgYSB3cmFwYXJvdW5kIHRvIHN0YXJ0IGV4YWN0IG1lYXN1cmVtZW50OgorCSAqICh0aGUgY3VycmVudCB0aWNrIG1pZ2h0IGhhdmUgYmVlbiBhbHJlYWR5IGhhbGYgZG9uZSkKKwkgKi8KKworCXdhaXRfdGltZXJfdGljaygpOworCisJLyoKKwkgKiBXZSB3cmFwcGVkIGFyb3VuZCBqdXN0IG5vdy4gTGV0J3Mgc3RhcnQ6CisJICovCisJaWYgKGNwdV9oYXNfdHNjKQorCQlyZHRzY2xsKHQxKTsKKwl0dDEgPSBhcGljX3JlYWQoQVBJQ19UTUNDVCk7CisKKwkvKgorCSAqIExldCdzIHdhaXQgTE9PUFMgd3JhcHJvdW5kczoKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTE9PUFM7IGkrKykKKwkJd2FpdF90aW1lcl90aWNrKCk7CisKKwl0dDIgPSBhcGljX3JlYWQoQVBJQ19UTUNDVCk7CisJaWYgKGNwdV9oYXNfdHNjKQorCQlyZHRzY2xsKHQyKTsKKworCS8qCisJICogVGhlIEFQSUMgYnVzIGNsb2NrIGNvdW50ZXIgaXMgMzIgYml0cyBvbmx5LCBpdAorCSAqIG1pZ2h0IGhhdmUgb3ZlcmZsb3duLCBidXQgbm90ZSB0aGF0IHdlIHVzZSBzaWduZWQKKwkgKiBsb25ncywgdGh1cyBubyBleHRyYSBjYXJlIG5lZWRlZC4KKwkgKgorCSAqIHVuZGVyZmxvd24gdG8gYmUgZXhhY3QsIGFzIHRoZSB0aW1lciBjb3VudHMgZG93biA7KQorCSAqLworCisJcmVzdWx0ID0gKHR0MS10dDIpKkFQSUNfRElWSVNPUi9MT09QUzsKKworCWlmIChjcHVfaGFzX3RzYykKKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uLi4gQ1BVIGNsb2NrIHNwZWVkIGlzICIKKwkJCSIlbGQuJTA0bGQgTUh6LlxuIiwKKwkJCSgobG9uZykodDItdDEpL0xPT1BTKS8oMTAwMDAwMC9IWiksCisJCQkoKGxvbmcpKHQyLXQxKS9MT09QUyklKDEwMDAwMDAvSFopKTsKKworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLi4uIGhvc3QgYnVzIGNsb2NrIHNwZWVkIGlzICIKKwkJIiVsZC4lMDRsZCBNSHouXG4iLAorCQlyZXN1bHQvKDEwMDAwMDAvSFopLAorCQlyZXN1bHQlKDEwMDAwMDAvSFopKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FsaWJyYXRpb25fcmVzdWx0OworCit2b2lkIF9faW5pdCBzZXR1cF9ib290X0FQSUNfY2xvY2sodm9pZCkKK3sKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJVc2luZyBsb2NhbCBBUElDIHRpbWVyIGludGVycnVwdHMuXG4iKTsKKwl1c2luZ19hcGljX3RpbWVyID0gMTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwljYWxpYnJhdGlvbl9yZXN1bHQgPSBjYWxpYnJhdGVfQVBJQ19jbG9jaygpOworCS8qCisJICogTm93IHNldCB1cCB0aGUgdGltZXIgZm9yIHJlYWwuCisJICovCisJc2V0dXBfQVBJQ190aW1lcihjYWxpYnJhdGlvbl9yZXN1bHQpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCit2b2lkIF9faW5pdCBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jayh2b2lkKQoreworCXNldHVwX0FQSUNfdGltZXIoY2FsaWJyYXRpb25fcmVzdWx0KTsKK30KKwordm9pZCBfX2luaXQgZGlzYWJsZV9BUElDX3RpbWVyKHZvaWQpCit7CisJaWYgKHVzaW5nX2FwaWNfdGltZXIpIHsKKwkJdW5zaWduZWQgbG9uZyB2OworCisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKKwl9Cit9CisKK3ZvaWQgZW5hYmxlX0FQSUNfdGltZXIodm9pZCkKK3sKKwlpZiAodXNpbmdfYXBpY190aW1lcikgeworCQl1bnNpZ25lZCBsb25nIHY7CisKKwkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFQpOworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIHYgJiB+QVBJQ19MVlRfTUFTS0VEKTsKKwl9Cit9CisKKy8qCisgKiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBwcm9maWxpbmcgdGltZXIgY2FuIGJlIGNoYW5nZWQKKyAqIGJ5IHdyaXRpbmcgYSBtdWx0aXBsaWVyIHZhbHVlIGludG8gL3Byb2MvcHJvZmlsZS4KKyAqLworaW50IHNldHVwX3Byb2ZpbGluZ190aW1lcih1bnNpZ25lZCBpbnQgbXVsdGlwbGllcikKK3sKKwlpbnQgaTsKKworCS8qCisJICogU2FuaXR5IGNoZWNrLiBbYXQgbGVhc3QgNTAwIEFQSUMgY3ljbGVzIHNob3VsZCBiZQorCSAqIGJldHdlZW4gQVBJQyBpbnRlcnJ1cHRzIGFzIGEgcnVsZSBvZiB0aHVtYiwgdG8gYXZvaWQKKwkgKiBpcnFzIGZsb29kaW5nIHVzXQorCSAqLworCWlmICggKCFtdWx0aXBsaWVyKSB8fCAoY2FsaWJyYXRpb25fcmVzdWx0L211bHRpcGxpZXIgPCA1MDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIAorCSAqIFNldCB0aGUgbmV3IG11bHRpcGxpZXIgZm9yIGVhY2ggQ1BVLiBDUFVzIGRvbid0IHN0YXJ0IHVzaW5nIHRoZQorCSAqIG5ldyB2YWx1ZXMgdW50aWwgdGhlIG5leHQgdGltZXIgaW50ZXJydXB0IGluIHdoaWNoIHRoZXkgZG8gcHJvY2VzcworCSAqIGFjY291bnRpbmcuIEF0IHRoYXQgdGltZSB0aGV5IGFsc28gYWRqdXN0IHRoZWlyIEFQSUMgdGltZXJzCisJICogYWNjb3JkaW5nbHkuCisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7ICsraSkKKwkJcGVyX2NwdShwcm9mX211bHRpcGxpZXIsIGkpID0gbXVsdGlwbGllcjsKKworCXJldHVybiAwOworfQorCisjdW5kZWYgQVBJQ19ESVZJU09SCisKKy8qCisgKiBMb2NhbCB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlci4gSXQgZG9lcyBib3RoIHByb2ZpbGluZyBhbmQKKyAqIHByb2Nlc3Mgc3RhdGlzdGljcy9yZXNjaGVkdWxpbmcuCisgKgorICogV2UgZG8gcHJvZmlsaW5nIGluIGV2ZXJ5IGxvY2FsIHRpY2ssIHN0YXRpc3RpY3MvcmVzY2hlZHVsaW5nCisgKiBoYXBwZW4gb25seSBldmVyeSAncHJvZmlsaW5nIG11bHRpcGxpZXInIHRpY2tzLiBUaGUgZGVmYXVsdAorICogbXVsdGlwbGllciBpcyAxIGFuZCBpdCBjYW4gYmUgY2hhbmdlZCBieSB3cml0aW5nIHRoZSBuZXcgbXVsdGlwbGllcgorICogdmFsdWUgaW50byAvcHJvYy9wcm9maWxlLgorICovCisKK2lubGluZSB2b2lkIHNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORywgcmVncyk7CisJaWYgKC0tcGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSkgPD0gMCkgeworCQkvKgorCQkgKiBUaGUgbXVsdGlwbGllciBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZ290CisJCSAqIHRvIHRoaXMgcG9pbnQgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgd3JpdGluZyB0bworCQkgKiAvcHJvYy9wcm9maWxlLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBhZGp1c3QgdGhlIEFQSUMKKwkJICogdGltZXIgYWNjb3JkaW5nbHkuCisJCSAqCisJCSAqIEludGVycnVwdHMgYXJlIGFscmVhZHkgbWFza2VkIG9mZiBhdCB0aGlzIHBvaW50LgorCQkgKi8KKwkJcGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSkgPSBwZXJfY3B1KHByb2ZfbXVsdGlwbGllciwgY3B1KTsKKwkJaWYgKHBlcl9jcHUocHJvZl9jb3VudGVyLCBjcHUpICE9CisJCQkJCXBlcl9jcHUocHJvZl9vbGRfbXVsdGlwbGllciwgY3B1KSkgeworCQkJX19zZXR1cF9BUElDX0xWVFQoCisJCQkJCWNhbGlicmF0aW9uX3Jlc3VsdC8KKwkJCQkJcGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSkpOworCQkJcGVyX2NwdShwcm9mX29sZF9tdWx0aXBsaWVyLCBjcHUpID0KKwkJCQkJCXBlcl9jcHUocHJvZl9jb3VudGVyLCBjcHUpOworCQl9CisKKyNpZmRlZiBDT05GSUdfU01QCisJCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIFdlIHRha2UgdGhlICdsb25nJyByZXR1cm4gcGF0aCwgYW5kIHRoZXJlIGV2ZXJ5IHN1YnN5c3RlbQorCSAqIGdyYWJzIHRoZSBhcHJvcHJpYXRlIGxvY2tzIChrZXJuZWwgbG9jay8gaXJxIGxvY2spLgorCSAqCisJICogd2UgbWlnaHQgd2FudCB0byBkZWNvdXBsZSBwcm9maWxpbmcgZnJvbSB0aGUgJ2xvbmcgcGF0aCcsCisJICogYW5kIGRvIHRoZSBwcm9maWxpbmcgdG90YWxseSBpbiBhc3NlbWJseS4KKwkgKgorCSAqIEN1cnJlbnRseSB0aGlzIGlzbid0IHRvbyBtdWNoIG9mIGFuIGlzc3VlIChwZXJmb3JtYW5jZSB3aXNlKSwKKwkgKiB3ZSBjYW4gdGFrZSBtb3JlIHRoYW4gMTAwSyBsb2NhbCBpcnFzIHBlciBzZWNvbmQgb24gYSAxMDAgTUh6IFA1LgorCSAqLworfQorCisvKgorICogTG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHQuIFRoaXMgaXMgdGhlIG1vc3QgbmF0dXJhbCB3YXkgZm9yIGRvaW5nCisgKiBsb2NhbCBpbnRlcnJ1cHRzLCBidXQgbG9jYWwgdGltZXIgaW50ZXJydXB0cyBjYW4gYmUgZW11bGF0ZWQgYnkKKyAqIGJyb2FkY2FzdCBpbnRlcnJ1cHRzIHRvby4gW2luIGNhc2UgdGhlIGh3IGRvZXNuJ3Qgc3VwcG9ydCBBUElDIHRpbWVyc10KKyAqCisgKiBbIGlmIGEgc2luZ2xlLUNQVSBzeXN0ZW0gcnVucyBhbiBTTVAga2VybmVsIHRoZW4gd2UgY2FsbCB0aGUgbG9jYWwKKyAqICAgaW50ZXJydXB0IGFzIHdlbGwuIFRodXMgd2UgY2Fubm90IGlubGluZSB0aGUgbG9jYWwgaXJxIC4uLiBdCisgKi8KKworZmFzdGNhbGwgdm9pZCBzbXBfYXBpY190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCS8qCisJICogdGhlIE5NSSBkZWFkbG9jay1kZXRlY3RvciB1c2VzIHRoaXMuCisJICovCisJcGVyX2NwdShpcnFfc3RhdCwgY3B1KS5hcGljX3RpbWVyX2lycXMrKzsKKworCS8qCisJICogTk9URSEgV2UnZCBiZXR0ZXIgQUNLIHRoZSBpcnEgaW1tZWRpYXRlbHksCisJICogYmVjYXVzZSB0aW1lciBoYW5kbGluZyBjYW4gYmUgc2xvdy4KKwkgKi8KKwlhY2tfQVBJQ19pcnEoKTsKKwkvKgorCSAqIHVwZGF0ZV9wcm9jZXNzX3RpbWVzKCkgZXhwZWN0cyB1cyB0byBoYXZlIGRvbmUgaXJxX2VudGVyKCkuCisJICogQmVzaWRlcywgaWYgd2UgZG9uJ3QgdGltZXIgaW50ZXJydXB0cyBpZ25vcmUgdGhlIGdsb2JhbAorCSAqIGludGVycnVwdCBsb2NrLCB3aGljaCBpcyB0aGUgV3JvbmdUaGluZyAodG0pIHRvIGRvLgorCSAqLworCWlycV9lbnRlcigpOworCXNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQocmVncyk7CisJaXJxX2V4aXQoKTsKK30KKworLyoKKyAqIFRoaXMgaW50ZXJydXB0IHNob3VsZCBfbmV2ZXJfIGhhcHBlbiB3aXRoIG91ciBBUElDL1NNUCBhcmNoaXRlY3R1cmUKKyAqLworZmFzdGNhbGwgdm9pZCBzbXBfc3B1cmlvdXNfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKworCWlycV9lbnRlcigpOworCS8qCisJICogQ2hlY2sgaWYgdGhpcyByZWFsbHkgaXMgYSBzcHVyaW91cyBpbnRlcnJ1cHQgYW5kIEFDSyBpdAorCSAqIGlmIGl0IGlzIGEgdmVjdG9yZWQgb25lLiAgSnVzdCBpbiBjYXNlLi4uCisJICogU3B1cmlvdXMgaW50ZXJydXB0cyBzaG91bGQgbm90IGJlIEFDS2VkLgorCSAqLworCXYgPSBhcGljX3JlYWQoQVBJQ19JU1IgKyAoKFNQVVJJT1VTX0FQSUNfVkVDVE9SICYgfjB4MWYpID4+IDEpKTsKKwlpZiAodiAmICgxIDw8IChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIDB4MWYpKSkKKwkJYWNrX0FQSUNfaXJxKCk7CisKKwkvKiBzZWUgc3ctZGV2LW1hbiB2b2wgMywgY2hhcHRlciA3LjQuMTMuNSAqLworCXByaW50ayhLRVJOX0lORk8gInNwdXJpb3VzIEFQSUMgaW50ZXJydXB0IG9uIENQVSMlZCwgc2hvdWxkIG5ldmVyIGhhcHBlbi5cbiIsCisJCQlzbXBfcHJvY2Vzc29yX2lkKCkpOworCWlycV9leGl0KCk7Cit9CisKKy8qCisgKiBUaGlzIGludGVycnVwdCBzaG91bGQgbmV2ZXIgaGFwcGVuIHdpdGggb3VyIEFQSUMvU01QIGFyY2hpdGVjdHVyZQorICovCisKK2Zhc3RjYWxsIHZvaWQgc21wX2Vycm9yX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHYsIHYxOworCisJaXJxX2VudGVyKCk7CisJLyogRmlyc3QgdGlja2xlIHRoZSBoYXJkd2FyZSwgb25seSB0aGVuIHJlcG9ydCB3aGF0IHdlbnQgb24uIC0tIFJFVyAqLworCXYgPSBhcGljX3JlYWQoQVBJQ19FU1IpOworCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCXYxID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKKwlhY2tfQVBJQ19pcnEoKTsKKwlhdG9taWNfaW5jKCZpcnFfZXJyX2NvdW50KTsKKworCS8qIEhlcmUgaXMgd2hhdCB0aGUgQVBJQyBlcnJvciBiaXRzIG1lYW46CisJICAgMDogU2VuZCBDUyBlcnJvcgorCSAgIDE6IFJlY2VpdmUgQ1MgZXJyb3IKKwkgICAyOiBTZW5kIGFjY2VwdCBlcnJvcgorCSAgIDM6IFJlY2VpdmUgYWNjZXB0IGVycm9yCisJICAgNDogUmVzZXJ2ZWQKKwkgICA1OiBTZW5kIGlsbGVnYWwgdmVjdG9yCisJICAgNjogUmVjZWl2ZWQgaWxsZWdhbCB2ZWN0b3IKKwkgICA3OiBJbGxlZ2FsIHJlZ2lzdGVyIGFkZHJlc3MKKwkqLworCXByaW50ayAoS0VSTl9ERUJVRyAiQVBJQyBlcnJvciBvbiBDUFUlZDogJTAybHgoJTAybHgpXG4iLAorCSAgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCB2ICwgdjEpOworCWlycV9leGl0KCk7Cit9CisKKy8qCisgKiBUaGlzIGluaXRpYWxpemVzIHRoZSBJTy1BUElDIGFuZCBBUElDIGhhcmR3YXJlIGlmIHRoaXMgaXMKKyAqIGEgVVAga2VybmVsLgorICovCitpbnQgX19pbml0IEFQSUNfaW5pdF91bmlwcm9jZXNzb3IgKHZvaWQpCit7CisJaWYgKGVuYWJsZV9sb2NhbF9hcGljIDwgMCkKKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX0FQSUMsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOworCisJaWYgKCFzbXBfZm91bmRfY29uZmlnICYmICFjcHVfaGFzX2FwaWMpCisJCXJldHVybiAtMTsKKworCS8qCisJICogQ29tcGxhaW4gaWYgdGhlIEJJT1MgcHJldGVuZHMgdGhlcmUgaXMgb25lLgorCSAqLworCWlmICghY3B1X2hhc19hcGljICYmIEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1ZywgbG9jYWwgQVBJQyAjJWQgbm90IGRldGVjdGVkIS4uLlxuIiwKKwkJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwl2ZXJpZnlfbG9jYWxfQVBJQygpOworCisJY29ubmVjdF9ic3BfQVBJQygpOworCisJcGh5c19jcHVfcHJlc2VudF9tYXAgPSBwaHlzaWRfbWFza19vZl9waHlzaWQoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKKworCXNldHVwX2xvY2FsX0FQSUMoKTsKKworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCisJCWNoZWNrX25taV93YXRjaGRvZygpOworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWlmIChzbXBfZm91bmRfY29uZmlnKQorCQlpZiAoIXNraXBfaW9hcGljX3NldHVwICYmIG5yX2lvYXBpY3MpCisJCQlzZXR1cF9JT19BUElDKCk7CisjZW5kaWYKKwlzZXR1cF9ib290X0FQSUNfY2xvY2soKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2NDFhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKQEAgLTAsMCArMSwyNDI4IEBACisvKiAtKi0gbGludXgtYyAtKi0KKyAqIEFQTSBCSU9TIGRyaXZlciBmb3IgTGludXgKKyAqIENvcHlyaWdodCAxOTk0LTIwMDEgU3RlcGhlbiBSb3Rod2VsbCAoc2ZyQGNhbmIuYXV1Zy5vcmcuYXUpCisgKgorICogSW5pdGlhbCBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlciB3YXMgZnVuZGVkIGJ5IE5FQyBBdXN0cmFsaWEgUC9MCisgKglhbmQgTkVDIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE9jdG9iZXIgMTk5NSwgUmlrIEZhaXRoIChmYWl0aEBjcy51bmMuZWR1KToKKyAqICAgIE1pbm9yIGVuaGFuY2VtZW50cyBhbmQgdXBkYXRlcyAodG8gdGhlIHBhdGNoIHNldCkgZm9yIDEuMy54CisgKiAgICBEb2N1bWVudGF0aW9uCisgKiBKYW51YXJ5IDE5OTYsIFJpayBGYWl0aCAoZmFpdGhAY3MudW5jLmVkdSk6CisgKiAgICBNYWtlIC9wcm9jL2FwbSBlYXN5IHRvIGZvcm1hdCAoYnVtcCBkcml2ZXIgdmVyc2lvbikKKyAqIE1hcmNoIDE5OTYsIFJpayBGYWl0aCAoZmFpdGhAY3MudW5jLmVkdSk6CisgKiAgICBQcm9oaWJpdCBBUE0gQklPUyBjYWxscyB1bmxlc3MgYXBtX2VuYWJsZWQuCisgKiAgICAoVGhhbmtzIHRvIFVscmljaCBXaW5kbCA8VWxyaWNoLldpbmRsQHJ6LnVuaS1yZWdlbnNidXJnLmRlPikKKyAqIEFwcmlsIDE5OTYsIFN0ZXBoZW4gUm90aHdlbGwgKHNmckBjYW5iLmF1dWcub3JnLmF1KQorICogICAgVmVyc2lvbiAxLjAgYW5kIDEuMQorICogTWF5IDE5OTYsIFZlcnNpb24gMS4yCisgKiBGZWIgMTk5OCwgVmVyc2lvbiAxLjMKKyAqIEZlYiAxOTk4LCBWZXJzaW9uIDEuNAorICogQXVnIDE5OTgsIFZlcnNpb24gMS41CisgKiBTZXAgMTk5OCwgVmVyc2lvbiAxLjYKKyAqIE5vdiAxOTk4LCBWZXJzaW9uIDEuNworICogSmFuIDE5OTksIFZlcnNpb24gMS44CisgKiBKYW4gMTk5OSwgVmVyc2lvbiAxLjkKKyAqIE9jdCAxOTk5LCBWZXJzaW9uIDEuMTAKKyAqIE5vdiAxOTk5LCBWZXJzaW9uIDEuMTEKKyAqIEphbiAyMDAwLCBWZXJzaW9uIDEuMTIKKyAqIEZlYiAyMDAwLCBWZXJzaW9uIDEuMTMKKyAqIE5vdiAyMDAwLCBWZXJzaW9uIDEuMTQKKyAqIE9jdCAyMDAxLCBWZXJzaW9uIDEuMTUKKyAqIEphbiAyMDAyLCBWZXJzaW9uIDEuMTYKKyAqIE9jdCAyMDAyLCBWZXJzaW9uIDEuMTZhYworICoKKyAqIEhpc3Rvcnk6CisgKiAgICAwLjZiOiBmaXJzdCB2ZXJzaW9uIGluIG9mZmljaWFsIGtlcm5lbCwgTGludXggMS4zLjQ2CisgKiAgICAwLjc6IGNoYW5nZWQgL3Byb2MvYXBtIGZvcm1hdCwgTGludXggMS4zLjU4CisgKiAgICAwLjg6IGZpeGVkIGdjYyAyLjcuWzEyXSBjb21waWxhdGlvbiBwcm9ibGVtcywgTGludXggMS4zLjU5CisgKiAgICAwLjk6IG9ubHkgY2FsbCBiaW9zIGlmIGJpb3MgaXMgcHJlc2VudCwgTGludXggMS4zLjcyCisgKiAgICAxLjA6IHVzZSBmaXhlZCBkZXZpY2UgbnVtYmVyLCBjb25zb2xpZGF0ZSAvcHJvYy9hcG0gaW50byB0aGlzIGZpbGUsCisgKiAgICAgICAgIExpbnV4IDEuMy44NQorICogICAgMS4xOiBzdXBwb3J0IHVzZXItc3BhY2Ugc3RhbmRieSBhbmQgc3VzcGVuZCwgcG93ZXIgb2ZmIGFmdGVyIHN5c3RlbQorICogICAgICAgICBoYWx0ZWQsIExpbnV4IDEuMy45OAorICogICAgMS4yOiBXaGVuIHJlc2V0dGluZyBSVEMgYWZ0ZXIgcmVzdW1lLCB0YWtlIGNhcmUgc28gdGhhdCB0aGUgdGltZQorICogICAgICAgICBpcyBvbmx5IGluY29ycmVjdCBieSAzMC02MG1TICh2cy4gMVMgcHJldmlvdXNseSkgKEdhYm9yIEouIFRvdGgKKyAqICAgICAgICAgPGp0b3RoQHByaW5jZXRvbi5lZHU+KTsgaW1wcm92ZSBpbnRlcmFjdGlvbiBiZXR3ZWVuCisgKiAgICAgICAgIHNjcmVlbi1ibGFua2luZyBhbmQgZ3BtIChTdGVwaGVuIFJvdGh3ZWxsKTsgTGludXggMS45OS40CisgKiAgICAxLjJhOlNpbXBsZSBjaGFuZ2UgdG8gc3RvcCBteXN0ZXJpb3VzIGJ1ZyByZXBvcnRzIHdpdGggU01QIGFsc28gYWRkZWQKKyAqCSAgIGxldmVscyB0byB0aGUgcHJpbnRrIGNhbGxzLiBBUE0gaXMgbm90IGRlZmluZWQgZm9yIFNNUCBtYWNoaW5lcy4KKyAqICAgICAgICAgVGhlIG5ldyByZXBsYWNtZW50IGZvciBpdCBpcywgYnV0IExpbnV4IGRvZXNuJ3QgeWV0IHN1cHBvcnQgdGhpcy4KKyAqICAgICAgICAgQWxhbiBDb3ggTGludXggMi4xLjU1CisgKiAgICAxLjM6IFNldCB1cCBhIHZhbGlkIGRhdGEgZGVzY3JpcHRvciAweDQwIGZvciBidWdneSBCSU9TJ3MKKyAqICAgIDEuNDogVXBncmFkZWQgdG8gc3VwcG9ydCBBUE0gMS4yLiBJbnRlZ3JhdGVkIFRoaW5rUGFkIHN1c3BlbmQgcGF0Y2ggYnkKKyAqICAgICAgICAgRGVhbiBHYXVkZXQgPGRnYXVkZXRAYXJjdGljLm9yZz4uCisgKiAgICAgICAgIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PiBMaW51eCAyLjEuODcKKyAqICAgIDEuNTogRml4IHNlZ21lbnQgcmVnaXN0ZXIgcmVsb2FkaW5nIChpbiBjYXNlIG9mIGJhZCBzZWdtZW50cyBzYXZlZAorICogICAgICAgICBhY3Jvc3MgQklPUyBjYWxsKS4KKyAqICAgICAgICAgU3RlcGhlbiBSb3Rod2VsbAorICogICAgMS42OiBDb3BlIHdpdGggY29tcGxpZXIvYXNzZW1ibGVyIGRpZmZlcmVuY2VzLgorICogICAgICAgICBPbmx5IHRyeSB0byB0dXJuIG9mZiB0aGUgZmlyc3QgZGlzcGxheSBkZXZpY2UuCisgKiAgICAgICAgIEZpeCBPT1BTIGF0IHBvd2VyIG9mZiB3aXRoIG5vIEFQTSBCSU9TIGJ5IEphbiBFY2h0ZXJuYWNoCisgKiAgICAgICAgICAgICAgICAgICA8ZWNodGVyQGluZm9ybWF0aWsudW5pLXJvc3RvY2suZGU+CisgKiAgICAgICAgIFN0ZXBoZW4gUm90aHdlbGwKKyAqICAgIDEuNzogTW9kaWZ5IGRyaXZlcidzIGNhY2hlZCBjb3B5IG9mIHRoZSBkaXNhYmxlZC9kaXNlbmdhZ2VkIGZsYWdzCisgKiAgICAgICAgIHRvIHJlZmxlY3QgY3VycmVudCBzdGF0ZSBvZiBBUE0gQklPUy4KKyAqICAgICAgICAgQ2hyaXMgUmFua2luIDxyYW5raW5jQGJlbGxzb3V0aC5uZXQ+CisgKiAgICAgICAgIFJlc2V0IGludGVycnVwdCAwIHRpbWVyIHRvIDEwMEh6IGFmdGVyIHN1c3BlbmQKKyAqICAgICAgICAgQ2hhZCBNaWxsZXIgPGNtaWxsZXJAc3VyZnNvdXRoLmNvbT4KKyAqICAgICAgICAgQWRkIENPTkZJR19BUE1fSUdOT1JFX1NVU1BFTkRfQk9VTkNFCisgKiAgICAgICAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICogICAgICAgICBBbGxvdyBib290IHRpbWUgZGlzYWJsaW5nIG9mIEFQTQorICogICAgICAgICBNYWtlIGJvb3QgbWVzc2FnZXMgZmFyIGxlc3MgdmVyYm9zZSBieSBkZWZhdWx0CisgKiAgICAgICAgIE1ha2UgYXNtIHNhZmVyCisgKiAgICAgICAgIFN0ZXBoZW4gUm90aHdlbGwKKyAqICAgIDEuODogQWRkIENPTkZJR19BUE1fUlRDX0lTX0dNVAorICogICAgICAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAqICAgICAgICAgY2hhbmdlIEFQTV9OT0lOVFMgdG8gQ09ORklHX0FQTV9BTExPV19JTlRTCisgKiAgICAgICAgIHJlbW92ZSBkZXBlbmRlbmN5IG9uIENPTkZJR19QUk9DX0ZTCisgKiAgICAgICAgIFN0ZXBoZW4gUm90aHdlbGwKKyAqICAgIDEuOTogRml4IHNtYWxsIHR5cG8uICA8bGFzbG9Ad29kaXAub3BvbGUucGw+CisgKiAgICAgICAgIFRyeSB0byBjb3BlIHdpdGggQklPUydzIHRoYXQgbmVlZCB0byBoYXZlIGFsbCBkaXNwbGF5CisgKiAgICAgICAgIGRldmljZXMgYmxhbmtlZCBhbmQgbm90IGp1c3QgdGhlIGZpcnN0IG9uZS4KKyAqICAgICAgICAgUm9zcyBQYXRlcnNvbiA8cm9zc0Bzb2kuY2l0eS5hYy51az4KKyAqICAgICAgICAgRml4IHNlZ21lbnQgbGltaXQgc2V0dGluZyBpdCBoYXMgYWx3YXlzIGJlZW4gd3JvbmcgYXMKKyAqICAgICAgICAgdGhlIHNlZ21lbnRzIG5lZWRlZCB0byBoYXZlIGJ5dGUgZ3JhbnVsYXJpdHkuCisgKiAgICAgICAgIE1hcmsgYSBmZXcgdGhpbmdzIF9faW5pdC4KKyAqICAgICAgICAgQWRkIGhhY2sgdG8gYWxsb3cgcG93ZXIgb2ZmIG9mIFNNUCBzeXN0ZW1zIGJ5IHBvcHVsYXIgcmVxdWVzdC4KKyAqICAgICAgICAgVXNlIENPTkZJR19TTVAgaW5zdGVhZCBvZiBfX1NNUF9fCisgKiAgICAgICAgIElnbm9yZSBCT1VOQ0VTIGZvciB0aHJlZSBzZWNvbmRzLgorICogICAgICAgICBTdGVwaGVuIFJvdGh3ZWxsCisgKiAgIDEuMTA6IEZpeCBmb3IgVGhpbmtwYWQgcmV0dXJuIGNvZGUuCisgKiAgICAgICAgIE1lcmdlIDIuMiBhbmQgMi4zIGRyaXZlcnMuCisgKiAgICAgICAgIFJlbW92ZSBBUE0gZGVwZW5kZW5jaWVzIGluIGFyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCisgKiAgICAgICAgIFJlbW92ZSBBUE0gZGVwZW5kZW5jaWVzIGluIGRyaXZlcnMvY2hhci9zeXNycS5jCisgKiAgICAgICAgIFJlc2V0IHRpbWUgYWNyb3NzIHN0YW5kYnkuCisgKiAgICAgICAgIEFsbG93IG1vcmUgaW5pdGl0aWFsaXNhdGlvbiBvbiBTTVAuCisgKiAgICAgICAgIFJlbW92ZSBDT05GSUdfQVBNX1BPV0VSX09GRiBhbmQgbWFrZSBpdCBib290IHRpbWUKKyAqICAgICAgICAgY29uZmlndXJhYmxlIChkZWZhdWx0IG9uKS4KKyAqICAgICAgICAgTWFrZSBkZWJ1ZyBvbmx5IGEgYm9vdCB0aW1lIHBhcmFtZXRlciAocmVtb3ZlIEFQTV9ERUJVRykuCisgKiAgICAgICAgIFRyeSB0byBibGFuayBhbGwgZGV2aWNlcyBvbiBhbnkgZXJyb3IuCisgKiAgIDEuMTE6IFJlbW92ZSBBUE0gZGVwZW5kZW5jaWVzIGluIGRyaXZlcnMvY2hhci9jb25zb2xlLmMKKyAqICAgICAgICAgQ2hlY2sgbnJfcnVubmluZyB0byBkZXRlY3QgaWYgd2UgYXJlIGlkbGUgKGZyb20KKyAqICAgICAgICAgQm9yaXNsYXYgRGVpYW5vdiA8Ym9yaXNsYXZAbGl4LnBvbHl0ZWNobmlxdWUuZnI+KQorICogICAgICAgICBGaXggZm9yIGJpb3NlcyB0aGF0IGRvbid0IHplcm8gdGhlIHRvcCBwYXJ0IG9mIHRoZQorICogICAgICAgICBlbnRyeXBvaW50IG9mZnNldCAoTWFyaW8gU2l0dGEgPHNpdHRhQGFsLnVuaXBtbi5pdD4pCisgKiAgICAgICAgIChyZXBvcnRlZCBieSBQYW5vcyBLYXRzYWxvdWxpcyA8dGVyYXNAd3JpdGVtZS5jb20+KS4KKyAqICAgICAgICAgUmVhbCBtb2RlIHBvd2VyIG9mZiBwYXRjaCAoV2FsdGVyIEhvZm1hbm4KKyAqICAgICAgICAgPFdhbHRlci5Ib2ZtYW5uQHBoeXNpay5zdHVkLnVuaS1lcmxhbmdlbi5kZT4pLgorICogICAxLjEyOiBSZW1vdmUgQ09ORklHX1NNUCBhcyB0aGUgY29tcGlsZXIgd2lsbCBvcHRpbWl6ZQorICogICAgICAgICB0aGUgY29kZSBhd2F5IGFueXdheSAoc21wX251bV9jcHVzID09IDEgaW4gVVApCisgKiAgICAgICAgIG5vdGVkIGJ5IEFydHVyIFNrYXdpbmEgPHNrYXdpbmFAZ2VvY2l0aWVzLmNvbT4uCisgKiAgICAgICAgIE1ha2UgcG93ZXIgb2ZmIHVuZGVyIFNNUCB3b3JrIGFnYWluLgorICogICAgICAgICBGaXggdGhpbmtvIHdpdGggaW5pdGlhbCBlbmdhZ2luZyBvZiBCSU9TLgorICogICAgICAgICBNYWtlIHN1cmUgcG93ZXIgb2ZmIG9ubHkgaGFwcGVucyBvbiBDUFUgMAorICogICAgICAgICAoUGF1bCAiUnVzdHkiIFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4pLgorICogICAgICAgICBEbyBlcnJvciBub3RpZmljYXRpb24gdG8gdXNlciBtb2RlIGlmIEJJT1MgY2FsbHMgZmFpbC4KKyAqICAgICAgICAgTW92ZSBlbnRyeXBvaW50IG9mZnNldCBmaXggdG8gLi4uYm9vdC9zZXR1cC5TCisgKiAgICAgICAgIHdoZXJlIGl0IGJlbG9uZ3MgKENvc21vcyA8Z2lzODg1NjRAY2lzLm5jdHUuZWR1LnR3PikuCisgKiAgICAgICAgIFJlbW92ZSBzbXAtcG93ZXItb2ZmLiBTTVAgdXNlcnMgbXVzdCBub3cgc3BlY2lmeQorICogICAgICAgICAiYXBtPXBvd2VyLW9mZiIgb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuIFN1Z2dlc3RlZAorICogICAgICAgICBieSBKaW0gQXZlcmEgPGppbWFAaGFsLmNvbT4sIG1vZGlmaWVkIGJ5IEFsYW4gQ294CisgKiAgICAgICAgIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+LgorICogICAgICAgICBSZWdpc3RlciB0aGUgL3Byb2MvYXBtIGVudHJ5IGV2ZW4gb24gU01QIHNvIHRoYXQKKyAqICAgICAgICAgc2NyaXB0cyB0aGF0IGNoZWNrIGZvciBpdCBiZWZvcmUgZG9pbmcgcG93ZXIgb2ZmCisgKiAgICAgICAgIHdvcmsgKEppbSBBdmVyYSA8amltYUBoYWwuY29tPikuCisgKiAgIDEuMTM6IENoYW5nZXMgZm9yIG5ldyBwbV8gaW50ZXJmYWNlcyAoQW5keSBIZW5yb2lkCisgKiAgICAgICAgIDxhbmR5X2hlbnJvaWRAeWFob28uY29tPikuCisgKiAgICAgICAgIE1vZHVsYXJpemUgdGhlIGNvZGUuCisgKiAgICAgICAgIEZpeCB0aGUgVGhpbmtwYWQgKGFnYWluKSA6LSggKENPTkZJR19BUE1fSUdOT1JFX01VTFRJUExFX1NVU1BFTkRTCisgKiAgICAgICAgIGlzIG5vdyB0aGUgd2F5IGxpZmUgd29ya3MpLgorICogICAgICAgICBGaXggdGhpbmtvIGluIHN1c3BlbmQoKSAod3JvbmcgcmV0dXJuKS4KKyAqICAgICAgICAgTm90aWZ5IGRyaXZlcnMgb24gY3JpdGljYWwgc3VzcGVuZC4KKyAqICAgICAgICAgTWFrZSBrYXBtZCBhYnNvcmIgbW9yZSBpZGxlIHRpbWUgKFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KKyAqICAgICAgICAgbW9kaWZpZWQgYnkgc2ZyKS4KKyAqICAgICAgICAgRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWxlIHdlIGFyZSBzdXNwZW5kZWQgKEFuZHkgSGVucm9pZAorICogICAgICAgICA8YW5keV9oZW5yb2lkQHlhaG9vLmNvbT4gZml4ZWQgYnkgc2ZyKS4KKyAqICAgICAgICAgTWFrZSBwb3dlciBvZmYgd29yayBvbiBTTVAgYWdhaW4gKFRvbnkgSG95bGUKKyAqICAgICAgICAgPHRtaEBtYWdlbnRhLWxvZ2ljLmNvbT4gYW5kIDx6bGF0a29AaXNrb24uaHI+KSBtb2RpZmllZCBieSBzZnIuCisgKiAgICAgICAgIFJlbW92ZSBDT05GSUdfQVBNX1NVU1BFTkRfQk9VTkNFLiAgVGhlIGJvdW5jZSBpZ25vcmUKKyAqICAgICAgICAgaW50ZXJ2YWwgaXMgbm93IGNvbmZpZ3VyYWJsZS4KKyAqICAgMS4xNDogTWFrZSBjb25uZWN0aW9uIHZlcnNpb24gcGVyc2lzdCBhY3Jvc3MgbW9kdWxlIHVubG9hZC9sb2FkLgorICogICAgICAgICBFbmFibGUgYW5kIGVuZ2FnZSBwb3dlciBtYW5hZ2VtZW50IGVhcmxpZXIuCisgKiAgICAgICAgIERpc2VuZ2FnZSBwb3dlciBtYW5hZ2VtZW50IG9uIG1vZHVsZSB1bmxvYWQuCisgKiAgICAgICAgIENoYW5nZWQgdG8gdXNlIHRoZSBzeXNycS1yZWdpc3RlciBoYWNrIGZvciByZWdpc3RlcmluZyB0aGUKKyAqICAgICAgICAgcG93ZXIgb2ZmIGZ1bmN0aW9uIGNhbGxlZCBieSBtYWdpYyBzeXNycSBiYXNlZCB1cG9uIGRpc2N1c3Npb25zCisgKiAgICAgICAgIGluIGlyYzovL2lyYy5vcGVucHJvamVjdHMubmV0LyNrZXJuZWxuZXdiaWVzCisgKiAgICAgICAgIChDcnV0Y2hlciBEdW5uYXZhbnQgPGNydXRjaGVyK2tlcm5lbEBkYXRhc3RhY2tzLmNvbT4pLgorICogICAgICAgICBNYWtlIENPTkZJR19BUE1fUkVBTF9NT0RFX1BPV0VSX09GRiBydW4gdGltZSBjb25maWd1cmFibGUuCisgKiAgICAgICAgIChBcmphbiB2YW4gZGUgVmVuIDxhcmphbnZAcmVkaGF0LmNvbT4pIG1vZGlmaWVkIGJ5IHNmci4KKyAqICAgICAgICAgV29yayBhcm91bmQgYnl0ZSBzd2FwIGJ1ZyBpbiBvbmUgb2YgdGhlIFZhaW8ncyBCSU9TJ3MKKyAqICAgICAgICAgKE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPikuCisgKiAgICAgICAgIEV4cG9zZWQgdGhlIGRpc2FibGUgZmxhZyB0byBkbWkgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGtub3duCisgKiAgICAgICAgIGJyb2tlbiBBUE0gKEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+KS4KKyAqICAgMS4xNGFjOiBJZiB0aGUgQklPUyBzYXlzICJJIHNsb3dlZCB0aGUgQ1BVIGRvd24iIHRoZW4gZG9uJ3Qgc3BpbgorICogICAgICAgICBjYWxsaW5nIGl0IC0gaW5zdGVhZCBpZGxlLiAoQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4pCisgKiAgICAgICAgIElmIGFuIEFQTSBpZGxlIGZhaWxzIGxvZyBpdCBhbmQgaWRsZSBzZW5zaWJseQorICogICAxLjE1OiBEb24ndCBxdWV1ZSBldmVudHMgdG8gY2xpZW50cyB3aG8gb3BlbiB0aGUgZGV2aWNlIE9fV1JPTkxZLgorICogICAgICAgICBEb24ndCBleHBlY3QgcmVwbGllcyBmcm9tIGNsaWVudHMgd2hvIG9wZW4gdGhlIGRldmljZSBPX1JET05MWS4KKyAqICAgICAgICAgKElkZWEgZnJvbSBUaG9tYXMgSG9vZCkKKyAqICAgICAgICAgTWlub3Igd2FpdHF1ZXVlIGNsZWFudXBzLiAoSm9obiBGcmVtbGluIDxjaGllZkBiYW5kaXRzLm9yZz4pCisgKiAgIDEuMTY6IEZpeCBpZGxlIGNhbGxpbmcuIChBbmRyZWFzIFN0ZWlubWV0eiA8YXN0QGRvbWR2LmRlPiBldCBhbC4pCisgKiAgICAgICAgIE5vdGlmeSBsaXN0ZW5lcnMgb2Ygc3RhbmRieSBvciBzdXNwZW5kIGV2ZW50cyBiZWZvcmUgbm90aWZ5aW5nCisgKiAgICAgICAgIGRyaXZlcnMuIFJldHVybiBFQlVTWSB0byBpb2N0bCgpIGlmIHN1c3BlbmQgaXMgcmVqZWN0ZWQuCisgKiAgICAgICAgIChSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPiBhbmQgVGhvbWFzIEhvb2QpCisgKiAgICAgICAgIElnbm9yZSBmaXJzdCByZXN1bWUgYWZ0ZXIgd2UgZ2VuZXJhdGUgb3VyIG93biByZXN1bWUgZXZlbnQKKyAqICAgICAgICAgYWZ0ZXIgYSBzdXNwZW5kIChUaG9tYXMgSG9vZCkKKyAqICAgICAgICAgRGFlbW9uaXplIG5vdyBnZXRzIHJpZCBvZiBvdXIgY29udHJvbGxpbmcgdGVybWluYWwgKHNmcikuCisgKiAgICAgICAgIENPTkZJR19BUE1fQ1BVX0lETEUgbm93IGp1c3QgYWZmZWN0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZgorICogICAgICAgICBpZGxlX3RocmVzaG9sZCAoc2ZyKS4KKyAqICAgICAgICAgQ2hhbmdlIG5hbWUgb2Yga2VybmVsIGFwbSBkYWVtb24gKGFzIGl0IG5vIGxvbmdlciBpZGxlcykgKHNmcikuCisgKiAgIDEuMTZhYzogRml4IHVwIFNNUCBzdXBwb3J0IHNvbWV3aGF0LiBZb3UgY2FuIG5vdyBmb3JjZSBTTVAgb24gYW5kIHdlCisgKgkgICBtYWtlIF9hbGxfIEFQTSBjYWxscyBvbiB0aGUgQ1BVIzAuIEZpeCB1bnNhZmUgc2lnbiBidWcuCisgKgkgICBUT0RPOiBkZXRlcm1pbmUgaWYgaXRzICJib290IENQVSIgb3IgIkNQVTAiIHdlIHdhbnQgdG8gbG9jayB0by4KKyAqCisgKiBBUE0gMS4xIFJlZmVyZW5jZToKKyAqCisgKiAgIEludGVsIENvcnBvcmF0aW9uLCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQKKyAqICAgKEFQTSkgQklPUyBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbiwgUmV2aXNpb24gMS4xLCBTZXB0ZW1iZXIgMTk5My4KKyAqICAgSW50ZWwgT3JkZXIgTnVtYmVyIDI0MTcwNC0wMDEuICBNaWNyb3NvZnQgUGFydCBOdW1iZXIgNzgxLTExMC1YMDEuCisgKgorICogW1RoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGZyZWUgZnJvbSBJbnRlbCBieSBjYWxsaW5nIDgwMC42MjguODY4NiAoZmF4CisgKiA5MTYuMzU2LjYxMDApIG9yIDgwMC41NDguNDcyNTsgb3IgdmlhIGFub255bW91cyBmdHAgZnJvbQorICogZnRwOi8vZnRwLmludGVsLmNvbS9wdWIvSUFML3NvZnR3YXJlX3NwZWNzL2FwbXYxMS5kb2MuICBJdCBpcyBhbHNvCisgKiBhdmFpbGFibGUgZnJvbSBNaWNyb3NvZnQgYnkgY2FsbGluZyAyMDYuODgyLjgwODAuXQorICoKKyAqIEFQTSAxLjIgUmVmZXJlbmNlOgorICogICBJbnRlbCBDb3Jwb3JhdGlvbiwgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50CisgKiAgIChBUE0pIEJJT1MgSW50ZXJmYWNlIFNwZWNpZmljYXRpb24sIFJldmlzaW9uIDEuMiwgRmVicnVhcnkgMTk5Ni4KKyAqCisgKiBbVGhpcyBkb2N1bWVudCBpcyBhdmFpbGFibGUgZnJvbSBNaWNyb3NvZnQgYXQ6CisgKiAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaHdkZXYvYnVzYmlvcy9hbXBfMTIuaHRtXQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisKKyNpbmNsdWRlICJpb19wb3J0cy5oIgorCitleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X2Ntb3NfdGltZSh2b2lkKTsKK2V4dGVybiB2b2lkIG1hY2hpbmVfcmVhbF9yZXN0YXJ0KHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKworI2lmIGRlZmluZWQoQ09ORklHX0FQTV9ESVNQTEFZX0JMQU5LKSAmJiBkZWZpbmVkKENPTkZJR19WVCkKK2V4dGVybiBpbnQgKCpjb25zb2xlX2JsYW5rX2hvb2spKGludCk7CisjZW5kaWYKKworLyoKKyAqIFRoZSBhcG1fYmlvcyBkZXZpY2UgaXMgb25lIG9mIHRoZSBtaXNjIGNoYXIgZGV2aWNlcy4KKyAqIFRoaXMgaXMgaXRzIG1pbm9yIG51bWJlci4KKyAqLworI2RlZmluZQlBUE1fTUlOT1JfREVWCTEzNAorCisvKgorICogU2VlIERvY3VtZW50YXRpb24vQ29uZmlnLmhlbHAgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisgKgorICogVmFyaW91cyBvcHRpb25zIGNhbiBiZSBjaGFuZ2VkIGF0IGJvb3QgdGltZSBhcyBmb2xsb3dzOgorICogKFdlIGFsbG93IHVuZGVyc2NvcmVzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG1vZHVsZXMgY29kZSkKKyAqCWFwbT1vbi9vZmYJCQllbmFibGUvZGlzYWJsZSBBUE0KKyAqCSAgICBbbm8tXWFsbG93Wy1fXWludHMJCWFsbG93IGludGVycnVwdHMgZHVyaW5nIEJJT1MgY2FsbHMKKyAqCSAgICBbbm8tXWJyb2tlblstX11wc3IJCUJJT1MgaGFzIGEgYnJva2VuIEdldFBvd2VyU3RhdHVzIGNhbGwKKyAqCSAgICBbbm8tXXJlYWxtb2RlWy1fXXBvd2VyWy1fXW9mZglzd2l0Y2ggdG8gcmVhbCBtb2RlIGJlZm9yZQorICoJICAgIAkJCQkJcG93ZXJpbmcgb2ZmCisgKgkgICAgW25vLV1kZWJ1ZwkJCWxvZyBzb21lIGRlYnVnZ2luZyBtZXNzYWdlcworICoJICAgIFtuby1dcG93ZXJbLV9db2ZmCQlwb3dlciBvZmYgb24gc2h1dGRvd24KKyAqCSAgICBbbm8tXXNtcAkJCVVzZSBhcG0gZXZlbiBvbiBhbiBTTVAgYm94CisgKgkgICAgYm91bmNlWy1fXWludGVydmFsPTxuPgludW1iZXIgb2YgdGlja3MgdG8gaWdub3JlIHN1c3BlbmQKKyAqCSAgICAJCQkJYm91bmNlcworICogICAgICAgICAgaWRsZVstX110aHJlc2hvbGQ9PG4+ICAgICAgIFN5c3RlbSBpZGxlIHBlcmNlbnRhZ2UgYWJvdmUgd2hpY2ggdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlIEFQTSBCSU9TIGlkbGUgY2FsbHMuIFNldCBpdCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCB0byBkaXNhYmxlLgorICogICAgICAgICAgaWRsZVstX11wZXJpb2Q9PG4+ICAgICAgICAgIFBlcmlvZCAoaW4gMS8xMDBzIG9mIGEgc2Vjb25kKSBvdmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGlkbGUgcGVyY2VudGFnZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWQuCisgKi8KKworLyogS05PV04gUFJPQkxFTSBNQUNISU5FUzoKKyAqCisgKiBVOiBUSSA0MDAwTSBUcmF2ZWxNYXRlOiBCSU9TIGlzICpOT1QqIEFQTSBjb21wbGlhbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFtDb25maXJtZWQgYnkgVEkgcmVwcmVzZW50YXRpdmVdCisgKiA/OiBBQ0VSIDQ4NkRYNC83NTogdXNlcyBkc2VnIDAwNDAsIGluIHZpb2xhdGlvbiBvZiBBUE0gc3BlY2lmaWNhdGlvbgorICogICAgICAgICAgICAgICAgICAgIFtDb25maXJtZWQgYnkgQklPUyBkaXNhc3NlbWJseV0KKyAqICAgICAgICAgICAgICAgICAgICBbVGhpcyBtYXkgd29yayBub3cgLi4uXQorICogUDogVG9zaGliYSAxOTUwUzogYmF0dGVyeSBsaWZlIGluZm9ybWF0aW9uIG9ubHkgZ2V0cyB1cGRhdGVkIGFmdGVyIHJlc3VtZQorICogUDogTWlkd2VzdCBNaWNybyBTb3VuZGJvb2sgRWxpdGUgRFgyLzY2IG1vbm9jaHJvbWU6IHNjcmVlbiBibGFua2luZworICogCWJyb2tlbiBpbiBCSU9TIFtSZXBvcnRlZCBieSBHYXJzdCBSLiBSZWVzZSA8cmVlc2VAaXNuLm5ldD5dCisgKiA/OiBBY2VyTm90ZS05NTA6IG9vcHMgb24gcmVhZGluZyAvcHJvYy9hcG0gLSB3b3JrYXJvdW5kIGlzIGEgV0lQCisgKiAJTmVhbGUgQmFua3MgPG5lYWxlQGxvd2VuZGFsZS5jb20uYXU+IERlY2VtYmVyIDIwMDAKKyAqCisgKiBMZWdlbmQ6IFUgPSB1bnVzYWJsZSB3aXRoIEFQTSBwYXRjaGVzCisgKiAgICAgICAgIFAgPSBwYXJ0aWFsbHkgdXNhYmxlIHdpdGggQVBNIHBhdGNoZXMKKyAqLworCisvKgorICogRGVmaW5lIGFzIDEgdG8gbWFrZSB0aGUgZHJpdmVyIGFsd2F5cyBjYWxsIHRoZSBBUE0gQklPUyBidXN5CisgKiByb3V0aW5lIGV2ZW4gaWYgdGhlIGNsb2NrIHdhcyBub3QgcmVwb3J0ZWQgYXMgc2xvd2VkIGJ5IHRoZQorICogaWRsZSByb3V0aW5lLiAgT3RoZXJ3aXNlLCBkZWZpbmUgYXMgMC4KKyAqLworI2RlZmluZSBBTFdBWVNfQ0FMTF9CVVNZICAgMQorCisvKgorICogRGVmaW5lIHRvIG1ha2UgdGhlIEFQTSBCSU9TIGNhbGxzIHplcm8gYWxsIGRhdGEgc2VnbWVudCByZWdpc3RlcnMgKHNvCisgKiB0aGF0IGFuIGluY29ycmVjdCBCSU9TIGltcGxlbWVudGF0aW9uIHdpbGwgY2F1c2UgYSBrZXJuZWwgcGFuaWMgaWYgaXQKKyAqIHRyaWVzIHRvIHdyaXRlIHRvIGFyYml0cmFyeSBtZW1vcnkpLgorICovCisjZGVmaW5lIEFQTV9aRVJPX1NFR1MKKworI2luY2x1ZGUgImFwbS5oIgorCisvKgorICogRGVmaW5lIHRvIG1ha2UgYWxsIF9zZXRfbGltaXQgY2FsbHMgdXNlIDY0ayBsaW1pdHMuICBUaGUgQVBNIDEuMSBCSU9TIGlzCisgKiBzdXBwb3NlZCB0byBwcm92aWRlIGxpbWl0IGluZm9ybWF0aW9uIHRoYXQgaXQgcmVjb2duaXplcy4gIE1hbnkgbWFjaGluZXMKKyAqIGRvIHRoaXMgY29ycmVjdGx5LCBidXQgbWFueSBvdGhlcnMgZG8gbm90IHJlc3RyaWN0IHRoZW1zZWx2ZXMgdG8gdGhlaXIKKyAqIGNsYWltZWQgbGltaXQuICBXaGVuIHRoaXMgaGFwcGVucywgdGhleSB3aWxsIGNhdXNlIGEgc2VnbWVudGF0aW9uCisgKiB2aW9sYXRpb24gaW4gdGhlIGtlcm5lbCBhdCBib290IHRpbWUuICBNb3N0IEJJT1MncywgaG93ZXZlciwgd2lsbAorICogcmVzcGVjdCBhIDY0ayBsaW1pdCwgc28gd2UgdXNlIHRoYXQuICBJZiB5b3Ugd2FudCB0byBiZSBwZWRhbnRpYyBhbmQKKyAqIGhvbGQgeW91ciBCSU9TIHRvIGl0cyBjbGFpbXMsIHRoZW4gdW5kZWZpbmUgdGhpcy4KKyAqLworI2RlZmluZSBBUE1fUkVMQVhfU0VHTUVOVFMKKworLyoKKyAqIERlZmluZSB0byByZS1pbml0aWFsaXplIHRoZSBpbnRlcnJ1cHQgMCB0aW1lciB0byAxMDAgSHogYWZ0ZXIgYSBzdXNwZW5kLgorICogVGhpcyBwYXRjaGVkIGJ5IENoYWQgTWlsbGVyIDxjbWlsbGVyQHN1cmZzb3V0aC5jb20+LCBvcmlnaW5hbCBjb2RlIGJ5CisgKiBEYXZpZCBDaGVuIDxjaGVuQGN0cGEwNC5taXQuZWR1PgorICovCisjdW5kZWYgSU5JVF9USU1FUl9BRlRFUl9TVVNQRU5ECisKKyNpZmRlZiBJTklUX1RJTUVSX0FGVEVSX1NVU1BFTkQKKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjZW5kaWYKKworLyoKKyAqIE5lZWQgdG8gcG9sbCB0aGUgQVBNIEJJT1MgZXZlcnkgc2Vjb25kCisgKi8KKyNkZWZpbmUgQVBNX0NIRUNLX1RJTUVPVVQJKEhaKQorCisvKgorICogSWdub3JlIHN1c3BlbmQgZXZlbnRzIGZvciB0aGlzIGFtb3VudCBvZiB0aW1lIGFmdGVyIGEgcmVzdW1lCisgKi8KKyNkZWZpbmUgREVGQVVMVF9CT1VOQ0VfSU5URVJWQUwJCSgzICogSFopCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBldmVudHMgc3RvcmVkCisgKi8KKyNkZWZpbmUgQVBNX01BWF9FVkVOVFMJCTIwCisKKy8qCisgKiBUaGUgcGVyLWZpbGUgQVBNIGRhdGEKKyAqLworc3RydWN0IGFwbV91c2VyIHsKKwlpbnQJCW1hZ2ljOworCXN0cnVjdCBhcG1fdXNlciAqCW5leHQ7CisJaW50CQlzdXNlcjogMTsKKwlpbnQJCXdyaXRlcjogMTsKKwlpbnQJCXJlYWRlcjogMTsKKwlpbnQJCXN1c3BlbmRfd2FpdDogMTsKKwlpbnQJCXN1c3BlbmRfcmVzdWx0OworCWludAkJc3VzcGVuZHNfcGVuZGluZzsKKwlpbnQJCXN0YW5kYnlzX3BlbmRpbmc7CisJaW50CQlzdXNwZW5kc19yZWFkOworCWludAkJc3RhbmRieXNfcmVhZDsKKwlpbnQJCWV2ZW50X2hlYWQ7CisJaW50CQlldmVudF90YWlsOworCWFwbV9ldmVudF90CWV2ZW50c1tBUE1fTUFYX0VWRU5UU107Cit9OworCisvKgorICogVGhlIG1hZ2ljIG51bWJlciBpbiBhcG1fdXNlcgorICovCisjZGVmaW5lIEFQTV9CSU9TX01BR0lDCQkweDQxMDEKKworLyoKKyAqIGlkbGUgcGVyY2VudGFnZSBhYm92ZSB3aGljaCBiaW9zIGlkbGUgY2FsbHMgYXJlIGRvbmUKKyAqLworI2lmZGVmIENPTkZJR19BUE1fQ1BVX0lETEUKKyNkZWZpbmUgREVGQVVMVF9JRExFX1RIUkVTSE9MRAk5NQorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9JRExFX1RIUkVTSE9MRAkxMDAKKyNlbmRpZgorI2RlZmluZSBERUZBVUxUX0lETEVfUEVSSU9ECSgxMDAgLyAzKQorCisvKgorICogTG9jYWwgdmFyaWFibGVzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0CXNlZ21lbnQ7Cit9CQkJCWFwbV9iaW9zX2VudHJ5Oworc3RhdGljIGludAkJCWNsb2NrX3Nsb3dlZDsKK3N0YXRpYyBpbnQJCQlpZGxlX3RocmVzaG9sZCA9IERFRkFVTFRfSURMRV9USFJFU0hPTEQ7CitzdGF0aWMgaW50CQkJaWRsZV9wZXJpb2QgPSBERUZBVUxUX0lETEVfUEVSSU9EOworc3RhdGljIGludAkJCXNldF9wbV9pZGxlOworc3RhdGljIGludAkJCXN1c3BlbmRzX3BlbmRpbmc7CitzdGF0aWMgaW50CQkJc3RhbmRieXNfcGVuZGluZzsKK3N0YXRpYyBpbnQJCQlpZ25vcmVfc3lzX3N1c3BlbmQ7CitzdGF0aWMgaW50CQkJaWdub3JlX25vcm1hbF9yZXN1bWU7CitzdGF0aWMgaW50CQkJYm91bmNlX2ludGVydmFsID0gREVGQVVMVF9CT1VOQ0VfSU5URVJWQUw7CisKKyNpZmRlZiBDT05GSUdfQVBNX1JUQ19JU19HTVQKKyMJZGVmaW5lCWNsb2NrX2Ntb3NfZGlmZgkwCisjCWRlZmluZQlnb3RfY2xvY2tfZGlmZgkxCisjZWxzZQorc3RhdGljIGxvbmcJCQljbG9ja19jbW9zX2RpZmY7CitzdGF0aWMgaW50CQkJZ290X2Nsb2NrX2RpZmY7CisjZW5kaWYKK3N0YXRpYyBpbnQJCQlkZWJ1ZzsKK3N0YXRpYyBpbnQJCQlzbXA7CitzdGF0aWMgaW50CQkJYXBtX2Rpc2FibGVkID0gLTE7CisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIGludAkJCXBvd2VyX29mZjsKKyNlbHNlCitzdGF0aWMgaW50CQkJcG93ZXJfb2ZmID0gMTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUE1fUkVBTF9NT0RFX1BPV0VSX09GRgorc3RhdGljIGludAkJCXJlYWxtb2RlX3Bvd2VyX29mZiA9IDE7CisjZWxzZQorc3RhdGljIGludAkJCXJlYWxtb2RlX3Bvd2VyX29mZjsKKyNlbmRpZgorc3RhdGljIGludAkJCWV4aXRfa2FwbWQ7CitzdGF0aWMgaW50CQkJa2FwbWRfcnVubmluZzsKKyNpZmRlZiBDT05GSUdfQVBNX0FMTE9XX0lOVFMKK3N0YXRpYyBpbnQJCQlhbGxvd19pbnRzID0gMTsKKyNlbHNlCitzdGF0aWMgaW50CQkJYWxsb3dfaW50czsKKyNlbmRpZgorc3RhdGljIGludAkJCWJyb2tlbl9wc3I7CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhcG1fd2FpdHF1ZXVlKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhcG1fc3VzcGVuZF93YWl0cXVldWUpOworc3RhdGljIHN0cnVjdCBhcG1fdXNlciAqCXVzZXJfbGlzdDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodXNlcl9saXN0X2xvY2spOworc3RhdGljIHN0cnVjdCBkZXNjX3N0cnVjdAliYWRfYmlvc19kZXNjID0geyAwLCAweDAwNDA5MjAwIH07CisKK3N0YXRpYyBjaGFyCQkJZHJpdmVyX3ZlcnNpb25bXSA9ICIxLjE2YWMiOwkvKiBubyBzcGFjZXMgKi8KKworLyoKKyAqCUFQTSBldmVudCBuYW1lcyB0YWtlbiBmcm9tIHRoZSBBUE0gMS4yIHNwZWNpZmljYXRpb24uIFRoZXNlIGFyZQorICoJdGhlIG1lc3NhZ2UgY29kZXMgdGhhdCB0aGUgQklPUyB1c2VzIHRvIHRlbGwgdXMgYWJvdXQgZXZlbnRzCisgKi8KK3N0YXRpYyBjaGFyICoJYXBtX2V2ZW50X25hbWVbXSA9IHsKKwkic3lzdGVtIHN0YW5kYnkiLAorCSJzeXN0ZW0gc3VzcGVuZCIsCisJIm5vcm1hbCByZXN1bWUiLAorCSJjcml0aWNhbCByZXN1bWUiLAorCSJsb3cgYmF0dGVyeSIsCisJInBvd2VyIHN0YXR1cyBjaGFuZ2UiLAorCSJ1cGRhdGUgdGltZSIsCisJImNyaXRpY2FsIHN1c3BlbmQiLAorCSJ1c2VyIHN0YW5kYnkiLAorCSJ1c2VyIHN1c3BlbmQiLAorCSJzeXN0ZW0gc3RhbmRieSByZXN1bWUiLAorCSJjYXBhYmlsaXRpZXMgY2hhbmdlIgorfTsKKyNkZWZpbmUgTlJfQVBNX0VWRU5UX05BTUUJXAorCQkoc2l6ZW9mKGFwbV9ldmVudF9uYW1lKSAvIHNpemVvZihhcG1fZXZlbnRfbmFtZVswXSkpCisKK3R5cGVkZWYgc3RydWN0IGxvb2t1cF90IHsKKwlpbnQJa2V5OworCWNoYXIgKgltc2c7Cit9IGxvb2t1cF90OworCisvKgorICoJVGhlIEJJT1MgcmV0dXJucyBhIHNldCBvZiBzdGFuZGFyZCBlcnJvciBjb2RlcyBpbiBBWCB3aGVuIHRoZQorICoJY2FycnkgZmxhZyBpcyBzZXQuCisgKi8KKyAKK3N0YXRpYyBjb25zdCBsb29rdXBfdCBlcnJvcl90YWJsZVtdID0geworLyogTi9BCXsgQVBNX1NVQ0NFU1MsCQkiT3BlcmF0aW9uIHN1Y2NlZWRlZCIgfSwgKi8KKwl7IEFQTV9ESVNBQkxFRCwJCSJQb3dlciBtYW5hZ2VtZW50IGRpc2FibGVkIiB9LAorCXsgQVBNX0NPTk5FQ1RFRCwJIlJlYWwgbW9kZSBpbnRlcmZhY2UgYWxyZWFkeSBjb25uZWN0ZWQiIH0sCisJeyBBUE1fTk9UX0NPTk5FQ1RFRCwJIkludGVyZmFjZSBub3QgY29ubmVjdGVkIiB9LAorCXsgQVBNXzE2X0NPTk5FQ1RFRCwJIjE2IGJpdCBpbnRlcmZhY2UgYWxyZWFkeSBjb25uZWN0ZWQiIH0sCisvKiBOL0EJeyBBUE1fMTZfVU5TVVBQT1JURUQsCSIxNiBiaXQgaW50ZXJmYWNlIG5vdCBzdXBwb3J0ZWQiIH0sICovCisJeyBBUE1fMzJfQ09OTkVDVEVELAkiMzIgYml0IGludGVyZmFjZSBhbHJlYWR5IGNvbm5lY3RlZCIgfSwKKwl7IEFQTV8zMl9VTlNVUFBPUlRFRCwJIjMyIGJpdCBpbnRlcmZhY2Ugbm90IHN1cHBvcnRlZCIgfSwKKwl7IEFQTV9CQURfREVWSUNFLAkiVW5yZWNvZ25pemVkIGRldmljZSBJRCIgfSwKKwl7IEFQTV9CQURfUEFSQU0sCSJQYXJhbWV0ZXIgb3V0IG9mIHJhbmdlIiB9LAorCXsgQVBNX05PVF9FTkdBR0VELAkiSW50ZXJmYWNlIG5vdCBlbmdhZ2VkIiB9LAorCXsgQVBNX0JBRF9GVU5DVElPTiwgICAgICJGdW5jdGlvbiBub3Qgc3VwcG9ydGVkIiB9LAorCXsgQVBNX1JFU1VNRV9ESVNBQkxFRCwJIlJlc3VtZSB0aW1lciBkaXNhYmxlZCIgfSwKKwl7IEFQTV9CQURfU1RBVEUsCSJVbmFibGUgdG8gZW50ZXIgcmVxdWVzdGVkIHN0YXRlIiB9LAorLyogTi9BCXsgQVBNX05PX0VWRU5UUywJIk5vIGV2ZW50cyBwZW5kaW5nIiB9LCAqLworCXsgQVBNX05PX0VSUk9SLAkJIkJJT1MgZGlkIG5vdCBzZXQgYSByZXR1cm4gY29kZSIgfSwKKwl7IEFQTV9OT1RfUFJFU0VOVCwJIk5vIEFQTSBwcmVzZW50IiB9Cit9OworI2RlZmluZSBFUlJPUl9DT1VOVAkoc2l6ZW9mKGVycm9yX3RhYmxlKS9zaXplb2YobG9va3VwX3QpKQorCisvKioKKyAqCWFwbV9lcnJvcgktCWRpc3BsYXkgYW4gQVBNIGVycm9yCisgKglAc3RyOiBpbmZvcm1hdGlvbiBzdHJpbmcKKyAqCUBlcnI6IEFQTSBCSU9TIHJldHVybiBjb2RlCisgKgorICoJV3JpdGUgYSBtZWFuaW5nZnVsIGxvZyBlbnRyeSB0byB0aGUga2VybmVsIGxvZyBpbiB0aGUgZXZlbnQgb2YKKyAqCWFuIEFQTSBlcnJvci4KKyAqLworIAorc3RhdGljIHZvaWQgYXBtX2Vycm9yKGNoYXIgKnN0ciwgaW50IGVycikKK3sKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IGkgPCBFUlJPUl9DT1VOVDsgaSsrKQorCQlpZiAoZXJyb3JfdGFibGVbaV0ua2V5ID09IGVycikgYnJlYWs7CisJaWYgKGkgPCBFUlJPUl9DT1VOVCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06ICVzOiAlc1xuIiwgc3RyLCBlcnJvcl90YWJsZVtpXS5tc2cpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06ICVzOiB1bmtub3duIGVycm9yIGNvZGUgJSMyLjJ4XG4iLAorCQkJc3RyLCBlcnIpOworfQorCisvKgorICogTG9jayBBUE0gZnVuY3Rpb25hbGl0eSB0byBwaHlzaWNhbCBDUFUgMAorICovCisgCisjaWZkZWYgQ09ORklHX1NNUAorCitzdGF0aWMgY3B1bWFza190IGFwbV9zYXZlX2NwdXModm9pZCkKK3sKKwljcHVtYXNrX3QgeCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwkvKiBTb21lIGJpb3NlcyBkb24ndCBsaWtlIGJlaW5nIGNhbGxlZCBmcm9tIENQVSAhPSAwICovCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdSgwKSk7CisJQlVHX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKTsKKwlyZXR1cm4geDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFwbV9yZXN0b3JlX2NwdXMoY3B1bWFza190IG1hc2spCit7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBtYXNrKTsKK30KKworI2Vsc2UKKworLyoKKyAqCU5vIENQVSBsb2NrZG93biBuZWVkZWQgb24gYSB1bmlwcm9jZXNzb3IKKyAqLworIAorI2RlZmluZSBhcG1fc2F2ZV9jcHVzKCkJCShjdXJyZW50LT5jcHVzX2FsbG93ZWQpCisjZGVmaW5lIGFwbV9yZXN0b3JlX2NwdXMoeCkJKHZvaWQpKHgpCisKKyNlbmRpZgorCisvKgorICogVGhlc2UgYXJlIHRoZSBhY3R1YWwgQklPUyBjYWxscy4gIERlcGVuZGluZyBvbiBBUE1fWkVST19TRUdTIGFuZAorICogYXBtX2luZm8uYWxsb3dfaW50cywgd2UgYXJlIGJlaW5nIHJlYWxseSBwYXJhbm9pZCBoZXJlISAgTm90IG9ubHkKKyAqIGFyZSBpbnRlcnJ1cHRzIGRpc2FibGVkLCBidXQgYWxsIHRoZSBzZWdtZW50IHJlZ2lzdGVycyAoZXhjZXB0IFNTKQorICogYXJlIHNhdmVkIGFuZCB6ZXJvZWQgdGhpcyBtZWFucyB0aGF0IGlmIHRoZSBCSU9TIHRyaWVzIHRvIHJlZmVyZW5jZQorICogYW55IGRhdGEgd2l0aG91dCBleHBsaWNpdGx5IGxvYWRpbmcgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzLCB0aGUga2VybmVsCisgKiB3aWxsIGZhdWx0IGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIGhhdmUgc29tZSB1bmZvcmVzZWVuIGNpcmN1bXN0YW5jZXMKKyAqIGZvciB0aGUgcmVzdCBvZiB0aGUga2VybmVsLiAgQW5kIGl0IHdpbGwgYmUgdmVyeSBvYnZpb3VzISAgOi0pIERvaW5nCisgKiB0aGlzIGRlcGVuZHMgb24gQ1MgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIHBoeXNpY2FsIG1lbW9yeSBhcyBEUyBzbyB0aGF0CisgKiBEUyBjYW4gYmUgemVyb2VkIGJlZm9yZSB0aGUgY2FsbC4gVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgZG8gYW55dGhpbmcKKyAqIGFib3V0IHRoZSBzdGFjayBzZWdtZW50L3BvaW50ZXIuICBBbHNvLCB3ZSB0ZWxsIHRoZSBjb21waWxlciB0aGF0CisgKiBldmVyeXRoaW5nIGNvdWxkIGNoYW5nZS4KKyAqCisgKiBBbHNvLCB3ZSBLTk9XIHRoYXQgZm9yIHRoZSBub24gZXJyb3IgY2FzZSBvZiBhcG1fYmlvc19jYWxsLCB0aGVyZQorICogaXMgbm8gdXNlZnVsIGRhdGEgcmV0dXJuZWQgaW4gdGhlIGxvdyBvcmRlciA4IGJpdHMgb2YgZWF4LgorICovCisjZGVmaW5lIEFQTV9ET19DTEkJXAorCWlmIChhcG1faW5mby5hbGxvd19pbnRzKSBcCisJCWxvY2FsX2lycV9lbmFibGUoKTsgXAorCWVsc2UgXAorCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisjaWZkZWYgQVBNX1pFUk9fU0VHUworIwlkZWZpbmUgQVBNX0RFQ0xfU0VHUyBcCisJCXVuc2lnbmVkIGludCBzYXZlZF9mczsgdW5zaWduZWQgaW50IHNhdmVkX2dzOworIwlkZWZpbmUgQVBNX0RPX1NBVkVfU0VHUyBcCisJCXNhdmVzZWdtZW50KGZzLCBzYXZlZF9mcyk7IHNhdmVzZWdtZW50KGdzLCBzYXZlZF9ncykKKyMJZGVmaW5lIEFQTV9ET19SRVNUT1JFX1NFR1MgXAorCQlsb2Fkc2VnbWVudChmcywgc2F2ZWRfZnMpOyBsb2Fkc2VnbWVudChncywgc2F2ZWRfZ3MpCisjZWxzZQorIwlkZWZpbmUgQVBNX0RFQ0xfU0VHUworIwlkZWZpbmUgQVBNX0RPX1NBVkVfU0VHUworIwlkZWZpbmUgQVBNX0RPX1JFU1RPUkVfU0VHUworI2VuZGlmCisKKy8qKgorICoJYXBtX2Jpb3NfY2FsbAktCU1ha2UgYW4gQVBNIEJJT1MgMzJiaXQgY2FsbAorICoJQGZ1bmM6IEFQTSBmdW5jdGlvbiB0byBleGVjdXRlCisgKglAZWJ4X2luOiBFQlggcmVnaXN0ZXIgZm9yIGNhbGwgZW50cnkKKyAqCUBlY3hfaW46IEVDWCByZWdpc3RlciBmb3IgY2FsbCBlbnRyeQorICoJQGVheDogRUFYIHJlZ2lzdGVyIHJldHVybgorICoJQGVieDogRUJYIHJlZ2lzdGVyIHJldHVybgorICoJQGVjeDogRUNYIHJlZ2lzdGVyIHJldHVybgorICoJQGVkeDogRURYIHJlZ2lzdGVyIHJldHVybgorICoJQGVzaTogRVNJIHJlZ2lzdGVyIHJldHVybgorICoKKyAqCU1ha2UgYW4gQVBNIGNhbGwgdXNpbmcgdGhlIDMyYml0IHByb3RlY3RlZCBtb2RlIGludGVyZmFjZS4gVGhlCisgKgljYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGtub3dpbmcgaWYgQVBNIEJJT1MgaXMgY29uZmlndXJlZCBhbmQKKyAqCWVuYWJsZWQuIFRoaXMgY2FsbCBjYW4gZGlzYWJsZSBpbnRlcnJ1cHRzIGZvciBhIGxvbmcgcGVyaW9kIG9mCisgKgl0aW1lIG9uIHNvbWUgbGFwdG9wcy4gIFRoZSByZXR1cm4gdmFsdWUgaXMgaW4gQUggYW5kIHRoZSBjYXJyeQorICoJZmxhZyBpcyBsb2FkZWQgaW50byBBTC4gIElmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGVuIHRoZSBlcnJvcgorICoJY29kZSBpcyByZXR1cm5lZCBpbiBBSCAoYml0cyA4LTE1IG9mIGVheCkgYW5kIHRoaXMgZnVuY3Rpb24KKyAqCXJldHVybnMgbm9uLXplcm8uCisgKi8KKyAKK3N0YXRpYyB1OCBhcG1fYmlvc19jYWxsKHUzMiBmdW5jLCB1MzIgZWJ4X2luLCB1MzIgZWN4X2luLAorCXUzMiAqZWF4LCB1MzIgKmVieCwgdTMyICplY3gsIHUzMiAqZWR4LCB1MzIgKmVzaSkKK3sKKwlBUE1fREVDTF9TRUdTCisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJY3B1bWFza190CQljcHVzOworCWludAkJCWNwdTsKKwlzdHJ1Y3QgZGVzY19zdHJ1Y3QJc2F2ZV9kZXNjXzQwOworCisJY3B1cyA9IGFwbV9zYXZlX2NwdXMoKTsKKwkKKwljcHUgPSBnZXRfY3B1KCk7CisJc2F2ZV9kZXNjXzQwID0gcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpWzB4NDAgLyA4XTsKKwlwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGNwdSlbMHg0MCAvIDhdID0gYmFkX2Jpb3NfZGVzYzsKKworCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCUFQTV9ET19DTEk7CisJQVBNX0RPX1NBVkVfU0VHUzsKKwlhcG1fYmlvc19jYWxsX2FzbShmdW5jLCBlYnhfaW4sIGVjeF9pbiwgZWF4LCBlYngsIGVjeCwgZWR4LCBlc2kpOworCUFQTV9ET19SRVNUT1JFX1NFR1M7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXBlcl9jcHUoY3B1X2dkdF90YWJsZSwgY3B1KVsweDQwIC8gOF0gPSBzYXZlX2Rlc2NfNDA7CisJcHV0X2NwdSgpOworCWFwbV9yZXN0b3JlX2NwdXMoY3B1cyk7CisJCisJcmV0dXJuICplYXggJiAweGZmOworfQorCisvKioKKyAqCWFwbV9iaW9zX2NhbGxfc2ltcGxlCS0JbWFrZSBhIHNpbXBsZSBBUE0gQklPUyAzMmJpdCBjYWxsCisgKglAZnVuYzogQVBNIGZ1bmN0aW9uIHRvIGludm9rZQorICoJQGVieF9pbjogRUJYIHJlZ2lzdGVyIHZhbHVlIGZvciBCSU9TIGNhbGwKKyAqCUBlY3hfaW46IEVDWCByZWdpc3RlciB2YWx1ZSBmb3IgQklPUyBjYWxsCisgKglAZWF4OiBFQVggcmVnaXN0ZXIgb24gcmV0dXJuIGZyb20gdGhlIEJJT1MgY2FsbAorICoKKyAqCU1ha2UgYSBCSU9TIGNhbGwgdGhhdCBkb2VzIG9ubHkgcmV0dXJucyBvbmUgdmFsdWUsIG9yIGp1c3Qgc3RhdHVzLgorICoJSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZW4gdGhlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQgaW4gQUgKKyAqCShiaXRzIDgtMTUgb2YgZWF4KSBhbmQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvLiBUaGlzIGlzCisgKgl1c2VkIGZvciBzaW1wbGVyIEJJT1Mgb3BlcmF0aW9ucy4gVGhpcyBjYWxsIG1heSBob2xkIGludGVycnVwdHMKKyAqCW9mZiBmb3IgYSBsb25nIHRpbWUgb24gc29tZSBsYXB0b3BzLgorICovCisKK3N0YXRpYyB1OCBhcG1fYmlvc19jYWxsX3NpbXBsZSh1MzIgZnVuYywgdTMyIGVieF9pbiwgdTMyIGVjeF9pbiwgdTMyICplYXgpCit7CisJdTgJCQllcnJvcjsKKwlBUE1fREVDTF9TRUdTCisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJY3B1bWFza190CQljcHVzOworCWludAkJCWNwdTsKKwlzdHJ1Y3QgZGVzY19zdHJ1Y3QJc2F2ZV9kZXNjXzQwOworCisKKwljcHVzID0gYXBtX3NhdmVfY3B1cygpOworCQorCWNwdSA9IGdldF9jcHUoKTsKKwlzYXZlX2Rlc2NfNDAgPSBwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGNwdSlbMHg0MCAvIDhdOworCXBlcl9jcHUoY3B1X2dkdF90YWJsZSwgY3B1KVsweDQwIC8gOF0gPSBiYWRfYmlvc19kZXNjOworCisJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisJQVBNX0RPX0NMSTsKKwlBUE1fRE9fU0FWRV9TRUdTOworCWVycm9yID0gYXBtX2Jpb3NfY2FsbF9zaW1wbGVfYXNtKGZ1bmMsIGVieF9pbiwgZWN4X2luLCBlYXgpOworCUFQTV9ET19SRVNUT1JFX1NFR1M7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCV9fZ2V0X2NwdV92YXIoY3B1X2dkdF90YWJsZSlbMHg0MCAvIDhdID0gc2F2ZV9kZXNjXzQwOworCXB1dF9jcHUoKTsKKwlhcG1fcmVzdG9yZV9jcHVzKGNwdXMpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglhcG1fZHJpdmVyX3ZlcnNpb24JLQlBUE0gZHJpdmVyIHZlcnNpb24KKyAqCUB2YWw6CWxvYWRlZCB3aXRoIHRoZSBBUE0gdmVyc2lvbiBvbiByZXR1cm4KKyAqCisgKglSZXRyaWV2ZSB0aGUgQVBNIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoZSBCSU9TLiBUaGlzIGlzIG9ubHkKKyAqCXN1cHBvcnRlZCBmb3IgQVBNIDEuMSBvciBoaWdoZXIuIEFuIGVycm9yIGluZGljYXRlcyBBUE0gMS4wIGlzCisgKglwcm9iYWJseSBwcmVzZW50LgorICoKKyAqCU9uIGVudHJ5IHZhbCBzaG91bGQgcG9pbnQgdG8gYSB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBBUE0gZHJpdmVyCisgKgl2ZXJzaW9uIHdpdGggdGhlIGhpZ2ggYnl0ZSBiZWluZyB0aGUgbWFqb3IgYW5kIHRoZSBsb3cgYnl0ZSB0aGUKKyAqCW1pbm9yIG51bWJlciBib3RoIGluIEJDRAorICoKKyAqCU9uIHJldHVybiBpdCB3aWxsIGhvbGQgdGhlIEJJT1MgcmV2aXNpb24gc3VwcG9ydGVkIGluIHRoZQorICoJc2FtZSBmb3JtYXQuCisgKi8KKworc3RhdGljIGludCBhcG1fZHJpdmVyX3ZlcnNpb24odV9zaG9ydCAqdmFsKQoreworCXUzMgllYXg7CisKKwlpZiAoYXBtX2Jpb3NfY2FsbF9zaW1wbGUoQVBNX0ZVTkNfVkVSU0lPTiwgMCwgKnZhbCwgJmVheCkpCisJCXJldHVybiAoZWF4ID4+IDgpICYgMHhmZjsKKwkqdmFsID0gZWF4OworCXJldHVybiBBUE1fU1VDQ0VTUzsKK30KKworLyoqCisgKglhcG1fZ2V0X2V2ZW50CS0JZ2V0IGFuIEFQTSBldmVudCBmcm9tIHRoZSBCSU9TCisgKglAZXZlbnQ6IHBvaW50ZXIgdG8gdGhlIGV2ZW50CisgKglAaW5mbzogcG9pbnQgdG8gdGhlIGV2ZW50IGluZm9ybWF0aW9uCisgKgorICoJVGhlIEFQTSBCSU9TIHByb3ZpZGVzIGEgcG9sbGVkIGluZm9ybWF0aW9uIGZvciBldmVudAorICoJcmVwb3J0aW5nLiBUaGUgQklPUyBleHBlY3RzIHRvIGJlIHBvbGxlZCBhdCBsZWFzdCBldmVyeSBzZWNvbmQKKyAqCXdoZW4gZXZlbnRzIGFyZSBwZW5kaW5nLiBXaGVuIGEgbWVzc2FnZSBpcyBmb3VuZCB0aGUgY2FsbGVyIHNob3VsZAorICoJcG9sbCB1bnRpbCBubyBtb3JlIG1lc3NhZ2VzIGFyZSBwcmVzZW50LiAgSG93ZXZlciwgdGhpcyBjYXVzZXMKKyAqCXByb2JsZW1zIG9uIHNvbWUgbGFwdG9wcyB3aGVyZSBhIHN1c3BlbmQgZXZlbnQgbm90aWZpY2F0aW9uIGlzCisgKglub3QgY2xlYXJlZCB1bnRpbCBpdCBpcyBhY2tub3dsZWRnZWQuCisgKgorICoJQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgaW5mbyBwb2ludGVyLCBwcm92aWRpbmcKKyAqCXRoYXQgQVBNIDEuMiBpcyBpbiB1c2UuIElmIG5vIG1lc3NnZXMgYXJlIHBlbmRpbmcgdGhlIHZhbHVlIDB4ODAKKyAqCWlzIHJldHVybmVkIChObyBwb3dlciBtYW5hZ2VtZW50IGV2ZW50cyBwZW5kaW5nKS4KKyAqLworIAorc3RhdGljIGludCBhcG1fZ2V0X2V2ZW50KGFwbV9ldmVudF90ICpldmVudCwgYXBtX2V2ZW50aW5mb190ICppbmZvKQoreworCXUzMgllYXg7CisJdTMyCWVieDsKKwl1MzIJZWN4OworCXUzMglkdW1teTsKKworCWlmIChhcG1fYmlvc19jYWxsKEFQTV9GVU5DX0dFVF9FVkVOVCwgMCwgMCwgJmVheCwgJmVieCwgJmVjeCwKKwkJCSZkdW1teSwgJmR1bW15KSkKKwkJcmV0dXJuIChlYXggPj4gOCkgJiAweGZmOworCSpldmVudCA9IGVieDsKKwlpZiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uIDwgMHgwMTAyKQorCQkqaW5mbyA9IH4wOyAvKiBpbmRpY2F0ZSBpbmZvIG5vdCB2YWxpZCAqLworCWVsc2UKKwkJKmluZm8gPSBlY3g7CisJcmV0dXJuIEFQTV9TVUNDRVNTOworfQorCisvKioKKyAqCXNldF9wb3dlcl9zdGF0ZQktCXNldCB0aGUgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZQorICoJQHdoYXQ6IHdoaWNoIGl0ZW1zIHRvIHRyYW5zaXRpb24KKyAqCUBzdGF0ZTogc3RhdGUgdG8gdHJhbnNpdGlvbiB0bworICoKKyAqCVJlcXVlc3QgYW4gQVBNIGNoYW5nZSBvZiBzdGF0ZSBmb3Igb25lIG9yIG1vcmUgc3lzdGVtIGRldmljZXMuIFRoZQorICoJcHJvY2Vzc29yIHN0YXRlIG11c3QgYmUgdHJhbnNpdGlvbmVkIGxhc3Qgb2YgYWxsLiB3aGF0IGhvbGRzIHRoZQorICoJY2xhc3Mgb2YgZGV2aWNlIGluIHRoZSB1cHBlciBieXRlIGFuZCB0aGUgZGV2aWNlIG51bWJlciAoMHhGRiBmb3IKKyAqCWFsbCkgZm9yIHRoZSBvYmplY3QgdG8gYmUgdHJhbnNpdGlvbmVkLgorICoKKyAqCVRoZSBzdGF0ZSBob2xkcyB0aGUgc3RhdGUgdG8gdHJhbnNpdGlvbiB0bywgd2hpY2ggbWF5IGluIGZhY3QKKyAqCWJlIGFuIGFjY2VwdGFuY2Ugb2YgYSBCSU9TIHJlcXVlc3RlZCBzdGF0ZSBjaGFuZ2UuCisgKi8KKyAKK3N0YXRpYyBpbnQgc2V0X3Bvd2VyX3N0YXRlKHVfc2hvcnQgd2hhdCwgdV9zaG9ydCBzdGF0ZSkKK3sKKwl1MzIJZWF4OworCisJaWYgKGFwbV9iaW9zX2NhbGxfc2ltcGxlKEFQTV9GVU5DX1NFVF9TVEFURSwgd2hhdCwgc3RhdGUsICZlYXgpKQorCQlyZXR1cm4gKGVheCA+PiA4KSAmIDB4ZmY7CisJcmV0dXJuIEFQTV9TVUNDRVNTOworfQorCisvKioKKyAqCXNldF9zeXN0ZW1fcG93ZXJfc3RhdGUgLSBzZXQgc3lzdGVtIHdpZGUgcG93ZXIgc3RhdGUKKyAqCUBzdGF0ZTogd2hpY2ggc3RhdGUgdG8gZW50ZXIKKyAqCisgKglUcmFuc2l0aW9uIHRoZSBlbnRpcmUgc3lzdGVtIGludG8gYSBuZXcgQVBNIHBvd2VyIHN0YXRlLgorICovCisgCitzdGF0aWMgaW50IHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUodV9zaG9ydCBzdGF0ZSkKK3sKKwlyZXR1cm4gc2V0X3Bvd2VyX3N0YXRlKEFQTV9ERVZJQ0VfQUxMLCBzdGF0ZSk7Cit9CisKKy8qKgorICoJYXBtX2RvX2lkbGUJLQlwZXJmb3JtIHBvd2VyIHNhdmluZworICoKKyAqCVRoaXMgZnVuY3Rpb24gbm90aWZpZXMgdGhlIEJJT1MgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIChpbiB0aGUgdmlldworICoJb2YgdGhlIE9TKSBpZGxlLiBJdCByZXR1cm5zIC0xIGluIHRoZSBldmVudCB0aGF0IHRoZSBCSU9TIHJlZnVzZXMKKyAqCXRvIGhhbmRsZSB0aGUgaWRsZSByZXF1ZXN0LiBPbiBhIHN1Y2Nlc3MgdGhlIGZ1bmN0aW9uIHJldHVybnMgMQorICoJaWYgdGhlIEJJT1MgZGlkIGNsb2NrIHNsb3dpbmcgb3IgMCBvdGhlcndpc2UuCisgKi8KKyAKK3N0YXRpYyBpbnQgYXBtX2RvX2lkbGUodm9pZCkKK3sKKwl1MzIJZWF4OworCisJaWYgKGFwbV9iaW9zX2NhbGxfc2ltcGxlKEFQTV9GVU5DX0lETEUsIDAsIDAsICZlYXgpKSB7CisJCXN0YXRpYyB1bnNpZ25lZCBsb25nIHQ7CisKKwkJLyogVGhpcyBhbHdheXMgZmFpbHMgb24gc29tZSBTTVAgYm9hcmRzIHJ1bm5pbmcgVVAga2VybmVscy4KKwkJICogT25seSByZXBvcnQgdGhlIGZhaWx1cmUgdGhlIGZpcnN0IDUgdGltZXMuCisJCSAqLworCQlpZiAoKyt0IDwgNSkKKwkJeworCQkJcHJpbnRrKEtFUk5fREVCVUcgImFwbV9kb19pZGxlIGZhaWxlZCAoJWQpXG4iLAorCQkJCQkoZWF4ID4+IDgpICYgMHhmZik7CisJCQl0ID0gamlmZmllczsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCWNsb2NrX3Nsb3dlZCA9IChhcG1faW5mby5iaW9zLmZsYWdzICYgQVBNX0lETEVfU0xPV1NfQ0xPQ0spICE9IDA7CisJcmV0dXJuIGNsb2NrX3Nsb3dlZDsKK30KKworLyoqCisgKglhcG1fZG9fYnVzeQktCWluZm9ybSB0aGUgQklPUyB0aGUgQ1BVIGlzIGJ1c3kKKyAqCisgKglSZXF1ZXN0IHRoYXQgdGhlIEJJT1MgYnJpbmdzIHRoZSBDUFUgYmFjayB0byBmdWxsIHBlcmZvcm1hbmNlLiAKKyAqLworIAorc3RhdGljIHZvaWQgYXBtX2RvX2J1c3kodm9pZCkKK3sKKwl1MzIJZHVtbXk7CisKKwlpZiAoY2xvY2tfc2xvd2VkIHx8IEFMV0FZU19DQUxMX0JVU1kpIHsKKwkJKHZvaWQpIGFwbV9iaW9zX2NhbGxfc2ltcGxlKEFQTV9GVU5DX0JVU1ksIDAsIDAsICZkdW1teSk7CisJCWNsb2NrX3Nsb3dlZCA9IDA7CisJfQorfQorCisvKgorICogSWYgbm8gcHJvY2VzcyBoYXMgcmVhbGx5IGJlZW4gaW50ZXJlc3RlZCBpbgorICogdGhlIENQVSBmb3Igc29tZSB0aW1lLCB3ZSB3YW50IHRvIGNhbGwgQklPUworICogcG93ZXIgbWFuYWdlbWVudCAtIHdlIHByb2JhYmx5IHdhbnQKKyAqIHRvIGNvbnNlcnZlIHBvd2VyLgorICovCisjZGVmaW5lIElETEVfQ0FMQ19MSU1JVCAgIChIWiAqIDEwMCkKKyNkZWZpbmUgSURMRV9MRUFLWV9NQVggICAgMTYKKworc3RhdGljIHZvaWQgKCpvcmlnaW5hbF9wbV9pZGxlKSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOworCisvKioKKyAqIGFwbV9jcHVfaWRsZQkJLQljcHUgaWRsaW5nIGZvciBBUE0gY2FwYWJsZSBMaW51eAorICoKKyAqIFRoaXMgaXMgdGhlIGlkbGluZyBmdW5jdGlvbiB0aGUga2VybmVsIGV4ZWN1dGVzIHdoZW4gQVBNIGlzIGF2YWlsYWJsZS4gSXQgCisgKiB0cmllcyB0byBkbyBCSU9TIHBvd2VybWFuYWdlbWVudCBiYXNlZCBvbiB0aGUgYXZlcmFnZSBzeXN0ZW0gaWRsZSB0aW1lLgorICogRnVydGhlcm1vcmUgaXQgY2FsbHMgdGhlIHN5c3RlbSBkZWZhdWx0IGlkbGUgcm91dGluZS4KKyAqLworCitzdGF0aWMgdm9pZCBhcG1fY3B1X2lkbGUodm9pZCkKK3sKKwlzdGF0aWMgaW50IHVzZV9hcG1faWRsZTsgLyogPSAwICovCisJc3RhdGljIHVuc2lnbmVkIGludCBsYXN0X2ppZmZpZXM7IC8qID0gMCAqLworCXN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9zdGltZTsgLyogPSAwICovCisKKwlpbnQgYXBtX2lkbGVfZG9uZSA9IDA7CisJdW5zaWduZWQgaW50IGppZmZpZXNfc2luY2VfbGFzdF9jaGVjayA9IGppZmZpZXMgLSBsYXN0X2ppZmZpZXM7CisJdW5zaWduZWQgaW50IGJ1Y2tldDsKKworcmVjYWxjOgorCWlmIChqaWZmaWVzX3NpbmNlX2xhc3RfY2hlY2sgPiBJRExFX0NBTENfTElNSVQpIHsKKwkJdXNlX2FwbV9pZGxlID0gMDsKKwkJbGFzdF9qaWZmaWVzID0gamlmZmllczsKKwkJbGFzdF9zdGltZSA9IGN1cnJlbnQtPnN0aW1lOworCX0gZWxzZSBpZiAoamlmZmllc19zaW5jZV9sYXN0X2NoZWNrID4gaWRsZV9wZXJpb2QpIHsKKwkJdW5zaWduZWQgaW50IGlkbGVfcGVyY2VudGFnZTsKKworCQlpZGxlX3BlcmNlbnRhZ2UgPSBjdXJyZW50LT5zdGltZSAtIGxhc3Rfc3RpbWU7CisJCWlkbGVfcGVyY2VudGFnZSAqPSAxMDA7CisJCWlkbGVfcGVyY2VudGFnZSAvPSBqaWZmaWVzX3NpbmNlX2xhc3RfY2hlY2s7CisJCXVzZV9hcG1faWRsZSA9IChpZGxlX3BlcmNlbnRhZ2UgPiBpZGxlX3RocmVzaG9sZCk7CisJCWlmIChhcG1faW5mby5mb3JiaWRfaWRsZSkKKwkJCXVzZV9hcG1faWRsZSA9IDA7CisJCWxhc3RfamlmZmllcyA9IGppZmZpZXM7CisJCWxhc3Rfc3RpbWUgPSBjdXJyZW50LT5zdGltZTsKKwl9CisKKwlidWNrZXQgPSBJRExFX0xFQUtZX01BWDsKKworCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJaWYgKHVzZV9hcG1faWRsZSkgeworCQkJdW5zaWduZWQgaW50IHQ7CisKKwkJCXQgPSBqaWZmaWVzOworCQkJc3dpdGNoIChhcG1fZG9faWRsZSgpKSB7CisJCQljYXNlIDA6IGFwbV9pZGxlX2RvbmUgPSAxOworCQkJCWlmICh0ICE9IGppZmZpZXMpIHsKKwkJCQkJaWYgKGJ1Y2tldCkgeworCQkJCQkJYnVja2V0ID0gSURMRV9MRUFLWV9NQVg7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoYnVja2V0KSB7CisJCQkJCWJ1Y2tldC0tOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDE6IGFwbV9pZGxlX2RvbmUgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDogLyogQklPUyByZWZ1c2VkICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKG9yaWdpbmFsX3BtX2lkbGUpCisJCQlvcmlnaW5hbF9wbV9pZGxlKCk7CisJCWVsc2UKKwkJCWRlZmF1bHRfaWRsZSgpOworCQlqaWZmaWVzX3NpbmNlX2xhc3RfY2hlY2sgPSBqaWZmaWVzIC0gbGFzdF9qaWZmaWVzOworCQlpZiAoamlmZmllc19zaW5jZV9sYXN0X2NoZWNrID4gaWRsZV9wZXJpb2QpCisJCQlnb3RvIHJlY2FsYzsKKwl9CisKKwlpZiAoYXBtX2lkbGVfZG9uZSkKKwkJYXBtX2RvX2J1c3koKTsKK30KKworLyoqCisgKglhcG1fcG93ZXJfb2ZmCS0JYXNrIHRoZSBCSU9TIHRvIHBvd2VyIG9mZgorICoKKyAqCUhhbmRsZSB0aGUgcG93ZXIgb2ZmIHNlcXVlbmNlLiBUaGlzIGlzIHRoZSBvbmUgcGllY2Ugb2YgY29kZSB3ZQorICoJd2lsbCBleGVjdXRlIGV2ZW4gb24gU01QIG1hY2hpbmVzLiBJbiBvcmRlciB0byBkZWFsIHdpdGggQklPUworICoJYnVncyB3ZSBzdXBwb3J0IHJlYWwgbW9kZSBBUE0gQklPUyBwb3dlciBvZmYgY2FsbHMuIFdlIGFsc28gbWFrZQorICoJdGhlIFNNUCBjYWxsIG9uIENQVTAgYXMgc29tZSBzeXN0ZW1zIHdpbGwgb25seSBob25vdXIgdGhpcyBjYWxsCisgKglvbiB0aGVpciBmaXJzdCBjcHUuCisgKi8KKyAKK3N0YXRpYyB2b2lkIGFwbV9wb3dlcl9vZmYodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyCXBvX2Jpb3NfY2FsbFtdID0geworCQkweGI4LCAweDAwLCAweDEwLAkvKiBtb3Z3ICAkMHgxMDAwLGF4ICAqLworCQkweDhlLCAweGQwLAkJLyogbW92dyAgYXgsc3MgICAgICAgKi8KKwkJMHhiYywgMHgwMCwgMHhmMCwJLyogbW92dyAgJDB4ZjAwMCxzcCAgKi8KKwkJMHhiOCwgMHgwNywgMHg1MywJLyogbW92dyAgJDB4NTMwNyxheCAgKi8KKwkJMHhiYiwgMHgwMSwgMHgwMCwJLyogbW92dyAgJDB4MDAwMSxieCAgKi8KKwkJMHhiOSwgMHgwMywgMHgwMCwJLyogbW92dyAgJDB4MDAwMyxjeCAgKi8KKwkJMHhjZCwgMHgxNQkJLyogaW50ICAgJDB4MTUgICAgICAgKi8KKwl9OworCisJLyoKKwkgKiBUaGlzIG1heSBiZSBjYWxsZWQgb24gYW4gU01QIG1hY2hpbmUuCisJICovCisjaWZkZWYgQ09ORklHX1NNUAorCS8qIFNvbWUgYmlvc2VzIGRvbid0IGxpa2UgYmVpbmcgY2FsbGVkIGZyb20gQ1BVICE9IDAgKi8KKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KDApKTsKKwlCVUdfT04oc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApOworI2VuZGlmCisJaWYgKGFwbV9pbmZvLnJlYWxtb2RlX3Bvd2VyX29mZikKKwl7CisJCSh2b2lkKWFwbV9zYXZlX2NwdXMoKTsKKwkJbWFjaGluZV9yZWFsX3Jlc3RhcnQocG9fYmlvc19jYWxsLCBzaXplb2YocG9fYmlvc19jYWxsKSk7CisJfQorCWVsc2UKKwkJKHZvaWQpIHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUoQVBNX1NUQVRFX09GRik7Cit9CisKKyNpZmRlZiBDT05GSUdfQVBNX0RPX0VOQUJMRQorCisvKioKKyAqCWFwbV9lbmFibGVfcG93ZXJfbWFuYWdlbWVudCAtIGVuYWJsZSBCSU9TIEFQTSBwb3dlciBtYW5hZ2VtZW50CisgKglAZW5hYmxlOiBlbmFibGUgeWVzL25vCisgKgorICoJRW5hYmxlIG9yIGRpc2FibGUgdGhlIEFQTSBCSU9TIHBvd2VyIHNlcnZpY2VzLiAKKyAqLworIAorc3RhdGljIGludCBhcG1fZW5hYmxlX3Bvd2VyX21hbmFnZW1lbnQoaW50IGVuYWJsZSkKK3sKKwl1MzIJZWF4OworCisJaWYgKChlbmFibGUgPT0gMCkgJiYgKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fQklPU19ESVNFTkdBR0VEKSkKKwkJcmV0dXJuIEFQTV9OT1RfRU5HQUdFRDsKKwlpZiAoYXBtX2Jpb3NfY2FsbF9zaW1wbGUoQVBNX0ZVTkNfRU5BQkxFX1BNLCBBUE1fREVWSUNFX0JBTEwsCisJCQllbmFibGUsICZlYXgpKQorCQlyZXR1cm4gKGVheCA+PiA4KSAmIDB4ZmY7CisJaWYgKGVuYWJsZSkKKwkJYXBtX2luZm8uYmlvcy5mbGFncyAmPSB+QVBNX0JJT1NfRElTQUJMRUQ7CisJZWxzZQorCQlhcG1faW5mby5iaW9zLmZsYWdzIHw9IEFQTV9CSU9TX0RJU0FCTEVEOworCXJldHVybiBBUE1fU1VDQ0VTUzsKK30KKyNlbmRpZgorCisvKioKKyAqCWFwbV9nZXRfcG93ZXJfc3RhdHVzCS0JZ2V0IGN1cnJlbnQgcG93ZXIgc3RhdGUKKyAqCUBzdGF0dXM6IHJldHVybmVkIHN0YXR1cworICoJQGJhdDogYmF0dGVyeSBpbmZvCisgKglAbGlmZTogZXN0aW1hdGVkIGxpZmUKKyAqCisgKglPYnRhaW4gdGhlIGN1cnJlbnQgcG93ZXIgc3RhdHVzIGZyb20gdGhlIEFQTSBCSU9TLiBXZSByZXR1cm4gYQorICoJc3RhdHVzIHdoaWNoIGdpdmVzIHRoZSByb3VnaCBiYXR0ZXJ5IHN0YXR1cywgYW5kIGN1cnJlbnQgcG93ZXIKKyAqCXNvdXJjZS4gVGhlIGJhdCB2YWx1ZSByZXR1cm5lZCBnaXZlIGFuIGVzdGltYXRlIGFzIGEgcGVyY2VudGFnZQorICoJb2YgbGlmZSBhbmQgYSBzdGF0dXMgdmFsdWUgZm9yIHRoZSBiYXR0ZXJ5LiBUaGUgZXN0aW1hdGVkIGxpZmUKKyAqCWlmIHJlcG9ydGVkIGlzIGEgbGlmZXRpbWUgaW4gc2Vjb2RuZHMvbWludXRlcyBhdCBjdXJyZW50IHBvd3dlcgorICoJY29uc3VtcHRpb24uCisgKi8KKyAKK3N0YXRpYyBpbnQgYXBtX2dldF9wb3dlcl9zdGF0dXModV9zaG9ydCAqc3RhdHVzLCB1X3Nob3J0ICpiYXQsIHVfc2hvcnQgKmxpZmUpCit7CisJdTMyCWVheDsKKwl1MzIJZWJ4OworCXUzMgllY3g7CisJdTMyCWVkeDsKKwl1MzIJZHVtbXk7CisKKwlpZiAoYXBtX2luZm8uZ2V0X3Bvd2VyX3N0YXR1c19icm9rZW4pCisJCXJldHVybiBBUE1fMzJfVU5TVVBQT1JURUQ7CisJaWYgKGFwbV9iaW9zX2NhbGwoQVBNX0ZVTkNfR0VUX1NUQVRVUywgQVBNX0RFVklDRV9BTEwsIDAsCisJCQkmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4LCAmZHVtbXkpKQorCQlyZXR1cm4gKGVheCA+PiA4KSAmIDB4ZmY7CisJKnN0YXR1cyA9IGVieDsKKwkqYmF0ID0gZWN4OworCWlmIChhcG1faW5mby5nZXRfcG93ZXJfc3RhdHVzX3N3YWJpbm1pbnV0ZXMpIHsKKwkJKmxpZmUgPSBzd2FiMTYoKHUxNillZHgpOworCQkqbGlmZSB8PSAweDgwMDA7CisJfSBlbHNlCisJCSpsaWZlID0gZWR4OworCXJldHVybiBBUE1fU1VDQ0VTUzsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgYXBtX2dldF9iYXR0ZXJ5X3N0YXR1cyh1X3Nob3J0IHdoaWNoLCB1X3Nob3J0ICpzdGF0dXMsCisJCQkJICB1X3Nob3J0ICpiYXQsIHVfc2hvcnQgKmxpZmUsIHVfc2hvcnQgKm5iYXQpCit7CisJdTMyCWVheDsKKwl1MzIJZWJ4OworCXUzMgllY3g7CisJdTMyCWVkeDsKKwl1MzIJZXNpOworCisJaWYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA8IDB4MDEwMikgeworCQkvKiBwcmV0ZW5kIHdlIG9ubHkgaGF2ZSBvbmUgYmF0dGVyeS4gKi8KKwkJaWYgKHdoaWNoICE9IDEpCisJCQlyZXR1cm4gQVBNX0JBRF9ERVZJQ0U7CisJCSpuYmF0ID0gMTsKKwkJcmV0dXJuIGFwbV9nZXRfcG93ZXJfc3RhdHVzKHN0YXR1cywgYmF0LCBsaWZlKTsKKwl9CisKKwlpZiAoYXBtX2Jpb3NfY2FsbChBUE1fRlVOQ19HRVRfU1RBVFVTLCAoMHg4MDAwIHwgKHdoaWNoKSksIDAsICZlYXgsCisJCQkmZWJ4LCAmZWN4LCAmZWR4LCAmZXNpKSkKKwkJcmV0dXJuIChlYXggPj4gOCkgJiAweGZmOworCSpzdGF0dXMgPSBlYng7CisJKmJhdCA9IGVjeDsKKwkqbGlmZSA9IGVkeDsKKwkqbmJhdCA9IGVzaTsKKwlyZXR1cm4gQVBNX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworLyoqCisgKglhcG1fZW5nYWdlX3Bvd2VyX21hbmFnZW1lbnQJLQllbmFibGUgUE0gb24gYSBkZXZpY2UKKyAqCUBkZXZpY2U6IGlkZW50aXR5IG9mIGRldmljZQorICoJQGVuYWJsZTogb24vb2ZmCisgKgorICoJQWN0aXZhdGUgb3IgZGVhY3RpdmUgcG93ZXIgbWFuYWdlbWVudCBvbiBlaXRoZXIgYSBzcGVjaWZpYyBkZXZpY2UKKyAqCW9yIHRoZSBlbnRpcmUgc3lzdGVtICglQVBNX0RFVklDRV9BTEwpLgorICovCisgCitzdGF0aWMgaW50IGFwbV9lbmdhZ2VfcG93ZXJfbWFuYWdlbWVudCh1X3Nob3J0IGRldmljZSwgaW50IGVuYWJsZSkKK3sKKwl1MzIJZWF4OworCisJaWYgKChlbmFibGUgPT0gMCkgJiYgKGRldmljZSA9PSBBUE1fREVWSUNFX0FMTCkKKwkgICAgJiYgKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fQklPU19ESVNBQkxFRCkpCisJCXJldHVybiBBUE1fRElTQUJMRUQ7CisJaWYgKGFwbV9iaW9zX2NhbGxfc2ltcGxlKEFQTV9GVU5DX0VOR0FHRV9QTSwgZGV2aWNlLCBlbmFibGUsICZlYXgpKQorCQlyZXR1cm4gKGVheCA+PiA4KSAmIDB4ZmY7CisJaWYgKGRldmljZSA9PSBBUE1fREVWSUNFX0FMTCkgeworCQlpZiAoZW5hYmxlKQorCQkJYXBtX2luZm8uYmlvcy5mbGFncyAmPSB+QVBNX0JJT1NfRElTRU5HQUdFRDsKKwkJZWxzZQorCQkJYXBtX2luZm8uYmlvcy5mbGFncyB8PSBBUE1fQklPU19ESVNFTkdBR0VEOworCX0KKwlyZXR1cm4gQVBNX1NVQ0NFU1M7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUE1fRElTUExBWV9CTEFOSykgJiYgZGVmaW5lZChDT05GSUdfVlQpCisKKy8qKgorICoJYXBtX2NvbnNvbGVfYmxhbmsJLQlibGFuayB0aGUgZGlzcGxheQorICoJQGJsYW5rOiBvbi9vZmYKKyAqCisgKglBdHRlbXB0IHRvIGJsYW5rIHRoZSBjb25zb2xlLCBmaXJzdGx5IGJ5IGJsYW5raW5nIGp1c3QgdmlkZW8gZGV2aWNlCisgKgl6ZXJvLCBhbmQgaWYgdGhhdCBmYWlscyAoc29tZSBCSU9TZXMgZG9uJ3Qgc3VwcG9ydCBpdCkgdGhlbiBpdCBibGFua3MKKyAqCWFsbCB2aWRlbyBkZXZpY2VzLiBUeXBpY2FsbHkgdGhlIEJJT1Mgd2lsbCBkbyBsYXB0b3AgYmFja2xpZ2h0IGFuZAorICoJbW9uaXRvciBwb3dlcmRvd24gZm9yIHVzLgorICovCisgCitzdGF0aWMgaW50IGFwbV9jb25zb2xlX2JsYW5rKGludCBibGFuaykKK3sKKwlpbnQJZXJyb3I7CisJdV9zaG9ydAlzdGF0ZTsKKworCXN0YXRlID0gYmxhbmsgPyBBUE1fU1RBVEVfU1RBTkRCWSA6IEFQTV9TVEFURV9SRUFEWTsKKwkvKiBCbGFuayB0aGUgZmlyc3QgZGlzcGxheSBkZXZpY2UgKi8KKwllcnJvciA9IHNldF9wb3dlcl9zdGF0ZSgweDEwMCwgc3RhdGUpOworCWlmICgoZXJyb3IgIT0gQVBNX1NVQ0NFU1MpICYmIChlcnJvciAhPSBBUE1fTk9fRVJST1IpKSB7CisJCS8qIHRyeSB0byBibGFuayB0aGVtIGFsbCBpbnN0ZWFkICovCisJCWVycm9yID0gc2V0X3Bvd2VyX3N0YXRlKDB4MWZmLCBzdGF0ZSk7CisJCWlmICgoZXJyb3IgIT0gQVBNX1NVQ0NFU1MpICYmIChlcnJvciAhPSBBUE1fTk9fRVJST1IpKQorCQkJLyogdHJ5IHRvIGJsYW5rIGRldmljZSBvbmUgaW5zdGVhZCAqLworCQkJZXJyb3IgPSBzZXRfcG93ZXJfc3RhdGUoMHgxMDEsIHN0YXRlKTsKKwl9CisJaWYgKChlcnJvciA9PSBBUE1fU1VDQ0VTUykgfHwgKGVycm9yID09IEFQTV9OT19FUlJPUikpCisJCXJldHVybiAxOworCWlmIChlcnJvciA9PSBBUE1fTk9UX0VOR0FHRUQpIHsKKwkJc3RhdGljIGludCB0cmllZDsKKwkJaW50IGVuZ19lcnJvcjsKKwkJaWYgKHRyaWVkKysgPT0gMCkgeworCQkJZW5nX2Vycm9yID0gYXBtX2VuZ2FnZV9wb3dlcl9tYW5hZ2VtZW50KEFQTV9ERVZJQ0VfQUxMLCAxKTsKKwkJCWlmIChlbmdfZXJyb3IpIHsKKwkJCQlhcG1fZXJyb3IoInNldCBkaXNwbGF5IiwgZXJyb3IpOworCQkJCWFwbV9lcnJvcigiZW5nYWdlIGludGVyZmFjZSIsIGVuZ19lcnJvcik7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gYXBtX2NvbnNvbGVfYmxhbmsoYmxhbmspOworCQl9CisJfQorCWFwbV9lcnJvcigic2V0IGRpc3BsYXkiLCBlcnJvcik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBxdWV1ZV9lbXB0eShzdHJ1Y3QgYXBtX3VzZXIgKmFzKQoreworCXJldHVybiBhcy0+ZXZlbnRfaGVhZCA9PSBhcy0+ZXZlbnRfdGFpbDsKK30KKworc3RhdGljIGFwbV9ldmVudF90IGdldF9xdWV1ZWRfZXZlbnQoc3RydWN0IGFwbV91c2VyICphcykKK3sKKwlhcy0+ZXZlbnRfdGFpbCA9IChhcy0+ZXZlbnRfdGFpbCArIDEpICUgQVBNX01BWF9FVkVOVFM7CisJcmV0dXJuIGFzLT5ldmVudHNbYXMtPmV2ZW50X3RhaWxdOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9ldmVudChhcG1fZXZlbnRfdCBldmVudCwgc3RydWN0IGFwbV91c2VyICpzZW5kZXIpCit7CisJc3RydWN0IGFwbV91c2VyICoJYXM7CisKKwlzcGluX2xvY2soJnVzZXJfbGlzdF9sb2NrKTsKKwlpZiAodXNlcl9saXN0ID09IE5VTEwpCisJCWdvdG8gb3V0OworCWZvciAoYXMgPSB1c2VyX2xpc3Q7IGFzICE9IE5VTEw7IGFzID0gYXMtPm5leHQpIHsKKwkJaWYgKChhcyA9PSBzZW5kZXIpIHx8ICghYXMtPnJlYWRlcikpCisJCQljb250aW51ZTsKKwkJYXMtPmV2ZW50X2hlYWQgPSAoYXMtPmV2ZW50X2hlYWQgKyAxKSAlIEFQTV9NQVhfRVZFTlRTOworCQlpZiAoYXMtPmV2ZW50X2hlYWQgPT0gYXMtPmV2ZW50X3RhaWwpIHsKKwkJCXN0YXRpYyBpbnQgbm90aWZpZWQ7CisKKwkJCWlmIChub3RpZmllZCsrID09IDApCisJCQkgICAgcHJpbnRrKEtFUk5fRVJSICJhcG06IGFuIGV2ZW50IHF1ZXVlIG92ZXJmbG93ZWRcbiIpOworCQkJYXMtPmV2ZW50X3RhaWwgPSAoYXMtPmV2ZW50X3RhaWwgKyAxKSAlIEFQTV9NQVhfRVZFTlRTOworCQl9CisJCWFzLT5ldmVudHNbYXMtPmV2ZW50X2hlYWRdID0gZXZlbnQ7CisJCWlmICgoIWFzLT5zdXNlcikgfHwgKCFhcy0+d3JpdGVyKSkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKGV2ZW50KSB7CisJCWNhc2UgQVBNX1NZU19TVVNQRU5EOgorCQljYXNlIEFQTV9VU0VSX1NVU1BFTkQ6CisJCQlhcy0+c3VzcGVuZHNfcGVuZGluZysrOworCQkJc3VzcGVuZHNfcGVuZGluZysrOworCQkJYnJlYWs7CisKKwkJY2FzZSBBUE1fU1lTX1NUQU5EQlk6CisJCWNhc2UgQVBNX1VTRVJfU1RBTkRCWToKKwkJCWFzLT5zdGFuZGJ5c19wZW5kaW5nKys7CisJCQlzdGFuZGJ5c19wZW5kaW5nKys7CisJCQlicmVhazsKKwkJfQorCX0KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFwbV93YWl0cXVldWUpOworb3V0OgorCXNwaW5fdW5sb2NrKCZ1c2VyX2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF90aW1lKHZvaWQpCit7CisJaWYgKGdvdF9jbG9ja19kaWZmKSB7CS8qIE11c3Qga25vdyB0aW1lIHpvbmUgaW4gb3JkZXIgdG8gc2V0IGNsb2NrICovCisJCXh0aW1lLnR2X3NlYyA9IGdldF9jbW9zX3RpbWUoKSArIGNsb2NrX2Ntb3NfZGlmZjsKKwkJeHRpbWUudHZfbnNlYyA9IDA7IAorCX0gCit9CisKK3N0YXRpYyB2b2lkIGdldF90aW1lX2RpZmYodm9pZCkKK3sKKyNpZm5kZWYgQ09ORklHX0FQTV9SVENfSVNfR01UCisJLyoKKwkgKiBFc3RpbWF0ZSB0aW1lIHpvbmUgc28gdGhhdCBzZXRfdGltZSBjYW4gdXBkYXRlIHRoZSBjbG9jaworCSAqLworCWNsb2NrX2Ntb3NfZGlmZiA9IC1nZXRfY21vc190aW1lKCk7CisJY2xvY2tfY21vc19kaWZmICs9IGdldF9zZWNvbmRzKCk7CisJZ290X2Nsb2NrX2RpZmYgPSAxOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHJlaW5pdF90aW1lcih2b2lkKQoreworI2lmZGVmIElOSVRfVElNRVJfQUZURVJfU1VTUEVORAorCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7CisJLyogc2V0IHRoZSBjbG9jayB0byAxMDAgSHogKi8KKwlvdXRiX3AoMHgzNCwgUElUX01PREUpOwkJLyogYmluYXJ5LCBtb2RlIDIsIExTQi9NU0IsIGNoIDAgKi8KKwl1ZGVsYXkoMTApOworCW91dGJfcChMQVRDSCAmIDB4ZmYsIFBJVF9DSDApOwkvKiBMU0IgKi8KKwl1ZGVsYXkoMTApOworCW91dGIoTEFUQ0ggPj4gOCwgUElUX0NIMCk7CS8qIE1TQiAqLworCXVkZWxheSgxMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc3VzcGVuZChpbnQgdmV0b2FibGUpCit7CisJaW50CQllcnI7CisJc3RydWN0IGFwbV91c2VyCSphczsKKworCWlmIChwbV9zZW5kX2FsbChQTV9TVVNQRU5ELCAodm9pZCAqKTMpKSB7CisJCS8qIFZldG9lZCAqLworCQlpZiAodmV0b2FibGUpIHsKKwkJCWlmIChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPiAweDEwMCkKKwkJCQlzZXRfc3lzdGVtX3Bvd2VyX3N0YXRlKEFQTV9TVEFURV9SRUpFQ1QpOworCQkJZXJyID0gLUVCVVNZOworCQkJaWdub3JlX3N5c19zdXNwZW5kID0gMDsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFwbTogc3VzcGVuZCB3YXMgdmV0b2VkLlxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwcmludGsoS0VSTl9DUklUICJhcG06IHN1c3BlbmQgd2FzIHZldG9lZCwgYnV0IHN1c3BlbmRpbmcgYW55d2F5LlxuIik7CisJfQorCisJZGV2aWNlX3N1c3BlbmQoUE1TR19TVVNQRU5EKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWRldmljZV9wb3dlcl9kb3duKFBNU0dfU1VTUEVORCk7CisKKwkvKiBzZXJpYWxpemUgd2l0aCB0aGUgdGltZXIgaW50ZXJydXB0ICovCisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisKKwkvKiBwcm90ZWN0IGFnYWluc3QgYWNjZXNzIHRvIHRpbWVyIGNoaXAgcmVnaXN0ZXJzICovCisJc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKKworCWdldF90aW1lX2RpZmYoKTsKKwkvKgorCSAqIElycSBzcGlubG9jayBtdXN0IGJlIGRyb3BwZWQgYXJvdW5kIHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUuCisJICogV2UnbGwgdW5kbyBhbnkgdGltZXIgY2hhbmdlcyBkdWUgdG8gaW50ZXJydXB0cyBiZWxvdy4KKwkgKi8KKwlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlzYXZlX3Byb2Nlc3Nvcl9zdGF0ZSgpOworCWVyciA9IHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUoQVBNX1NUQVRFX1NVU1BFTkQpOworCXJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCXNwaW5fbG9jaygmaTgyNTNfbG9jayk7CisJcmVpbml0X3RpbWVyKCk7CisJc2V0X3RpbWUoKTsKKwlpZ25vcmVfbm9ybWFsX3Jlc3VtZSA9IDE7CisKKwlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKworCWlmIChlcnIgPT0gQVBNX05PX0VSUk9SKQorCQllcnIgPSBBUE1fU1VDQ0VTUzsKKwlpZiAoZXJyICE9IEFQTV9TVUNDRVNTKQorCQlhcG1fZXJyb3IoInN1c3BlbmQiLCBlcnIpOworCWVyciA9IChlcnIgPT0gQVBNX1NVQ0NFU1MpID8gMCA6IC1FSU87CisJZGV2aWNlX3Bvd2VyX3VwKCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCWRldmljZV9yZXN1bWUoKTsKKwlwbV9zZW5kX2FsbChQTV9SRVNVTUUsICh2b2lkICopMCk7CisJcXVldWVfZXZlbnQoQVBNX05PUk1BTF9SRVNVTUUsIE5VTEwpOworIG91dDoKKwlzcGluX2xvY2soJnVzZXJfbGlzdF9sb2NrKTsKKwlmb3IgKGFzID0gdXNlcl9saXN0OyBhcyAhPSBOVUxMOyBhcyA9IGFzLT5uZXh0KSB7CisJCWFzLT5zdXNwZW5kX3dhaXQgPSAwOworCQlhcy0+c3VzcGVuZF9yZXN1bHQgPSBlcnI7CisJfQorCXNwaW5fdW5sb2NrKCZ1c2VyX2xpc3RfbG9jayk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhcG1fc3VzcGVuZF93YWl0cXVldWUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHN0YW5kYnkodm9pZCkKK3sKKwlpbnQJZXJyOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlkZXZpY2VfcG93ZXJfZG93bihQTVNHX1NVU1BFTkQpOworCS8qIHNlcmlhbGl6ZSB3aXRoIHRoZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKwkvKiBJZiBuZWVkZWQsIG5vdGlmeSBkcml2ZXJzIGhlcmUgKi8KKwlnZXRfdGltZV9kaWZmKCk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwllcnIgPSBzZXRfc3lzdGVtX3Bvd2VyX3N0YXRlKEFQTV9TVEFURV9TVEFOREJZKTsKKwlpZiAoKGVyciAhPSBBUE1fU1VDQ0VTUykgJiYgKGVyciAhPSBBUE1fTk9fRVJST1IpKQorCQlhcG1fZXJyb3IoInN0YW5kYnkiLCBlcnIpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlkZXZpY2VfcG93ZXJfdXAoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyBhcG1fZXZlbnRfdCBnZXRfZXZlbnQodm9pZCkKK3sKKwlpbnQJCWVycm9yOworCWFwbV9ldmVudF90CWV2ZW50OworCWFwbV9ldmVudGluZm9fdAlpbmZvOworCisJc3RhdGljIGludCBub3RpZmllZDsKKworCS8qIHdlIGRvbid0IHVzZSB0aGUgZXZlbnRpbmZvICovCisJZXJyb3IgPSBhcG1fZ2V0X2V2ZW50KCZldmVudCwgJmluZm8pOworCWlmIChlcnJvciA9PSBBUE1fU1VDQ0VTUykKKwkJcmV0dXJuIGV2ZW50OworCisJaWYgKChlcnJvciAhPSBBUE1fTk9fRVZFTlRTKSAmJiAobm90aWZpZWQrKyA9PSAwKSkKKwkJYXBtX2Vycm9yKCJnZXRfZXZlbnQiLCBlcnJvcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfZXZlbnRzKHZvaWQpCit7CisJYXBtX2V2ZW50X3QJCWV2ZW50OworCXN0YXRpYyB1bnNpZ25lZCBsb25nCWxhc3RfcmVzdW1lOworCXN0YXRpYyBpbnQJCWlnbm9yZV9ib3VuY2U7CisKKwl3aGlsZSAoKGV2ZW50ID0gZ2V0X2V2ZW50KCkpICE9IDApIHsKKwkJaWYgKGRlYnVnKSB7CisJCQlpZiAoZXZlbnQgPD0gTlJfQVBNX0VWRU5UX05BTUUpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImFwbTogcmVjZWl2ZWQgJXMgbm90aWZ5XG4iLAorCQkJCSAgICAgICBhcG1fZXZlbnRfbmFtZVtldmVudCAtIDFdKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiYXBtOiByZWNlaXZlZCB1bmtub3duICIKKwkJCQkgICAgICAgImV2ZW50IDB4JTAyeFxuIiwgZXZlbnQpOworCQl9CisJCWlmIChpZ25vcmVfYm91bmNlCisJCSAgICAmJiAoKGppZmZpZXMgLSBsYXN0X3Jlc3VtZSkgPiBib3VuY2VfaW50ZXJ2YWwpKQorCQkJaWdub3JlX2JvdW5jZSA9IDA7CisKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIEFQTV9TWVNfU1RBTkRCWToKKwkJY2FzZSBBUE1fVVNFUl9TVEFOREJZOgorCQkJcXVldWVfZXZlbnQoZXZlbnQsIE5VTEwpOworCQkJaWYgKHN0YW5kYnlzX3BlbmRpbmcgPD0gMCkKKwkJCQlzdGFuZGJ5KCk7CisJCQlicmVhazsKKworCQljYXNlIEFQTV9VU0VSX1NVU1BFTkQ6CisjaWZkZWYgQ09ORklHX0FQTV9JR05PUkVfVVNFUl9TVVNQRU5ECisJCQlpZiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgxMDApCisJCQkJc2V0X3N5c3RlbV9wb3dlcl9zdGF0ZShBUE1fU1RBVEVfUkVKRUNUKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgQVBNX1NZU19TVVNQRU5EOgorCQkJaWYgKGlnbm9yZV9ib3VuY2UpIHsKKwkJCQlpZiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgxMDApCisJCQkJCXNldF9zeXN0ZW1fcG93ZXJfc3RhdGUoQVBNX1NUQVRFX1JFSkVDVCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICogSWYgd2UgYXJlIGFscmVhZHkgcHJvY2Vzc2luZyBhIFNVU1BFTkQsCisJCQkgKiB0aGVuIGZ1cnRoZXIgU1VTUEVORCBldmVudHMgZnJvbSB0aGUgQklPUworCQkJICogd2lsbCBiZSBpZ25vcmVkLiAgV2UgYWxzbyByZXR1cm4gaGVyZSB0bworCQkJICogY29wZSB3aXRoIHRoZSBmYWN0IHRoYXQgdGhlIFRoaW5rcGFkcyBrZWVwCisJCQkgKiBzZW5kaW5nIGEgU1VTUEVORCBldmVudCB1bnRpbCBzb21ldGhpbmcgZWxzZQorCQkJICogaGFwcGVucyEKKwkJCSAqLworCQkJaWYgKGlnbm9yZV9zeXNfc3VzcGVuZCkKKwkJCQlyZXR1cm47CisJCQlpZ25vcmVfc3lzX3N1c3BlbmQgPSAxOworCQkJcXVldWVfZXZlbnQoZXZlbnQsIE5VTEwpOworCQkJaWYgKHN1c3BlbmRzX3BlbmRpbmcgPD0gMCkKKwkJCQkodm9pZCkgc3VzcGVuZCgxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBNX05PUk1BTF9SRVNVTUU6CisJCWNhc2UgQVBNX0NSSVRJQ0FMX1JFU1VNRToKKwkJY2FzZSBBUE1fU1RBTkRCWV9SRVNVTUU6CisJCQlpZ25vcmVfc3lzX3N1c3BlbmQgPSAwOworCQkJbGFzdF9yZXN1bWUgPSBqaWZmaWVzOworCQkJaWdub3JlX2JvdW5jZSA9IDE7CisJCQlpZiAoKGV2ZW50ICE9IEFQTV9OT1JNQUxfUkVTVU1FKQorCQkJICAgIHx8IChpZ25vcmVfbm9ybWFsX3Jlc3VtZSA9PSAwKSkgeworCQkJCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwkJCQlzZXRfdGltZSgpOworCQkJCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOworCQkJCWRldmljZV9yZXN1bWUoKTsKKwkJCQlwbV9zZW5kX2FsbChQTV9SRVNVTUUsICh2b2lkICopMCk7CisJCQkJcXVldWVfZXZlbnQoZXZlbnQsIE5VTEwpOworCQkJfQorCQkJaWdub3JlX25vcm1hbF9yZXN1bWUgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBBUE1fQ0FQQUJJTElUWV9DSEFOR0U6CisJCWNhc2UgQVBNX0xPV19CQVRURVJZOgorCQljYXNlIEFQTV9QT1dFUl9TVEFUVVNfQ0hBTkdFOgorCQkJcXVldWVfZXZlbnQoZXZlbnQsIE5VTEwpOworCQkJLyogSWYgbmVlZGVkLCBub3RpZnkgZHJpdmVycyBoZXJlICovCisJCQlicmVhazsKKworCQljYXNlIEFQTV9VUERBVEVfVElNRToKKwkJCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwkJCXNldF90aW1lKCk7CisJCQl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBNX0NSSVRJQ0FMX1NVU1BFTkQ6CisJCQkvKgorCQkJICogV2UgYXJlIG5vdCBhbGxvd2VkIHRvIHJlamVjdCBhIGNyaXRpY2FsIHN1c3BlbmQuCisJCQkgKi8KKwkJCSh2b2lkKSBzdXNwZW5kKDApOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFwbV9ldmVudF9oYW5kbGVyKHZvaWQpCit7CisJc3RhdGljIGludAlwZW5kaW5nX2NvdW50ID0gNDsKKwlpbnQJCWVycjsKKworCWlmICgoc3RhbmRieXNfcGVuZGluZyA+IDApIHx8IChzdXNwZW5kc19wZW5kaW5nID4gMCkpIHsKKwkJaWYgKChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPiAweDEwMCkgJiYKKwkJCQkocGVuZGluZ19jb3VudC0tIDw9IDApKSB7CisJCQlwZW5kaW5nX2NvdW50ID0gNDsKKwkJCWlmIChkZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiYXBtOiBzZXR0aW5nIHN0YXRlIGJ1c3lcbiIpOworCQkJZXJyID0gc2V0X3N5c3RlbV9wb3dlcl9zdGF0ZShBUE1fU1RBVEVfQlVTWSk7CisJCQlpZiAoZXJyKQorCQkJCWFwbV9lcnJvcigiYnVzeSIsIGVycik7CisJCX0KKwl9IGVsc2UKKwkJcGVuZGluZ19jb3VudCA9IDQ7CisJY2hlY2tfZXZlbnRzKCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBBUE0gdGhyZWFkIG1haW4gbG9vcC4KKyAqLworCitzdGF0aWMgdm9pZCBhcG1fbWFpbmxvb3Aodm9pZCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWFkZF93YWl0X3F1ZXVlKCZhcG1fd2FpdHF1ZXVlLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlmb3IgKDs7KSB7CisJCXNjaGVkdWxlX3RpbWVvdXQoQVBNX0NIRUNLX1RJTUVPVVQpOworCQlpZiAoZXhpdF9rYXBtZCkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBPaywgY2hlY2sgYWxsIGV2ZW50cywgY2hlY2sgZm9yIGlkbGUgKGFuZCBtYXJrIHVzIHNsZWVwaW5nCisJCSAqIHNvIGFzIG5vdCB0byBjb3VudCB0b3dhcmRzIHRoZSBsb2FkIGF2ZXJhZ2UpLi4KKwkJICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWFwbV9ldmVudF9oYW5kbGVyKCk7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZhcG1fd2FpdHF1ZXVlLCAmd2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYXBtX3VzZXIoc3RydWN0IGFwbV91c2VyICphcywgY29uc3QgY2hhciAqZnVuYykKK3sKKwlpZiAoKGFzID09IE5VTEwpIHx8IChhcy0+bWFnaWMgIT0gQVBNX0JJT1NfTUFHSUMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXBtOiAlcyBwYXNzZWQgYmFkIGZpbHBcbiIsIGZ1bmMpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRvX3JlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXBtX3VzZXIgKglhczsKKwlpbnQJCQlpOworCWFwbV9ldmVudF90CQlldmVudDsKKworCWFzID0gZnAtPnByaXZhdGVfZGF0YTsKKwlpZiAoY2hlY2tfYXBtX3VzZXIoYXMsICJyZWFkIikpCisJCXJldHVybiAtRUlPOworCWlmICgoaW50KWNvdW50IDwgc2l6ZW9mKGFwbV9ldmVudF90KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKChxdWV1ZV9lbXB0eShhcykpICYmIChmcC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQorCQlyZXR1cm4gLUVBR0FJTjsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXBtX3dhaXRxdWV1ZSwgIXF1ZXVlX2VtcHR5KGFzKSk7CisJaSA9IGNvdW50OworCXdoaWxlICgoaSA+PSBzaXplb2YoZXZlbnQpKSAmJiAhcXVldWVfZW1wdHkoYXMpKSB7CisJCWV2ZW50ID0gZ2V0X3F1ZXVlZF9ldmVudChhcyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZXZlbnQsIHNpemVvZihldmVudCkpKSB7CisJCQlpZiAoaSA8IGNvdW50KQorCQkJCWJyZWFrOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIEFQTV9TWVNfU1VTUEVORDoKKwkJY2FzZSBBUE1fVVNFUl9TVVNQRU5EOgorCQkJYXMtPnN1c3BlbmRzX3JlYWQrKzsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBNX1NZU19TVEFOREJZOgorCQljYXNlIEFQTV9VU0VSX1NUQU5EQlk6CisJCQlhcy0+c3RhbmRieXNfcmVhZCsrOworCQkJYnJlYWs7CisJCX0KKwkJYnVmICs9IHNpemVvZihldmVudCk7CisJCWkgLT0gc2l6ZW9mKGV2ZW50KTsKKwl9CisJaWYgKGkgPCBjb3VudCkKKwkJcmV0dXJuIGNvdW50IC0gaTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZG9fcG9sbChzdHJ1Y3QgZmlsZSAqZnAsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXN0cnVjdCBhcG1fdXNlciAqIGFzOworCisJYXMgPSBmcC0+cHJpdmF0ZV9kYXRhOworCWlmIChjaGVja19hcG1fdXNlcihhcywgInBvbGwiKSkKKwkJcmV0dXJuIDA7CisJcG9sbF93YWl0KGZwLCAmYXBtX3dhaXRxdWV1ZSwgd2FpdCk7CisJaWYgKCFxdWV1ZV9lbXB0eShhcykpCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgIHVfaW50IGNtZCwgdV9sb25nIGFyZykKK3sKKwlzdHJ1Y3QgYXBtX3VzZXIgKglhczsKKworCWFzID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWlmIChjaGVja19hcG1fdXNlcihhcywgImlvY3RsIikpCisJCXJldHVybiAtRUlPOworCWlmICgoIWFzLT5zdXNlcikgfHwgKCFhcy0+d3JpdGVyKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVBNX0lPQ19TVEFOREJZOgorCQlpZiAoYXMtPnN0YW5kYnlzX3JlYWQgPiAwKSB7CisJCQlhcy0+c3RhbmRieXNfcmVhZC0tOworCQkJYXMtPnN0YW5kYnlzX3BlbmRpbmctLTsKKwkJCXN0YW5kYnlzX3BlbmRpbmctLTsKKwkJfSBlbHNlCisJCQlxdWV1ZV9ldmVudChBUE1fVVNFUl9TVEFOREJZLCBhcyk7CisJCWlmIChzdGFuZGJ5c19wZW5kaW5nIDw9IDApCisJCQlzdGFuZGJ5KCk7CisJCWJyZWFrOworCWNhc2UgQVBNX0lPQ19TVVNQRU5EOgorCQlpZiAoYXMtPnN1c3BlbmRzX3JlYWQgPiAwKSB7CisJCQlhcy0+c3VzcGVuZHNfcmVhZC0tOworCQkJYXMtPnN1c3BlbmRzX3BlbmRpbmctLTsKKwkJCXN1c3BlbmRzX3BlbmRpbmctLTsKKwkJfSBlbHNlCisJCQlxdWV1ZV9ldmVudChBUE1fVVNFUl9TVVNQRU5ELCBhcyk7CisJCWlmIChzdXNwZW5kc19wZW5kaW5nIDw9IDApIHsKKwkJCXJldHVybiBzdXNwZW5kKDEpOworCQl9IGVsc2UgeworCQkJYXMtPnN1c3BlbmRfd2FpdCA9IDE7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXBtX3N1c3BlbmRfd2FpdHF1ZXVlLAorCQkJCQlhcy0+c3VzcGVuZF93YWl0ID09IDApOworCQkJcmV0dXJuIGFzLT5zdXNwZW5kX3Jlc3VsdDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBhcG1fdXNlciAqCWFzOworCisJYXMgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaWYgKGNoZWNrX2FwbV91c2VyKGFzLCAicmVsZWFzZSIpKQorCQlyZXR1cm4gMDsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWlmIChhcy0+c3RhbmRieXNfcGVuZGluZyA+IDApIHsKKwkJc3RhbmRieXNfcGVuZGluZyAtPSBhcy0+c3RhbmRieXNfcGVuZGluZzsKKwkJaWYgKHN0YW5kYnlzX3BlbmRpbmcgPD0gMCkKKwkJCXN0YW5kYnkoKTsKKwl9CisJaWYgKGFzLT5zdXNwZW5kc19wZW5kaW5nID4gMCkgeworCQlzdXNwZW5kc19wZW5kaW5nIC09IGFzLT5zdXNwZW5kc19wZW5kaW5nOworCQlpZiAoc3VzcGVuZHNfcGVuZGluZyA8PSAwKQorCQkJKHZvaWQpIHN1c3BlbmQoMSk7CisJfQorICAJc3Bpbl9sb2NrKCZ1c2VyX2xpc3RfbG9jayk7CisJaWYgKHVzZXJfbGlzdCA9PSBhcykKKwkJdXNlcl9saXN0ID0gYXMtPm5leHQ7CisJZWxzZSB7CisJCXN0cnVjdCBhcG1fdXNlciAqCWFzMTsKKworCQlmb3IgKGFzMSA9IHVzZXJfbGlzdDsKKwkJICAgICAoYXMxICE9IE5VTEwpICYmIChhczEtPm5leHQgIT0gYXMpOworCQkgICAgIGFzMSA9IGFzMS0+bmV4dCkKKwkJCTsKKwkJaWYgKGFzMSA9PSBOVUxMKQorCQkJcHJpbnRrKEtFUk5fRVJSICJhcG06IGZpbHAgbm90IGluIHVzZXIgbGlzdFxuIik7CisJCWVsc2UKKwkJCWFzMS0+bmV4dCA9IGFzLT5uZXh0OworCX0KKwlzcGluX3VubG9jaygmdXNlcl9saXN0X2xvY2spOworCWtmcmVlKGFzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGFwbV91c2VyICoJYXM7CisKKwlhcyA9IChzdHJ1Y3QgYXBtX3VzZXIgKilrbWFsbG9jKHNpemVvZigqYXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYXMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImFwbTogY2Fubm90IGFsbG9jYXRlIHN0cnVjdCBvZiBzaXplICVkIGJ5dGVzXG4iLAorCQkgICAgICAgc2l6ZW9mKCphcykpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJYXMtPm1hZ2ljID0gQVBNX0JJT1NfTUFHSUM7CisJYXMtPmV2ZW50X3RhaWwgPSBhcy0+ZXZlbnRfaGVhZCA9IDA7CisJYXMtPnN1c3BlbmRzX3BlbmRpbmcgPSBhcy0+c3RhbmRieXNfcGVuZGluZyA9IDA7CisJYXMtPnN1c3BlbmRzX3JlYWQgPSBhcy0+c3RhbmRieXNfcmVhZCA9IDA7CisJLyoKKwkgKiBYWFggLSB0aGlzIGlzIGEgdGlueSBiaXQgYnJva2VuLCB3aGVuIHdlIGNvbnNpZGVyIEJTRAorICAgICAgICAgKiBwcm9jZXNzIGFjY291bnRpbmcuIElmIHRoZSBkZXZpY2UgaXMgb3BlbmVkIGJ5IHJvb3QsIHdlCisJICogaW5zdGFudGx5IGZsYWcgdGhhdCB3ZSB1c2VkIHN1cGVydXNlciBwcml2cy4gV2hvIGtub3dzLAorCSAqIHdlIG1pZ2h0IGNsb3NlIHRoZSBkZXZpY2UgaW1tZWRpYXRlbHkgd2l0aG91dCBkb2luZyBhCisJICogcHJpdmlsZWdlZCBvcGVyYXRpb24gLS0gY2V2YW5zCisJICovCisJYXMtPnN1c2VyID0gY2FwYWJsZShDQVBfU1lTX0FETUlOKTsKKwlhcy0+d3JpdGVyID0gKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSA9PSBGTU9ERV9XUklURTsKKwlhcy0+cmVhZGVyID0gKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID09IEZNT0RFX1JFQUQ7CisJc3Bpbl9sb2NrKCZ1c2VyX2xpc3RfbG9jayk7CisJYXMtPm5leHQgPSB1c2VyX2xpc3Q7CisJdXNlcl9saXN0ID0gYXM7CisJc3Bpbl91bmxvY2soJnVzZXJfbGlzdF9sb2NrKTsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBhczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcG1fZ2V0X2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IGZwb3MsIGludCBsZW5ndGgpCit7CisJY2hhciAqCQlwOworCXVuc2lnbmVkIHNob3J0CWJ4OworCXVuc2lnbmVkIHNob3J0CWN4OworCXVuc2lnbmVkIHNob3J0CWR4OworCWludAkJZXJyb3I7CisJdW5zaWduZWQgc2hvcnQgIGFjX2xpbmVfc3RhdHVzID0gMHhmZjsKKwl1bnNpZ25lZCBzaG9ydCAgYmF0dGVyeV9zdGF0dXMgPSAweGZmOworCXVuc2lnbmVkIHNob3J0ICBiYXR0ZXJ5X2ZsYWcgICA9IDB4ZmY7CisJaW50CQlwZXJjZW50YWdlICAgICA9IC0xOworCWludCAgICAgICAgICAgICB0aW1lX3VuaXRzICAgICA9IC0xOworCWNoYXIgICAgICAgICAgICAqdW5pdHMgICAgICAgICA9ICI/IjsKKworCXAgPSBidWY7CisKKwlpZiAoKG51bV9vbmxpbmVfY3B1cygpID09IDEpICYmCisJICAgICEoZXJyb3IgPSBhcG1fZ2V0X3Bvd2VyX3N0YXR1cygmYngsICZjeCwgJmR4KSkpIHsKKwkJYWNfbGluZV9zdGF0dXMgPSAoYnggPj4gOCkgJiAweGZmOworCQliYXR0ZXJ5X3N0YXR1cyA9IGJ4ICYgMHhmZjsKKwkJaWYgKChjeCAmIDB4ZmYpICE9IDB4ZmYpCisJCQlwZXJjZW50YWdlID0gY3ggJiAweGZmOworCisJCWlmIChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPiAweDEwMCkgeworCQkJYmF0dGVyeV9mbGFnID0gKGN4ID4+IDgpICYgMHhmZjsKKwkJCWlmIChkeCAhPSAweGZmZmYpIHsKKwkJCQl1bml0cyA9IChkeCAmIDB4ODAwMCkgPyAibWluIiA6ICJzZWMiOworCQkJCXRpbWVfdW5pdHMgPSBkeCAmIDB4N2ZmZjsKKwkJCX0KKwkJfQorCX0KKwkvKiBBcmd1bWVudHMsIHdpdGggc3ltYm9scyBmcm9tIGxpbnV4L2FwbV9iaW9zLmguICBJbmZvcm1hdGlvbiBpcworCSAgIGZyb20gdGhlIEdldCBQb3dlciBTdGF0dXMgKDB4MGEpIGNhbGwgdW5sZXNzIG90aGVyd2lzZSBub3RlZC4KKworCSAgIDApIExpbnV4IGRyaXZlciB2ZXJzaW9uICh0aGlzIHdpbGwgY2hhbmdlIGlmIGZvcm1hdCBjaGFuZ2VzKQorCSAgIDEpIEFQTSBCSU9TIFZlcnNpb24uICBVc3VhbGx5IDEuMCwgMS4xIG9yIDEuMi4KKwkgICAyKSBBUE0gZmxhZ3MgZnJvbSBBUE0gSW5zdGFsbGF0aW9uIENoZWNrICgweDAwKToKKwkgICAgICBiaXQgMDogQVBNXzE2X0JJVF9TVVBQT1JUCisJICAgICAgYml0IDE6IEFQTV8zMl9CSVRfU1VQUE9SVAorCSAgICAgIGJpdCAyOiBBUE1fSURMRV9TTE9XU19DTE9DSworCSAgICAgIGJpdCAzOiBBUE1fQklPU19ESVNBQkxFRAorCSAgICAgIGJpdCA0OiBBUE1fQklPU19ESVNFTkdBR0VECisJICAgMykgQUMgbGluZSBzdGF0dXMKKwkgICAgICAweDAwOiBPZmYtbGluZQorCSAgICAgIDB4MDE6IE9uLWxpbmUKKwkgICAgICAweDAyOiBPbiBiYWNrdXAgcG93ZXIgKEJJT1MgPj0gMS4xIG9ubHkpCisJICAgICAgMHhmZjogVW5rbm93bgorCSAgIDQpIEJhdHRlcnkgc3RhdHVzCisJICAgICAgMHgwMDogSGlnaAorCSAgICAgIDB4MDE6IExvdworCSAgICAgIDB4MDI6IENyaXRpY2FsCisJICAgICAgMHgwMzogQ2hhcmdpbmcKKwkgICAgICAweDA0OiBTZWxlY3RlZCBiYXR0ZXJ5IG5vdCBwcmVzZW50IChCSU9TID49IDEuMiBvbmx5KQorCSAgICAgIDB4ZmY6IFVua25vd24KKwkgICA1KSBCYXR0ZXJ5IGZsYWcKKwkgICAgICBiaXQgMDogSGlnaAorCSAgICAgIGJpdCAxOiBMb3cKKwkgICAgICBiaXQgMjogQ3JpdGljYWwKKwkgICAgICBiaXQgMzogQ2hhcmdpbmcKKwkgICAgICBiaXQgNzogTm8gc3lzdGVtIGJhdHRlcnkKKwkgICAgICAweGZmOiBVbmtub3duCisJICAgNikgUmVtYWluaW5nIGJhdHRlcnkgbGlmZSAocGVyY2VudGFnZSBvZiBjaGFyZ2UpOgorCSAgICAgIDAtMTAwOiB2YWxpZAorCSAgICAgIC0xOiBVbmtub3duCisJICAgNykgUmVtYWluaW5nIGJhdHRlcnkgbGlmZSAodGltZSB1bml0cyk6CisJICAgICAgTnVtYmVyIG9mIHJlbWFpbmluZyBtaW51dGVzIG9yIHNlY29uZHMKKwkgICAgICAtMTogVW5rbm93bgorCSAgIDgpIG1pbiA9IG1pbnV0ZXM7IHNlYyA9IHNlY29uZHMgKi8KKworCXAgKz0gc3ByaW50ZihwLCAiJXMgJWQuJWQgMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4ICVkJSUgJWQgJXNcbiIsCisJCSAgICAgZHJpdmVyX3ZlcnNpb24sCisJCSAgICAgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgYXBtX2luZm8uYmlvcy52ZXJzaW9uICYgMHhmZiwKKwkJICAgICBhcG1faW5mby5iaW9zLmZsYWdzLAorCQkgICAgIGFjX2xpbmVfc3RhdHVzLAorCQkgICAgIGJhdHRlcnlfc3RhdHVzLAorCQkgICAgIGJhdHRlcnlfZmxhZywKKwkJICAgICBwZXJjZW50YWdlLAorCQkgICAgIHRpbWVfdW5pdHMsCisJCSAgICAgdW5pdHMpOworCisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBpbnQgYXBtKHZvaWQgKnVudXNlZCkKK3sKKwl1bnNpZ25lZCBzaG9ydAlieDsKKwl1bnNpZ25lZCBzaG9ydAljeDsKKwl1bnNpZ25lZCBzaG9ydAlkeDsKKwlpbnQJCWVycm9yOworCWNoYXIgKgkJcG93ZXJfc3RhdDsKKwljaGFyICoJCWJhdF9zdGF0OworCisJa2FwbWRfcnVubmluZyA9IDE7CisKKwlkYWVtb25pemUoImthcG1kIik7CisKKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKKworI2lmZGVmIENPTkZJR19TTVAKKwkvKiAyMDAyLzA4LzAxIC0gV1QKKwkgKiBUaGlzIGlzIHRvIGF2b2lkIHJhbmRvbSBjcmFzaGVzIGF0IGJvb3QgdGltZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24KKwkgKiBvbiBTTVAgc3lzdGVtcyBpbiBjYXNlIG9mICJhcG09cG93ZXItb2ZmIiBtb2RlLiBTZWVuIG9uIEFTVVMgQTdNMjY2RC4KKwkgKiBTb21lIGJpb3NlcyBkb24ndCBsaWtlIGJlaW5nIGNhbGxlZCBmcm9tIENQVSAhPSAwLgorCSAqIE1ldGhvZCBzdWdnZXN0ZWQgYnkgSW5nbyBNb2xuYXIuCisJICovCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdSgwKSk7CisJQlVHX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKTsKKyNlbmRpZgorCisJaWYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA9PSAwKSB7CisJCWFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA9IGFwbV9pbmZvLmJpb3MudmVyc2lvbjsKKwkJaWYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA+IDB4MTAwKSB7CisJCQkvKgorCQkJICogV2Ugb25seSBzdXBwb3J0IEJJT1NzIHVwIHRvIHZlcnNpb24gMS4yCisJCQkgKi8KKwkJCWlmIChhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gPiAweDAxMDIpCisJCQkJYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID0gMHgwMTAyOworCQkJZXJyb3IgPSBhcG1fZHJpdmVyX3ZlcnNpb24oJmFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbik7CisJCQlpZiAoZXJyb3IgIT0gQVBNX1NVQ0NFU1MpIHsKKwkJCQlhcG1fZXJyb3IoImRyaXZlciB2ZXJzaW9uIiwgZXJyb3IpOworCQkJCS8qIEZhbGwgYmFjayB0byBhbiBBUE0gMS4wIGNvbm5lY3Rpb24uICovCisJCQkJYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID0gMHgxMDA7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZGVidWcpCisJCXByaW50ayhLRVJOX0lORk8gImFwbTogQ29ubmVjdGlvbiB2ZXJzaW9uICVkLiVkXG4iLAorCQkJKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA+PiA4KSAmIDB4ZmYsCisJCQlhcG1faW5mby5jb25uZWN0aW9uX3ZlcnNpb24gJiAweGZmKTsKKworI2lmZGVmIENPTkZJR19BUE1fRE9fRU5BQkxFCisJaWYgKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fQklPU19ESVNBQkxFRCkgeworCQkvKgorCQkgKiBUaGlzIGNhbGwgY2F1c2VzIG15IE5FQyBVbHRyYUxpdGUgVmVyc2EgMzMvQyB0byBoYW5nIGlmIGl0CisJCSAqIGlzIGJvb3RlZCB3aXRoIFBNIGRpc2FibGVkIGJ1dCBub3QgaW4gdGhlIGRvY2tpbmcgc3RhdGlvbi4KKwkJICogVW5mb3J0dW5hdGUgLi4uCisJCSAqLworCQllcnJvciA9IGFwbV9lbmFibGVfcG93ZXJfbWFuYWdlbWVudCgxKTsKKwkJaWYgKGVycm9yKSB7CisJCQlhcG1fZXJyb3IoImVuYWJsZSBwb3dlciBtYW5hZ2VtZW50IiwgZXJyb3IpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fQklPU19ESVNFTkdBR0VEKQorCSAgICAmJiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgwMTAwKSkgeworCQllcnJvciA9IGFwbV9lbmdhZ2VfcG93ZXJfbWFuYWdlbWVudChBUE1fREVWSUNFX0FMTCwgMSk7CisJCWlmIChlcnJvcikgeworCQkJYXBtX2Vycm9yKCJlbmdhZ2UgcG93ZXIgbWFuYWdlbWVudCIsIGVycm9yKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChkZWJ1ZyAmJiAobnVtX29ubGluZV9jcHVzKCkgPT0gMSB8fCBzbXAgKSkgeworCQllcnJvciA9IGFwbV9nZXRfcG93ZXJfc3RhdHVzKCZieCwgJmN4LCAmZHgpOworCQlpZiAoZXJyb3IpCisJCQlwcmludGsoS0VSTl9JTkZPICJhcG06IHBvd2VyIHN0YXR1cyBub3QgYXZhaWxhYmxlXG4iKTsKKwkJZWxzZSB7CisJCQlzd2l0Y2ggKChieCA+PiA4KSAmIDB4ZmYpIHsKKwkJCWNhc2UgMDogcG93ZXJfc3RhdCA9ICJvZmYgbGluZSI7IGJyZWFrOworCQkJY2FzZSAxOiBwb3dlcl9zdGF0ID0gIm9uIGxpbmUiOyBicmVhazsKKwkJCWNhc2UgMjogcG93ZXJfc3RhdCA9ICJvbiBiYWNrdXAgcG93ZXIiOyBicmVhazsKKwkJCWRlZmF1bHQ6IHBvd2VyX3N0YXQgPSAidW5rbm93biI7IGJyZWFrOworCQkJfQorCQkJc3dpdGNoIChieCAmIDB4ZmYpIHsKKwkJCWNhc2UgMDogYmF0X3N0YXQgPSAiaGlnaCI7IGJyZWFrOworCQkJY2FzZSAxOiBiYXRfc3RhdCA9ICJsb3ciOyBicmVhazsKKwkJCWNhc2UgMjogYmF0X3N0YXQgPSAiY3JpdGljYWwiOyBicmVhazsKKwkJCWNhc2UgMzogYmF0X3N0YXQgPSAiY2hhcmdpbmciOyBicmVhazsKKwkJCWRlZmF1bHQ6IGJhdF9zdGF0ID0gInVua25vd24iOyBicmVhazsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiYXBtOiBBQyAlcywgYmF0dGVyeSBzdGF0dXMgJXMsIGJhdHRlcnkgbGlmZSAiLAorCQkJICAgICAgIHBvd2VyX3N0YXQsIGJhdF9zdGF0KTsKKwkJCWlmICgoY3ggJiAweGZmKSA9PSAweGZmKQorCQkJCXByaW50aygidW5rbm93blxuIik7CisJCQllbHNlCisJCQkJcHJpbnRrKCIlZCUlXG4iLCBjeCAmIDB4ZmYpOworCQkJaWYgKGFwbV9pbmZvLmNvbm5lY3Rpb25fdmVyc2lvbiA+IDB4MTAwKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAiYXBtOiBiYXR0ZXJ5IGZsYWcgMHglMDJ4LCBiYXR0ZXJ5IGxpZmUgIiwKKwkJCQkgICAgICAgKGN4ID4+IDgpICYgMHhmZik7CisJCQkJaWYgKGR4ID09IDB4ZmZmZikKKwkJCQkJcHJpbnRrKCJ1bmtub3duXG4iKTsKKwkJCQllbHNlCisJCQkJCXByaW50aygiJWQgJXNcbiIsIGR4ICYgMHg3ZmZmLAorCQkJCQkJKGR4ICYgMHg4MDAwKSA/CisJCQkJCQkibWludXRlcyIgOiAic2Vjb25kcyIpOworCQkJfQorCQl9CisJfQorCisJLyogSW5zdGFsbCBvdXIgcG93ZXIgb2ZmIGhhbmRsZXIuLiAqLworCWlmIChwb3dlcl9vZmYpCisJCXBtX3Bvd2VyX29mZiA9IGFwbV9wb3dlcl9vZmY7CisKKwlpZiAobnVtX29ubGluZV9jcHVzKCkgPT0gMSB8fCBzbXApIHsKKyNpZiBkZWZpbmVkKENPTkZJR19BUE1fRElTUExBWV9CTEFOSykgJiYgZGVmaW5lZChDT05GSUdfVlQpCisJCWNvbnNvbGVfYmxhbmtfaG9vayA9IGFwbV9jb25zb2xlX2JsYW5rOworI2VuZGlmCisJCWFwbV9tYWlubG9vcCgpOworI2lmIGRlZmluZWQoQ09ORklHX0FQTV9ESVNQTEFZX0JMQU5LKSAmJiBkZWZpbmVkKENPTkZJR19WVCkKKwkJY29uc29sZV9ibGFua19ob29rID0gTlVMTDsKKyNlbmRpZgorCX0KKwlrYXBtZF9ydW5uaW5nID0gMDsKKworCXJldHVybiAwOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgYXBtX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQJaW52ZXJ0OworCisJd2hpbGUgKChzdHIgIT0gTlVMTCkgJiYgKCpzdHIgIT0gJ1wwJykpIHsKKwkJaWYgKHN0cm5jbXAoc3RyLCAib2ZmIiwgMykgPT0gMCkKKwkJCWFwbV9kaXNhYmxlZCA9IDE7CisJCWlmIChzdHJuY21wKHN0ciwgIm9uIiwgMikgPT0gMCkKKwkJCWFwbV9kaXNhYmxlZCA9IDA7CisJCWlmICgoc3RybmNtcChzdHIsICJib3VuY2UtaW50ZXJ2YWw9IiwgMTYpID09IDApIHx8CisJCSAgICAoc3RybmNtcChzdHIsICJib3VuY2VfaW50ZXJ2YWw9IiwgMTYpID09IDApKQorCQkJYm91bmNlX2ludGVydmFsID0gc2ltcGxlX3N0cnRvbChzdHIgKyAxNiwgTlVMTCwgMCk7CisJCWlmICgoc3RybmNtcChzdHIsICJpZGxlLXRocmVzaG9sZD0iLCAxNSkgPT0gMCkgfHwKKwkJICAgIChzdHJuY21wKHN0ciwgImlkbGVfdGhyZXNob2xkPSIsIDE1KSA9PSAwKSkKKwkJCWlkbGVfdGhyZXNob2xkID0gc2ltcGxlX3N0cnRvbChzdHIgKyAxNSwgTlVMTCwgMCk7CisJCWlmICgoc3RybmNtcChzdHIsICJpZGxlLXBlcmlvZD0iLCAxMikgPT0gMCkgfHwKKwkJICAgIChzdHJuY21wKHN0ciwgImlkbGVfcGVyaW9kPSIsIDEyKSA9PSAwKSkKKwkJCWlkbGVfcGVyaW9kID0gc2ltcGxlX3N0cnRvbChzdHIgKyAxMiwgTlVMTCwgMCk7CisJCWludmVydCA9IChzdHJuY21wKHN0ciwgIm5vLSIsIDMpID09IDApIHx8CisJCQkoc3RybmNtcChzdHIsICJub18iLCAzKSA9PSAwKTsKKwkJaWYgKGludmVydCkKKwkJCXN0ciArPSAzOworCQlpZiAoc3RybmNtcChzdHIsICJkZWJ1ZyIsIDUpID09IDApCisJCQlkZWJ1ZyA9ICFpbnZlcnQ7CisJCWlmICgoc3RybmNtcChzdHIsICJwb3dlci1vZmYiLCA5KSA9PSAwKSB8fAorCQkgICAgKHN0cm5jbXAoc3RyLCAicG93ZXJfb2ZmIiwgOSkgPT0gMCkpCisJCQlwb3dlcl9vZmYgPSAhaW52ZXJ0OworCQlpZiAoc3RybmNtcChzdHIsICJzbXAiLCAzKSA9PSAwKQorCQl7CisJCQlzbXAgPSAhaW52ZXJ0OworCQkJaWRsZV90aHJlc2hvbGQgPSAxMDA7CisJCX0KKwkJaWYgKChzdHJuY21wKHN0ciwgImFsbG93LWludHMiLCAxMCkgPT0gMCkgfHwKKwkJICAgIChzdHJuY21wKHN0ciwgImFsbG93X2ludHMiLCAxMCkgPT0gMCkpCisgCQkJYXBtX2luZm8uYWxsb3dfaW50cyA9ICFpbnZlcnQ7CisJCWlmICgoc3RybmNtcChzdHIsICJicm9rZW4tcHNyIiwgMTApID09IDApIHx8CisJCSAgICAoc3RybmNtcChzdHIsICJicm9rZW5fcHNyIiwgMTApID09IDApKQorCQkJYXBtX2luZm8uZ2V0X3Bvd2VyX3N0YXR1c19icm9rZW4gPSAhaW52ZXJ0OworCQlpZiAoKHN0cm5jbXAoc3RyLCAicmVhbG1vZGUtcG93ZXItb2ZmIiwgMTgpID09IDApIHx8CisJCSAgICAoc3RybmNtcChzdHIsICJyZWFsbW9kZV9wb3dlcl9vZmYiLCAxOCkgPT0gMCkpCisJCQlhcG1faW5mby5yZWFsbW9kZV9wb3dlcl9vZmYgPSAhaW52ZXJ0OworCQlzdHIgPSBzdHJjaHIoc3RyLCAnLCcpOworCQlpZiAoc3RyICE9IE5VTEwpCisJCQlzdHIgKz0gc3Ryc3BuKHN0ciwgIiwgXHQiKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFwbT0iLCBhcG1fc2V0dXApOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFwbV9iaW9zX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGRvX3JlYWQsCisJLnBvbGwJCT0gZG9fcG9sbCwKKwkuaW9jdGwJCT0gZG9faW9jdGwsCisJLm9wZW4JCT0gZG9fb3BlbiwKKwkucmVsZWFzZQk9IGRvX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXBtX2RldmljZSA9IHsKKwlBUE1fTUlOT1JfREVWLAorCSJhcG1fYmlvcyIsCisJJmFwbV9iaW9zX2ZvcHMKK307CisKKworLyogU2ltcGxlICJwcmludCBpZiB0cnVlIiBjYWxsYmFjayAqLworc3RhdGljIGludCBfX2luaXQgcHJpbnRfaWZfdHJ1ZShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlwcmludGsoIiVzXG4iLCBkLT5pZGVudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTb21lIEJpb3NlcyBlbmFibGUgdGhlIFBTLzIgbW91c2UgKHRvdWNocGFkKSBhdCByZXN1bWUsIGV2ZW4gaWYgaXQgd2FzCisgKiBkaXNhYmxlZCBiZWZvcmUgdGhlIHN1c3BlbmQuIExpbnV4IHVzZWQgdG8gZ2V0IHRlcnJpYmx5IGNvbmZ1c2VkIGJ5IHRoYXQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJyb2tlbl9wczJfcmVzdW1lKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzIG1hY2hpbmUgZGV0ZWN0ZWQuIE1vdXNlcGFkIFJlc3VtZSBCdWcgd29ya2Fyb3VuZCBob3BlZnVsbHkgbm90IG5lZWRlZC5cbiIsIGQtPmlkZW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogU29tZSBiaW9zZXMgaGF2ZSBhIGJyb2tlbiBwcm90ZWN0ZWQgbW9kZSBwb3dlcm9mZiBhbmQgbmVlZCB0byB1c2UgcmVhbG1vZGUgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldF9yZWFsbW9kZV9wb3dlcl9vZmYoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJaWYgKGFwbV9pbmZvLnJlYWxtb2RlX3Bvd2VyX29mZiA9PSAwKSB7CisJCWFwbV9pbmZvLnJlYWxtb2RlX3Bvd2VyX29mZiA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIGJpb3MgZGV0ZWN0ZWQuIFVzaW5nIHJlYWxtb2RlIHBvd2Vyb2ZmIG9ubHkuXG4iLCBkLT5pZGVudCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBTb21lIGxhcHRvcHMgcmVxdWlyZSBpbnRlcnJ1cHRzIHRvIGJlIGVuYWJsZWQgZHVyaW5nIEFQTSBjYWxscyAqLworc3RhdGljIGludCBfX2luaXQgc2V0X2FwbV9pbnRzKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmIChhcG1faW5mby5hbGxvd19pbnRzID09IDApIHsKKwkJYXBtX2luZm8uYWxsb3dfaW50cyA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIG1hY2hpbmUgZGV0ZWN0ZWQuIEVuYWJsaW5nIGludGVycnVwdHMgZHVyaW5nIEFQTSBjYWxscy5cbiIsIGQtPmlkZW50KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNvbWUgQVBNIGJpb3NlcyBjb3JydXB0IG1lbW9yeSBvciBqdXN0IHBsYWluIGRvIG5vdCB3b3JrICovCitzdGF0aWMgaW50IF9faW5pdCBhcG1faXNfaG9ya2VkKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmIChhcG1faW5mby5kaXNhYmxlZCA9PSAwKSB7CisJCWFwbV9pbmZvLmRpc2FibGVkID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgbWFjaGluZSBkZXRlY3RlZC4gRGlzYWJsaW5nIEFQTS5cbiIsIGQtPmlkZW50KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFwbV9pc19ob3JrZWRfZDg1MG1kKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmIChhcG1faW5mby5kaXNhYmxlZCA9PSAwKSB7CisJCWFwbV9pbmZvLmRpc2FibGVkID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgbWFjaGluZSBkZXRlY3RlZC4gRGlzYWJsaW5nIEFQTS5cbiIsIGQtPmlkZW50KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVGhpcyBidWcgaXMgZml4ZWQgaW4gYmlvcyBQMTUgd2hpY2ggaXMgYXZhaWxhYmxlIGZvciBcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJkb3dubG9hZCBmcm9tIHN1cHBvcnQuaW50ZWwuY29tIFxuIik7CisJfQorCXJldHVybiAwOworfQorCisvKiBTb21lIEFQTSBiaW9zZXMgaGFuZyBvbiBBUE0gaWRsZSBjYWxscyAqLworc3RhdGljIGludCBfX2luaXQgYXBtX2xpa2VzX3RvX21lbHQoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJaWYgKGFwbV9pbmZvLmZvcmJpZF9pZGxlID09IDApIHsKKwkJYXBtX2luZm8uZm9yYmlkX2lkbGUgPSAxOworCQlwcmludGsoS0VSTl9JTkZPICIlcyBtYWNoaW5lIGRldGVjdGVkLiBEaXNhYmxpbmcgQVBNIGlkbGUgY2FsbHMuXG4iLCBkLT5pZGVudCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogIENoZWNrIGZvciBjbHVlIGZyZWUgQklPUyBpbXBsZW1lbnRhdGlvbnMgd2hvIHVzZQorICogIHRoZSBmb2xsb3dpbmcgUUEgdGVjaG5pcXVlCisgKgorICogICAgICBbIFdyaXRlIEJJT1MgQ29kZSBdPC0tLS0tLQorICogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIF4KKyAqICAgICAgPCBEb2VzIGl0IENvbXBpbGUgPi0tLS1OLS0KKyAqICAgICAgICAgICAgICAgfFkgICAgICAgICAgICAgICBeCisgKgk8IERvZXMgaXQgQm9vdCBXaW45OCA+LU4tLQorICogICAgICAgICAgICAgICB8WQorICogICAgICAgICAgIFtTaGlwIEl0XQorICoKKyAqCVBob2VuaXggQTA0ICAwOC8yNC8yMDAwIGlzIGtub3duIGJhZCAoRGVsbCBJbnNwaXJvbiA1MDAwZSkKKyAqCVBob2VuaXggQTA3ICAwOS8yOS8yMDAwIGlzIGtub3duIGdvb2QgKERlbGwgSW5zcGlyb24gNTAwMCkKKyAqLworc3RhdGljIGludCBfX2luaXQgYnJva2VuX2FwbV9wb3dlcihzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlhcG1faW5mby5nZXRfcG93ZXJfc3RhdHVzX2Jyb2tlbiA9IDE7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQklPUyBzdHJpbmdzIHN1Z2dlc3QgQVBNIGJ1Z3MsIGRpc2FibGluZyBwb3dlciBzdGF0dXMgcmVwb3J0aW5nLlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGJpb3Mgc3dhcHMgdGhlIEFQTSBtaW51dGUgcmVwb3J0aW5nIGJ5dGVzIG92ZXIgKE1hbnkgc29ueSBsYXB0b3BzCisgKiBoYXZlIHRoaXMgcHJvYmxlbSkuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJYXBtX2luZm8uZ2V0X3Bvd2VyX3N0YXR1c19zd2FiaW5taW51dGVzID0gMTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJCSU9TIHN0cmluZ3Mgc3VnZ2VzdCBBUE0gcmVwb3J0cyBiYXR0ZXJ5IGxpZmUgaW4gbWludXRlcyBhbmQgd3JvbmcgYnl0ZSBvcmRlci5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBhcG1fZG1pX3RhYmxlW10gPSB7CisJeworCQlwcmludF9pZl90cnVlLAorCQlLRVJOX1dBUk5JTkcgIklCTSBUMjMgLSBCSU9TIDEuMDNiKyBhbmQgY29udHJvbGxlciBmaXJtd2FyZSAxLjAyKyBtYXkgYmUgbmVlZGVkIGZvciBMaW51eCBBUE0uIiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJJQk0iKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiMUFFVDM4V1cgKDEuMDFiKSIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gdGhlIEM2MDAgKi8KKwkJYnJva2VuX3BzMl9yZXN1bWUsICJEZWxsIExhdGl0dWRlIEM2MDAiLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUgQzYwMCIpLCB9LAorCX0sCisJewkvKiBBbGxvdyBpbnRlcnJ1cHRzIGR1cmluZyBzdXNwZW5kIG9uIERlbGwgTGF0aXR1ZGUgbGFwdG9wcyovCisJCXNldF9hcG1faW50cywgIkRlbGwgTGF0aXR1ZGUiLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUgQzUxMCIpLCB9CisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWQsICJEZWxsIEluc3Bpcm9uIDI1MDAiLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSW5zcGlyb24gMjUwMCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwiQTExIiksIH0sCisJfSwKKwl7CS8qIEFsbG93IGludGVycnVwdHMgZHVyaW5nIHN1c3BlbmQgb24gRGVsbCBJbnNwaXJvbiBsYXB0b3BzKi8KKwkJc2V0X2FwbV9pbnRzLCAiRGVsbCBJbnNwaXJvbiIsIHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSW5zcGlyb24gNDAwMCIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gSW5zcGlyb24gNTAwMGUgKi8KKwkJYnJva2VuX2FwbV9wb3dlciwgIkRlbGwgSW5zcGlyb24gNTAwMGUiLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiQTA0IiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA4LzI0LzIwMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIEluc3Bpcm9uIDI1MDAgKi8KKwkJYnJva2VuX2FwbV9wb3dlciwgIkRlbGwgSW5zcGlyb24gMjUwMCIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJBMTIiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDIvMDQvMjAwMiIpLCB9LAorCX0sCisJewkvKiBBUE0gY3Jhc2hlcyAqLworCQlhcG1faXNfaG9ya2VkLCAiRGVsbCBEaW1lbnNpb24gNDEwMCIsCisJCXsJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBDb21wdXRlciBDb3Jwb3JhdGlvbiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJYUFMtWiIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwiSW50ZWwgQ29ycC4iKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCJBMTEiKSwgfSwKKwl9LAorCXsJLyogQWxsb3cgaW50ZXJydXB0cyBkdXJpbmcgc3VzcGVuZCBvbiBDb21wYXEgTGFwdG9wcyovCisJCXNldF9hcG1faW50cywgIkNvbXBhcSAxMlhMMTI1IiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJDb21wYXEiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQ29tcGFxIFBDIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwiNC4wNiIpLCB9LAorCX0sCisJewkvKiBBbGxvdyBpbnRlcnJ1cHRzIGR1cmluZyBBUE0gb3IgdGhlIGNsb2NrIGdvZXMgc2xvdyAqLworCQlzZXRfYXBtX2ludHMsICJBU1VTVGVLIiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTDg0MDBLIHNlcmllcyBOb3RlYm9vayBQQyIpLCB9LAorCX0sCisJewkvKiBBUE0gYmxvd3Mgb24gc2h1dGRvd24gKi8KKwkJYXBtX2lzX2hvcmtlZCwgIkFCSVQgS1g3LTMzM1tSXSIsCisJCXsJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBQklUIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJWVDgzNjctODIzM0EgKEtYNy0zMzNbUl0pIiksIH0sCisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWQsICJUcmlnZW0gRGVsaGkzIiwKKwkJewlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJUcmlHZW0gQ29tcHV0ZXIsIEluYyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJEZWxoaTMiKSwgfSwKKwl9LAorCXsJLyogQVBNIGNyYXNoZXMgKi8KKwkJYXBtX2lzX2hvcmtlZCwgIkZ1aml0c3UtU2llbWVucyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgImhvZW5peC9GVUpJVFNVIFNJRU1FTlMiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiVmVyc2lvbjEuMDEiKSwgfSwKKwl9LAorCXsJLyogQVBNIGNyYXNoZXMgKi8KKwkJYXBtX2lzX2hvcmtlZF9kODUwbWQsICJJbnRlbCBEODUwTUQiLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJJbnRlbCBDb3JwLiIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJNVjg1MDEwQS44NkEuMDAxNi5QMDcuMDIwMTI1MTUzNiIpLCB9LAorCX0sCisJewkvKiBBUE0gY3Jhc2hlcyAqLworCQlhcG1faXNfaG9ya2VkLCAiSW50ZWwgRDgxMEVNTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIkludGVsIENvcnAuIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIk1PODEwMTBBLjg2QS4wMDA4LlAwNC4wMDA0MTcwODAwIiksIH0sCisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWQsICJEZWxsIFhQUy1aIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiSW50ZWwgQ29ycC4iKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiQTExIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlhQUy1aIiksIH0sCisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWQsICJTaGFycCBQQy1QSi9BWCIsCisJCXsJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0hBUlAiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUEMtUEovQVgiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsIlN5c3RlbVNvZnQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCJWZXJzaW9uIFIyLjA4IiksIH0sCisJfSwKKwl7CS8qIEFQTSBjcmFzaGVzICovCisJCWFwbV9pc19ob3JrZWQsICJEZWxsIEluc3Bpcm9uIDI1MDAiLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSW5zcGlyb24gMjUwMCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwiQTExIiksIH0sCisJfSwKKwl7CS8qIEFQTSBpZGxlIGhhbmdzICovCisJCWFwbV9saWtlc190b19tZWx0LCAiSmFiaWwgQU1EIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiQW1lcmljYW4gTWVnYXRyZW5kcyBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIjBBQVNOUDA2IiksIH0sCisJfSwKKwl7CS8qIEFQTSBpZGxlIGhhbmdzICovCisJCWFwbV9saWtlc190b19tZWx0LCAiQU1JIEJpb3MiLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJBbWVyaWNhbiBNZWdhdHJlbmRzIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiMEFBU05QMDUiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctTjUwNVgoREUpICovCisJCXN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMsICJTb255IFZBSU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUjAyMDZIIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA4LzIzLzk5IiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLU41MDVWWCAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlcySzA2SDAiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDIvMDMvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctWEcyOSAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMTE3QTAiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDQvMjUvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctWjYwME5FICovCisJCXN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMsICJTb255IFZBSU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUjAxMjFaMSIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIwNS8xMS8wMCIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gU29ueSBWYWlvIFBDRy1aNjAwTkUgKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJXTUUwMVoxIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA4LzExLzAwIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLVo2MDBMRUsoREUpICovCisJCXN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMsICJTb255IFZBSU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUjAyMDZaMyIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIxMi8yNS8wMCIpLCB9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCBBUE0gb24gU29ueSBWYWlvIFBDRy1aNTA1TFMgKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJSMDIwM0QwIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA1LzEyLzAwIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLVo1MDVMUyAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMjAzWjMiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDgvMjUvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctWjUwNUxTICh3aXRoIHVwZGF0ZWQgQklPUykgKi8KKwkJc3dhYl9hcG1fcG93ZXJfaW5fbWludXRlcywgIlNvbnkgVkFJTyIsCisJCXsJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJSMDIwOVozIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjA1LzEyLzAxIiksIH0sCisJfSwKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLUYxMDRLICovCisJCXN3YWJfYXBtX3Bvd2VyX2luX21pbnV0ZXMsICJTb255IFZBSU8iLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJQaG9lbml4IFRlY2hub2xvZ2llcyBMVEQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUjAyMDRLMiIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIwOC8yOC8wMCIpLCB9LAorCX0sCisKKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIEFQTSBvbiBTb255IFZhaW8gUENHLUMxVk4vQzFWRSAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMjA4UDEiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMTEvMDkvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctQzFWRSAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIlIwMjA0UDEiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMDkvMTIvMDAiKSwgfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggQVBNIG9uIFNvbnkgVmFpbyBQQ0ctQzFWRSAqLworCQlzd2FiX2FwbV9wb3dlcl9pbl9taW51dGVzLCAiU29ueSBWQUlPIiwKKwkJewlETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiUGhvZW5peCBUZWNobm9sb2dpZXMgTFREIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIldYUE8xWjMiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19EQVRFLCAiMTAvMjYvMDEiKSwgfSwKKwl9LAorCXsJLyogYnJva2VuIFBNIHBvd2Vyb2ZmIGJpb3MgKi8KKwkJc2V0X3JlYWxtb2RlX3Bvd2VyX29mZiwgIkF3YXJkIFNvZnR3YXJlIHY0LjYwIFBHTUEiLAorCQl7CURNSV9NQVRDSChETUlfQklPU19WRU5ET1IsICJBd2FyZCBTb2Z0d2FyZSBJbnRlcm5hdGlvbmFsLCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIjQuNjAgUEdNQSIpLAorCQkJRE1JX01BVENIKERNSV9CSU9TX0RBVEUsICIxMzQ1MjYxODQiKSwgfSwKKwl9LAorCisJLyogR2VuZXJpYyBwZXIgdmVuZG9yIEFQTSBzZXR0aW5ncyAgKi8KKworCXsJLyogQWxsb3cgaW50ZXJydXB0cyBkdXJpbmcgc3VzcGVuZCBvbiBJQk0gbGFwdG9wcyAqLworCQlzZXRfYXBtX2ludHMsICJJQk0iLAorCQl7CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIklCTSIpLCB9LAorCX0sCisKKwl7IH0KK307CisKKy8qCisgKiBKdXN0IHN0YXJ0IHRoZSBBUE0gdGhyZWFkLiBXZSBkbyBOT1Qgd2FudCB0byBkbyBBUE0gQklPUworICogY2FsbHMgZnJvbSBhbnl0aGluZyBidXQgdGhlIEFQTSB0aHJlYWQsIGlmIGZvciBubyBvdGhlciByZWFzb24KKyAqIHRoYW4gdGhlIGZhY3QgdGhhdCB3ZSBkb24ndCB0cnVzdCB0aGUgQVBNIEJJT1MuIFRoaXMgd2F5LAorICogbW9zdCBjb21tb24gQVBNIEJJT1MgcHJvYmxlbXMgdGhhdCBsZWFkIHRvIHByb3RlY3Rpb24gZXJyb3JzCisgKiBldGMgd2lsbCBoYXZlIGF0IGxlYXN0IHNvbWUgbGV2ZWwgb2YgYmVpbmcgY29udGFpbmVkLi4uCisgKgorICogSW4gc2hvcnQsIGlmIHNvbWV0aGluZyBiYWQgaGFwcGVucywgYXQgbGVhc3Qgd2UgaGF2ZSBhIGNob2ljZQorICogb2YganVzdCBraWxsaW5nIHRoZSBhcG0gdGhyZWFkLi4KKyAqLworc3RhdGljIGludCBfX2luaXQgYXBtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFwbV9wcm9jOworCWludCByZXQ7CisJaW50IGk7CisKKwlkbWlfY2hlY2tfc3lzdGVtKGFwbV9kbWlfdGFibGUpOworCisJaWYgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImFwbTogQklPUyBub3QgZm91bmQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByaW50ayhLRVJOX0lORk8KKwkJImFwbTogQklPUyB2ZXJzaW9uICVkLiVkIEZsYWdzIDB4JTAyeCAoRHJpdmVyIHZlcnNpb24gJXMpXG4iLAorCQkoKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA+PiA4KSAmIDB4ZmYpLAorCQkoYXBtX2luZm8uYmlvcy52ZXJzaW9uICYgMHhmZiksCisJCWFwbV9pbmZvLmJpb3MuZmxhZ3MsCisJCWRyaXZlcl92ZXJzaW9uKTsKKwlpZiAoKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fMzJfQklUX1NVUFBPUlQpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXBtOiBubyAzMiBiaXQgQklPUyBzdXBwb3J0XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGFsbG93X2ludHMpCisJCWFwbV9pbmZvLmFsbG93X2ludHMgPSAxOworCWlmIChicm9rZW5fcHNyKQorCQlhcG1faW5mby5nZXRfcG93ZXJfc3RhdHVzX2Jyb2tlbiA9IDE7CisJaWYgKHJlYWxtb2RlX3Bvd2VyX29mZikKKwkJYXBtX2luZm8ucmVhbG1vZGVfcG93ZXJfb2ZmID0gMTsKKwkvKiBVc2VyIGNhbiBvdmVycmlkZSwgYnV0IGRlZmF1bHQgaXMgdG8gdHJ1c3QgRE1JICovCisJaWYgKGFwbV9kaXNhYmxlZCAhPSAtMSkKKwkJYXBtX2luZm8uZGlzYWJsZWQgPSBhcG1fZGlzYWJsZWQ7CisKKwkvKgorCSAqIEZpeCBmb3IgdGhlIENvbXBhcSBDb250dXJhIDMvMjVjIHdoaWNoIHJlcG9ydHMgQklPUyB2ZXJzaW9uIDAuMQorCSAqIGJ1dCBpcyByZXBvcnRlZGx5IGEgMS4wIEJJT1MuCisJICovCisJaWYgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA9PSAweDAwMSkKKwkJYXBtX2luZm8uYmlvcy52ZXJzaW9uID0gMHgxMDA7CisKKwkvKiBCSU9TIDwgMS4yIGRvZXNuJ3Qgc2V0IGNzZWdfMTZfbGVuICovCisJaWYgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA8IDB4MTAyKQorCQlhcG1faW5mby5iaW9zLmNzZWdfMTZfbGVuID0gMDsgLyogNjRrICovCisKKwlpZiAoZGVidWcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXBtOiBlbnRyeSAleDolbHggY3NlZzE2ICV4IGRzZWcgJXgiLAorCQkJYXBtX2luZm8uYmlvcy5jc2VnLCBhcG1faW5mby5iaW9zLm9mZnNldCwKKwkJCWFwbV9pbmZvLmJpb3MuY3NlZ18xNiwgYXBtX2luZm8uYmlvcy5kc2VnKTsKKwkJaWYgKGFwbV9pbmZvLmJpb3MudmVyc2lvbiA+IDB4MTAwKQorCQkJcHJpbnRrKCIgY3NlZyBsZW4gJXgsIGRzZWcgbGVuICV4IiwKKwkJCQlhcG1faW5mby5iaW9zLmNzZWdfbGVuLAorCQkJCWFwbV9pbmZvLmJpb3MuZHNlZ19sZW4pOworCQlpZiAoYXBtX2luZm8uYmlvcy52ZXJzaW9uID4gMHgxMDEpCisJCQlwcmludGsoIiBjc2VnMTYgbGVuICV4IiwgYXBtX2luZm8uYmlvcy5jc2VnXzE2X2xlbik7CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlpZiAoYXBtX2luZm8uZGlzYWJsZWQpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06IGRpc2FibGVkIG9uIHVzZXIgcmVxdWVzdC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKChudW1fb25saW5lX2NwdXMoKSA+IDEpICYmICFwb3dlcl9vZmYgJiYgIXNtcCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImFwbTogZGlzYWJsZWQgLSBBUE0gaXMgbm90IFNNUCBzYWZlLlxuIik7CisJCWFwbV9pbmZvLmRpc2FibGVkID0gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChQTV9JU19BQ1RJVkUoKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImFwbTogb3ZlcnJpZGRlbiBieSBBQ1BJLlxuIik7CisJCWFwbV9pbmZvLmRpc2FibGVkID0gMTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXBtX2FjdGl2ZSA9IDE7CisKKwkvKgorCSAqIFNldCB1cCBhIHNlZ21lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSByZWFsIG1vZGUgc2VnbWVudCAweDQwCisJICogdGhhdCBleHRlbmRzIHVwIHRvIHRoZSBlbmQgb2YgcGFnZSB6ZXJvICh0aGF0IHdlIGhhdmUgcmVzZXJ2ZWQpLgorCSAqIFRoaXMgaXMgZm9yIGJ1Z2d5IEJJT1MncyB0aGF0IHJlZmVyIHRvIChyZWFsIG1vZGUpIHNlZ21lbnQgMHg0MAorCSAqIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGNhbGxlZCBpbiBwcm90ZWN0ZWQgbW9kZS4KKwkgKi8KKwlzZXRfYmFzZShiYWRfYmlvc19kZXNjLCBfX3ZhKCh1bnNpZ25lZCBsb25nKTB4NDAgPDwgNCkpOworCV9zZXRfbGltaXQoKGNoYXIgKikmYmFkX2Jpb3NfZGVzYywgNDA5NSAtICgweDQwIDw8IDQpKTsKKworCWFwbV9iaW9zX2VudHJ5Lm9mZnNldCA9IGFwbV9pbmZvLmJpb3Mub2Zmc2V0OworCWFwbV9iaW9zX2VudHJ5LnNlZ21lbnQgPSBBUE1fQ1M7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCXNldF9iYXNlKHBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0NTID4+IDNdLAorCQkJIF9fdmEoKHVuc2lnbmVkIGxvbmcpYXBtX2luZm8uYmlvcy5jc2VnIDw8IDQpKTsKKwkJc2V0X2Jhc2UocGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBpKVtBUE1fQ1NfMTYgPj4gM10sCisJCQkgX192YSgodW5zaWduZWQgbG9uZylhcG1faW5mby5iaW9zLmNzZWdfMTYgPDwgNCkpOworCQlzZXRfYmFzZShwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9EUyA+PiAzXSwKKwkJCSBfX3ZhKCh1bnNpZ25lZCBsb25nKWFwbV9pbmZvLmJpb3MuZHNlZyA8PCA0KSk7CisjaWZuZGVmIEFQTV9SRUxBWF9TRUdNRU5UUworCQlpZiAoYXBtX2luZm8uYmlvcy52ZXJzaW9uID09IDB4MTAwKSB7CisjZW5kaWYKKwkJCS8qIEZvciBBU1VTIG1vdGhlcmJvYXJkLCBBd2FyZCBCSU9TIHJldiAxMTAgKGFuZCBvdGhlcnM/KSAqLworCQkJX3NldF9saW1pdCgoY2hhciAqKSZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9DUyA+PiAzXSwgNjQgKiAxMDI0IC0gMSk7CisJCQkvKiBGb3Igc29tZSB1bmtub3duIG1hY2hpbmUuICovCisJCQlfc2V0X2xpbWl0KChjaGFyICopJnBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0NTXzE2ID4+IDNdLCA2NCAqIDEwMjQgLSAxKTsKKwkJCS8qIEZvciB0aGUgREVDIEhpbm90ZSBVbHRyYSBDVDQ3NSAoYW5kIG90aGVycz8pICovCisJCQlfc2V0X2xpbWl0KChjaGFyICopJnBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0RTID4+IDNdLCA2NCAqIDEwMjQgLSAxKTsKKyNpZm5kZWYgQVBNX1JFTEFYX1NFR01FTlRTCisJCX0gZWxzZSB7CisJCQlfc2V0X2xpbWl0KChjaGFyICopJnBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0NTID4+IDNdLAorCQkJCShhcG1faW5mby5iaW9zLmNzZWdfbGVuIC0gMSkgJiAweGZmZmYpOworCQkJX3NldF9saW1pdCgoY2hhciAqKSZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9DU18xNiA+PiAzXSwKKwkJCQkoYXBtX2luZm8uYmlvcy5jc2VnXzE2X2xlbiAtIDEpICYgMHhmZmZmKTsKKwkJCV9zZXRfbGltaXQoKGNoYXIgKikmcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBpKVtBUE1fRFMgPj4gM10sCisJCQkJKGFwbV9pbmZvLmJpb3MuZHNlZ19sZW4gLSAxKSAmIDB4ZmZmZik7CisJCSAgICAgIC8qIHdvcmthcm91bmQgZm9yIGJyb2tlbiBCSU9TZXMgKi8KKwkgICAgICAgICAgICAgICAgaWYgKGFwbV9pbmZvLmJpb3MuY3NlZ19sZW4gPD0gYXBtX2luZm8uYmlvcy5vZmZzZXQpCisgICAgICAgIAkgICAgICAgICAgICAgICAgX3NldF9saW1pdCgoY2hhciAqKSZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGkpW0FQTV9DUyA+PiAzXSwgNjQgKiAxMDI0IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFwbV9pbmZvLmJpb3MuZHNlZ19sZW4gPD0gMHg0MCkgeyAvKiAweDQwICogNGtCID09IDY0a0IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIAkvKiBmb3IgdGhlIEJJT1MgdGhhdCBhc3N1bWVzIGdyYW51bGFyaXR5ID0gMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgCXBlcl9jcHUoY3B1X2dkdF90YWJsZSwgaSlbQVBNX0RTID4+IDNdLmIgfD0gMHg4MDAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAJcHJpbnRrKEtFUk5fTk9USUNFICJhcG06IHdlIHNldCB0aGUgZ3JhbnVsYXJpdHkgb2YgZHNlZy5cbiIpOworICAgICAgICAJICAgICAgICB9CisJCX0KKyNlbmRpZgorCX0KKworCWFwbV9wcm9jID0gY3JlYXRlX3Byb2NfaW5mb19lbnRyeSgiYXBtIiwgMCwgTlVMTCwgYXBtX2dldF9pbmZvKTsKKwlpZiAoYXBtX3Byb2MpCisJCWFwbV9wcm9jLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmV0ID0ga2VybmVsX3RocmVhZChhcG0sIE5VTEwsIENMT05FX0tFUk5FTCB8IFNJR0NITEQpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXBtOiBkaXNhYmxlZCAtIFVuYWJsZSB0byBzdGFydCBrZXJuZWwgdGhyZWFkLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChudW1fb25saW5lX2NwdXMoKSA+IDEgJiYgIXNtcCApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCSAgICJhcG06IGRpc2FibGVkIC0gQVBNIGlzIG5vdCBTTVAgc2FmZSAocG93ZXIgb2ZmIGFjdGl2ZSkuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWlzY19yZWdpc3RlcigmYXBtX2RldmljZSk7CisKKwlpZiAoSFogIT0gMTAwKQorCQlpZGxlX3BlcmlvZCA9IChpZGxlX3BlcmlvZCAqIEhaKSAvIDEwMDsKKwlpZiAoaWRsZV90aHJlc2hvbGQgPCAxMDApIHsKKwkJb3JpZ2luYWxfcG1faWRsZSA9IHBtX2lkbGU7CisJCXBtX2lkbGUgID0gYXBtX2NwdV9pZGxlOworCQlzZXRfcG1faWRsZSA9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhcG1fZXhpdCh2b2lkKQoreworCWludAllcnJvcjsKKworCWlmIChzZXRfcG1faWRsZSkgeworCQlwbV9pZGxlID0gb3JpZ2luYWxfcG1faWRsZTsKKwkJLyoKKwkJICogV2UgYXJlIGFib3V0IHRvIHVubG9hZCB0aGUgY3VycmVudCBpZGxlIHRocmVhZCBwbSBjYWxsYmFjaworCQkgKiAocG1faWRsZSksIFdhaXQgZm9yIGFsbCBwcm9jZXNzb3JzIHRvIHVwZGF0ZSBjYWNoZWQvbG9jYWwKKwkJICogY29waWVzIG9mIHBtX2lkbGUgYmVmb3JlIHByb2NlZWRpbmcuCisJCSAqLworCQljcHVfaWRsZV93YWl0KCk7CisJfQorCWlmICgoKGFwbV9pbmZvLmJpb3MuZmxhZ3MgJiBBUE1fQklPU19ESVNFTkdBR0VEKSA9PSAwKQorCSAgICAmJiAoYXBtX2luZm8uY29ubmVjdGlvbl92ZXJzaW9uID4gMHgwMTAwKSkgeworCQllcnJvciA9IGFwbV9lbmdhZ2VfcG93ZXJfbWFuYWdlbWVudChBUE1fREVWSUNFX0FMTCwgMCk7CisJCWlmIChlcnJvcikKKwkJCWFwbV9lcnJvcigiZGlzZW5nYWdlIHBvd2VyIG1hbmFnZW1lbnQiLCBlcnJvcik7CisJfQorCW1pc2NfZGVyZWdpc3RlcigmYXBtX2RldmljZSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoImFwbSIsIE5VTEwpOworCWlmIChwb3dlcl9vZmYpCisJCXBtX3Bvd2VyX29mZiA9IE5VTEw7CisJZXhpdF9rYXBtZCA9IDE7CisJd2hpbGUgKGthcG1kX3J1bm5pbmcpCisJCXNjaGVkdWxlKCk7CisJcG1fYWN0aXZlID0gMDsKK30KKworbW9kdWxlX2luaXQoYXBtX2luaXQpOworbW9kdWxlX2V4aXQoYXBtX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTdGVwaGVuIFJvdGh3ZWxsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRW5hYmxlIGRlYnVnIG1vZGUiKTsKK21vZHVsZV9wYXJhbShwb3dlcl9vZmYsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9vZmYsICJFbmFibGUgcG93ZXIgb2ZmIik7Cittb2R1bGVfcGFyYW0oYm91bmNlX2ludGVydmFsLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhib3VuY2VfaW50ZXJ2YWwsCisJCSJTZXQgdGhlIG51bWJlciBvZiB0aWNrcyB0byBpZ25vcmUgc3VzcGVuZCBib3VuY2VzIik7Cittb2R1bGVfcGFyYW0oYWxsb3dfaW50cywgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFsbG93X2ludHMsICJBbGxvdyBpbnRlcnJ1cHRzIGR1cmluZyBCSU9TIGNhbGxzIik7Cittb2R1bGVfcGFyYW0oYnJva2VuX3BzciwgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJyb2tlbl9wc3IsICJCSU9TIGhhcyBhIGJyb2tlbiBHZXRQb3dlclN0YXR1cyBjYWxsIik7Cittb2R1bGVfcGFyYW0ocmVhbG1vZGVfcG93ZXJfb2ZmLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVhbG1vZGVfcG93ZXJfb2ZmLAorCQkiU3dpdGNoIHRvIHJlYWwgbW9kZSBiZWZvcmUgcG93ZXJpbmcgb2ZmIik7Cittb2R1bGVfcGFyYW0oaWRsZV90aHJlc2hvbGQsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkbGVfdGhyZXNob2xkLAorCSJTeXN0ZW0gaWRsZSBwZXJjZW50YWdlIGFib3ZlIHdoaWNoIHRvIG1ha2UgQVBNIEJJT1MgaWRsZSBjYWxscyIpOworbW9kdWxlX3BhcmFtKGlkbGVfcGVyaW9kLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZGxlX3BlcmlvZCwKKwkiUGVyaW9kIChpbiBzZWMvMTAwKSBvdmVyIHdoaWNoIHRvIGNhY3VsYXRlIHRoZSBpZGxlIHBlcmNlbnRhZ2UiKTsKK21vZHVsZV9wYXJhbShzbXAsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhzbXAsCisJIlNldCB0aGlzIHRvIGVuYWJsZSBBUE0gdXNlIG9uIGFuIFNNUCBwbGF0Zm9ybS4gVXNlIHdpdGggY2F1dGlvbiBvbiBvbGRlciBzeXN0ZW1zIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihBUE1fTUlOT1JfREVWKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQ2NmUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBHZW5lcmF0ZSBkZWZpbml0aW9ucyBuZWVkZWQgYnkgYXNzZW1ibHkgbGFuZ3VhZ2UgbW9kdWxlcy4KKyAqIFRoaXMgY29kZSBnZW5lcmF0ZXMgcmF3IGFzbSBvdXRwdXQgd2hpY2ggaXMgcG9zdC1wcm9jZXNzZWQKKyAqIHRvIGV4dHJhY3QgYW5kIGZvcm1hdCB0aGUgcmVxdWlyZWQgZGF0YS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KKyNpbmNsdWRlICJzaWdmcmFtZS5oIgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisKKyNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCisgICAgICAgIGFzbSB2b2xhdGlsZSgiXG4tPiIgI3N5bSAiICUwICIgI3ZhbCA6IDogImkiICh2YWwpKQorCisjZGVmaW5lIEJMQU5LKCkgYXNtIHZvbGF0aWxlKCJcbi0+IiA6IDogKQorCisjZGVmaW5lIE9GRlNFVChzeW0sIHN0ciwgbWVtKSBcCisJREVGSU5FKHN5bSwgb2Zmc2V0b2Yoc3RydWN0IHN0ciwgbWVtKSk7CisKK3ZvaWQgZm9vKHZvaWQpCit7CisJT0ZGU0VUKFNJR0NPTlRFWFRfZWF4LCBzaWdjb250ZXh0LCBlYXgpOworCU9GRlNFVChTSUdDT05URVhUX2VieCwgc2lnY29udGV4dCwgZWJ4KTsKKwlPRkZTRVQoU0lHQ09OVEVYVF9lY3gsIHNpZ2NvbnRleHQsIGVjeCk7CisJT0ZGU0VUKFNJR0NPTlRFWFRfZWR4LCBzaWdjb250ZXh0LCBlZHgpOworCU9GRlNFVChTSUdDT05URVhUX2VzaSwgc2lnY29udGV4dCwgZXNpKTsKKwlPRkZTRVQoU0lHQ09OVEVYVF9lZGksIHNpZ2NvbnRleHQsIGVkaSk7CisJT0ZGU0VUKFNJR0NPTlRFWFRfZWJwLCBzaWdjb250ZXh0LCBlYnApOworCU9GRlNFVChTSUdDT05URVhUX2VzcCwgc2lnY29udGV4dCwgZXNwKTsKKwlPRkZTRVQoU0lHQ09OVEVYVF9laXAsIHNpZ2NvbnRleHQsIGVpcCk7CisJQkxBTksoKTsKKworCU9GRlNFVChDUFVJTkZPX3g4NiwgY3B1aW5mb194ODYsIHg4Nik7CisJT0ZGU0VUKENQVUlORk9feDg2X3ZlbmRvciwgY3B1aW5mb194ODYsIHg4Nl92ZW5kb3IpOworCU9GRlNFVChDUFVJTkZPX3g4Nl9tb2RlbCwgY3B1aW5mb194ODYsIHg4Nl9tb2RlbCk7CisJT0ZGU0VUKENQVUlORk9feDg2X21hc2ssIGNwdWluZm9feDg2LCB4ODZfbWFzayk7CisJT0ZGU0VUKENQVUlORk9faGFyZF9tYXRoLCBjcHVpbmZvX3g4NiwgaGFyZF9tYXRoKTsKKwlPRkZTRVQoQ1BVSU5GT19jcHVpZF9sZXZlbCwgY3B1aW5mb194ODYsIGNwdWlkX2xldmVsKTsKKwlPRkZTRVQoQ1BVSU5GT194ODZfY2FwYWJpbGl0eSwgY3B1aW5mb194ODYsIHg4Nl9jYXBhYmlsaXR5KTsKKwlPRkZTRVQoQ1BVSU5GT194ODZfdmVuZG9yX2lkLCBjcHVpbmZvX3g4NiwgeDg2X3ZlbmRvcl9pZCk7CisJQkxBTksoKTsKKworCU9GRlNFVChUSV90YXNrLCB0aHJlYWRfaW5mbywgdGFzayk7CisJT0ZGU0VUKFRJX2V4ZWNfZG9tYWluLCB0aHJlYWRfaW5mbywgZXhlY19kb21haW4pOworCU9GRlNFVChUSV9mbGFncywgdGhyZWFkX2luZm8sIGZsYWdzKTsKKwlPRkZTRVQoVElfc3RhdHVzLCB0aHJlYWRfaW5mbywgc3RhdHVzKTsKKwlPRkZTRVQoVElfY3B1LCB0aHJlYWRfaW5mbywgY3B1KTsKKwlPRkZTRVQoVElfcHJlZW1wdF9jb3VudCwgdGhyZWFkX2luZm8sIHByZWVtcHRfY291bnQpOworCU9GRlNFVChUSV9hZGRyX2xpbWl0LCB0aHJlYWRfaW5mbywgYWRkcl9saW1pdCk7CisJT0ZGU0VUKFRJX3Jlc3RhcnRfYmxvY2ssIHRocmVhZF9pbmZvLCByZXN0YXJ0X2Jsb2NrKTsKKwlCTEFOSygpOworCisJT0ZGU0VUKEVYRUNfRE9NQUlOX2hhbmRsZXIsIGV4ZWNfZG9tYWluLCBoYW5kbGVyKTsKKwlPRkZTRVQoUlRfU0lHRlJBTUVfc2lnY29udGV4dCwgcnRfc2lnZnJhbWUsIHVjLnVjX21jb250ZXh0KTsKKwlCTEFOSygpOworCisJT0ZGU0VUKHBiZV9hZGRyZXNzLCBwYmUsIGFkZHJlc3MpOworCU9GRlNFVChwYmVfb3JpZ19hZGRyZXNzLCBwYmUsIG9yaWdfYWRkcmVzcyk7CisJT0ZGU0VUKHBiZV9uZXh0LCBwYmUsIG5leHQpOworCisJLyogT2Zmc2V0IGZyb20gdGhlIHN5c2VudGVyIHN0YWNrIHRvIHRzcy5lc3AwICovCisJREVGSU5FKFRTU19zeXNlbnRlcl9lc3AwLCBvZmZzZXRvZihzdHJ1Y3QgdHNzX3N0cnVjdCwgZXNwMCkgLQorCQkgc2l6ZW9mKHN0cnVjdCB0c3Nfc3RydWN0KSk7CisKKwlERUZJTkUoUEFHRV9TSVpFX2FzbSwgUEFHRV9TSVpFKTsKKwlERUZJTkUoVlNZU0NBTExfQkFTRSwgX19maXhfdG9fdmlydChGSVhfVlNZU0NBTEwpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYm9vdGZsYWcuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYm9vdGZsYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMwZWQwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9ib290ZmxhZy5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKglJbXBsZW1lbnQgJ1NpbXBsZSBCb290IEZsYWcgU3BlY2lmaWNhdGlvbiAyLjAnCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKworCisjZGVmaW5lIFNCRl9SRVNFUlZFRCAoMHg3OCkKKyNkZWZpbmUgU0JGX1BOUE9TICAgICgxPDwwKQorI2RlZmluZSBTQkZfQk9PVElORyAgKDE8PDEpCisjZGVmaW5lIFNCRl9ESUFHICAgICAoMTw8MikKKyNkZWZpbmUgU0JGX1BBUklUWSAgICgxPDw3KQorCisKK2ludCBzYmZfcG9ydCBfX2luaXRkYXRhID0gLTE7CS8qIHNldCB2aWEgYWNwaV9ib290X2luaXQoKSAqLworCisKK3N0YXRpYyBpbnQgX19pbml0IHBhcml0eSh1OCB2KQoreworCWludCB4ID0gMDsKKwlpbnQgaTsKKwkKKwlmb3IoaT0wO2k8ODtpKyspCisJeworCQl4Xj0odiYxKTsKKwkJdj4+PTE7CisJfQorCXJldHVybiB4OworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2JmX3dyaXRlKHU4IHYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZihzYmZfcG9ydCAhPSAtMSkKKwl7CisJCXYgJj0gflNCRl9QQVJJVFk7CisJCWlmKCFwYXJpdHkodikpCisJCQl2fD1TQkZfUEFSSVRZOworCisJCXByaW50ayhLRVJOX0lORk8gIlNpbXBsZSBCb290IEZsYWcgYXQgMHgleCBzZXQgdG8gMHgleFxuIiwgc2JmX3BvcnQsIHYpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCQlDTU9TX1dSSVRFKHYsIHNiZl9wb3J0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB1OCBfX2luaXQgc2JmX3JlYWQodm9pZCkKK3sKKwl1OCB2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaWYoc2JmX3BvcnQgPT0gLTEpCisJCXJldHVybiAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCXYgPSBDTU9TX1JFQUQoc2JmX3BvcnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNiZl92YWx1ZV92YWxpZCh1OCB2KQoreworCWlmKHYmU0JGX1JFU0VSVkVEKQkJLyogUmVzZXJ2ZWQgYml0cyAqLworCQlyZXR1cm4gMDsKKwlpZighcGFyaXR5KHYpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2JmX2luaXQodm9pZCkKK3sKKwl1OCB2OworCWlmKHNiZl9wb3J0ID09IC0xKQorCQlyZXR1cm4gMDsKKwl2ID0gc2JmX3JlYWQoKTsKKwlpZighc2JmX3ZhbHVlX3ZhbGlkKHYpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJTaW1wbGUgQm9vdCBGbGFnIHZhbHVlIDB4JXggcmVhZCBmcm9tIENNT1MgUkFNIHdhcyBpbnZhbGlkXG4iLHYpOworCisJdiAmPSB+U0JGX1JFU0VSVkVEOworCXYgJj0gflNCRl9CT09USU5HOworCXYgJj0gflNCRl9ESUFHOworI2lmIGRlZmluZWQoQ09ORklHX0lTQVBOUCkKKwl2IHw9IFNCRl9QTlBPUzsKKyNlbmRpZgorCXNiZl93cml0ZSh2KTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoc2JmX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL2NwdS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTBhZWNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorIworIyBNYWtlZmlsZSBmb3IgeDg2LWNvbXBhdGlibGUgQ1BVIGRldGFpbHMgYW5kIHF1aXJrcworIworCitvYmoteQk6PQljb21tb24ubyBwcm9jLm8KKworb2JqLXkJKz0JYW1kLm8KK29iai15CSs9CWN5cml4Lm8KK29iai15CSs9CWNlbnRhdXIubworb2JqLXkJKz0JdHJhbnNtZXRhLm8KK29iai15CSs9CWludGVsLm8gaW50ZWxfY2FjaGVpbmZvLm8KK29iai15CSs9CXJpc2Uubworb2JqLXkJKz0JbmV4Z2VuLm8KK29iai15CSs9CXVtYy5vCisKK29iai0kKENPTkZJR19YODZfTUNFKQkrPQltY2hlY2svCisKK29iai0kKENPTkZJR19NVFJSKQkrPSAJbXRyci8KK29iai0kKENPTkZJR19DUFVfRlJFUSkJKz0JY3B1ZnJlcS8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvYW1kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5NDU4NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jCkBAIC0wLDAgKzEsMjQ5IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSAiY3B1LmgiCisKKy8qCisgKglCIHN0ZXAgQU1EIEs2IGJlZm9yZSBCIDk3MzB4eHh4IGhhdmUgaGFyZHdhcmUgYnVncyB0aGF0IGNhbiBjYXVzZQorICoJbWlzZXhlY3V0aW9uIG9mIGNvZGUgdW5kZXIgTGludXguIE93bmVycyBvZiBzdWNoIHByb2Nlc3NvcnMgc2hvdWxkCisgKgljb250YWN0IEFNRCBmb3IgcHJlY2lzZSBkZXRhaWxzIGFuZCBhIENQVSBzd2FwLgorICoKKyAqCVNlZQlodHRwOi8vd3d3Lm11bHRpbWFuaWEuY29tL3BvdWxvdC9rNmJ1Zy5odG1sCisgKgkJaHR0cDovL3d3dy5hbWQuY29tL0s2L2s2ZG9jcy9yZXZnZC5odG1sCisgKgorICoJVGhlIGZvbGxvd2luZyB0ZXN0IGlzIGVybS4uIGludGVyZXN0aW5nLiBBTUQgbmVnbGVjdGVkIHRvIHVwCisgKgl0aGUgY2hpcCBzZXR0aW5nIHdoZW4gZml4aW5nIHRoZSBidWcgYnV0IHRoZXkgYWxzbyB0d2Vha2VkIHNvbWUKKyAqCXBlcmZvcm1hbmNlIGF0IHRoZSBzYW1lIHRpbWUuLgorICovCisgCitleHRlcm4gdm9pZCB2aWRlKHZvaWQpOworX19hc21fXygiLmFsaWduIDRcbnZpZGU6IHJldCIpOworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9hbWQoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiBsLCBoOworCWludCBtYnl0ZXMgPSBudW1fcGh5c3BhZ2VzID4+ICgyMC1QQUdFX1NISUZUKTsKKwlpbnQgcjsKKworCS8qCisJICoJRklYTUU6IFdlIHNob3VsZCBoYW5kbGUgdGhlIEs1IGhlcmUuIFNldCB1cCB0aGUgd3JpdGUKKwkgKglyYW5nZSBhbmQgYWxzbyB0dXJuIG9uIE1TUiA4MyBiaXRzIDQgYW5kIDMxICh3cml0ZSBhbGxvYywKKwkgKglubyBidXMgcGlwZWxpbmUpCisJICovCisKKwkvKiBCaXQgMzEgaW4gbm9ybWFsIENQVUlEIHVzZWQgZm9yIG5vbnN0YW5kYXJkIDNETm93IElEOworCSAgIDNETm93IGlzIElEZCBieSBiaXQgMzEgaW4gZXh0ZW5kZWQgQ1BVSUQgKDEqMzIrMzEpIGFueXdheSAqLworCWNsZWFyX2JpdCgwKjMyKzMxLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCisJciA9IGdldF9tb2RlbF9uYW1lKGMpOworCisJc3dpdGNoKGMtPng4NikKKwl7CisJCWNhc2UgNDoKKwkJLyoKKwkJICogR2VuZXJhbCBTeXN0ZW1zIEJJT1NlbiBhbGlhcyB0aGUgY3B1IGZyZXF1ZW5jeSByZWdpc3RlcnMKKwkJICogb2YgdGhlIEVsYW4gYXQgMHgwMDBkZjAwMC4gVW5mb3J0dWFudGx5LCBvbmUgb2YgdGhlIExpbnV4CisJCSAqIGRyaXZlcnMgc3Vic2VxdWVudGx5IHBva2VzIGl0LCBhbmQgY2hhbmdlcyB0aGUgQ1BVIHNwZWVkLgorCQkgKiBXb3JrYXJvdW5kIDogUmVtb3ZlIHRoZSB1bm5lZWRlZCBhbGlhcy4KKwkJICovCisjZGVmaW5lIENCQVIJCSgweGZmZmMpIC8qIENvbmZpZ3VyYXRpb24gQmFzZSBBZGRyZXNzICAoMzItYml0KSAqLworI2RlZmluZSBDQkFSX0VOQgkoMHg4MDAwMDAwMCkKKyNkZWZpbmUgQ0JBUl9LRVkJKDBYMDAwMDAwQ0IpCisJCQlpZiAoYy0+eDg2X21vZGVsPT05IHx8IGMtPng4Nl9tb2RlbCA9PSAxMCkgeworCQkJCWlmIChpbmwgKENCQVIpICYgQ0JBUl9FTkIpCisJCQkJCW91dGwgKDAgfCBDQkFSX0tFWSwgQ0JBUik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJaWYoIGMtPng4Nl9tb2RlbCA8IDYgKQorCQkJeworCQkJCS8qIEJhc2VkIG9uIEFNRCBkb2MgMjA3MzRSIC0gSnVuZSAyMDAwICovCisJCQkJaWYgKCBjLT54ODZfbW9kZWwgPT0gMCApIHsKKwkJCQkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX0FQSUMsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJCQkJc2V0X2JpdChYODZfRkVBVFVSRV9QR0UsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWlmICggYy0+eDg2X21vZGVsID09IDYgJiYgYy0+eDg2X21hc2sgPT0gMSApIHsKKwkJCQljb25zdCBpbnQgSzZfQlVHX0xPT1AgPSAxMDAwMDAwOworCQkJCWludCBuOworCQkJCXZvaWQgKCpmX3ZpZGUpKHZvaWQpOworCQkJCXVuc2lnbmVkIGxvbmcgZCwgZDI7CisJCQkJCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEs2IHN0ZXBwaW5nIEIgZGV0ZWN0ZWQgLSAiKTsKKwkJCQkKKwkJCQkvKgorCQkJCSAqIEl0IGxvb2tzIGxpa2UgQU1EIGZpeGVkIHRoZSAyLjYuMiBidWcgYW5kIGltcHJvdmVkIGluZGlyZWN0IAorCQkJCSAqIGNhbGxzIGF0IHRoZSBzYW1lIHRpbWUuCisJCQkJICovCisKKwkJCQluID0gSzZfQlVHX0xPT1A7CisJCQkJZl92aWRlID0gdmlkZTsKKwkJCQlyZHRzY2woZCk7CisJCQkJd2hpbGUgKG4tLSkgCisJCQkJCWZfdmlkZSgpOworCQkJCXJkdHNjbChkMik7CisJCQkJZCA9IGQyLWQ7CisJCQkJCisJCQkJLyogS25vY2sgdGhlc2UgdHdvIGxpbmVzIG91dCBpZiBpdCBkZWJ1Z3Mgb3V0IG9rICovCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEs2IHN0ZXBwaW5nIEIgZGV0ZWN0ZWQgLSAiKTsKKwkJCQkvKiAtLSBjdXQgaGVyZSAtLSAqLworCQkJCWlmIChkID4gMjAqSzZfQlVHX0xPT1ApIAorCQkJCQlwcmludGsoInN5c3RlbSBzdGFiaWxpdHkgbWF5IGJlIGltcGFpcmVkIHdoZW4gbW9yZSB0aGFuIDMyIE1CIGFyZSB1c2VkLlxuIik7CisJCQkJZWxzZSAKKwkJCQkJcHJpbnRrKCJwcm9iYWJseSBPSyAoYWZ0ZXIgQjk3MzB4eHh4KS5cbiIpOworCQkJCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBzZWUgaHR0cDovL21lbWJyZXMubHljb3MuZnIvcG91bG90L2s2YnVnLmh0bWxcbiIpOworCQkJfQorCisJCQkvKiBLNiB3aXRoIG9sZCBzdHlsZSBXSENSICovCisJCQlpZiAoYy0+eDg2X21vZGVsIDwgOCB8fAorCQkJICAgKGMtPng4Nl9tb2RlbD09IDggJiYgYy0+eDg2X21hc2sgPCA4KSkgeworCQkJCS8qIFdlIGNhbiBvbmx5IHdyaXRlIGFsbG9jYXRlIG9uIHRoZSBsb3cgNTA4TWIgKi8KKwkJCQlpZihtYnl0ZXM+NTA4KQorCQkJCQltYnl0ZXM9NTA4OworCisJCQkJcmRtc3IoTVNSX0s2X1dIQ1IsIGwsIGgpOworCQkJCWlmICgobCYweDAwMDBGRkZGKT09MCkgeworCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQlsPSgxPDwwKXwoKG1ieXRlcy80KTw8MSk7CisJCQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCQkJd2JpbnZkKCk7CisJCQkJCXdybXNyKE1TUl9LNl9XSENSLCBsLCBoKTsKKwkJCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBvbGQgc3R5bGUgSzYgd3JpdGUgYWxsb2NhdGlvbiBmb3IgJWQgTWJcbiIsCisJCQkJCQltYnl0ZXMpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKChjLT54ODZfbW9kZWwgPT0gOCAmJiBjLT54ODZfbWFzayA+NykgfHwKKwkJCSAgICAgYy0+eDg2X21vZGVsID09IDkgfHwgYy0+eDg2X21vZGVsID09IDEzKSB7CisJCQkJLyogVGhlIG1vcmUgc2VyaW91cyBjaGlwcyAuLiAqLworCisJCQkJaWYobWJ5dGVzPjQwOTIpCisJCQkJCW1ieXRlcz00MDkyOworCisJCQkJcmRtc3IoTVNSX0s2X1dIQ1IsIGwsIGgpOworCQkJCWlmICgobCYweEZGRkYwMDAwKT09MCkgeworCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJCQlsPSgobWJ5dGVzPj4yKTw8MjIpfCgxPDwxNik7CisJCQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCQkJd2JpbnZkKCk7CisJCQkJCXdybXNyKE1TUl9LNl9XSENSLCBsLCBoKTsKKwkJCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBuZXcgc3R5bGUgSzYgd3JpdGUgYWxsb2NhdGlvbiBmb3IgJWQgTWJcbiIsCisJCQkJCQltYnl0ZXMpOworCQkJCX0KKworCQkJCS8qICBTZXQgTVRSUiBjYXBhYmlsaXR5IGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KKwkJCQlpZiAoYy0+eDg2X21vZGVsID09IDEzIHx8IGMtPng4Nl9tb2RlbCA9PSA5IHx8CisJCQkJICAgKGMtPng4Nl9tb2RlbCA9PSA4ICYmIGMtPng4Nl9tYXNrID49IDgpKQorCQkJCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0s2X01UUlIsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgNjogLyogQW4gQXRobG9uL0R1cm9uICovCisgCisJCQkvKiBCaXQgMTUgb2YgQXRobG9uIHNwZWNpZmljIE1TUiAxNSwgbmVlZHMgdG8gYmUgMAorIAkJCSAqIHRvIGVuYWJsZSBTU0Ugb24gUGFsb21pbm8vTW9yZ2FuL0JhcnRvbiBDUFUncy4KKwkJCSAqIElmIHRoZSBCSU9TIGRpZG4ndCBlbmFibGUgaXQgYWxyZWFkeSwgZW5hYmxlIGl0IGhlcmUuCisJCQkgKi8KKwkJCWlmIChjLT54ODZfbW9kZWwgPj0gNiAmJiBjLT54ODZfbW9kZWwgPD0gMTApIHsKKwkJCQlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfWE1NKSkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyBkaXNhYmxlZCBLNy9TU0UgU3VwcG9ydC5cbiIpOworCQkJCQlyZG1zcihNU1JfSzdfSFdDUiwgbCwgaCk7CisJCQkJCWwgJj0gfjB4MDAwMDgwMDA7CisJCQkJCXdybXNyKE1TUl9LN19IV0NSLCBsLCBoKTsKKwkJCQkJc2V0X2JpdChYODZfRkVBVFVSRV9YTU0sIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIEl0J3MgYmVlbiBkZXRlcm1pbmVkIGJ5IEFNRCB0aGF0IEF0aGxvbnMgc2luY2UgbW9kZWwgOCBzdGVwcGluZyAxCisJCQkgKiBhcmUgbW9yZSByb2J1c3Qgd2l0aCBDTEtfQ1RMIHNldCB0byAyMDB4eHh4eCBpbnN0ZWFkIG9mIDYwMHh4eHh4CisJCQkgKiBBcyBwZXIgQU1EIHRlY2huaWNhbCBub3RlIDI3MjEyIDAuMgorCQkJICovCisJCQlpZiAoKGMtPng4Nl9tb2RlbCA9PSA4ICYmIGMtPng4Nl9tYXNrPj0xKSB8fCAoYy0+eDg2X21vZGVsID4gOCkpIHsKKwkJCQlyZG1zcihNU1JfSzdfQ0xLX0NUTCwgbCwgaCk7CisJCQkJaWYgKChsICYgMHhmZmYwMDAwMCkgIT0gMHgyMDAwMDAwMCkgeworCQkJCQlwcmludGsgKCJDUFU6IENMS19DVEwgTVNSIHdhcyAleC4gUmVwcm9ncmFtbWluZyB0byAleFxuIiwgbCwKKwkJCQkJCSgobCAmIDB4MDAwZmZmZmYpfDB4MjAwMDAwMDApKTsKKwkJCQkJd3Jtc3IoTVNSX0s3X0NMS19DVEwsIChsICYgMHgwMDBmZmZmZil8MHgyMDAwMDAwMCwgaCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCisJc3dpdGNoIChjLT54ODYpIHsKKwljYXNlIDE1OgorCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0s4LCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc2V0X2JpdChYODZfRkVBVFVSRV9LNywgYy0+eDg2X2NhcGFiaWxpdHkpOyAKKwkJYnJlYWs7CisJfQorCisJZGlzcGxheV9jYWNoZWluZm8oYyk7CisJZGV0ZWN0X2h0KGMpOworCisjaWZkZWYgQ09ORklHX1g4Nl9IVAorCS8qIEFNRCBkdWFsIGNvcmUgbG9va3MgbGlrZSBIVCBidXQgaXNuJ3QgcmVhbGx5LiBIaWRlIGl0IGZyb20gdGhlCisJICAgc2NoZWR1bGVyLiBUaGlzIHdvcmtzIGFyb3VuZCBwcm9ibGVtcyB3aXRoIHRoZSBkb21haW4gc2NoZWR1bGVyLgorCSAgIEFsc28gcHJvYmFibHkgZ2l2ZXMgc2xpZ2h0bHkgYmV0dGVyIHNjaGVkdWxpbmcgYW5kIGRpc2FibGVzCisJICAgU01UIG5pY2Ugd2hpY2ggaXMgaGFybWZ1bCBvbiBkdWFsIGNvcmUuCisJICAgVEJEIHR1bmUgdGhlIGRvbWFpbiBzY2hlZHVsZXIgZm9yIGR1YWwgY29yZS4gKi8KKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DTVBfTEVHQUNZKSkKKwkJc21wX251bV9zaWJsaW5ncyA9IDE7CisjZW5kaWYKKworCWlmIChjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPj0gMHg4MDAwMDAwOCkgeworCQljLT54ODZfbnVtX2NvcmVzID0gKGNwdWlkX2VjeCgweDgwMDAwMDA4KSAmIDB4ZmYpICsgMTsKKwkJaWYgKGMtPng4Nl9udW1fY29yZXMgJiAoYy0+eDg2X251bV9jb3JlcyAtIDEpKQorCQkJYy0+eDg2X251bV9jb3JlcyA9IDE7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFtZF9zaXplX2NhY2hlKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMsIHVuc2lnbmVkIGludCBzaXplKQoreworCS8qIEFNRCBlcnJhdGEgVDEzIChvcmRlciAjMjE5MjIpICovCisJaWYgKChjLT54ODYgPT0gNikpIHsKKwkJaWYgKGMtPng4Nl9tb2RlbCA9PSAzICYmIGMtPng4Nl9tYXNrID09IDApCS8qIER1cm9uIFJldiBBMCAqLworCQkJc2l6ZSA9IDY0OworCQlpZiAoYy0+eDg2X21vZGVsID09IDQgJiYKKwkJICAgIChjLT54ODZfbWFzaz09MCB8fCBjLT54ODZfbWFzaz09MSkpCS8qIFRiaXJkIHJldiBBMS9BMiAqLworCQkJc2l6ZSA9IDI1NjsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBhbWRfY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJBTUQiLAorCS5jX2lkZW50IAk9IHsgIkF1dGhlbnRpY0FNRCIgfSwKKwkuY19tb2RlbHMgPSB7CisJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfQU1ELCAuZmFtaWx5ID0gNCwgLm1vZGVsX25hbWVzID0KKwkJICB7CisJCQkgIFszXSA9ICI0ODYgRFgvMiIsCisJCQkgIFs3XSA9ICI0ODYgRFgvMi1XQiIsCisJCQkgIFs4XSA9ICI0ODYgRFgvNCIsIAorCQkJICBbOV0gPSAiNDg2IERYLzQtV0IiLCAKKwkJCSAgWzE0XSA9ICJBbTV4ODYtV1QiLAorCQkJICBbMTVdID0gIkFtNXg4Ni1XQiIgCisJCSAgfQorCQl9LAorCX0sCisJLmNfaW5pdAkJPSBpbml0X2FtZCwKKwkuY19pZGVudGlmeQk9IGdlbmVyaWNfaWRlbnRpZnksCisJLmNfc2l6ZV9jYWNoZQk9IGFtZF9zaXplX2NhY2hlLAorfTsKKworaW50IF9faW5pdCBhbWRfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX0FNRF0gPSAmYW1kX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbChhbWRfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY2VudGF1ci5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY2VudGF1ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDgxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jZW50YXVyLmMKQEAgLTAsMCArMSw0NzYgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgImNwdS5oIgorCisjaWZkZWYgQ09ORklHX1g4Nl9PT1NUT1JFCisKK3N0YXRpYyB1MzIgX19pbml0IHBvd2VyMih1MzIgeCkKK3sKKwl1MzIgcz0xOworCXdoaWxlKHM8PXgpCisJCXM8PD0xOworCXJldHVybiBzPj49MTsKK30KKworCisvKgorICoJU2V0IHVwIGFuIGFjdHVhbCBNQ1IKKyAqLworIAorc3RhdGljIHZvaWQgX19pbml0IGNlbnRhdXJfbWNyX2luc2VydChpbnQgcmVnLCB1MzIgYmFzZSwgdTMyIHNpemUsIGludCBrZXkpCit7CisJdTMyIGxvLCBoaTsKKwkKKwloaSA9IGJhc2UgJiB+MHhGRkY7CisJbG8gPSB+KHNpemUtMSk7CQkvKiBTaXplIGlzIGEgcG93ZXIgb2YgMiBzbyB0aGlzIG1ha2VzIGEgbWFzayAqLworCWxvICY9IH4weEZGRjsJCS8qIFJlbW92ZSB0aGUgY3RybCB2YWx1ZSBiaXRzICovCisJbG8gfD0ga2V5OwkJLyogQXR0cmlidXRlIHdlIHdpc2ggdG8gc2V0ICovCisJd3Jtc3IocmVnK01TUl9JRFRfTUNSMCwgbG8sIGhpKTsKKwltdHJyX2NlbnRhdXJfcmVwb3J0X21jcihyZWcsIGxvLCBoaSk7CS8qIFRlbGwgdGhlIG10cnIgZHJpdmVyICovCit9CisKKy8qCisgKglGaWd1cmUgd2hhdCB3ZSBjYW4gY292ZXIgd2l0aCBNQ1IncworICoKKyAqCVNob3J0Y3V0OiBXZSBrbm93IHlvdSBjYW4ndCBwdXQgNEdpZyBvZiBSQU0gb24gYSB3aW5jaGlwCisgKi8KKworc3RhdGljIHUzMiBfX2luaXQgcmFtdG9wKHZvaWQpCQkvKiAxNjM4OCAqLworeworCWludCBpOworCXUzMiB0b3AgPSAwOworCXUzMiBjbGlwID0gMHhGRkZGRkZGRlVMOworCQorCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKworCQlpZiAoZTgyMC5tYXBbaV0uYWRkciA+IDB4RkZGRkZGRkZVTCkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKglEb24ndCBNQ1Igb3ZlciByZXNlcnZlZCBzcGFjZS4gSWdub3JlIHRoZSBJU0EgaG9sZQorCQkgKgl3ZSBmcm9iIGFyb3VuZCB0aGF0IGNhdGFzdHJvcGh5IGFscmVhZHkKKwkJICovCisJCSAJCQkKKwkJaWYgKGU4MjAubWFwW2ldLnR5cGUgPT0gRTgyMF9SRVNFUlZFRCkKKwkJeworCQkJaWYoZTgyMC5tYXBbaV0uYWRkciA+PSAweDEwMDAwMFVMICYmIGU4MjAubWFwW2ldLmFkZHIgPCBjbGlwKQorCQkJCWNsaXAgPSBlODIwLm1hcFtpXS5hZGRyOworCQkJY29udGludWU7CisJCX0KKwkJc3RhcnQgPSBlODIwLm1hcFtpXS5hZGRyOworCQllbmQgPSBlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZTsKKwkJaWYgKHN0YXJ0ID49IGVuZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZW5kID4gdG9wKQorCQkJdG9wID0gZW5kOworCX0KKwkvKiBFdmVyeXRoaW5nIGJlbG93ICd0b3AnIHNob3VsZCBiZSBSQU0gZXhjZXB0IGZvciB0aGUgSVNBIGhvbGUuCisJICAgQmVjYXVzZSBvZiB0aGUgbGltaXRlZCBNQ1IncyB3ZSB3YW50IHRvIG1hcCBOVi9BQ1BJIGludG8gb3VyCisJICAgTUNSIHJhbmdlIGZvciBndW5rIGluIFJBTSAKKwkgICAKKwkgICBDbGlwIG1pZ2h0IGNhdXNlIHVzIHRvIE1DUiBpbnN1ZmZpY2llbnQgUkFNIGJ1dCB0aGF0IGlzIGFuCisJICAgYWNjZXB0YWJsZSBmYWlsdXJlIG1vZGUgYW5kIHNob3VsZCBvbmx5IGJpdGUgb2JzY3VyZSBib3hlcyB3aXRoCisJICAgYSBWRVNBIGhvbGUgYXQgMTVNYgorCSAgIAorCSAgIFRoZSBzZWNvbmQgY2FzZSBDbGlwIHNvbWV0aW1lcyBraWNrcyBpbiBpcyB3aGVuIHRoZSBFQkRBIGlzIG1hcmtlZAorCSAgIGFzIHJlc2VydmVkLiBBZ2FpbiB3ZSBmYWlsIHNhZmUgd2l0aCByZWFzb25hYmxlIHJlc3VsdHMKKwkqLworCQorCWlmKHRvcD5jbGlwKQorCQl0b3A9Y2xpcDsKKwkJCisJcmV0dXJuIHRvcDsKK30KKworLyoKKyAqCUNvbXB1dGUgYSBzZXQgb2YgTUNSJ3MgdG8gZ2l2ZSBtYXhpbXVtIGNvdmVyYWdlCisgKi8KKworc3RhdGljIGludCBfX2luaXQgY2VudGF1cl9tY3JfY29tcHV0ZShpbnQgbnIsIGludCBrZXkpCit7CisJdTMyIG1lbSA9IHJhbXRvcCgpOworCXUzMiByb290ID0gcG93ZXIyKG1lbSk7CisJdTMyIGJhc2UgPSByb290OworCXUzMiB0b3AgPSByb290OworCXUzMiBmbG9vciA9IDA7CisJaW50IGN0ID0gMDsKKwkKKwl3aGlsZShjdDxucikKKwl7CisJCXUzMiBmc3BhY2UgPSAwOworCisJCS8qCisJCSAqCUZpbmQgdGhlIGxhcmdlc3QgYmxvY2sgd2Ugd2lsbCBmaWxsIGdvaW5nIHVwd2FyZHMKKwkJICovCisKKwkJdTMyIGhpZ2ggPSBwb3dlcjIobWVtLXRvcCk7CQorCisJCS8qCisJCSAqCUZpbmQgdGhlIGxhcmdlc3QgYmxvY2sgd2Ugd2lsbCBmaWxsIGdvaW5nIGRvd253YXJkcworCQkgKi8KKworCQl1MzIgbG93ID0gYmFzZS8yOworCisJCS8qCisJCSAqCURvbid0IGZpbGwgYmVsb3cgMU1iIGdvaW5nIGRvd253YXJkcyBhcyB0aGVyZQorCQkgKglpcyBhbiBJU0EgaG9sZSBpbiB0aGUgd2F5LgorCQkgKi8JCQorCQkgCisJCWlmKGJhc2UgPD0gMTAyNCoxMDI0KQorCQkJbG93ID0gMDsKKwkJCQorCQkvKgorCQkgKglTZWUgaG93IG11Y2ggc3BhY2Ugd2UgY291bGQgY292ZXIgYnkgZmlsbGluZyBiZWxvdworCQkgKgl0aGUgSVNBIGhvbGUKKwkJICovCisJCSAKKwkJaWYoZmxvb3IgPT0gMCkKKwkJCWZzcGFjZSA9IDUxMioxMDI0OworCQllbHNlIGlmKGZsb29yID09NTEyKjEwMjQpCisJCQlmc3BhY2UgPSAxMjgqMTAyNDsKKworCQkvKiBBbmQgZm9yZ2V0IFJPTSBzcGFjZSAqLworCQkKKwkJLyoKKwkJICoJTm93IGluc3RhbGwgdGhlIGxhcmdlc3QgY292ZXJhZ2Ugd2UgZ2V0CisJCSAqLworCQkgCisJCWlmKGZzcGFjZSA+IGhpZ2ggJiYgZnNwYWNlID4gbG93KQorCQl7CisJCQljZW50YXVyX21jcl9pbnNlcnQoY3QsIGZsb29yLCBmc3BhY2UsIGtleSk7CisJCQlmbG9vciArPSBmc3BhY2U7CisJCX0KKwkJZWxzZSBpZihoaWdoID4gbG93KQorCQl7CisJCQljZW50YXVyX21jcl9pbnNlcnQoY3QsIHRvcCwgaGlnaCwga2V5KTsKKwkJCXRvcCArPSBoaWdoOworCQl9CisJCWVsc2UgaWYobG93ID4gMCkKKwkJeworCQkJYmFzZSAtPSBsb3c7CisJCQljZW50YXVyX21jcl9pbnNlcnQoY3QsIGJhc2UsIGxvdywga2V5KTsKKwkJfQorCQllbHNlIGJyZWFrOworCQljdCsrOworCX0KKwkvKgorCSAqCVdlIGxvYWRlZCBjdCB2YWx1ZXMuIFdlIG5vdyBuZWVkIHRvIHNldCB0aGUgbWFzay4gVGhlIGNhbGxlcgorCSAqCW11c3QgZG8gdGhpcyBiaXQuCisJICovCisJIAorCXJldHVybiBjdDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGNlbnRhdXJfY3JlYXRlX29wdGltYWxfbWNyKHZvaWQpCit7CisJaW50IGk7CisJLyoKKwkgKglBbGxvY2F0ZSB1cCB0byA2IG1jcnMgdG8gbWFyayBhcyBtdWNoIG9mIHJhbSBhcyBwb3NzaWJsZQorCSAqCWFzIHdyaXRlIGNvbWJpbmluZyBhbmQgd2VhayB3cml0ZSBvcmRlcmVkLgorCSAqCisJICoJVG8gZXhwZXJpbWVudCB3aXRoOiBMaW51eCBuZXZlciB1c2VzIHN0YWNrIG9wZXJhdGlvbnMgZm9yIAorCSAqCW1taW8gc3BhY2VzIHNvIHdlIGNvdWxkIGdsb2JhbGx5IGVuYWJsZSBzdGFjayBvcGVyYXRpb24gd2MKKwkgKgorCSAqCUxvYWQgdGhlIHJlZ2lzdGVycyB3aXRoIHR5cGUgMzEgLSBmdWxsIHdyaXRlIGNvbWJpbmluZywgYWxsCisJICoJd3JpdGVzIHdlYWtseSBvcmRlcmVkLgorCSAqLworCWludCB1c2VkID0gY2VudGF1cl9tY3JfY29tcHV0ZSg2LCAzMSk7CisKKwkvKgorCSAqCVdpcGUgdW51c2VkIE1DUnMKKwkgKi8KKwkgCisJZm9yKGk9dXNlZDtpPDg7aSsrKQorCQl3cm1zcihNU1JfSURUX01DUjAraSwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB3aW5jaGlwMl9jcmVhdGVfb3B0aW1hbF9tY3Iodm9pZCkKK3sKKwl1MzIgbG8sIGhpOworCWludCBpOworCisJLyoKKwkgKglBbGxvY2F0ZSB1cCB0byA2IG1jcnMgdG8gbWFyayBhcyBtdWNoIG9mIHJhbSBhcyBwb3NzaWJsZQorCSAqCWFzIHdyaXRlIGNvbWJpbmluZywgd2VhayBzdG9yZSBvcmRlcmVkLgorCSAqCisJICoJTG9hZCB0aGUgcmVnaXN0ZXJzIHdpdGggdHlwZSAyNQorCSAqCQk4CS0Jd2VhayB3cml0ZSBvcmRlcmluZworCSAqCQkxNgktCXdlYWsgcmVhZCBvcmRlcmluZworCSAqCQkxCS0Jd3JpdGUgY29tYmluaW5nCisJICovCisKKwlpbnQgdXNlZCA9IGNlbnRhdXJfbWNyX2NvbXB1dGUoNiwgMjUpOworCQorCS8qCisJICoJTWFyayB0aGUgcmVnaXN0ZXJzIHdlIGFyZSB1c2luZy4KKwkgKi8KKwkgCisJcmRtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgbG8sIGhpKTsKKwlmb3IoaT0wO2k8dXNlZDtpKyspCisJCWxvfD0xPDwoOStpKTsKKwl3cm1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworCQorCS8qCisJICoJV2lwZSB1bnVzZWQgTUNScworCSAqLworCSAKKwlmb3IoaT11c2VkO2k8ODtpKyspCisJCXdybXNyKE1TUl9JRFRfTUNSMCtpLCAwLCAwKTsKK30KKworLyoKKyAqCUhhbmRsZSB0aGUgTUNSIGtleSBvbiB0aGUgV2luY2hpcCAyLgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCB3aW5jaGlwMl91bnByb3RlY3RfbWNyKHZvaWQpCit7CisJdTMyIGxvLCBoaTsKKwl1MzIga2V5OworCQorCXJkbXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CisJbG8mPX4weDFDMDsJLyogYmxhbmsgYml0cyA4LTYgKi8KKwlrZXkgPSAobG8+PjE3KSAmIDc7CisJbG8gfD0ga2V5PDw2OwkvKiByZXBsYWNlIHdpdGggdW5sb2NrIGtleSAqLworCXdybXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB3aW5jaGlwMl9wcm90ZWN0X21jcih2b2lkKQoreworCXUzMiBsbywgaGk7CisJCisJcmRtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgbG8sIGhpKTsKKwlsbyY9fjB4MUMwOwkvKiBibGFuayBiaXRzIDgtNiAqLworCXdybXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1g4Nl9PT1NUT1JFICovCisKKyNkZWZpbmUgQUNFX1BSRVNFTlQJKDEgPDwgNikKKyNkZWZpbmUgQUNFX0VOQUJMRUQJKDEgPDwgNykKKyNkZWZpbmUgQUNFX0ZDUgkJKDEgPDwgMjgpCS8qIE1TUl9WSUFfRkNSICovCisKKyNkZWZpbmUgUk5HX1BSRVNFTlQJKDEgPDwgMikKKyNkZWZpbmUgUk5HX0VOQUJMRUQJKDEgPDwgMykKKyNkZWZpbmUgUk5HX0VOQUJMRQkoMSA8PCA2KQkvKiBNU1JfVklBX1JORyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9jMyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdTMyICBsbywgaGk7CisKKwkvKiBUZXN0IGZvciBDZW50YXVyIEV4dGVuZGVkIEZlYXR1cmUgRmxhZ3MgcHJlc2VuY2UgKi8KKwlpZiAoY3B1aWRfZWF4KDB4QzAwMDAwMDApID49IDB4QzAwMDAwMDEpIHsKKwkJdTMyIHRtcCA9IGNwdWlkX2VkeCgweEMwMDAwMDAxKTsKKworCQkvKiBlbmFibGUgQUNFIHVuaXQsIGlmIHByZXNlbnQgYW5kIGRpc2FibGVkICovCisJCWlmICgodG1wICYgKEFDRV9QUkVTRU5UIHwgQUNFX0VOQUJMRUQpKSA9PSBBQ0VfUFJFU0VOVCkgeworCQkJcmRtc3IgKE1TUl9WSUFfRkNSLCBsbywgaGkpOworCQkJbG8gfD0gQUNFX0ZDUjsJCS8qIGVuYWJsZSBBQ0UgdW5pdCAqLworCQkJd3Jtc3IgKE1TUl9WSUFfRkNSLCBsbywgaGkpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiBFbmFibGVkIEFDRSBoL3cgY3J5cHRvXG4iKTsKKwkJfQorCisJCS8qIGVuYWJsZSBSTkcgdW5pdCwgaWYgcHJlc2VudCBhbmQgZGlzYWJsZWQgKi8KKwkJaWYgKCh0bXAgJiAoUk5HX1BSRVNFTlQgfCBSTkdfRU5BQkxFRCkpID09IFJOR19QUkVTRU5UKSB7CisJCQlyZG1zciAoTVNSX1ZJQV9STkcsIGxvLCBoaSk7CisJCQlsbyB8PSBSTkdfRU5BQkxFOwkvKiBlbmFibGUgUk5HIHVuaXQgKi8KKwkJCXdybXNyIChNU1JfVklBX1JORywgbG8sIGhpKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkNQVTogRW5hYmxlZCBoL3cgUk5HXG4iKTsKKwkJfQorCisJCS8qIHN0b3JlIENlbnRhdXIgRXh0ZW5kZWQgRmVhdHVyZSBGbGFncyBhcworCQkgKiB3b3JkIDUgb2YgdGhlIENQVSBjYXBhYmlsaXR5IGJpdCBhcnJheQorCQkgKi8KKwkJYy0+eDg2X2NhcGFiaWxpdHlbNV0gPSBjcHVpZF9lZHgoMHhDMDAwMDAwMSk7CisJfQorCisJLyogQ3lyaXggSUlJIGZhbWlseSBuZWVkcyBDWDggJiBQR0UgZXhwbGljaXR5IGVuYWJsZWQuICovCisJaWYgKGMtPng4Nl9tb2RlbCA+PTYgJiYgYy0+eDg2X21vZGVsIDw9IDkpIHsKKwkJcmRtc3IgKE1TUl9WSUFfRkNSLCBsbywgaGkpOworCQlsbyB8PSAoMTw8MSB8IDE8PDcpOworCQl3cm1zciAoTVNSX1ZJQV9GQ1IsIGxvLCBoaSk7CisJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1g4LCBjLT54ODZfY2FwYWJpbGl0eSk7CisJfQorCisJLyogQmVmb3JlIE5laGVtaWFoLCB0aGUgQzMncyBoYWQgM2ROT1chICovCisJaWYgKGMtPng4Nl9tb2RlbCA+PTYgJiYgYy0+eDg2X21vZGVsIDw5KQorCQlzZXRfYml0KFg4Nl9GRUFUVVJFXzNETk9XLCBjLT54ODZfY2FwYWJpbGl0eSk7CisKKwlnZXRfbW9kZWxfbmFtZShjKTsKKwlkaXNwbGF5X2NhY2hlaW5mbyhjKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfY2VudGF1cihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJZW51bSB7CisJCUVDWDg9MTw8MSwKKwkJRUlFUlJJTlQ9MTw8MiwKKwkJRFBNPTE8PDMsCisJCURNQ0U9MTw8NCwKKwkJRFNUUENMSz0xPDw1LAorCQlFTElORUFSPTE8PDYsCisJCURTTUM9MTw8NywKKwkJRFRMT0NLPTE8PDgsCisJCUVEQ1RMQj0xPDw4LAorCQlFTU1YPTE8PDksCisJCURQREM9MTw8MTEsCisJCUVCUlBSRUQ9MTw8MTIsCisJCURJQz0xPDwxMywKKwkJRERDPTE8PDE0LAorCQlETkE9MTw8MTUsCisJCUVSRVRTVEs9MTw8MTYsCisJCUUyTU1YPTE8PDE5LAorCQlFQU1EM0Q9MTw8MjAsCisJfTsKKworCWNoYXIgKm5hbWU7CisJdTMyICBmY3Jfc2V0PTA7CisJdTMyICBmY3JfY2xyPTA7CisJdTMyICBsbyxoaSxuZXdsbzsKKwl1MzIgIGFhLGJiLGNjLGRkOworCisJLyogQml0IDMxIGluIG5vcm1hbCBDUFVJRCB1c2VkIGZvciBub25zdGFuZGFyZCAzRE5vdyBJRDsKKwkgICAzRE5vdyBpcyBJRGQgYnkgYml0IDMxIGluIGV4dGVuZGVkIENQVUlEICgxKjMyKzMxKSBhbnl3YXkgKi8KKwljbGVhcl9iaXQoMCozMiszMSwgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJc3dpdGNoIChjLT54ODYpIHsKKworCQljYXNlIDU6CisJCQlzd2l0Y2goYy0+eDg2X21vZGVsKSB7CisJCQljYXNlIDQ6CisJCQkJbmFtZT0iQzYiOworCQkJCWZjcl9zZXQ9RUNYOHxEU01DfEVEQ1RMQnxFTU1YfEVSRVRTVEs7CisJCQkJZmNyX2Nscj1EUERDOworCQkJCXByaW50ayhLRVJOX05PVElDRSAiRGlzYWJsaW5nIGJ1Z2dlZCBUU0MuXG4iKTsKKwkJCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfVFNDLCBjLT54ODZfY2FwYWJpbGl0eSk7CisjaWZkZWYgQ09ORklHX1g4Nl9PT1NUT1JFCisJCQkJY2VudGF1cl9jcmVhdGVfb3B0aW1hbF9tY3IoKTsKKwkJCQkvKiBFbmFibGUKKwkJCQkJd3JpdGUgY29tYmluaW5nIG9uIG5vbi1zdGFjaywgbm9uLXN0cmluZworCQkJCQl3cml0ZSBjb21iaW5pbmcgb24gc3RyaW5nLCBhbGwgdHlwZXMKKwkJCQkJd2VhayB3cml0ZSBvcmRlcmluZyAKKwkJCQkJCisJCQkJICAgVGhlIEM2IG9yaWdpbmFsIGxhY2tzIHdlYWsgcmVhZCBvcmRlciAKKwkJCQkgICAKKwkJCQkgICBOb3RlIDB4MTIwIGlzIHdyaXRlIG9ubHkgb24gV2luY2hpcCAxICovCisJCQkJICAgCisJCQkJd3Jtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgMHgwMUYwMDAxRiwgMCk7CisjZW5kaWYJCQkJCisJCQkJYnJlYWs7CisJCQljYXNlIDg6CisJCQkJc3dpdGNoKGMtPng4Nl9tYXNrKSB7CisJCQkJZGVmYXVsdDoKKwkJCQkJbmFtZT0iMiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNyAuLi4gOToKKwkJCQkJbmFtZT0iMkEiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDEwIC4uLiAxNToKKwkJCQkJbmFtZT0iMkIiOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZmNyX3NldD1FQ1g4fERTTUN8RFRMT0NLfEVNTVh8RUJSUFJFRHxFUkVUU1RLfEUyTU1YfEVBTUQzRDsKKwkJCQlmY3JfY2xyPURQREM7CisjaWZkZWYgQ09ORklHX1g4Nl9PT1NUT1JFCisJCQkJd2luY2hpcDJfdW5wcm90ZWN0X21jcigpOworCQkJCXdpbmNoaXAyX2NyZWF0ZV9vcHRpbWFsX21jcigpOworCQkJCXJkbXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CisJCQkJLyogRW5hYmxlCisJCQkJCXdyaXRlIGNvbWJpbmluZyBvbiBub24tc3RhY2ssIG5vbi1zdHJpbmcKKwkJCQkJd3JpdGUgY29tYmluaW5nIG9uIHN0cmluZywgYWxsIHR5cGVzCisJCQkJCXdlYWsgd3JpdGUgb3JkZXJpbmcgCisJCQkJKi8KKwkJCQlsb3w9MzE7CQkJCQorCQkJCXdybXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CisJCQkJd2luY2hpcDJfcHJvdGVjdF9tY3IoKTsKKyNlbmRpZgorCQkJCWJyZWFrOworCQkJY2FzZSA5OgorCQkJCW5hbWU9IjMiOworCQkJCWZjcl9zZXQ9RUNYOHxEU01DfERUTE9DS3xFTU1YfEVCUlBSRUR8RVJFVFNUS3xFMk1NWHxFQU1EM0Q7CisJCQkJZmNyX2Nscj1EUERDOworI2lmZGVmIENPTkZJR19YODZfT09TVE9SRQorCQkJCXdpbmNoaXAyX3VucHJvdGVjdF9tY3IoKTsKKwkJCQl3aW5jaGlwMl9jcmVhdGVfb3B0aW1hbF9tY3IoKTsKKwkJCQlyZG1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworCQkJCS8qIEVuYWJsZQorCQkJCQl3cml0ZSBjb21iaW5pbmcgb24gbm9uLXN0YWNrLCBub24tc3RyaW5nCisJCQkJCXdyaXRlIGNvbWJpbmluZyBvbiBzdHJpbmcsIGFsbCB0eXBlcworCQkJCQl3ZWFrIHdyaXRlIG9yZGVyaW5nIAorCQkJCSovCisJCQkJbG98PTMxOwkJCQkKKwkJCQl3cm1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworCQkJCXdpbmNoaXAyX3Byb3RlY3RfbWNyKCk7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgMTA6CisJCQkJbmFtZT0iNCI7CisJCQkJLyogbm8gaW5mbyBvbiB0aGUgV0M0IHlldCAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQluYW1lPSI/PyI7CisJCQl9CisKKwkJCXJkbXNyKE1TUl9JRFRfRkNSMSwgbG8sIGhpKTsKKwkJCW5ld2xvPShsb3xmY3Jfc2V0KSAmICh+ZmNyX2Nscik7CisKKwkJCWlmIChuZXdsbyE9bG8pIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJDZW50YXVyIEZDUiB3YXMgMHglWCBub3cgMHglWFxuIiwgbG8sIG5ld2xvICk7CisJCQkJd3Jtc3IoTVNSX0lEVF9GQ1IxLCBuZXdsbywgaGkgKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ2VudGF1ciBGQ1IgaXMgMHglWFxuIixsbyk7CisJCQl9CisJCQkvKiBFbXVsYXRlIE1UUlJzIHVzaW5nIENlbnRhdXIncyBNQ1IuICovCisJCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NFTlRBVVJfTUNSLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCQkvKiBSZXBvcnQgQ1g4ICovCisJCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NYOCwgYy0+eDg2X2NhcGFiaWxpdHkpOworCQkJLyogU2V0IDNETm93ISBvbiBXaW5jaGlwIDIgYW5kIGFib3ZlLiAqLworCQkJaWYgKGMtPng4Nl9tb2RlbCA+PTgpCisJCQkJc2V0X2JpdChYODZfRkVBVFVSRV8zRE5PVywgYy0+eDg2X2NhcGFiaWxpdHkpOworCQkJLyogU2VlIGlmIHdlIGNhbiBmaW5kIG91dCBzb21lIG1vcmUuICovCisJCQlpZiAoIGNwdWlkX2VheCgweDgwMDAwMDAwKSA+PSAweDgwMDAwMDA1ICkgeworCQkJCS8qIFllcywgd2UgY2FuLiAqLworCQkJCWNwdWlkKDB4ODAwMDAwMDUsJmFhLCZiYiwmY2MsJmRkKTsKKwkJCQkvKiBBZGQgTDEgZGF0YSBhbmQgY29kZSBjYWNoZSBzaXplcy4gKi8KKwkJCQljLT54ODZfY2FjaGVfc2l6ZSA9IChjYz4+MjQpKyhkZD4+MjQpOworCQkJfQorCQkJc3ByaW50ZiggYy0+eDg2X21vZGVsX2lkLCAiV2luQ2hpcCAlcyIsIG5hbWUgKTsKKwkJCWJyZWFrOworCisJCWNhc2UgNjoKKwkJCWluaXRfYzMoYyk7CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2VudGF1cl9zaXplX2NhY2hlKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMsIHVuc2lnbmVkIGludCBzaXplKQoreworCS8qIFZJQSBDMyBDUFVzICg2NzAtNjhGKSBuZWVkIGZ1cnRoZXIgc2hpZnRpbmcuICovCisJaWYgKChjLT54ODYgPT0gNikgJiYgKChjLT54ODZfbW9kZWwgPT0gNykgfHwgKGMtPng4Nl9tb2RlbCA9PSA4KSkpCisJCXNpemUgPj49IDg7CisKKwkvKiBWSUEgYWxzbyBzY3Jld2VkIHVwIE5laGVtaWFoIHN0ZXBwaW5nIDEsIGFuZCBtYWRlCisJICAgaXQgcmV0dXJuICc2NUtCJyBpbnN0ZWFkIG9mICc2NEtCJworCSAgIC0gTm90ZSwgaXQgc2VlbXMgdGhpcyBtYXkgb25seSBiZSBpbiBlbmdpbmVlcmluZyBzYW1wbGVzLiAqLworCWlmICgoYy0+eDg2PT02KSAmJiAoYy0+eDg2X21vZGVsPT05KSAmJiAoYy0+eDg2X21hc2s9PTEpICYmIChzaXplPT02NSkpCisJCXNpemUgLT0xOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBjZW50YXVyX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKKwkuY192ZW5kb3IJPSAiQ2VudGF1ciIsCisJLmNfaWRlbnQJPSB7ICJDZW50YXVySGF1bHMiIH0sCisJLmNfaW5pdAkJPSBpbml0X2NlbnRhdXIsCisJLmNfc2l6ZV9jYWNoZQk9IGNlbnRhdXJfc2l6ZV9jYWNoZSwKK307CisKK2ludCBfX2luaXQgY2VudGF1cl9pbml0X2NwdSh2b2lkKQoreworCWNwdV9kZXZzW1g4Nl9WRU5ET1JfQ0VOVEFVUl0gPSAmY2VudGF1cl9jcHVfZGV2OworCXJldHVybiAwOworfQorCisvL2Vhcmx5X2FyY2hfaW5pdGNhbGwoY2VudGF1cl9pbml0X2NwdSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jaGFuZ2Vsb2cgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jaGFuZ2Vsb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmNzZiOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NoYW5nZWxvZwpAQCAtMCwwICsxLDYzIEBACisvKgorICogIEVuaGFuY2VkIENQVSB0eXBlIGRldGVjdGlvbiBieSBNaWtlIEphZ2RpcywgUGF0cmljayBTdC4gSmVhbgorICogIGFuZCBNYXJ0aW4gTWFyZXMsIE5vdmVtYmVyIDE5OTcuCisgKgorICogIEZvcmNlIEN5cml4IDZ4ODYoTVgpIGFuZCBNIElJIHByb2Nlc3NvcnMgdG8gcmVwb3J0IE1UUlIgY2FwYWJpbGl0eQorICogIGFuZCBDeXJpeCAiY29tYSBidWciIHJlY29nbml0aW9uIGJ5CisgKiAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+IEZlYnJ1YXJ5IDE5OTkuCisgKiAKKyAqICBGb3JjZSBDZW50YXVyIEM2IHByb2Nlc3NvcnMgdG8gcmVwb3J0IE1UUlIgY2FwYWJpbGl0eS4KKyAqICBCYXJ0IEhhcnRnZXJzIDxiYXJ0QGV0cG1vZC5waHlzLnR1ZS5ubD4sIE1heSAxOTk5LgorICoKKyAqICBJbnRlbCBNb2JpbGUgUGVudGl1bSBJSSBkZXRlY3Rpb24gZml4LiBTZWFuIEdpbGxleSwgSnVuZSAxOTk5LgorICoKKyAqICBJRFQgV2luY2hpcCB0d2Vha3MsIG1pc2MgY2xlYW4gdXBzLgorICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBBdWd1c3QgMTk5OQorICoKKyAqICBCZXR0ZXIgZGV0ZWN0aW9uIG9mIENlbnRhdXIvSURUIFdpbkNoaXAgbW9kZWxzLgorICogIEJhcnQgSGFydGdlcnMgPGJhcnRAZXRwbW9kLnBoeXMudHVlLm5sPiwgQXVndXN0IDE5OTkuCisgKgorICogIENsZWFuZWQgdXAgY2FjaGUtZGV0ZWN0aW9uIGNvZGUKKyAqICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPiwgT2N0b2JlciAxOTk5CisgKgorICogIEFkZGVkIHByb3BlciBMMiBjYWNoZSBkZXRlY3Rpb24gZm9yIENvcHBlcm1pbmUKKyAqICBEcmFnYW4gU3RhbmNldmljIDx2aXNpdG9yQHZhbGludXguY29tPiwgT2N0b2JlciAxOTk5CisgKgorICogIEFkZGVkIHRoZSBvcmlnaW5hbCBhcnJheSBmb3IgY2FwYWJpbGl0eSBmbGFncyBidXQgZm9yZ290IHRvIGNyZWRpdCAKKyAqICBteXNlbGYgOikgKH4xOTk4KSBGaXhlZC9jbGVhbmVkIHVwIHNvbWUgY3B1X21vZGVsX2luZm8gYW5kIG90aGVyIHN0dWZmCisgKiAgSmF1ZGVyIEhvIDxqYXVkZXJob0BjYXJ1bWJhLmNvbT4sIEphbnVhcnkgMjAwMAorICoKKyAqICBEZXRlY3Rpb24gZm9yIENlbGVyb24gY29wcGVybWluZSwgaWRlbnRpZnlfY3B1KCkgb3ZlcmhhdWxlZCwKKyAqICBhbmQgYSBmZXcgb3RoZXIgY2xlYW4gdXBzLgorICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBBcHJpbCAyMDAwCisgKgorICogIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0CisgKiAgR2VuZXJhbCBGUFUgc3RhdGUgaGFuZGxpbmcgY2xlYW51cHMKKyAqICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+LCBNYXkgMjAwMAorICoKKyAqICBBZGRlZCBwcm9wZXIgQ2FzY2FkZXMgQ1BVIGFuZCBMMiBjYWNoZSBkZXRlY3Rpb24gZm9yIENhc2NhZGVzCisgKiAgYW5kIDgtd2F5IHR5cGUgY2FjaGUgaGFwcHkgYnVuY2ggZnJvbSBJbnRlbDpeKQorICogIERyYWdhbiBTdGFuY2V2aWMgPHZpc2l0b3JAdmFsaW51eC5jb20+LCBNYXkgMjAwMCAKKyAqCisgKiAgRm9yd2FyZCBwb3J0IEFNRCBEdXJvbiBlcnJhdGEgVDEzIGZyb20gMi4yLjE3cHJlCisgKiAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4sIEF1Z3VzdCAyMDAwCisgKgorICogIEZvcndhcmQgcG9ydCBsb3RzIG9mIGZpeGVzL2ltcHJvdmVtZW50cyBmcm9tIDIuMi4xOHByZQorICogIEN5cml4IElJSSwgUGVudGl1bSBJViBzdXBwb3J0LgorICogIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+LCBPY3RvYmVyIDIwMDAKKyAqCisgKiAgTWFzc2l2ZSBjbGVhbnVwIG9mIENQVSBkZXRlY3Rpb24gYW5kIGJ1ZyBoYW5kbGluZzsKKyAqICBUcmFuc21ldGEgQ1BVIGRldGVjdGlvbiwKKyAqICBILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4sIE5vdmVtYmVyIDIwMDAKKyAqCisgKiAgVklBIEMzIFN1cHBvcnQuCisgKiAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4sIE1hcmNoIDIwMDEKKyAqCisgKiAgQU1EIEF0aGxvbi9EdXJvbi9UaHVuZGVyYmlyZCBibHVlc21va2Ugc3VwcG9ydC4KKyAqICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPiwgQXByaWwgMjAwMS4KKyAqCisgKiAgQ2FjaGVTaXplIGJ1ZyB3b3JrYXJvdW5kIHVwZGF0ZXMgZm9yIEFNRCwgSW50ZWwgJiBWSUEgQ3lyaXguCisgKiAgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4sIFNlcHRlbWJlciwgT2N0b2JlciAyMDAxLgorICoKKyAqLworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDVkODIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtMCwwICsxLDYzNCBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8bWFjaF9hcGljLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImNwdS5oIgorCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZGVzY19zdHJ1Y3QsIGNwdV9nZHRfdGFibGVbR0RUX0VOVFJJRVNdKTsKK0VYUE9SVF9QRVJfQ1BVX1NZTUJPTChjcHVfZ2R0X3RhYmxlKTsKKworREVGSU5FX1BFUl9DUFUodW5zaWduZWQgY2hhciwgY3B1XzE2Yml0X3N0YWNrW0NQVV8xNkJJVF9TVEFDS19TSVpFXSk7CitFWFBPUlRfUEVSX0NQVV9TWU1CT0woY3B1XzE2Yml0X3N0YWNrKTsKKworc3RhdGljIGludCBjYWNoZXNpemVfb3ZlcnJpZGUgX19pbml0ZGF0YSA9IC0xOworc3RhdGljIGludCBkaXNhYmxlX3g4Nl9meHNyIF9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCBkaXNhYmxlX3g4Nl9zZXJpYWxfbnIgX19pbml0ZGF0YSA9IDE7CisKK3N0cnVjdCBjcHVfZGV2ICogY3B1X2RldnNbWDg2X1ZFTkRPUl9OVU1dID0ge307CisKK2V4dGVybiB2b2lkIG1jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CisKK2V4dGVybiBpbnQgZGlzYWJsZV9wc2U7CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQoreworCS8qIE5vdCBtdWNoIHdlIGNhbiBkbyBoZXJlLi4uICovCisJLyogQ2hlY2sgaWYgYXQgbGVhc3QgaXQgaGFzIGNwdWlkICovCisJaWYgKGMtPmNwdWlkX2xldmVsID09IC0xKSB7CisJCS8qIE5vIGNwdWlkLiBJdCBtdXN0IGJlIGFuIGFuY2llbnQgQ1BVICovCisJCWlmIChjLT54ODYgPT0gNCkKKwkJCXN0cmNweShjLT54ODZfbW9kZWxfaWQsICI0ODYiKTsKKwkJZWxzZSBpZiAoYy0+eDg2ID09IDMpCisJCQlzdHJjcHkoYy0+eDg2X21vZGVsX2lkLCAiMzg2Iik7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgZGVmYXVsdF9jcHUgPSB7CisJLmNfaW5pdAk9IGRlZmF1bHRfaW5pdCwKK307CitzdGF0aWMgc3RydWN0IGNwdV9kZXYgKiB0aGlzX2NwdSA9ICZkZWZhdWx0X2NwdTsKKworc3RhdGljIGludCBfX2luaXQgY2FjaGVzaXplX3NldHVwKGNoYXIgKnN0cikKK3sKKwlnZXRfb3B0aW9uICgmc3RyLCAmY2FjaGVzaXplX292ZXJyaWRlKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImNhY2hlc2l6ZT0iLCBjYWNoZXNpemVfc2V0dXApOworCitpbnQgX19pbml0IGdldF9tb2RlbF9uYW1lKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBpbnQgKnY7CisJY2hhciAqcCwgKnE7CisKKwlpZiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApIDwgMHg4MDAwMDAwNCkKKwkJcmV0dXJuIDA7CisKKwl2ID0gKHVuc2lnbmVkIGludCAqKSBjLT54ODZfbW9kZWxfaWQ7CisJY3B1aWQoMHg4MDAwMDAwMiwgJnZbMF0sICZ2WzFdLCAmdlsyXSwgJnZbM10pOworCWNwdWlkKDB4ODAwMDAwMDMsICZ2WzRdLCAmdls1XSwgJnZbNl0sICZ2WzddKTsKKwljcHVpZCgweDgwMDAwMDA0LCAmdls4XSwgJnZbOV0sICZ2WzEwXSwgJnZbMTFdKTsKKwljLT54ODZfbW9kZWxfaWRbNDhdID0gMDsKKworCS8qIEludGVsIGNoaXBzIHJpZ2h0LWp1c3RpZnkgdGhpcyBzdHJpbmcgZm9yIHNvbWUgZHVtYiByZWFzb247CisJICAgdW5kbyB0aGF0IGJyYWluIGRhbWFnZSAqLworCXAgPSBxID0gJmMtPng4Nl9tb2RlbF9pZFswXTsKKwl3aGlsZSAoICpwID09ICcgJyApCisJICAgICBwKys7CisJaWYgKCBwICE9IHEgKSB7CisJICAgICB3aGlsZSAoICpwICkKKwkJICAqcSsrID0gKnArKzsKKwkgICAgIHdoaWxlICggcSA8PSAmYy0+eDg2X21vZGVsX2lkWzQ4XSApCisJCSAgKnErKyA9ICdcMCc7CS8qIFplcm8tcGFkIHRoZSByZXN0ICovCisJfQorCisJcmV0dXJuIDE7Cit9CisKKwordm9pZCBfX2luaXQgZGlzcGxheV9jYWNoZWluZm8oc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXVuc2lnbmVkIGludCBuLCBkdW1teSwgZWN4LCBlZHgsIGwyc2l6ZTsKKworCW4gPSBjcHVpZF9lYXgoMHg4MDAwMDAwMCk7CisKKwlpZiAobiA+PSAweDgwMDAwMDA1KSB7CisJCWNwdWlkKDB4ODAwMDAwMDUsICZkdW1teSwgJmR1bW15LCAmZWN4LCAmZWR4KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiBMMSBJIENhY2hlOiAlZEsgKCVkIGJ5dGVzL2xpbmUpLCBEIGNhY2hlICVkSyAoJWQgYnl0ZXMvbGluZSlcbiIsCisJCQllZHg+PjI0LCBlZHgmMHhGRiwgZWN4Pj4yNCwgZWN4JjB4RkYpOworCQljLT54ODZfY2FjaGVfc2l6ZT0oZWN4Pj4yNCkrKGVkeD4+MjQpOwkKKwl9CisKKwlpZiAobiA8IDB4ODAwMDAwMDYpCS8qIFNvbWUgY2hpcHMganVzdCBoYXMgYSBsYXJnZSBMMS4gKi8KKwkJcmV0dXJuOworCisJZWN4ID0gY3B1aWRfZWN4KDB4ODAwMDAwMDYpOworCWwyc2l6ZSA9IGVjeCA+PiAxNjsKKwkKKwkvKiBkbyBwcm9jZXNzb3Itc3BlY2lmaWMgY2FjaGUgcmVzaXppbmcgKi8KKwlpZiAodGhpc19jcHUtPmNfc2l6ZV9jYWNoZSkKKwkJbDJzaXplID0gdGhpc19jcHUtPmNfc2l6ZV9jYWNoZShjLGwyc2l6ZSk7CisKKwkvKiBBbGxvdyB1c2VyIHRvIG92ZXJyaWRlIGFsbCB0aGlzIGlmIG5lY2Vzc2FyeS4gKi8KKwlpZiAoY2FjaGVzaXplX292ZXJyaWRlICE9IC0xKQorCQlsMnNpemUgPSBjYWNoZXNpemVfb3ZlcnJpZGU7CisKKwlpZiAoIGwyc2l6ZSA9PSAwICkKKwkJcmV0dXJuOwkJLyogQWdhaW4sIG5vIEwyIGNhY2hlIGlzIHBvc3NpYmxlICovCisKKwljLT54ODZfY2FjaGVfc2l6ZSA9IGwyc2l6ZTsKKworCXByaW50ayhLRVJOX0lORk8gIkNQVTogTDIgQ2FjaGU6ICVkSyAoJWQgYnl0ZXMvbGluZSlcbiIsCisJICAgICAgIGwyc2l6ZSwgZWN4ICYgMHhGRik7Cit9CisKKy8qIE5hbWluZyBjb252ZW50aW9uIHNob3VsZCBiZTogPE5hbWU+IFsoPENvZGVuYW1lPildICovCisvKiBUaGlzIHRhYmxlIG9ubHkgaXMgdXNlZCB1bmxlc3MgaW5pdF88dmVuZG9yPigpIGJlbG93IGRvZXNuJ3Qgc2V0IGl0OyAqLworLyogaW4gcGFydGljdWxhciwgaWYgQ1BVSUQgbGV2ZWxzIDB4ODAwMDAwMDIuLjQgYXJlIHN1cHBvcnRlZCwgdGhpcyBpc24ndCB1c2VkICovCisKKy8qIExvb2sgdXAgQ1BVIG5hbWVzIGJ5IHRhYmxlIGxvb2t1cC4gKi8KK3N0YXRpYyBjaGFyIF9faW5pdCAqdGFibGVfbG9va3VwX21vZGVsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlzdHJ1Y3QgY3B1X21vZGVsX2luZm8gKmluZm87CisKKwlpZiAoIGMtPng4Nl9tb2RlbCA+PSAxNiApCisJCXJldHVybiBOVUxMOwkvKiBSYW5nZSBjaGVjayAqLworCisJaWYgKCF0aGlzX2NwdSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpbmZvID0gdGhpc19jcHUtPmNfbW9kZWxzOworCisJd2hpbGUgKGluZm8gJiYgaW5mby0+ZmFtaWx5KSB7CisJCWlmIChpbmZvLT5mYW1pbHkgPT0gYy0+eDg2KQorCQkJcmV0dXJuIGluZm8tPm1vZGVsX25hbWVzW2MtPng4Nl9tb2RlbF07CisJCWluZm8rKzsKKwl9CisJcmV0dXJuIE5VTEw7CQkvKiBOb3QgZm91bmQgKi8KK30KKworCit2b2lkIF9faW5pdCBnZXRfY3B1X3ZlbmRvcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMsIGludCBlYXJseSkKK3sKKwljaGFyICp2ID0gYy0+eDg2X3ZlbmRvcl9pZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBYODZfVkVORE9SX05VTTsgaSsrKSB7CisJCWlmIChjcHVfZGV2c1tpXSkgeworCQkJaWYgKCFzdHJjbXAodixjcHVfZGV2c1tpXS0+Y19pZGVudFswXSkgfHwKKwkJCSAgICAoY3B1X2RldnNbaV0tPmNfaWRlbnRbMV0gJiYgCisJCQkgICAgICFzdHJjbXAodixjcHVfZGV2c1tpXS0+Y19pZGVudFsxXSkpKSB7CisJCQkJYy0+eDg2X3ZlbmRvciA9IGk7CisJCQkJaWYgKCFlYXJseSkKKwkJCQkJdGhpc19jcHUgPSBjcHVfZGV2c1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworCitzdGF0aWMgaW50IF9faW5pdCB4ODZfZnhzcl9zZXR1cChjaGFyICogcykKK3sKKwlkaXNhYmxlX3g4Nl9meHNyID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoIm5vZnhzciIsIHg4Nl9meHNyX3NldHVwKTsKKworCisvKiBTdGFuZGFyZCBtYWNybyB0byBzZWUgaWYgYSBzcGVjaWZpYyBmbGFnIGlzIGNoYW5nZWFibGUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZsYWdfaXNfY2hhbmdlYWJsZV9wKHUzMiBmbGFnKQoreworCXUzMiBmMSwgZjI7CisKKwlhc20oInB1c2hmbFxuXHQiCisJICAgICJwdXNoZmxcblx0IgorCSAgICAicG9wbCAlMFxuXHQiCisJICAgICJtb3ZsICUwLCUxXG5cdCIKKwkgICAgInhvcmwgJTIsJTBcblx0IgorCSAgICAicHVzaGwgJTBcblx0IgorCSAgICAicG9wZmxcblx0IgorCSAgICAicHVzaGZsXG5cdCIKKwkgICAgInBvcGwgJTBcblx0IgorCSAgICAicG9wZmxcblx0IgorCSAgICA6ICI9JnIiIChmMSksICI9JnIiIChmMikKKwkgICAgOiAiaXIiIChmbGFnKSk7CisKKwlyZXR1cm4gKChmMV5mMikgJiBmbGFnKSAhPSAwOworfQorCisKKy8qIFByb2JlIGZvciB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyBpbnQgX19pbml0IGhhdmVfY3B1aWRfcCh2b2lkKQoreworCXJldHVybiBmbGFnX2lzX2NoYW5nZWFibGVfcChYODZfRUZMQUdTX0lEKTsKK30KKworLyogRG8gbWluaW11bSBDUFUgZGV0ZWN0aW9uIGVhcmx5LgorICAgRmllbGRzIHJlYWxseSBuZWVkZWQ6IHZlbmRvciwgY3B1aWRfbGV2ZWwsIGZhbWlseSwgbW9kZWwsIG1hc2ssIGNhY2hlIGFsaWdubWVudC4KKyAgIFRoZSBvdGhlcnMgYXJlIG5vdCB0b3VjaGVkIHRvIGF2b2lkIHVud2FudGVkIHNpZGUgZWZmZWN0cy4gKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9jcHVfZGV0ZWN0KHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmJvb3RfY3B1X2RhdGE7CisKKwljLT54ODZfY2FjaGVfYWxpZ25tZW50ID0gMzI7CisKKwlpZiAoIWhhdmVfY3B1aWRfcCgpKQorCQlyZXR1cm47CisKKwkvKiBHZXQgdmVuZG9yIG5hbWUgKi8KKwljcHVpZCgweDAwMDAwMDAwLCAmYy0+Y3B1aWRfbGV2ZWwsCisJICAgICAgKGludCAqKSZjLT54ODZfdmVuZG9yX2lkWzBdLAorCSAgICAgIChpbnQgKikmYy0+eDg2X3ZlbmRvcl9pZFs4XSwKKwkgICAgICAoaW50ICopJmMtPng4Nl92ZW5kb3JfaWRbNF0pOworCisJZ2V0X2NwdV92ZW5kb3IoYywgMSk7CisKKwljLT54ODYgPSA0OworCWlmIChjLT5jcHVpZF9sZXZlbCA+PSAweDAwMDAwMDAxKSB7CisJCXUzMiBqdW5rLCB0Zm1zLCBjYXAwLCBtaXNjOworCQljcHVpZCgweDAwMDAwMDAxLCAmdGZtcywgJm1pc2MsICZqdW5rLCAmY2FwMCk7CisJCWMtPng4NiA9ICh0Zm1zID4+IDgpICYgMTU7CisJCWMtPng4Nl9tb2RlbCA9ICh0Zm1zID4+IDQpICYgMTU7CisJCWlmIChjLT54ODYgPT0gMHhmKSB7CisJCQljLT54ODYgKz0gKHRmbXMgPj4gMjApICYgMHhmZjsKKwkJCWMtPng4Nl9tb2RlbCArPSAoKHRmbXMgPj4gMTYpICYgMHhGKSA8PCA0OworCQl9CisJCWMtPng4Nl9tYXNrID0gdGZtcyAmIDE1OworCQlpZiAoY2FwMCAmICgxPDwxOSkpCisJCQljLT54ODZfY2FjaGVfYWxpZ25tZW50ID0gKChtaXNjID4+IDgpICYgMHhmZikgKiA4OworCX0KKworCWVhcmx5X2ludGVsX3dvcmthcm91bmQoYyk7Cit9CisKK3ZvaWQgX19pbml0IGdlbmVyaWNfaWRlbnRpZnkoc3RydWN0IGNwdWluZm9feDg2ICogYykKK3sKKwl1MzIgdGZtcywgeGx2bDsKKwlpbnQganVuazsKKworCWlmIChoYXZlX2NwdWlkX3AoKSkgeworCQkvKiBHZXQgdmVuZG9yIG5hbWUgKi8KKwkJY3B1aWQoMHgwMDAwMDAwMCwgJmMtPmNwdWlkX2xldmVsLAorCQkgICAgICAoaW50ICopJmMtPng4Nl92ZW5kb3JfaWRbMF0sCisJCSAgICAgIChpbnQgKikmYy0+eDg2X3ZlbmRvcl9pZFs4XSwKKwkJICAgICAgKGludCAqKSZjLT54ODZfdmVuZG9yX2lkWzRdKTsKKwkJCisJCWdldF9jcHVfdmVuZG9yKGMsIDApOworCQkvKiBJbml0aWFsaXplIHRoZSBzdGFuZGFyZCBzZXQgb2YgY2FwYWJpbGl0aWVzICovCisJCS8qIE5vdGUgdGhhdCB0aGUgdmVuZG9yLXNwZWNpZmljIGNvZGUgYmVsb3cgbWlnaHQgb3ZlcnJpZGUgKi8KKwkKKwkJLyogSW50ZWwtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHgwMDAwMDAwMSAqLworCQlpZiAoIGMtPmNwdWlkX2xldmVsID49IDB4MDAwMDAwMDEgKSB7CisJCQl1MzIgY2FwYWJpbGl0eSwgZXhjYXA7CisJCQljcHVpZCgweDAwMDAwMDAxLCAmdGZtcywgJmp1bmssICZleGNhcCwgJmNhcGFiaWxpdHkpOworCQkJYy0+eDg2X2NhcGFiaWxpdHlbMF0gPSBjYXBhYmlsaXR5OworCQkJYy0+eDg2X2NhcGFiaWxpdHlbNF0gPSBleGNhcDsKKwkJCWMtPng4NiA9ICh0Zm1zID4+IDgpICYgMTU7CisJCQljLT54ODZfbW9kZWwgPSAodGZtcyA+PiA0KSAmIDE1OworCQkJaWYgKGMtPng4NiA9PSAweGYpIHsKKwkJCQljLT54ODYgKz0gKHRmbXMgPj4gMjApICYgMHhmZjsKKwkJCQljLT54ODZfbW9kZWwgKz0gKCh0Zm1zID4+IDE2KSAmIDB4RikgPDwgNDsKKwkJCX0gCisJCQljLT54ODZfbWFzayA9IHRmbXMgJiAxNTsKKwkJfSBlbHNlIHsKKwkJCS8qIEhhdmUgQ1BVSUQgbGV2ZWwgMCBvbmx5IC0gdW5oZWFyZCBvZiAqLworCQkJYy0+eDg2ID0gNDsKKwkJfQorCisJCS8qIEFNRC1kZWZpbmVkIGZsYWdzOiBsZXZlbCAweDgwMDAwMDAxICovCisJCXhsdmwgPSBjcHVpZF9lYXgoMHg4MDAwMDAwMCk7CisJCWlmICggKHhsdmwgJiAweGZmZmYwMDAwKSA9PSAweDgwMDAwMDAwICkgeworCQkJaWYgKCB4bHZsID49IDB4ODAwMDAwMDEgKSB7CisJCQkJYy0+eDg2X2NhcGFiaWxpdHlbMV0gPSBjcHVpZF9lZHgoMHg4MDAwMDAwMSk7CisJCQkJYy0+eDg2X2NhcGFiaWxpdHlbNl0gPSBjcHVpZF9lY3goMHg4MDAwMDAwMSk7CisJCQl9CisJCQlpZiAoIHhsdmwgPj0gMHg4MDAwMDAwNCApCisJCQkJZ2V0X21vZGVsX25hbWUoYyk7IC8qIERlZmF1bHQgbmFtZSAqLworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc3F1YXNoX3RoZV9zdHVwaWRfc2VyaWFsX251bWJlcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfUE4pICYmIGRpc2FibGVfeDg2X3NlcmlhbF9uciApIHsKKwkJLyogRGlzYWJsZSBwcm9jZXNzb3Igc2VyaWFsIG51bWJlciAqLworCQl1bnNpZ25lZCBsb25nIGxvLGhpOworCQlyZG1zcihNU1JfSUEzMl9CQkxfQ1JfQ1RMLGxvLGhpKTsKKwkJbG8gfD0gMHgyMDAwMDA7CisJCXdybXNyKE1TUl9JQTMyX0JCTF9DUl9DVEwsbG8saGkpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNQVSBzZXJpYWwgbnVtYmVyIGRpc2FibGVkLlxuIik7CisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9QTiwgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJCS8qIERpc2FibGluZyB0aGUgc2VyaWFsIG51bWJlciBtYXkgYWZmZWN0IHRoZSBjcHVpZCBsZXZlbCAqLworCQljLT5jcHVpZF9sZXZlbCA9IGNwdWlkX2VheCgwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHg4Nl9zZXJpYWxfbnJfc2V0dXAoY2hhciAqcykKK3sKKwlkaXNhYmxlX3g4Nl9zZXJpYWxfbnIgPSAwOworCXJldHVybiAxOworfQorX19zZXR1cCgic2VyaWFsbnVtYmVyIiwgeDg2X3NlcmlhbF9ucl9zZXR1cCk7CisKKworCisvKgorICogVGhpcyBkb2VzIHRoZSBoYXJkIHdvcmsgb2YgYWN0dWFsbHkgcGlja2luZyBhcGFydCB0aGUgQ1BVIHN0dWZmLi4uCisgKi8KK3ZvaWQgX19pbml0IGlkZW50aWZ5X2NwdShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJaW50IGk7CisKKwljLT5sb29wc19wZXJfamlmZnkgPSBsb29wc19wZXJfamlmZnk7CisJYy0+eDg2X2NhY2hlX3NpemUgPSAtMTsKKwljLT54ODZfdmVuZG9yID0gWDg2X1ZFTkRPUl9VTktOT1dOOworCWMtPmNwdWlkX2xldmVsID0gLTE7CS8qIENQVUlEIG5vdCBkZXRlY3RlZCAqLworCWMtPng4Nl9tb2RlbCA9IGMtPng4Nl9tYXNrID0gMDsJLyogU28gZmFyIHVua25vd24uLi4gKi8KKwljLT54ODZfdmVuZG9yX2lkWzBdID0gJ1wwJzsgLyogVW5zZXQgKi8KKwljLT54ODZfbW9kZWxfaWRbMF0gPSAnXDAnOyAgLyogVW5zZXQgKi8KKwljLT54ODZfbnVtX2NvcmVzID0gMTsKKwltZW1zZXQoJmMtPng4Nl9jYXBhYmlsaXR5LCAwLCBzaXplb2YgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJaWYgKCFoYXZlX2NwdWlkX3AoKSkgeworCQkvKiBGaXJzdCBvZiBhbGwsIGRlY2lkZSBpZiB0aGlzIGlzIGEgNDg2IG9yIGhpZ2hlciAqLworCQkvKiBJdCdzIGEgNDg2IGlmIHdlIGNhbiBtb2RpZnkgdGhlIEFDIGZsYWcgKi8KKwkJaWYgKCBmbGFnX2lzX2NoYW5nZWFibGVfcChYODZfRUZMQUdTX0FDKSApCisJCQljLT54ODYgPSA0OworCQllbHNlCisJCQljLT54ODYgPSAzOworCX0KKworCWdlbmVyaWNfaWRlbnRpZnkoYyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiQ1BVOiBBZnRlciBnZW5lcmljIGlkZW50aWZ5LCBjYXBzOiIpOworCWZvciAoaSA9IDA7IGkgPCBOQ0FQSU5UUzsgaSsrKQorCQlwcmludGsoIiAlMDhseCIsIGMtPng4Nl9jYXBhYmlsaXR5W2ldKTsKKwlwcmludGsoIlxuIik7CisKKwlpZiAodGhpc19jcHUtPmNfaWRlbnRpZnkpIHsKKwkJdGhpc19jcHUtPmNfaWRlbnRpZnkoYyk7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNQVTogQWZ0ZXIgdmVuZG9yIGlkZW50aWZ5LCBjYXBzOiIpOworCQlmb3IgKGkgPSAwOyBpIDwgTkNBUElOVFM7IGkrKykKKwkJCXByaW50aygiICUwOGx4IiwgYy0+eDg2X2NhcGFiaWxpdHlbaV0pOworCQlwcmludGsoIlxuIik7CisJfQorCisJLyoKKwkgKiBWZW5kb3Itc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uICBJbiB0aGlzIHNlY3Rpb24gd2UKKwkgKiBjYW5vbmljYWxpemUgdGhlIGZlYXR1cmUgZmxhZ3MsIG1lYW5pbmcgaWYgdGhlcmUgYXJlCisJICogZmVhdHVyZXMgYSBjZXJ0YWluIENQVSBzdXBwb3J0cyB3aGljaCBDUFVJRCBkb2Vzbid0CisJICogdGVsbCB1cywgQ1BVSUQgY2xhaW1pbmcgaW5jb3JyZWN0IGZsYWdzLCBvciBvdGhlciBidWdzLAorCSAqIHdlIGhhbmRsZSB0aGVtIGhlcmUuCisJICoKKwkgKiBBdCB0aGUgZW5kIG9mIHRoaXMgc2VjdGlvbiwgYy0+eDg2X2NhcGFiaWxpdHkgYmV0dGVyCisJICogaW5kaWNhdGUgdGhlIGZlYXR1cmVzIHRoaXMgQ1BVIGdlbnVpbmVseSBzdXBwb3J0cyEKKwkgKi8KKwlpZiAodGhpc19jcHUtPmNfaW5pdCkKKwkJdGhpc19jcHUtPmNfaW5pdChjKTsKKworCS8qIERpc2FibGUgdGhlIFBOIGlmIGFwcHJvcHJpYXRlICovCisJc3F1YXNoX3RoZV9zdHVwaWRfc2VyaWFsX251bWJlcihjKTsKKworCS8qCisJICogVGhlIHZlbmRvci1zcGVjaWZpYyBmdW5jdGlvbnMgbWlnaHQgaGF2ZSBjaGFuZ2VkIGZlYXR1cmVzLiAgTm93CisJICogd2UgZG8gImdlbmVyaWMgY2hhbmdlcy4iCisJICovCisKKwkvKiBUU0MgZGlzYWJsZWQ/ICovCisJaWYgKCB0c2NfZGlzYWJsZSApCisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9UU0MsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKworCS8qIEZYU1IgZGlzYWJsZWQ/ICovCisJaWYgKGRpc2FibGVfeDg2X2Z4c3IpIHsKKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX0ZYU1IsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1hNTSwgYy0+eDg2X2NhcGFiaWxpdHkpOworCX0KKworCWlmIChkaXNhYmxlX3BzZSkKKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1BTRSwgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJLyogSWYgdGhlIG1vZGVsIG5hbWUgaXMgc3RpbGwgdW5zZXQsIGRvIHRhYmxlIGxvb2t1cC4gKi8KKwlpZiAoICFjLT54ODZfbW9kZWxfaWRbMF0gKSB7CisJCWNoYXIgKnA7CisJCXAgPSB0YWJsZV9sb29rdXBfbW9kZWwoYyk7CisJCWlmICggcCApCisJCQlzdHJjcHkoYy0+eDg2X21vZGVsX2lkLCBwKTsKKwkJZWxzZQorCQkJLyogTGFzdCByZXNvcnQuLi4gKi8KKwkJCXNwcmludGYoYy0+eDg2X21vZGVsX2lkLCAiJTAyeC8lMDJ4IiwKKwkJCQljLT54ODZfdmVuZG9yLCBjLT54ODZfbW9kZWwpOworCX0KKworCS8qIE5vdyB0aGUgZmVhdHVyZSBmbGFncyBiZXR0ZXIgcmVmbGVjdCBhY3R1YWwgQ1BVIGZlYXR1cmVzISAqLworCisJcHJpbnRrKEtFUk5fREVCVUcgIkNQVTogQWZ0ZXIgYWxsIGluaXRzLCBjYXBzOiIpOworCWZvciAoaSA9IDA7IGkgPCBOQ0FQSU5UUzsgaSsrKQorCQlwcmludGsoIiAlMDhseCIsIGMtPng4Nl9jYXBhYmlsaXR5W2ldKTsKKwlwcmludGsoIlxuIik7CisKKwkvKgorCSAqIE9uIFNNUCwgYm9vdF9jcHVfZGF0YSBob2xkcyB0aGUgY29tbW9uIGZlYXR1cmUgc2V0IGJldHdlZW4KKwkgKiBhbGwgQ1BVczsgc28gbWFrZSBzdXJlIHRoYXQgd2UgaW5kaWNhdGUgd2hpY2ggZmVhdHVyZXMgYXJlCisJICogY29tbW9uIGJldHdlZW4gdGhlIENQVXMuICBUaGUgZmlyc3QgdGltZSB0aGlzIHJvdXRpbmUgZ2V0cworCSAqIGV4ZWN1dGVkLCBjID09ICZib290X2NwdV9kYXRhLgorCSAqLworCWlmICggYyAhPSAmYm9vdF9jcHVfZGF0YSApIHsKKwkJLyogQU5EIHRoZSBhbHJlYWR5IGFjY3VtdWxhdGVkIGZsYWdzIHdpdGggdGhlc2UgKi8KKwkJZm9yICggaSA9IDAgOyBpIDwgTkNBUElOVFMgOyBpKysgKQorCQkJYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eVtpXSAmPSBjLT54ODZfY2FwYWJpbGl0eVtpXTsKKwl9CisKKwkvKiBJbml0IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIGlmIGF2YWlsYWJsZS4gKi8KKyNpZmRlZiBDT05GSUdfWDg2X01DRQorCW1jaGVja19pbml0KGMpOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfWDg2X0hUCit2b2lkIF9faW5pdCBkZXRlY3RfaHQoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiAJZWF4LCBlYngsIGVjeCwgZWR4OworCWludCAJaW5kZXhfbHNiLCBpbmRleF9tc2IsIHRtcDsKKwlpbnQgCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9IVCkpCisJCXJldHVybjsKKworCWNwdWlkKDEsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCXNtcF9udW1fc2libGluZ3MgPSAoZWJ4ICYgMHhmZjAwMDApID4+IDE2OworCisJaWYgKHNtcF9udW1fc2libGluZ3MgPT0gMSkgeworCQlwcmludGsoS0VSTl9JTkZPICAiQ1BVOiBIeXBlci1UaHJlYWRpbmcgaXMgZGlzYWJsZWRcbiIpOworCX0gZWxzZSBpZiAoc21wX251bV9zaWJsaW5ncyA+IDEgKSB7CisJCWluZGV4X2xzYiA9IDA7CisJCWluZGV4X21zYiA9IDMxOworCisJCWlmIChzbXBfbnVtX3NpYmxpbmdzID4gTlJfQ1BVUykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ1BVOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgdGhlIHNpYmxpbmdzICVkIiwgc21wX251bV9zaWJsaW5ncyk7CisJCQlzbXBfbnVtX3NpYmxpbmdzID0gMTsKKwkJCXJldHVybjsKKwkJfQorCQl0bXAgPSBzbXBfbnVtX3NpYmxpbmdzOworCQl3aGlsZSAoKHRtcCAmIDEpID09IDApIHsKKwkJCXRtcCA+Pj0xIDsKKwkJCWluZGV4X2xzYisrOworCQl9CisJCXRtcCA9IHNtcF9udW1fc2libGluZ3M7CisJCXdoaWxlICgodG1wICYgMHg4MDAwMDAwMCApID09IDApIHsKKwkJCXRtcCA8PD0xIDsKKwkJCWluZGV4X21zYi0tOworCQl9CisJCWlmIChpbmRleF9sc2IgIT0gaW5kZXhfbXNiICkKKwkJCWluZGV4X21zYisrOworCQlwaHlzX3Byb2NfaWRbY3B1XSA9IHBoeXNfcGtnX2lkKChlYnggPj4gMjQpICYgMHhGRiwgaW5kZXhfbXNiKTsKKworCQlwcmludGsoS0VSTl9JTkZPICAiQ1BVOiBQaHlzaWNhbCBQcm9jZXNzb3IgSUQ6ICVkXG4iLAorCQkgICAgICAgcGh5c19wcm9jX2lkW2NwdV0pOworCX0KK30KKyNlbmRpZgorCit2b2lkIF9faW5pdCBwcmludF9jcHVfaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJY2hhciAqdmVuZG9yID0gTlVMTDsKKworCWlmIChjLT54ODZfdmVuZG9yIDwgWDg2X1ZFTkRPUl9OVU0pCisJCXZlbmRvciA9IHRoaXNfY3B1LT5jX3ZlbmRvcjsKKwllbHNlIGlmIChjLT5jcHVpZF9sZXZlbCA+PSAwKQorCQl2ZW5kb3IgPSBjLT54ODZfdmVuZG9yX2lkOworCisJaWYgKHZlbmRvciAmJiBzdHJuY21wKGMtPng4Nl9tb2RlbF9pZCwgdmVuZG9yLCBzdHJsZW4odmVuZG9yKSkpCisJCXByaW50aygiJXMgIiwgdmVuZG9yKTsKKworCWlmICghYy0+eDg2X21vZGVsX2lkWzBdKQorCQlwcmludGsoIiVkODYiLCBjLT54ODYpOworCWVsc2UKKwkJcHJpbnRrKCIlcyIsIGMtPng4Nl9tb2RlbF9pZCk7CisKKwlpZiAoYy0+eDg2X21hc2sgfHwgYy0+Y3B1aWRfbGV2ZWwgPj0gMCkgCisJCXByaW50aygiIHN0ZXBwaW5nICUwMnhcbiIsIGMtPng4Nl9tYXNrKTsKKwllbHNlCisJCXByaW50aygiXG4iKTsKK30KKworY3B1bWFza190IGNwdV9pbml0aWFsaXplZCBfX2luaXRkYXRhID0gQ1BVX01BU0tfTk9ORTsKKworLyogVGhpcyBpcyBoYWNreS4gOikKKyAqIFdlJ3JlIGVtdWxhdGluZyBmdXR1cmUgYmVoYXZpb3IuCisgKiBJbiB0aGUgZnV0dXJlLCB0aGUgY3B1LXNwZWNpZmljIGluaXQgZnVuY3Rpb25zIHdpbGwgYmUgY2FsbGVkIGltcGxpY2l0bHkKKyAqIHZpYSB0aGUgbWFnaWMgb2YgaW5pdGNhbGxzLgorICogVGhleSB3aWxsIGluc2VydCB0aGVtc2VsdmVzIGludG8gdGhlIGNwdV9kZXZzIHN0cnVjdHVyZS4KKyAqIFRoZW4sIHdoZW4gY3B1X2luaXQoKSBpcyBjYWxsZWQsIHdlIGNhbiBqdXN0IGl0ZXJhdGUgb3ZlciB0aGF0IGFycmF5LgorICovCisKK2V4dGVybiBpbnQgaW50ZWxfY3B1X2luaXQodm9pZCk7CitleHRlcm4gaW50IGN5cml4X2luaXRfY3B1KHZvaWQpOworZXh0ZXJuIGludCBuc2NfaW5pdF9jcHUodm9pZCk7CitleHRlcm4gaW50IGFtZF9pbml0X2NwdSh2b2lkKTsKK2V4dGVybiBpbnQgY2VudGF1cl9pbml0X2NwdSh2b2lkKTsKK2V4dGVybiBpbnQgdHJhbnNtZXRhX2luaXRfY3B1KHZvaWQpOworZXh0ZXJuIGludCByaXNlX2luaXRfY3B1KHZvaWQpOworZXh0ZXJuIGludCBuZXhnZW5faW5pdF9jcHUodm9pZCk7CitleHRlcm4gaW50IHVtY19pbml0X2NwdSh2b2lkKTsKKwordm9pZCBfX2luaXQgZWFybHlfY3B1X2luaXQodm9pZCkKK3sKKwlpbnRlbF9jcHVfaW5pdCgpOworCWN5cml4X2luaXRfY3B1KCk7CisJbnNjX2luaXRfY3B1KCk7CisJYW1kX2luaXRfY3B1KCk7CisJY2VudGF1cl9pbml0X2NwdSgpOworCXRyYW5zbWV0YV9pbml0X2NwdSgpOworCXJpc2VfaW5pdF9jcHUoKTsKKwluZXhnZW5faW5pdF9jcHUoKTsKKwl1bWNfaW5pdF9jcHUoKTsKKwllYXJseV9jcHVfZGV0ZWN0KCk7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCisJLyogcHNlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb24tdGhlLWZseSB1bm1hcHBpbmcsCisJICogZGlzYWJsZSBpdCBldmVuIGlmIHRoZSBjcHVzIGNsYWltIHRvIHN1cHBvcnQgaXQuCisJICovCisJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1BTRSwgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7CisJZGlzYWJsZV9wc2UgPSAxOworI2VuZGlmCit9CisvKgorICogY3B1X2luaXQoKSBpbml0aWFsaXplcyBzdGF0ZSB0aGF0IGlzIHBlci1DUFUuIFNvbWUgZGF0YSBpcyBhbHJlYWR5CisgKiBpbml0aWFsaXplZCAobmF0dXJhbGx5KSBpbiB0aGUgYm9vdHN0cmFwIHByb2Nlc3MsIHN1Y2ggYXMgdGhlIEdEVAorICogYW5kIElEVC4gV2UgcmVsb2FkIHRoZW0gbmV2ZXJ0aGVsZXNzLCB0aGlzIGZ1bmN0aW9uIGFjdHMgYXMgYQorICogJ0NQVSBzdGF0ZSBiYXJyaWVyJywgbm90aGluZyBzaG91bGQgZ2V0IGFjcm9zcy4KKyAqLwordm9pZCBfX2luaXQgY3B1X2luaXQgKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqIHQgPSAmcGVyX2NwdShpbml0X3RzcywgY3B1KTsKKwlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkID0gJmN1cnJlbnQtPnRocmVhZDsKKwlfX3UzMiBzdGsxNl9vZmYgPSAoX191MzIpJnBlcl9jcHUoY3B1XzE2Yml0X3N0YWNrLCBjcHUpOworCisJaWYgKGNwdV90ZXN0X2FuZF9zZXQoY3B1LCBjcHVfaW5pdGlhbGl6ZWQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNQVSMlZCBhbHJlYWR5IGluaXRpYWxpemVkIVxuIiwgY3B1KTsKKwkJZm9yICg7OykgbG9jYWxfaXJxX2VuYWJsZSgpOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXppbmcgQ1BVIyVkXG4iLCBjcHUpOworCisJaWYgKGNwdV9oYXNfdm1lIHx8IGNwdV9oYXNfdHNjIHx8IGNwdV9oYXNfZGUpCisJCWNsZWFyX2luX2NyNChYODZfQ1I0X1ZNRXxYODZfQ1I0X1BWSXxYODZfQ1I0X1RTRHxYODZfQ1I0X0RFKTsKKwlpZiAodHNjX2Rpc2FibGUgJiYgY3B1X2hhc190c2MpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJEaXNhYmxpbmcgVFNDLi4uXG4iKTsKKwkJLyoqKiogRklYLUhQQTogRE9FUyBUSElTIFJFQUxMWSBCRUxPTkcgSEVSRT8gKioqKi8KKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1RTQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7CisJCXNldF9pbl9jcjQoWDg2X0NSNF9UU0QpOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcGVyLUNQVSBHRFQgd2l0aCB0aGUgYm9vdCBHRFQsCisJICogYW5kIHNldCB1cCB0aGUgR0RUIGRlc2NyaXB0b3I6CisJICovCisJbWVtY3B5KCZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGNwdSksIGNwdV9nZHRfdGFibGUsCisJICAgICAgIEdEVF9TSVpFKTsKKworCS8qIFNldCB1cCBHRFQgZW50cnkgZm9yIDE2Yml0IHN0YWNrICovCisJKihfX3U2NCAqKSYocGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpW0dEVF9FTlRSWV9FU1BGSVhfU1NdKSB8PQorCQkoKCgoX191NjQpc3RrMTZfb2ZmKSA8PCAxNikgJiAweDAwMDAwMGZmZmZmZjAwMDBVTEwpIHwKKwkJKCgoKF9fdTY0KXN0azE2X29mZikgPDwgMzIpICYgMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSB8CisJCShDUFVfMTZCSVRfU1RBQ0tfU0laRSAtIDEpOworCisJY3B1X2dkdF9kZXNjcltjcHVdLnNpemUgPSBHRFRfU0laRSAtIDE7CisJY3B1X2dkdF9kZXNjcltjcHVdLmFkZHJlc3MgPQorCSAgICAodW5zaWduZWQgbG9uZykmcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIHBlci10aHJlYWQgVExTIGRlc2NyaXB0b3IgY2FjaGU6CisJICovCisJbWVtY3B5KHRocmVhZC0+dGxzX2FycmF5LCAmcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpLAorCQlHRFRfRU5UUllfVExTX0VOVFJJRVMgKiA4KTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZ2R0ICUwIiA6IDogIm0iIChjcHVfZ2R0X2Rlc2NyW2NwdV0pKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGlkdCAlMCIgOiA6ICJtIiAoaWR0X2Rlc2NyKSk7CisKKwkvKgorCSAqIERlbGV0ZSBOVAorCSAqLworCV9fYXNtX18oInB1c2hmbCA7IGFuZGwgJDB4ZmZmZmJmZmYsKCVlc3ApIDsgcG9wZmwiKTsKKworCS8qCisJICogU2V0IHVwIGFuZCBsb2FkIHRoZSBwZXItQ1BVIFRTUyBhbmQgTERUCisJICovCisJYXRvbWljX2luYygmaW5pdF9tbS5tbV9jb3VudCk7CisJY3VycmVudC0+YWN0aXZlX21tID0gJmluaXRfbW07CisJaWYgKGN1cnJlbnQtPm1tKQorCQlCVUcoKTsKKwllbnRlcl9sYXp5X3RsYigmaW5pdF9tbSwgY3VycmVudCk7CisKKwlsb2FkX2VzcDAodCwgdGhyZWFkKTsKKwlzZXRfdHNzX2Rlc2MoY3B1LHQpOworCWxvYWRfVFJfZGVzYygpOworCWxvYWRfTERUKCZpbml0X21tLmNvbnRleHQpOworCisJLyogU2V0IHVwIGRvdWJsZWZhdWx0IFRTUyBwb2ludGVyIGluIHRoZSBHRFQgKi8KKwlfX3NldF90c3NfZGVzYyhjcHUsIEdEVF9FTlRSWV9ET1VCTEVGQVVMVF9UU1MsICZkb3VibGVmYXVsdF90c3MpOworCisJLyogQ2xlYXIgJWZzIGFuZCAlZ3MuICovCisJYXNtIHZvbGF0aWxlICgieG9ybCAlZWF4LCAlZWF4OyBtb3ZsICVlYXgsICVmczsgbW92bCAlZWF4LCAlZ3MiKTsKKworCS8qIENsZWFyIGFsbCA2IGRlYnVnIHJlZ2lzdGVyczogKi8KKworI2RlZmluZSBDRChyZWdpc3RlcikgX19hc21fXygibW92bCAlMCwlJWRiIiAjcmVnaXN0ZXIgOjoiciIoMCkgKTsKKworCUNEKDApOyBDRCgxKTsgQ0QoMik7IENEKDMpOyAvKiBubyBkYjQgYW5kIGRiNSAqLzsgQ0QoNik7IENEKDcpOworCisjdW5kZWYgQ0QKKworCS8qCisJICogRm9yY2UgRlBVIGluaXRpYWxpemF0aW9uOgorCSAqLworCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzID0gMDsKKwljbGVhcl91c2VkX21hdGgoKTsKKwlteGNzcl9mZWF0dXJlX21hc2tfaW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1LmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTFkNGYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1LmgKQEAgLTAsMCArMSwzMCBAQAorCitzdHJ1Y3QgY3B1X21vZGVsX2luZm8geworCWludCB2ZW5kb3I7CisJaW50IGZhbWlseTsKKwljaGFyICptb2RlbF9uYW1lc1sxNl07Cit9OworCisvKiBhdHRlbXB0IHRvIGNvbnNvbGlkYXRlIGNwdSBhdHRyaWJ1dGVzICovCitzdHJ1Y3QgY3B1X2RldiB7CisJY2hhcgkqIGNfdmVuZG9yOworCisJLyogc29tZSBoYXZlIHR3byBwb3NzaWJpbGl0aWVzIGZvciBjcHVpZCBzdHJpbmcgKi8KKwljaGFyCSogY19pZGVudFsyXTsJCisKKwlzdHJ1Y3QJCWNwdV9tb2RlbF9pbmZvIGNfbW9kZWxzWzRdOworCisJdm9pZAkJKCpjX2luaXQpKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpOworCXZvaWQJCSgqY19pZGVudGlmeSkoc3RydWN0IGNwdWluZm9feDg2ICogYyk7CisJdW5zaWduZWQgaW50CSgqY19zaXplX2NhY2hlKShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjLCB1bnNpZ25lZCBpbnQgc2l6ZSk7Cit9OworCitleHRlcm4gc3RydWN0IGNwdV9kZXYgKiBjcHVfZGV2cyBbWDg2X1ZFTkRPUl9OVU1dOworCitleHRlcm4gaW50IGdldF9tb2RlbF9uYW1lKHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CitleHRlcm4gdm9pZCBkaXNwbGF5X2NhY2hlaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOworCitleHRlcm4gdm9pZCBnZW5lcmljX2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpOworCitleHRlcm4gdm9pZCBlYXJseV9pbnRlbF93b3JrYXJvdW5kKHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjVmZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCkBAIC0wLDAgKzEsMjMxIEBACisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworCittZW51ICJDUFUgRnJlcXVlbmN5IHNjYWxpbmciCisKK3NvdXJjZSAiZHJpdmVycy9jcHVmcmVxL0tjb25maWciCisKK2lmIENQVV9GUkVRCisKK2NvbW1lbnQgIkNQVUZyZXEgcHJvY2Vzc29yIGRyaXZlcnMiCisKK2NvbmZpZyBYODZfQUNQSV9DUFVGUkVRCisJdHJpc3RhdGUgIkFDUEkgUHJvY2Vzc29yIFAtU3RhdGVzIGRyaXZlciIKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwlkZXBlbmRzIG9uIEFDUElfUFJPQ0VTU09SCisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyBhIENQVUZyZXEgZHJpdmVyIHdoaWNoIHV0aWxpemVzIHRoZSBBQ1BJCisJICBQcm9jZXNzb3IgUGVyZm9ybWFuY2UgU3RhdGVzLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBFTEFOX0NQVUZSRVEKKwl0cmlzdGF0ZSAiQU1EIEVsYW4iCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVwZW5kcyBvbiBYODZfRUxBTgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIEFNRCBFbGFuIFNDNDAwIGFuZCBTQzQxMAorCSAgcHJvY2Vzc29ycy4KKworCSAgWW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgcHJvY2Vzc29yIG1heGltdW0gc3BlZWQgYXMgYm9vdAorCSAgcGFyYW1ldGVyOiBlbGFuZnJlcT1tYXhzcGVlZCAoaW4ga0h6KSBvciBhcyBtb2R1bGUKKwkgIHBhcmFtZXRlciAibWF4X2ZyZXEiLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfUE9XRVJOT1dfSzYKKwl0cmlzdGF0ZSAiQU1EIE1vYmlsZSBLNi0yL0s2LTMgUG93ZXJOb3chIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIG1vYmlsZSBBTUQgSzYtMisgYW5kIG1vYmlsZQorCSAgQU1EIEs2LTMrIHByb2Nlc3NvcnMuCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9QT1dFUk5PV19LNworCXRyaXN0YXRlICJBTUQgTW9iaWxlIEF0aGxvbi9EdXJvbiBQb3dlck5vdyEiCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgbW9iaWxlIEFNRCBLNyBtb2JpbGUgcHJvY2Vzc29ycy4KKworCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X1BPV0VSTk9XX0s3X0FDUEkKKwlib29sCisJZGVwZW5kcyBvbiBYODZfUE9XRVJOT1dfSzcgJiYgQUNQSV9QUk9DRVNTT1IKKwlkZXBlbmRzIG9uICEoWDg2X1BPV0VSTk9XX0s3ID0geSAmJiBBQ1BJX1BST0NFU1NPUiA9IG0pCisJZGVmYXVsdCB5CisKK2NvbmZpZyBYODZfUE9XRVJOT1dfSzgKKwl0cmlzdGF0ZSAiQU1EIE9wdGVyb24vQXRobG9uNjQgUG93ZXJOb3chIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgbW9iaWxlIEFNRCBPcHRlcm9uL0F0aGxvbjY0IHByb2Nlc3NvcnMuCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9QT1dFUk5PV19LOF9BQ1BJCisJYm9vbAorCWRlcGVuZHMgb24gWDg2X1BPV0VSTk9XX0s4ICYmIEFDUElfUFJPQ0VTU09SCisJZGVwZW5kcyBvbiAhKFg4Nl9QT1dFUk5PV19LOCA9IHkgJiYgQUNQSV9QUk9DRVNTT1IgPSBtKQorCWRlZmF1bHQgeQorCitjb25maWcgWDg2X0dYX1NVU1BNT0QKKwl0cmlzdGF0ZSAiQ3lyaXggTWVkaWFHWC9OYXRTZW1pIEdlb2RlIFN1c3BlbmQgTW9kdWxhdGlvbiIKKwloZWxwCisJIFRoaXMgYWRkIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgTmF0U2VtaSBHZW9kZSBwcm9jZXNzb3JzIHdoaWNoCisJIHN1cHBvcnQgc3VzcGVuZCBtb2R1bGF0aW9uLgorCisJIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X1NQRUVEU1RFUF9DRU5UUklOTworCXRyaXN0YXRlICJJbnRlbCBFbmhhbmNlZCBTcGVlZFN0ZXAiCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJc2VsZWN0IFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fVEFCTEUgaWYgKCFYODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkpCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgRW5oYW5jZWQgU3BlZWRTdGVwIGVuYWJsZWQKKwkgIG1vYmlsZSBDUFVzLiAgVGhpcyBtZWFucyBJbnRlbCBQZW50aXVtIE0gKENlbnRyaW5vKSBDUFVzLiBIb3dldmVyLAorCSAgeW91IGFsc28gbmVlZCB0byBzYXkgWSB0byAiVXNlIEFDUEkgdGFibGVzIHRvIGRlY29kZS4uLiIgYmVsb3cKKwkgIFt3aGljaCBtaWdodCBpbXBseSBlbmFibGluZyBBQ1BJXSBpZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBkcml2ZXIKKwkgIG9uIG5vbi1CYW5pYXMgQ1BVcy4KKwkgIAorCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXEvPi4KKwkgIAorCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJCisJYm9vbCAiVXNlIEFDUEkgdGFibGVzIHRvIGRlY29kZSB2YWxpZCBmcmVxdWVuY3kvdm9sdGFnZSBwYWlycyIKKwlkZXBlbmRzIG9uIFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk8gJiYgQUNQSV9QUk9DRVNTT1IKKwlkZXBlbmRzIG9uICEoWDg2X1NQRUVEU1RFUF9DRU5UUklOTyA9IHkgJiYgQUNQSV9QUk9DRVNTT1IgPSBtKQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFVzZSBwcmltYXJpbHkgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIHRoZSBCSU9TIEFDUEkgdGFibGVzCisJICB0byBkZXRlcm1pbmUgdmFsaWQgQ1BVIGZyZXF1ZW5jeSBhbmQgdm9sdGFnZSBwYWlyaW5ncy4gSXQgaXMKKwkgIHJlcXVpcmVkIGZvciB0aGUgZHJpdmVyIHRvIHdvcmsgb24gbm9uLUJhbmlhcyBDUFVzLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkuCisKK2NvbmZpZyBYODZfU1BFRURTVEVQX0NFTlRSSU5PX1RBQkxFCisJYm9vbCAiQnVpbHQtaW4gdGFibGVzIGZvciBCYW5pYXMgQ1BVcyIKKwlkZXBlbmRzIG9uIFg4Nl9TUEVFRFNURVBfQ0VOVFJJTk8KKwlkZWZhdWx0IHkKKwloZWxwCisJICBVc2UgYnVpbHQtaW4gdGFibGVzIGZvciBCYW5pYXMgQ1BVcyBpZiBBQ1BJIGVuY29kaW5nCisJICBpcyBub3QgYXZhaWxhYmxlLgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfU1BFRURTVEVQX0lDSAorCXRyaXN0YXRlICJJbnRlbCBTcGVlZHN0ZXAgb24gSUNILU0gY2hpcHNldHMgKGlvcG9ydCBpbnRlcmZhY2UpIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIGNlcnRhaW4gbW9iaWxlIEludGVsIFBlbnRpdW0gSUlJCisJICAoQ29wcGVybWluZSksIGFsbCBtb2JpbGUgSW50ZWwgUGVudGl1bSBJSUktTSAoVHVhbGF0aW4pIGFuZCBhbGwKKwkgIG1vYmlsZSBJbnRlbCBQZW50aXVtIDQgUDQtTSBvbiBzeXN0ZW1zIHdoaWNoIGhhdmUgYW4gSW50ZWwgSUNIMiwgCisJICBJQ0gzIG9yIElDSDQgc291dGhicmlkZ2UuCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9TUEVFRFNURVBfU01JCisJdHJpc3RhdGUgIkludGVsIFNwZWVkU3RlcCBvbiA0NDBCWC9aWC9NWCBjaGlwc2V0cyAoU01JIGludGVyZmFjZSkiCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBjZXJ0YWluIG1vYmlsZSBJbnRlbCBQZW50aXVtIElJSQorCSAgKENvcHBlcm1pbmUpLCBhbGwgbW9iaWxlIEludGVsIFBlbnRpdW0gSUlJLU0gKFR1YWxhdGluKSAgCisJICBvbiBzeXN0ZW1zIHdoaWNoIGhhdmUgYW4gSW50ZWwgNDQwQlgvWlgvTVggc291dGhicmlkZ2UuCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9QNF9DTE9DS01PRAorCXRyaXN0YXRlICJJbnRlbCBQZW50aXVtIDQgY2xvY2sgbW9kdWxhdGlvbiIKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBJbnRlbCBQZW50aXVtIDQgLyBYRU9OCisJICBwcm9jZXNzb3JzLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfQ1BVRlJFUV9ORk9SQ0UyCisJdHJpc3RhdGUgIm5WaWRpYSBuRm9yY2UyIEZTQiBjaGFuZ2luZyIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIEZTQiBjaGFuZ2luZyBvbiBuVmlkaWEgbkZvcmNlMgorCSAgcGxhdGZvcm1zLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBYODZfTE9OR1JVTgorCXRyaXN0YXRlICJUcmFuc21ldGEgTG9uZ1J1biIKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBUcmFuc21ldGEgQ3J1c29lIGFuZCBFZmZpY2VvbiBwcm9jZXNzb3JzCisJICB3aGljaCBzdXBwb3J0IExvbmdSdW4uCisKKwkgIEZvciBkZXRhaWxzLCB0YWtlIGEgbG9vayBhdCA8ZmlsZTpEb2N1bWVudGF0aW9uL2NwdS1mcmVxLz4uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFg4Nl9MT05HSEFVTAorCXRyaXN0YXRlICJWSUEgQ3lyaXggSUlJIExvbmdoYXVsIgorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIFZJQSBTYW11ZWwvQ3lyaXhJSUksIAorCSAgVklBIEN5cml4IFNhbXVlbC9DMywgVklBIEN5cml4IEV6cmEgYW5kIFZJQSBDeXJpeCBFenJhLVQgCisJICBwcm9jZXNzb3JzLgorCisJICBGb3IgZGV0YWlscywgdGFrZSBhIGxvb2sgYXQgPGZpbGU6RG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8+LgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbW1lbnQgInNoYXJlZCBvcHRpb25zIgorCitjb25maWcgWDg2X0FDUElfQ1BVRlJFUV9QUk9DX0lOVEYKKyAgICAgICAgYm9vbCAiL3Byb2MvYWNwaS9wcm9jZXNzb3IvLi4vcGVyZm9ybWFuY2UgaW50ZXJmYWNlIChkZXByZWNhdGVkKSIKKwlkZXBlbmRzIG9uIFBST0NfRlMKKwlkZXBlbmRzIG9uIFg4Nl9BQ1BJX0NQVUZSRVEgfHwgWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJIHx8IFg4Nl9QT1dFUk5PV19LN19BQ1BJIHx8IFg4Nl9QT1dFUk5PV19LOF9BQ1BJCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSBkZXByZWNhdGVkIC9wcm9jL2FjcGkvcHJvY2Vzc29yLy4uL3BlcmZvcm1hbmNlIAorCSAgaW50ZXJmYWNlLiBXaGlsZSBpdCBpcyBoZWxwZnVsIGZvciBkZWJ1Z2dpbmcsIHRoZSBnZW5lcmljLAorCSAgY3Jvc3MtYXJjaGl0ZWN0dXJlIGNwdWZyZXEgaW50ZXJmYWNlcyBzaG91bGQgYmUgdXNlZC4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgWDg2X1NQRUVEU1RFUF9MSUIKKwl0cmlzdGF0ZQorCWRlZmF1bHQgWDg2X1NQRUVEU1RFUF9JQ0ggfHwgWDg2X1NQRUVEU1RFUF9TTUkgfHwgWDg2X1A0X0NMT0NLTU9ECisKK2NvbmZpZyBYODZfU1BFRURTVEVQX1JFTEFYRURfQ0FQX0NIRUNLCisJYm9vbCAiUmVsYXhlZCBzcGVlZHN0ZXAgY2FwYWJpbGl0eSBjaGVja3MiCisJZGVwZW5kcyBvbiAoWDg2X1NQRUVEU1RFUF9TTUkgfHwgWDg2X1NQRUVEU1RFUF9JQ0gpCisJaGVscAorCSAgRG9uJ3QgcGVyZm9ybSBhbGwgY2hlY2tzIGZvciBhIHNwZWVkc3RlcCBjYXBhYmxlIHN5c3RlbSB3aGljaCB3b3VsZCAKKwkgIG5vcm1hbGx5IGJlIGRvbmUuIFNvbWUgYW5jaWVudCBvciBzdHJhbmdlIHN5c3RlbXMsIHRob3VnaCBzcGVlZHN0ZXAgCisJICBjYXBhYmxlLCBkb24ndCBhbHdheXMgaW5kaWNhdGUgdGhhdCB0aGV5IGFyZSBzcGVlZHN0ZXAgY2FwYWJsZS4gVGhpcyAKKwkgIG9wdGlvbiBsZXRzIHRoZSBwcm9iaW5nIGNvZGUgYnlwYXNzIHNvbWUgb2YgdGhvc2UgY2hlY2tzIGlmIHRoZQorCSAgcGFyYW1ldGVyICJyZWxheGVkX2NoZWNrPTEiIGlzIHBhc3NlZCB0byB0aGUgbW9kdWxlLgorCitlbmRpZgkjIENQVV9GUkVRCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MjJlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKK29iai0kKENPTkZJR19YODZfUE9XRVJOT1dfSzYpCQkrPSBwb3dlcm5vdy1rNi5vCitvYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s3KQkJKz0gcG93ZXJub3ctazcubworb2JqLSQoQ09ORklHX1g4Nl9QT1dFUk5PV19LOCkJCSs9IHBvd2Vybm93LWs4Lm8KK29iai0kKENPTkZJR19YODZfTE9OR0hBVUwpCQkrPSBsb25naGF1bC5vCitvYmotJChDT05GSUdfRUxBTl9DUFVGUkVRKQkJKz0gZWxhbmZyZXEubworb2JqLSQoQ09ORklHX1g4Nl9MT05HUlVOKQkJKz0gbG9uZ3J1bi5vICAKK29iai0kKENPTkZJR19YODZfR1hfU1VTUE1PRCkJCSs9IGd4LXN1c3Btb2Qubworb2JqLSQoQ09ORklHX1g4Nl9TUEVFRFNURVBfSUNIKQkJKz0gc3BlZWRzdGVwLWljaC5vCitvYmotJChDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOTykJKz0gc3BlZWRzdGVwLWNlbnRyaW5vLm8KK29iai0kKENPTkZJR19YODZfU1BFRURTVEVQX0xJQikJCSs9IHNwZWVkc3RlcC1saWIubworb2JqLSQoQ09ORklHX1g4Nl9TUEVFRFNURVBfU01JKQkJKz0gc3BlZWRzdGVwLXNtaS5vCitvYmotJChDT05GSUdfWDg2X0FDUElfQ1BVRlJFUSkJCSs9IGFjcGktY3B1ZnJlcS5vCitvYmotJChDT05GSUdfWDg2X1A0X0NMT0NLTU9EKQkJKz0gcDQtY2xvY2ttb2Qubworb2JqLSQoQ09ORklHX1g4Nl9DUFVGUkVRX05GT1JDRTIpCSs9IGNwdWZyZXEtbmZvcmNlMi5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjNlMTdhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwpAQCAtMCwwICsxLDUzNyBAQAorLyoKKyAqIGFjcGktY3B1ZnJlcS5jIC0gQUNQSSBQcm9jZXNzb3IgUC1TdGF0ZXMgRHJpdmVyICgkUmV2aXNpb246IDEuMyAkKQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgQW5keSBHcm92ZXIgPGFuZHJldy5ncm92ZXJAaW50ZWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBQYXVsIERpZWZlbmJhdWdoIDxwYXVsLnMuZGllZmVuYmF1Z2hAaW50ZWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDQgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgInNwZWVkc3RlcC1lc3QtY29tbW9uLmgiCisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAiYWNwaS1jcHVmcmVxIiwgbXNnKQorCitNT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoLCBEb21pbmlrIEJyb2Rvd3NraSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIFByb2Nlc3NvciBQLVN0YXRlcyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvIHsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UJYWNwaV9kYXRhOworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZQkJKmZyZXFfdGFibGU7CisJdW5zaWduZWQgaW50CQkJCXJlc3VtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvCSphY3BpX2lvX2RhdGFbTlJfQ1BVU107CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgYWNwaV9jcHVmcmVxX2RyaXZlcjsKKworc3RhdGljIGludAorYWNwaV9wcm9jZXNzb3Jfd3JpdGVfcG9ydCgKKwl1MTYJcG9ydCwKKwl1OAliaXRfd2lkdGgsCisJdTMyCXZhbHVlKQoreworCWlmIChiaXRfd2lkdGggPD0gOCkgeworCQlvdXRiKHZhbHVlLCBwb3J0KTsKKwl9IGVsc2UgaWYgKGJpdF93aWR0aCA8PSAxNikgeworCQlvdXR3KHZhbHVlLCBwb3J0KTsKKwl9IGVsc2UgaWYgKGJpdF93aWR0aCA8PSAzMikgeworCQlvdXRsKHZhbHVlLCBwb3J0KTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FjcGlfcHJvY2Vzc29yX3JlYWRfcG9ydCgKKwl1MTYJcG9ydCwKKwl1OAliaXRfd2lkdGgsCisJdTMyCSpyZXQpCit7CisJKnJldCA9IDA7CisJaWYgKGJpdF93aWR0aCA8PSA4KSB7CisJCSpyZXQgPSBpbmIocG9ydCk7CisJfSBlbHNlIGlmIChiaXRfd2lkdGggPD0gMTYpIHsKKwkJKnJldCA9IGludyhwb3J0KTsKKwl9IGVsc2UgaWYgKGJpdF93aWR0aCA8PSAzMikgeworCQkqcmV0ID0gaW5sKHBvcnQpOworCX0gZWxzZSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWNwaV9wcm9jZXNzb3Jfc2V0X3BlcmZvcm1hbmNlICgKKwlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvCSpkYXRhLAorCXVuc2lnbmVkIGludAkJY3B1LAorCWludAkJCXN0YXRlKQoreworCXUxNgkJCXBvcnQgPSAwOworCXU4CQkJYml0X3dpZHRoID0gMDsKKwlpbnQJCQlyZXQgPSAwOworCXUzMgkJCXZhbHVlID0gMDsKKwlpbnQJCQlpID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAgICBjcHVmcmVxX2ZyZXFzOworCWNwdW1hc2tfdAkJc2F2ZWRfbWFzazsKKwlpbnQJCQlyZXR2YWw7CisKKwlkcHJpbnRrKCJhY3BpX3Byb2Nlc3Nvcl9zZXRfcGVyZm9ybWFuY2VcbiIpOworCisJLyoKKwkgKiBUQkQ6IFVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXRfY3B1c19hbGxvd2VkLgorCSAqIEFzIHNldF9jcHVzX2FsbG93ZWQgaXMgYSBiaXQgcmFjeSwgCisJICogd2l0aCBhbnkgb3RoZXIgc2V0X2NwdXNfYWxsb3dlZCBmb3IgdGhpcyBwcm9jZXNzLgorCSAqLworCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSkgeworCQlyZXR1cm4gKC1FQUdBSU4pOworCX0KKwkKKwlpZiAoc3RhdGUgPT0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlKSB7CisJCWlmICh1bmxpa2VseShkYXRhLT5yZXN1bWUpKSB7CisJCQlkcHJpbnRrKCJDYWxsZWQgYWZ0ZXIgcmVzdW1lLCByZXNldHRpbmcgdG8gUCVkXG4iLCBzdGF0ZSk7CisJCQlkYXRhLT5yZXN1bWUgPSAwOworCQl9IGVsc2UgeworCQkJZHByaW50aygiQWxyZWFkeSBhdCB0YXJnZXQgc3RhdGUgKFAlZClcbiIsIHN0YXRlKTsKKwkJCXJldHZhbCA9IDA7CisJCQlnb3RvIG1pZ3JhdGVfZW5kOworCQl9CisJfQorCisJZHByaW50aygiVHJhbnNpdGlvbmluZyBmcm9tIFAlZCB0byBQJWRcbiIsCisJCWRhdGEtPmFjcGlfZGF0YS5zdGF0ZSwgc3RhdGUpOworCisJLyogY3B1ZnJlcSBmcmVxdWVuY3kgc3RydWN0ICovCisJY3B1ZnJlcV9mcmVxcy5jcHUgPSBjcHU7CisJY3B1ZnJlcV9mcmVxcy5vbGQgPSBkYXRhLT5mcmVxX3RhYmxlW2RhdGEtPmFjcGlfZGF0YS5zdGF0ZV0uZnJlcXVlbmN5OworCWNwdWZyZXFfZnJlcXMubmV3ID0gZGF0YS0+ZnJlcV90YWJsZVtzdGF0ZV0uZnJlcXVlbmN5OworCisJLyogbm90aWZ5IGNwdWZyZXEgKi8KKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZjcHVmcmVxX2ZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwkvKgorCSAqIEZpcnN0IHdlIHdyaXRlIHRoZSB0YXJnZXQgc3RhdGUncyAnY29udHJvbCcgdmFsdWUgdG8gdGhlCisJICogY29udHJvbF9yZWdpc3Rlci4KKwkgKi8KKworCXBvcnQgPSBkYXRhLT5hY3BpX2RhdGEuY29udHJvbF9yZWdpc3Rlci5hZGRyZXNzOworCWJpdF93aWR0aCA9IGRhdGEtPmFjcGlfZGF0YS5jb250cm9sX3JlZ2lzdGVyLmJpdF93aWR0aDsKKwl2YWx1ZSA9ICh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbc3RhdGVdLmNvbnRyb2w7CisKKwlkcHJpbnRrKCJXcml0aW5nIDB4JTA4eCB0byBwb3J0IDB4JTA0eFxuIiwgdmFsdWUsIHBvcnQpOworCisJcmV0ID0gYWNwaV9wcm9jZXNzb3Jfd3JpdGVfcG9ydChwb3J0LCBiaXRfd2lkdGgsIHZhbHVlKTsKKwlpZiAocmV0KSB7CisJCWRwcmludGsoIkludmFsaWQgcG9ydCB3aWR0aCAweCUwNHhcbiIsIGJpdF93aWR0aCk7CisJCXJldHZhbCA9IHJldDsKKwkJZ290byBtaWdyYXRlX2VuZDsKKwl9CisKKwkvKgorCSAqIFRoZW4gd2UgcmVhZCB0aGUgJ3N0YXR1c19yZWdpc3RlcicgYW5kIGNvbXBhcmUgdGhlIHZhbHVlIHdpdGggdGhlCisJICogdGFyZ2V0IHN0YXRlJ3MgJ3N0YXR1cycgdG8gbWFrZSBzdXJlIHRoZSB0cmFuc2l0aW9uIHdhcyBzdWNjZXNzZnVsLgorCSAqIE5vdGUgdGhhdCB3ZSdsbCBwb2xsIGZvciB1cCB0byAxbXMgKDEwMCBjeWNsZXMgb2YgMTB1cykgYmVmb3JlCisJICogZ2l2aW5nIHVwLgorCSAqLworCisJcG9ydCA9IGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuYWRkcmVzczsKKwliaXRfd2lkdGggPSBkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLmJpdF93aWR0aDsKKworCWRwcmludGsoIkxvb2tpbmcgZm9yIDB4JTA4eCBmcm9tIHBvcnQgMHglMDR4XG4iLAorCQkodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5zdGF0dXMsIHBvcnQpOworCisJZm9yIChpPTA7IGk8MTAwOyBpKyspIHsKKwkJcmV0ID0gYWNwaV9wcm9jZXNzb3JfcmVhZF9wb3J0KHBvcnQsIGJpdF93aWR0aCwgJnZhbHVlKTsKKwkJaWYgKHJldCkgewkKKwkJCWRwcmludGsoIkludmFsaWQgcG9ydCB3aWR0aCAweCUwNHhcbiIsIGJpdF93aWR0aCk7CisJCQlyZXR2YWwgPSByZXQ7CisJCQlnb3RvIG1pZ3JhdGVfZW5kOworCQl9CisJCWlmICh2YWx1ZSA9PSAodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5zdGF0dXMpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKiBub3RpZnkgY3B1ZnJlcSAqLworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmNwdWZyZXFfZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisKKwlpZiAodmFsdWUgIT0gKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzKSB7CisJCXVuc2lnbmVkIGludCB0bXAgPSBjcHVmcmVxX2ZyZXFzLm5ldzsKKwkJY3B1ZnJlcV9mcmVxcy5uZXcgPSBjcHVmcmVxX2ZyZXFzLm9sZDsKKwkJY3B1ZnJlcV9mcmVxcy5vbGQgPSB0bXA7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmNwdWZyZXFfZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmY3B1ZnJlcV9mcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWNwaS1jcHVmcmVxOiBUcmFuc2l0aW9uIGZhaWxlZFxuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gbWlncmF0ZV9lbmQ7CisJfQorCisJZHByaW50aygiVHJhbnNpdGlvbiBzdWNjZXNzZnVsIGFmdGVyICVkIG1pY3Jvc2Vjb25kc1xuIiwgaSAqIDEwKTsKKworCWRhdGEtPmFjcGlfZGF0YS5zdGF0ZSA9IHN0YXRlOworCisJcmV0dmFsID0gMDsKK21pZ3JhdGVfZW5kOgorCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgc2F2ZWRfbWFzayk7CisJcmV0dXJuIChyZXR2YWwpOworfQorCisKK3N0YXRpYyBpbnQKK2FjcGlfY3B1ZnJlcV90YXJnZXQgKAorCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAgICpwb2xpY3ksCisJdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAorCXVuc2lnbmVkIGludCByZWxhdGlvbikKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvICpkYXRhID0gYWNwaV9pb19kYXRhW3BvbGljeS0+Y3B1XTsKKwl1bnNpZ25lZCBpbnQgbmV4dF9zdGF0ZSA9IDA7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisKKwlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfc2V0cG9saWN5XG4iKTsKKworCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksCisJCQlkYXRhLT5mcmVxX3RhYmxlLAorCQkJdGFyZ2V0X2ZyZXEsCisJCQlyZWxhdGlvbiwKKwkJCSZuZXh0X3N0YXRlKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gKHJlc3VsdCk7CisKKwlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9zZXRfcGVyZm9ybWFuY2UgKGRhdGEsIHBvbGljeS0+Y3B1LCBuZXh0X3N0YXRlKTsKKworCXJldHVybiAocmVzdWx0KTsKK30KKworCitzdGF0aWMgaW50CithY3BpX2NwdWZyZXFfdmVyaWZ5ICgKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCByZXN1bHQgPSAwOworCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8gKmRhdGEgPSBhY3BpX2lvX2RhdGFbcG9saWN5LT5jcHVdOworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX3ZlcmlmeVxuIik7CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCAKKwkJCWRhdGEtPmZyZXFfdGFibGUpOworCisJcmV0dXJuIChyZXN1bHQpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCithY3BpX2NwdWZyZXFfZ3Vlc3NfZnJlcSAoCisJc3RydWN0IGNwdWZyZXFfYWNwaV9pbwkqZGF0YSwKKwl1bnNpZ25lZCBpbnQJCWNwdSkKK3sKKwlpZiAoY3B1X2toeikgeworCQkvKiBzZWFyY2ggdGhlIGNsb3Nlc3QgbWF0Y2ggdG8gY3B1X2toeiAqLworCQl1bnNpZ25lZCBpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyBmcmVxOworCQl1bnNpZ25lZCBsb25nIGZyZXFuID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDA7CisKKwkJZm9yIChpPTA7IGkgPCAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50IC0gMSk7IGkrKykgeworCQkJZnJlcSA9IGZyZXFuOworCQkJZnJlcW4gPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2krMV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOworCQkJaWYgKCgyICogY3B1X2toeikgPiAoZnJlcW4gKyBmcmVxKSkgeworCQkJCWRhdGEtPmFjcGlfZGF0YS5zdGF0ZSA9IGk7CisJCQkJcmV0dXJuIChmcmVxKTsKKwkJCX0KKwkJfQorCQlkYXRhLT5hY3BpX2RhdGEuc3RhdGUgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQgLSAxOworCQlyZXR1cm4gKGZyZXFuKTsKKwl9IGVsc2UKKwkJLyogYXNzdW1lIENQVSBpcyBhdCBQMC4uLiAqLworCQlkYXRhLT5hY3BpX2RhdGEuc3RhdGUgPSAwOworCQlyZXR1cm4gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDA7CisJCit9CisKKworLyogCisgKiBhY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGNfZXN0IC0gbGV0IEJJT1Mga25vdyBhYm91dCB0aGUgU01QIGNhcGFiaWxpdGllcworICogb2YgdGhpcyBkcml2ZXIKKyAqIEBwZXJmOiBwcm9jZXNzb3Itc3BlY2lmaWMgYWNwaV9pb19kYXRhIHN0cnVjdAorICogQGNwdTogQ1BVIGJlaW5nIGluaXRpYWxpemVkCisgKgorICogVG8gYXZvaWQgaXNzdWVzIHdpdGggbGVnYWN5IE9TZXMsIHNvbWUgQklPU2VzIHJlcXVpcmUgdG8gYmUgaW5mb3JtZWQgb2YKKyAqIHRoZSBTTVAgY2FwYWJpbGl0aWVzIG9mIE9TIFAtc3RhdGUgZHJpdmVyLiBIZXJlIHdlIHNldCB0aGUgYml0cyBpbiBfUERDIAorICogYWNjb3JkaW5nbHksIGZvciBFbmhhbmNlZCBTcGVlZHN0ZXAuIEFjdHVhbCBjYWxsIHRvIF9QREMgaXMgZG9uZSBpbgorICogZHJpdmVyL2FjcGkvcHJvY2Vzc29yLmMKKyAqLworc3RhdGljIHZvaWQgCithY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGNfZXN0KAorCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKnBlcmYsIAorCQl1bnNpZ25lZCBpbnQgY3B1LAorCQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqb2JqX2xpc3QKKwkJKQoreworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJdTMyICpidWY7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHU7CisJZHByaW50aygiYWNwaV9wcm9jZXNzb3JfY3B1X2luaXRfcGRjX2VzdFxuIik7CisKKwlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKKwkJcmV0dXJuOworCisJLyogSW5pdGlhbGl6ZSBwZGMuIEl0IHdpbGwgYmUgdXNlZCBsYXRlci4gKi8KKwlpZiAoIW9ial9saXN0KQorCQlyZXR1cm47CisJCQorCWlmICghKG9ial9saXN0LT5jb3VudCAmJiBvYmpfbGlzdC0+cG9pbnRlcikpCisJCXJldHVybjsKKworCW9iaiA9IG9ial9saXN0LT5wb2ludGVyOworCWlmICgob2JqLT5idWZmZXIubGVuZ3RoID09IDEyKSAmJiBvYmotPmJ1ZmZlci5wb2ludGVyKSB7CisJCWJ1ZiA9ICh1MzIgKilvYmotPmJ1ZmZlci5wb2ludGVyOworICAgICAgIAkJYnVmWzBdID0gQUNQSV9QRENfUkVWSVNJT05fSUQ7CisgICAgICAgCQlidWZbMV0gPSAxOworICAgICAgIAkJYnVmWzJdID0gQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QOworCQlwZXJmLT5wZGMgPSBvYmpfbGlzdDsKKwl9CisJcmV0dXJuOworfQorIAorCisvKiBDUFUgc3BlY2lmaWMgUERDIGluaXRpYWxpemF0aW9uICovCitzdGF0aWMgdm9pZCAKK2FjcGlfcHJvY2Vzc29yX2NwdV9pbml0X3BkYygKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICpwZXJmLCAKKwkJdW5zaWduZWQgaW50IGNwdSwKKwkJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKm9ial9saXN0CisJCSkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YSArIGNwdTsKKwlkcHJpbnRrKCJhY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGNcbiIpOworCXBlcmYtPnBkYyA9IE5VTEw7CisJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKKwkJYWNwaV9wcm9jZXNzb3JfY3B1X2luaXRfcGRjX2VzdChwZXJmLCBjcHUsIG9ial9saXN0KTsKKwlyZXR1cm47Cit9CisKKworc3RhdGljIGludAorYWNwaV9jcHVmcmVxX2NwdV9pbml0ICgKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgICAqcG9saWN5KQoreworCXVuc2lnbmVkIGludAkJaTsKKwl1bnNpZ25lZCBpbnQJCWNwdSA9IHBvbGljeS0+Y3B1OworCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8JKmRhdGE7CisJdW5zaWduZWQgaW50CQlyZXN1bHQgPSAwOworCisJdW5pb24gYWNwaV9vYmplY3QJCWFyZzAgPSB7QUNQSV9UWVBFX0JVRkZFUn07CisJdTMyCQkJCWFyZzBfYnVmWzNdOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IAlhcmdfbGlzdCA9IHsxLCAmYXJnMH07CisKKwlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfY3B1X2luaXRcbiIpOworCS8qIHNldHVwIGFyZ19saXN0IGZvciBfUERDIHNldHRpbmdzICovCisgICAgICAgIGFyZzAuYnVmZmVyLmxlbmd0aCA9IDEyOworICAgICAgICBhcmcwLmJ1ZmZlci5wb2ludGVyID0gKHU4ICopIGFyZzBfYnVmOworCisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2FjcGlfaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAoLUVOT01FTSk7CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvKSk7CisKKwlhY3BpX2lvX2RhdGFbY3B1XSA9IGRhdGE7CisKKwlhY3BpX3Byb2Nlc3Nvcl9jcHVfaW5pdF9wZGMoJmRhdGEtPmFjcGlfZGF0YSwgY3B1LCAmYXJnX2xpc3QpOworCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsIGNwdSk7CisJZGF0YS0+YWNwaV9kYXRhLnBkYyA9IE5VTEw7CisKKwlpZiAocmVzdWx0KQorCQlnb3RvIGVycl9mcmVlOworCisJaWYgKGlzX2NvbnN0X2xvb3BzX2NwdShjcHUpKSB7CisJCWFjcGlfY3B1ZnJlcV9kcml2ZXIuZmxhZ3MgfD0gQ1BVRlJFUV9DT05TVF9MT09QUzsKKwl9CisKKwkvKiBjYXBhYmlsaXR5IGNoZWNrICovCisJaWYgKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCA8PSAxKSB7CisJCWRwcmludGsoIk5vIFAtU3RhdGVzXG4iKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfdW5yZWc7CisJfQorCWlmICgoZGF0YS0+YWNwaV9kYXRhLmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKSB8fAorCSAgICAoZGF0YS0+YWNwaV9kYXRhLnN0YXR1c19yZWdpc3Rlci5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pKSB7CisJCWRwcmludGsoIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2UgWyVkLCAlZF1cbiIsCisJCQkodTMyKSAoZGF0YS0+YWNwaV9kYXRhLmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQpLAorCQkJKHUzMikgKGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQpKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfdW5yZWc7CisJfQorCisJLyogYWxsb2MgZnJlcV90YWJsZSAqLworCWRhdGEtPmZyZXFfdGFibGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUpICogKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCArIDEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEtPmZyZXFfdGFibGUpIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5yZWc7CisJfQorCisJLyogZGV0ZWN0IHRyYW5zaXRpb24gbGF0ZW5jeSAqLworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAwOworCWZvciAoaT0wOyBpPGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudDsgaSsrKSB7CisJCWlmICgoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS50cmFuc2l0aW9uX2xhdGVuY3kgKiAxMDAwKSA+IHBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kpCisJCQlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS50cmFuc2l0aW9uX2xhdGVuY3kgKiAxMDAwOworCX0KKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCisJLyogVGhlIGN1cnJlbnQgc3BlZWQgaXMgdW5rbm93biBhbmQgbm90IGRldGVjdGFibGUgYnkgQUNQSS4uLiAgKi8KKwlwb2xpY3ktPmN1ciA9IGFjcGlfY3B1ZnJlcV9ndWVzc19mcmVxKGRhdGEsIHBvbGljeS0+Y3B1KTsKKworCS8qIHRhYmxlIGluaXQgKi8KKwlmb3IgKGk9MDsgaTw9ZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50OyBpKyspCisJeworCQlkYXRhLT5mcmVxX3RhYmxlW2ldLmluZGV4ID0gaTsKKwkJaWYgKGk8ZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50KQorCQkJZGF0YS0+ZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKwkJZWxzZQorCQkJZGF0YS0+ZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwl9CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgZGF0YS0+ZnJlcV90YWJsZSk7CisJaWYgKHJlc3VsdCkgeworCQlnb3RvIGVycl9mcmVxZnJlZTsKKwl9CisKKwkvKiBub3RpZnkgQklPUyB0aGF0IHdlIGV4aXN0ICovCisJYWNwaV9wcm9jZXNzb3Jfbm90aWZ5X3NtbShUSElTX01PRFVMRSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJhY3BpLWNwdWZyZXE6IENQVSV1IC0gQUNQSSBwZXJmb3JtYW5jZSBtYW5hZ2VtZW50IGFjdGl2YXRlZC5cbiIsCisJICAgICAgIGNwdSk7CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudDsgaSsrKQorCQlkcHJpbnRrKCIgICAgICVjUCVkOiAlZCBNSHosICVkIG1XLCAlZCB1U1xuIiwKKwkJCShpID09IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZT8nKic6JyAnKSwgaSwKKwkJCSh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3ksCisJCQkodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLnBvd2VyLAorCQkJKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS50cmFuc2l0aW9uX2xhdGVuY3kpOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoZGF0YS0+ZnJlcV90YWJsZSwgcG9saWN5LT5jcHUpOworCXJldHVybiAocmVzdWx0KTsKKworIGVycl9mcmVxZnJlZToKKwlrZnJlZShkYXRhLT5mcmVxX3RhYmxlKTsKKyBlcnJfdW5yZWc6CisJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmZGF0YS0+YWNwaV9kYXRhLCBjcHUpOworIGVycl9mcmVlOgorCWtmcmVlKGRhdGEpOworCWFjcGlfaW9fZGF0YVtjcHVdID0gTlVMTDsKKworCXJldHVybiAocmVzdWx0KTsKK30KKworCitzdGF0aWMgaW50CithY3BpX2NwdWZyZXFfY3B1X2V4aXQgKAorCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAgICpwb2xpY3kpCit7CisJc3RydWN0IGNwdWZyZXFfYWNwaV9pbyAqZGF0YSA9IGFjcGlfaW9fZGF0YVtwb2xpY3ktPmNwdV07CisKKworCWRwcmludGsoImFjcGlfY3B1ZnJlcV9jcHVfZXhpdFxuIik7CisKKwlpZiAoZGF0YSkgeworCQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CisJCWFjcGlfaW9fZGF0YVtwb2xpY3ktPmNwdV0gPSBOVUxMOworCQlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsIHBvbGljeS0+Y3B1KTsKKwkJa2ZyZWUoZGF0YSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorYWNwaV9jcHVmcmVxX3Jlc3VtZSAoCisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICAgKnBvbGljeSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvICpkYXRhID0gYWNwaV9pb19kYXRhW3BvbGljeS0+Y3B1XTsKKworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX3Jlc3VtZVxuIik7CisKKwlkYXRhLT5yZXN1bWUgPSAxOworCisJcmV0dXJuICgwKTsKK30KKworCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogYWNwaV9jcHVmcmVxX2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgYWNwaV9jcHVmcmVxX2RyaXZlciA9IHsKKwkudmVyaWZ5IAk9IGFjcGlfY3B1ZnJlcV92ZXJpZnksCisJLnRhcmdldCAJPSBhY3BpX2NwdWZyZXFfdGFyZ2V0LAorCS5pbml0CQk9IGFjcGlfY3B1ZnJlcV9jcHVfaW5pdCwKKwkuZXhpdAkJPSBhY3BpX2NwdWZyZXFfY3B1X2V4aXQsCisJLnJlc3VtZQkJPSBhY3BpX2NwdWZyZXFfcmVzdW1lLAorCS5uYW1lCQk9ICJhY3BpLWNwdWZyZXEiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuYXR0ciAgICAgICAgICAgPSBhY3BpX2NwdWZyZXFfYXR0ciwKK307CisKKworc3RhdGljIGludCBfX2luaXQKK2FjcGlfY3B1ZnJlcV9pbml0ICh2b2lkKQoreworCWludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisKKwlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfaW5pdFxuIik7CisKKyAJcmVzdWx0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfY3B1ZnJlcV9kcml2ZXIpOworCQorCXJldHVybiAocmVzdWx0KTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQKK2FjcGlfY3B1ZnJlcV9leGl0ICh2b2lkKQoreworCWRwcmludGsoImFjcGlfY3B1ZnJlcV9leGl0XG4iKTsKKworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfY3B1ZnJlcV9kcml2ZXIpOworCisJcmV0dXJuOworfQorCisKK2xhdGVfaW5pdGNhbGwoYWNwaV9jcHVmcmVxX2luaXQpOworbW9kdWxlX2V4aXQoYWNwaV9jcHVmcmVxX2V4aXQpOworCitNT0RVTEVfQUxJQVMoImFjcGkiKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvY3B1ZnJlcS1uZm9yY2UyLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2NwdWZyZXEtbmZvcmNlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTQwNTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2NwdWZyZXEtbmZvcmNlMi5jCkBAIC0wLDAgKzEsNDU3IEBACisvKgorICogKEMpIDIwMDQgIFNlYmFzdGlhbiBXaXR0IDxzZS53aXR0QGdteC5uZXQ+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqICBCYXNlZCB1cG9uIHJldmVyc2UgZW5naW5lZXJlZCBpbmZvcm1hdGlvbgorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNkZWZpbmUgTkZPUkNFMl9YVEFMIDI1CisjZGVmaW5lIE5GT1JDRTJfQk9PVEZTQiAweDQ4CisjZGVmaW5lIE5GT1JDRTJfUExMRU5BQkxFIDB4YTgKKyNkZWZpbmUgTkZPUkNFMl9QTExSRUcgMHhhNAorI2RlZmluZSBORk9SQ0UyX1BMTEFEUiAweGEwCisjZGVmaW5lIE5GT1JDRTJfUExMKG11bCwgZGl2KSAoMHgxMDAwMDAgfCAobXVsIDw8IDgpIHwgZGl2KQorCisjZGVmaW5lIE5GT1JDRTJfTUlOX0ZTQiA1MAorI2RlZmluZSBORk9SQ0UyX1NBRkVfRElTVEFOQ0UgNTAKKworLyogRGVsYXkgaW4gbXMgYmV0d2VlbiBGU0IgY2hhbmdlcyAqLworLy8jZGVmaW5lIE5GT1JDRTJfREVMQVkgMTAKKworLyogbmZvcmNlMl9jaGlwc2V0OgorICogRlNCIGlzIGNoYW5nZWQgdXNpbmcgdGhlIGNoaXBzZXQKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpuZm9yY2UyX2NoaXBzZXRfZGV2OworCisvKiBmaWQ6CisgKiBtdWx0aXBsaWVyICogMTAKKyAqLworc3RhdGljIGludCBmaWQgPSAwOworCisvKiBtaW5fZnNiLCBtYXhfZnNiOgorICogbWluaW11bSBhbmQgbWF4aW11bSBGU0IgKD0gRlNCIGF0IGJvb3QgdGltZSkgCisgKi8KK3N0YXRpYyBpbnQgbWluX2ZzYiA9IDA7CitzdGF0aWMgaW50IG1heF9mc2IgPSAwOworCitNT0RVTEVfQVVUSE9SKCJTZWJhc3RpYW4gV2l0dCA8c2Uud2l0dEBnbXgubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJuRm9yY2UyIEZTQiBjaGFuZ2luZyBjcHVmcmVxIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oZmlkLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKG1pbl9mc2IsIGludCwgMDQ0NCk7CisKK01PRFVMRV9QQVJNX0RFU0MoZmlkLCAiQ1BVIG11bHRpcGxpZXIgdG8gdXNlICgxMS41ID0gMTE1KSIpOworTU9EVUxFX1BBUk1fREVTQyhtaW5fZnNiLAorICAgICAgICAgICAgICAgICAiTWluaW11bSBGU0IgdG8gdXNlLCBpZiBub3QgZGVmaW5lZDogY3VycmVudCBGU0IgLSA1MCIpOworCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgImNwdWZyZXEtbmZvcmNlMiIsIG1zZykKKworLyoKKyAqIG5mb3JjZTJfY2FsY19mc2IgLSBjYWxjdWxhdGUgRlNCCisgKiBAcGxsOiBQTEwgdmFsdWUKKyAqIAorICogICBDYWxjdWxhdGVzIEZTQiBmcm9tIFBMTCB2YWx1ZQorICovCitzdGF0aWMgaW50IG5mb3JjZTJfY2FsY19mc2IoaW50IHBsbCkKK3sKKwl1bnNpZ25lZCBjaGFyIG11bCwgZGl2OworCisJbXVsID0gKHBsbCA+PiA4KSAmIDB4ZmY7CisJZGl2ID0gcGxsICYgMHhmZjsKKworCWlmIChkaXYgPiAwKQorCQlyZXR1cm4gTkZPUkNFMl9YVEFMICogbXVsIC8gZGl2OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBuZm9yY2UyX2NhbGNfcGxsIC0gY2FsY3VsYXRlIFBMTCB2YWx1ZQorICogQGZzYjogRlNCCisgKiAKKyAqICAgQ2FsY3VsYXRlIFBMTCB2YWx1ZSBmb3IgZ2l2ZW4gRlNCCisgKi8KK3N0YXRpYyBpbnQgbmZvcmNlMl9jYWxjX3BsbCh1bnNpZ25lZCBpbnQgZnNiKQoreworCXVuc2lnbmVkIGNoYXIgeG11bCwgeGRpdjsKKwl1bnNpZ25lZCBjaGFyIG11bCA9IDAsIGRpdiA9IDA7CisJaW50IHRyaWVkID0gMDsKKworCS8qIFRyeSB0byBjYWxjdWxhdGUgbXVsdGlwbGllciBhbmQgZGl2aWRlciB1cCB0byA0IHRpbWVzICovCisJd2hpbGUgKCgobXVsID09IDApIHx8IChkaXYgPT0gMCkpICYmICh0cmllZCA8PSAzKSkgeworCQlmb3IgKHhkaXYgPSAxOyB4ZGl2IDw9IDB4ODA7IHhkaXYrKykKKwkJCWZvciAoeG11bCA9IDE7IHhtdWwgPD0gMHhmZTsgeG11bCsrKQorCQkJCWlmIChuZm9yY2UyX2NhbGNfZnNiKE5GT1JDRTJfUExMKHhtdWwsIHhkaXYpKSA9PQorCQkJCSAgICBmc2IgKyB0cmllZCkgeworCQkJCQltdWwgPSB4bXVsOworCQkJCQlkaXYgPSB4ZGl2OworCQkJCX0KKwkJdHJpZWQrKzsKKwl9CisKKwlpZiAoKG11bCA9PSAwKSB8fCAoZGl2ID09IDApKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gTkZPUkNFMl9QTEwobXVsLCBkaXYpOworfQorCisvKgorICogbmZvcmNlMl93cml0ZV9wbGwgLSB3cml0ZSBQTEwgdmFsdWUgdG8gY2hpcHNldAorICogQHBsbDogUExMIHZhbHVlCisgKiAKKyAqICAgV3JpdGVzIG5ldyBGU0IgUExMIHZhbHVlIHRvIGNoaXBzZXQKKyAqLworc3RhdGljIHZvaWQgbmZvcmNlMl93cml0ZV9wbGwoaW50IHBsbCkKK3sKKwlpbnQgdGVtcDsKKworCS8qIFNldCB0aGUgcGxsIGFkZHIuIHRvIDB4MDAgKi8KKwl0ZW1wID0gMHgwMDsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG5mb3JjZTJfY2hpcHNldF9kZXYsIE5GT1JDRTJfUExMQURSLCB0ZW1wKTsKKworCS8qIE5vdyB3cml0ZSB0aGUgdmFsdWUgaW4gYWxsIDY0IHJlZ2lzdGVycyAqLworCWZvciAodGVtcCA9IDA7IHRlbXAgPD0gMHgzZjsgdGVtcCsrKSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQobmZvcmNlMl9jaGlwc2V0X2RldiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORk9SQ0UyX1BMTFJFRywgcGxsKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBuZm9yY2UyX2ZzYl9yZWFkIC0gUmVhZCBGU0IKKyAqCisgKiAgIFJlYWQgRlNCIGZyb20gY2hpcHNldAorICogICBJZiBib290ZnNiICE9IDAsIHJldHVybiBGU0IgYXQgYm9vdC10aW1lCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZvcmNlMl9mc2JfcmVhZChpbnQgYm9vdGZzYikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqbmZvcmNlMl9zdWI1OworCXUzMiBmc2IsIHRlbXAgPSAwOworCisJCisJLyogR2V0IGNoaXBzZXQgYm9vdCBGU0IgZnJvbSBzdWJkZXZpY2UgNSAoRlNCIGF0IGJvb3QtdGltZSkgKi8KKwluZm9yY2UyX3N1YjUgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX05WSURJQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMUVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQU5ZX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKwkKKwlpZiAoIW5mb3JjZTJfc3ViNSkKKwkJcmV0dXJuIDA7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQobmZvcmNlMl9zdWI1LCBORk9SQ0UyX0JPT1RGU0IsICZmc2IpOworCWZzYiAvPSAxMDAwMDAwOworCQorCS8qIENoZWNrIGlmIFBMTCByZWdpc3RlciBpcyBhbHJlYWR5IHNldCAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG5mb3JjZTJfY2hpcHNldF9kZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORk9SQ0UyX1BMTEVOQUJMRSwgKHU4ICopJnRlbXApOworCQorCWlmKGJvb3Rmc2IgfHwgIXRlbXApCisJCXJldHVybiBmc2I7CisJCQorCS8qIFVzZSBQTEwgcmVnaXN0ZXIgRlNCIHZhbHVlICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG5mb3JjZTJfY2hpcHNldF9kZXYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZPUkNFMl9QTExSRUcsICZ0ZW1wKTsKKwlmc2IgPSBuZm9yY2UyX2NhbGNfZnNiKHRlbXApOworCisJcmV0dXJuIGZzYjsKK30KKworLyoKKyAqIG5mb3JjZTJfc2V0X2ZzYiAtIHNldCBuZXcgRlNCCisgKiBAZnNiOiBOZXcgRlNCCisgKiAKKyAqICAgU2V0cyBuZXcgRlNCCisgKi8KK3N0YXRpYyBpbnQgbmZvcmNlMl9zZXRfZnNiKHVuc2lnbmVkIGludCBmc2IpCit7CisJdTMyIHBsbCwgdGVtcCA9IDA7CisJdW5zaWduZWQgaW50IHRmc2I7CisJaW50IGRpZmY7CisKKwlpZiAoKGZzYiA+IG1heF9mc2IpIHx8IChmc2IgPCBORk9SQ0UyX01JTl9GU0IpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogRlNCICVkIGlzIG91dCBvZiByYW5nZSFcbiIsIGZzYik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwl0ZnNiID0gbmZvcmNlMl9mc2JfcmVhZCgwKTsKKwlpZiAoIXRmc2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBFcnJvciB3aGlsZSByZWFkaW5nIHRoZSBGU0JcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaXJzdCB3cml0ZT8gVGhlbiBzZXQgYWN0dWFsIHZhbHVlICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUobmZvcmNlMl9jaGlwc2V0X2RldiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GT1JDRTJfUExMRU5BQkxFLCAodTggKikmdGVtcCk7CisJaWYgKCF0ZW1wKSB7CisJCXBsbCA9IG5mb3JjZTJfY2FsY19wbGwodGZzYik7CisKKwkJaWYgKHBsbCA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQluZm9yY2UyX3dyaXRlX3BsbChwbGwpOworCX0KKworCS8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgKi8KKwl0ZW1wID0gMHgwMTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUobmZvcmNlMl9jaGlwc2V0X2RldiwgTkZPUkNFMl9QTExFTkFCTEUsICh1OCl0ZW1wKTsKKworCWRpZmYgPSB0ZnNiIC0gZnNiOworCisJaWYgKCFkaWZmKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgodGZzYiAhPSBmc2IpICYmICh0ZnNiIDw9IG1heF9mc2IpICYmICh0ZnNiID49IG1pbl9mc2IpKSB7CisJCWlmIChkaWZmIDwgMCkKKwkJCXRmc2IrKzsKKwkJZWxzZQorCQkJdGZzYi0tOworCisJCS8qIENhbGN1bGF0ZSB0aGUgUExMIHJlZy4gdmFsdWUgKi8KKwkJaWYgKChwbGwgPSBuZm9yY2UyX2NhbGNfcGxsKHRmc2IpKSA9PSAtMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkKKwkJbmZvcmNlMl93cml0ZV9wbGwocGxsKTsKKyNpZmRlZiBORk9SQ0UyX0RFTEFZCisJCW1kZWxheShORk9SQ0UyX0RFTEFZKTsKKyNlbmRpZgorCX0KKworCXRlbXAgPSAweDQwOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShuZm9yY2UyX2NoaXBzZXRfZGV2LCBORk9SQ0UyX1BMTEFEUiwgKHU4KXRlbXApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbmZvcmNlMl9nZXQgLSBnZXQgdGhlIENQVSBmcmVxdWVuY3kKKyAqIEBjcHU6IENQVSBudW1iZXIKKyAqIAorICogUmV0dXJucyB0aGUgQ1BVIGZyZXF1ZW5jeQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5mb3JjZTJfZ2V0KHVuc2lnbmVkIGludCBjcHUpCit7CisJaWYgKGNwdSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIG5mb3JjZTJfZnNiX3JlYWQoMCkgKiBmaWQgKiAxMDA7Cit9CisKKy8qKgorICogbmZvcmNlMl90YXJnZXQgLSBzZXQgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqIEB0YXJnZXRfZnJlcTogdGhlIHRhcmdldCBmcmVxdWVuY3kKKyAqIEByZWxhdGlvbjogaG93IHRoYXQgZnJlcXVlbmN5IHJlbGF0ZXMgdG8gYWNoaWV2ZWQgZnJlcXVlbmN5IChDUFVGUkVRX1JFTEFUSU9OX0wgb3IgQ1BVRlJFUV9SRUxBVElPTl9IKQorICoKKyAqIFNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kuCisgKi8KK3N0YXRpYyBpbnQgbmZvcmNlMl90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworLy8gICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICBmbGFnczsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwl1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZzYjsKKworCWlmICgodGFyZ2V0X2ZyZXEgPiBwb2xpY3ktPm1heCkgfHwgKHRhcmdldF9mcmVxIDwgcG9saWN5LT5taW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRhcmdldF9mc2IgPSB0YXJnZXRfZnJlcSAvIChmaWQgKiAxMDApOworCisJZnJlcXMub2xkID0gbmZvcmNlMl9nZXQocG9saWN5LT5jcHUpOworCWZyZXFzLm5ldyA9IHRhcmdldF9mc2IgKiBmaWQgKiAxMDA7CisJZnJlcXMuY3B1ID0gMDsJCS8qIE9ubHkgb25lIENQVSBvbiBuRm9yY2UyIHBsYXR0Zm9ybXMgKi8KKworCWlmIChmcmVxcy5vbGQgPT0gZnJlcXMubmV3KQorCQlyZXR1cm4gMDsKKworCWRwcmludGsoS0VSTl9JTkZPICJjcHVmcmVxOiBPbGQgQ1BVIGZyZXF1ZW5jeSAlZCBrSHosIG5ldyAlZCBrSHpcbiIsCisJICAgICAgIGZyZXFzLm9sZCwgZnJlcXMubmV3KTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwkvKiBEaXNhYmxlIElSUXMgKi8KKwkvL2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmIChuZm9yY2UyX3NldF9mc2IodGFyZ2V0X2ZzYikgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IENoYW5naW5nIEZTQiB0byAlZCBmYWlsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9mc2IpOworCWVsc2UKKwkJZHByaW50ayhLRVJOX0lORk8gImNwdWZyZXE6IENoYW5nZWQgRlNCIHN1Y2Nlc3NmdWxseSB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2ZzYik7CisKKwkvKiBFbmFibGUgSVJRcyAqLworCS8vbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuZm9yY2UyX3ZlcmlmeSAtIHZlcmlmaWVzIGEgbmV3IENQVUZyZXEgcG9saWN5CisgKiBAcG9saWN5OiBuZXcgcG9saWN5CisgKi8KK3N0YXRpYyBpbnQgbmZvcmNlMl92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdW5zaWduZWQgaW50IGZzYl9wb2xfbWF4OworCisJZnNiX3BvbF9tYXggPSBwb2xpY3ktPm1heCAvIChmaWQgKiAxMDApOworCisJaWYgKHBvbGljeS0+bWluIDwgKGZzYl9wb2xfbWF4ICogZmlkICogMTAwKSkKKwkJcG9saWN5LT5tYXggPSAoZnNiX3BvbF9tYXggKyAxKSAqIGZpZCAqIDEwMDsKKworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5mb3JjZTJfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdW5zaWduZWQgaW50IGZzYjsKKwl1bnNpZ25lZCBpbnQgcmZpZDsKKworCS8qIGNhcGFiaWxpdHkgY2hlY2sgKi8KKwlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBHZXQgY3VycmVudCBGU0IgKi8KKwlmc2IgPSBuZm9yY2UyX2ZzYl9yZWFkKDApOworCisJaWYgKCFmc2IpCisJCXJldHVybiAtRUlPOworCisJLyogRklYOiBHZXQgRklEIGZyb20gQ1BVICovCisJaWYgKCFmaWQpIHsKKwkJaWYgKCFjcHVfa2h6KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImNwdWZyZXE6IGNwdV9raHogbm90IHNldCwgY2FuJ3QgY2FsY3VsYXRlIG11bHRpcGxpZXIhXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJZmlkID0gY3B1X2toeiAvIChmc2IgKiAxMDApOworCQlyZmlkID0gZmlkICUgNTsKKworCQlpZiAocmZpZCkgeworCQkJaWYgKHJmaWQgPiAyKQorCQkJCWZpZCArPSA1IC0gcmZpZDsKKwkJCWVsc2UKKwkJCQlmaWQgLT0gcmZpZDsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gImNwdWZyZXE6IEZTQiBjdXJyZW50bHkgYXQgJWkgTUh6LCBGSUQgJWQuJWRcbiIsIGZzYiwKKwkgICAgICAgZmlkIC8gMTAsIGZpZCAlIDEwKTsKKwkKKwkvKiBTZXQgbWF4aW11bSBGU0IgdG8gRlNCIGF0IGJvb3QgdGltZSAqLworCW1heF9mc2IgPSBuZm9yY2UyX2ZzYl9yZWFkKDEpOworCQorCWlmKCFtYXhfZnNiKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghbWluX2ZzYikKKwkJbWluX2ZzYiA9IG1heF9mc2IgLSBORk9SQ0UyX1NBRkVfRElTVEFOQ0U7CisKKwlpZiAobWluX2ZzYiA8IE5GT1JDRTJfTUlOX0ZTQikKKwkJbWluX2ZzYiA9IE5GT1JDRTJfTUlOX0ZTQjsKKworCS8qIGNwdWluZm8gYW5kIGRlZmF1bHQgcG9saWN5IHZhbHVlcyAqLworCXBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSA9IG1pbl9mc2IgKiBmaWQgKiAxMDA7CisJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gbWF4X2ZzYiAqIGZpZCAqIDEwMDsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCXBvbGljeS0+Y3VyID0gbmZvcmNlMl9nZXQocG9saWN5LT5jcHUpOworCXBvbGljeS0+bWluID0gcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxOworCXBvbGljeS0+bWF4ID0gcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxOworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZm9yY2UyX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIG5mb3JjZTJfZHJpdmVyID0geworCS5uYW1lID0gIm5mb3JjZTIiLAorCS52ZXJpZnkgPSBuZm9yY2UyX3ZlcmlmeSwKKwkudGFyZ2V0ID0gbmZvcmNlMl90YXJnZXQsCisJLmdldCA9IG5mb3JjZTJfZ2V0LAorCS5pbml0ID0gbmZvcmNlMl9jcHVfaW5pdCwKKwkuZXhpdCA9IG5mb3JjZTJfY3B1X2V4aXQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCisvKioKKyAqIG5mb3JjZTJfZGV0ZWN0X2NoaXBzZXQgLSBkZXRlY3QgdGhlIFNvdXRoYnJpZGdlIHdoaWNoIGNvbnRhaW5zIEZTQiBQTEwgbG9naWMKKyAqCisgKiBEZXRlY3RzIG5Gb3JjZTIgQTIgYW5kIEMxIHN0ZXBwaW5nCisgKiAKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBuZm9yY2UyX2RldGVjdF9jaGlwc2V0KHZvaWQpCit7CisJdTggcmV2aXNpb247CisKKwluZm9yY2UyX2NoaXBzZXRfZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9OVklESUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworCWlmIChuZm9yY2UyX2NoaXBzZXRfZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUobmZvcmNlMl9jaGlwc2V0X2RldiwgUENJX1JFVklTSU9OX0lELCAmcmV2aXNpb24pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiY3B1ZnJlcTogRGV0ZWN0ZWQgbkZvcmNlMiBjaGlwc2V0IHJldmlzaW9uICVYXG4iLAorCSAgICAgICByZXZpc2lvbik7CisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiY3B1ZnJlcTogRlNCIGNoYW5naW5nIGlzIG1heWJlIHVuc3RhYmxlIGFuZCBjYW4gbGVhZCB0byBjcmFzaGVzIGFuZCBkYXRhIGxvc3MuXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG5mb3JjZTJfaW5pdCAtIGluaXRpYWxpemVzIHRoZSBuRm9yY2UyIENQVUZyZXEgZHJpdmVyCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIG5Gb3JjZTIgRlNCIHN1cHBvcnQuIFJldHVybnMgLUVOT0RFViBvbiB1bnN1cHBvcnRlZAorICogZGV2aWNlcywgLUVJTlZBTCBvbiBwcm9ibGVtcyBkdXJpbmcgaW5pdGlhdGl6YXRpb24sIGFuZCB6ZXJvIG9uCisgKiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBuZm9yY2UyX2luaXQodm9pZCkKK3sKKwkvKiBUT0RPOiBkbyB3ZSBuZWVkIHRvIGRldGVjdCB0aGUgcHJvY2Vzc29yPyAqLworCisJLyogZGV0ZWN0IGNoaXBzZXQgKi8KKwlpZiAobmZvcmNlMl9kZXRlY3RfY2hpcHNldCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3B1ZnJlcTogTm8gbkZvcmNlMiBjaGlwc2V0LlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmbmZvcmNlMl9kcml2ZXIpOworfQorCisvKioKKyAqIG5mb3JjZTJfZXhpdCAtIHVucmVnaXN0ZXJzIGNwdWZyZXEgbW9kdWxlCisgKgorICogICBVbnJlZ2lzdGVycyBuRm9yY2UyIEZTQiBjaGFuZ2Ugc3VwcG9ydC4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IG5mb3JjZTJfZXhpdCh2b2lkKQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJm5mb3JjZTJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobmZvcmNlMl9pbml0KTsKK21vZHVsZV9leGl0KG5mb3JjZTJfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZWxhbmZyZXEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZWxhbmZyZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjdjYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lbGFuZnJlcS5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogCWVsYW5mcmVxOiAJY3B1ZnJlcSBkcml2ZXIgZm9yIHRoZSBBTUQgRUxBTiBmYW1pbHkKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDIgUm9iZXJ0IFNjaHdlYmVsIDxyLnNjaHdlYmVsQHBlbmd1dHJvbml4LmRlPgorICoKKyAqCVBhcnRzIG9mIHRoaXMgY29kZSBhcmUgKGMpIFN2ZW4gR2VnZ3VzIDxzdmVuQGdlZ2d1cy5uZXQ+IAorICoKKyAqICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCisgKgorICoJMjAwMi0wMi0xMzogLSBpbml0aWFsIHJldmlzaW9uIGZvciAyLjQuMTgtcHJlOSBieSBSb2JlcnQgU2Nod2ViZWwKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdGltZXguaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBSRUdfQ1NDSVIgMHgyMiAJCS8qIENoaXAgU2V0dXAgYW5kIENvbnRyb2wgSW5kZXggUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgUkVHX0NTQ0RSIDB4MjMJCS8qIENoaXAgU2V0dXAgYW5kIENvbnRyb2wgRGF0YSAgUmVnaXN0ZXIgICAgKi8KKworLyogTW9kdWxlIHBhcmFtZXRlciAqLworc3RhdGljIGludCBtYXhfZnJlcTsKKworc3RydWN0IHNfZWxhbl9tdWx0aXBsaWVyIHsKKwlpbnQgY2xvY2s7CQkvKiBmcmVxdWVuY3kgaW4ga0h6ICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaW50IHZhbDQwaDsJCS8qIFBNVSBGb3JjZSBNb2RlIHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgKi8KKwlpbnQgdmFsODBoOwkJLyogQ1BVIENsb2NrIFNwZWVkIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworfTsKKworLyoKKyAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBmcmVxdWVuY2llcyAKKyAqIGFyZSBsaXN0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGhlcmUhCisgKi8KK3N0cnVjdCBzX2VsYW5fbXVsdGlwbGllciBlbGFuX211bHRpcGxpZXJbXSA9IHsKKwl7MTAwMCwJMHgwMiwJMHgxOH0sCisJezIwMDAsCTB4MDIsCTB4MTB9LAorCXs0MDAwLAkweDAyLAkweDA4fSwKKwl7ODAwMCwJMHgwMCwJMHgwMH0sCisJezE2MDAwLAkweDAwLAkweDAyfSwKKwl7MzMwMDAsCTB4MDAsCTB4MDR9LAorCXs2NjAwMCwJMHgwMSwJMHgwNH0sCisJezk5MDAwLAkweDAxLAkweDA1fQorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBlbGFuZnJlcV90YWJsZVtdID0geworCXswLAkxMDAwfSwKKwl7MSwJMjAwMH0sCisJezIsCTQwMDB9LAorCXszLAk4MDAwfSwKKwl7NCwJMTYwMDB9LAorCXs1LAkzMzAwMH0sCisJezYsCTY2MDAwfSwKKwl7NywJOTkwMDB9LAorCXswLAlDUFVGUkVRX1RBQkxFX0VORH0sCit9OworCisKKy8qKgorICoJZWxhbmZyZXFfZ2V0X2NwdV9mcmVxdWVuY3k6IGRldGVybWluZSBjdXJyZW50IGNwdSBzcGVlZAorICoKKyAqCUZpbmRzIG91dCBhdCB3aGljaCBmcmVxdWVuY3kgdGhlIENQVSBvZiB0aGUgRWxhbiBTT0MgcnVucworICoJYXQgdGhlIG1vbWVudC4gRnJlcXVlbmNpZXMgZnJvbSAxIHRvIDMzIE1IeiBhcmUgZ2VuZXJhdGVkIAorICoJdGhlIG5vcm1hbCB3YXksIDY2IGFuZCA5OSBNSHogYXJlIGNhbGxlZCAiSHlwZXJzcGVlZCBNb2RlIgorICoJYW5kIGhhdmUgdGhlIHJlc3Qgb2YgdGhlIGNoaXAgcnVubmluZyB3aXRoIDMzIE1Iei4gCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBlbGFuZnJlcV9nZXRfY3B1X2ZyZXF1ZW5jeSh1bnNpZ25lZCBpbnQgY3B1KQoreworICAgICAgICB1OCBjbG9ja3NwZWVkX3JlZzsgICAgLyogQ2xvY2sgU3BlZWQgUmVnaXN0ZXIgKi8KKwkKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworICAgICAgICBvdXRiX3AoMHg4MCxSRUdfQ1NDSVIpOworICAgICAgICBjbG9ja3NwZWVkX3JlZyA9IGluYl9wKFJFR19DU0NEUik7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisgICAgICAgIGlmICgoY2xvY2tzcGVlZF9yZWcgJiAweEUwKSA9PSAweEUwKSB7IHJldHVybiAwOyB9CisKKyAgICAgICAgLyogQXJlIHdlIGluIENQVSBjbG9jayBtdWx0aXBsaWVkIG1vZGUgKDY2Lzk5IE1Ieik/ICovCisgICAgICAgIGlmICgoY2xvY2tzcGVlZF9yZWcgJiAweEUwKSA9PSAweEMwKSB7CisgICAgICAgICAgICAgICAgaWYgKChjbG9ja3NwZWVkX3JlZyAmIDB4MDEpID09IDApIHsKKwkJCXJldHVybiA2NjAwMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiA5OTAwMDsgICAgICAgICAgICAgCisJCX0KKyAgICAgICAgfQorCisJLyogMzMgTUh6IGlzIG5vdCAzMiBNSHouLi4gKi8KKwlpZiAoKGNsb2Nrc3BlZWRfcmVnICYgMHhFMCk9PTB4QTApCisJCXJldHVybiAzMzAwMDsKKworICAgICAgICByZXR1cm4gKCgxPDwoKGNsb2Nrc3BlZWRfcmVnICYgMHhFMCkgPj4gNSkpICogMTAwMCk7Cit9CisKKworLyoqCisgKiAgICAgIGVsYW5mcmVxX3NldF9jcHVfZnJlcXVlbmN5OiBDaGFuZ2UgdGhlIENQVSBjb3JlIGZyZXF1ZW5jeQorICogCUBjcHU6IGNwdSBudW1iZXIKKyAqCUBmcmVxOiBmcmVxdWVuY3kgaW4ga0h6CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgZnJlcXVlbmN5IHZhbHVlIGFuZCBjaGFuZ2VzIHRoZSBDUFUgZnJlcXVlbmN5IAorICoJYWNjb3JkaW5nIHRvIHRoaXMuIE5vdGUgdGhhdCB0aGUgZnJlcXVlbmN5IGhhcyB0byBiZSBjaGVja2VkIGJ5CisgKgllbGFuZnJlcV92YWxpZGF0ZXNwZWVkKCkgZm9yIGNvcnJlY3RuZXNzIQorICoJCisgKglUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuIAorICovCisKK3N0YXRpYyB2b2lkIGVsYW5mcmVxX3NldF9jcHVfc3RhdGUgKHVuc2lnbmVkIGludCBzdGF0ZSkgeworCisJc3RydWN0IGNwdWZyZXFfZnJlcXMgICAgZnJlcXM7CisKKwlmcmVxcy5vbGQgPSBlbGFuZnJlcV9nZXRfY3B1X2ZyZXF1ZW5jeSgwKTsKKwlmcmVxcy5uZXcgPSBlbGFuX211bHRpcGxpZXJbc3RhdGVdLmNsb2NrOworCWZyZXFzLmNwdSA9IDA7IC8qIGVsYW5mcmVxLmMgaXMgVVAgb25seSBkcml2ZXIgKi8KKwkKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiZWxhbmZyZXE6IGF0dGVtcHRpbmcgdG8gc2V0IGZyZXF1ZW5jeSB0byAlaSBrSHpcbiIsZWxhbl9tdWx0aXBsaWVyW3N0YXRlXS5jbG9jayk7CisKKworCS8qIAorCSAqIEFjY2VzcyB0byB0aGUgRWxhbidzIGludGVybmFsIHJlZ2lzdGVycyBpcyBpbmRleGVkIHZpYSAgICAKKwkgKiAweDIyOiBDaGlwIFNldHVwICYgQ29udHJvbCBSZWdpc3RlciBJbmRleCBSZWdpc3RlciAoQ1NDSSkgCisJICogMHgyMzogQ2hpcCBTZXR1cCAmIENvbnRyb2wgUmVnaXN0ZXIgRGF0YSAgUmVnaXN0ZXIgKENTQ0QpIAorCSAqCisJICovCisKKwkvKiAKKwkgKiAweDQwIGlzIHRoZSBQb3dlciBNYW5hZ2VtZW50IFVuaXQncyBGb3JjZSBNb2RlIFJlZ2lzdGVyLiAKKwkgKiBCaXQgNiBlbmFibGVzIEh5cGVyc3BlZWQgTW9kZSAoNjYvMTAwIE1IeiBjb3JlIGZyZXF1ZW5jeSkKKwkgKi8KKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJb3V0Yl9wKDB4NDAsUkVHX0NTQ0lSKTsgCS8qIERpc2FibGUgaHlwZXJzcGVlZCBtb2RlICAgICAgICAgICovCisJb3V0Yl9wKDB4MDAsUkVHX0NTQ0RSKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CQkvKiB3YWl0IHRpbGwgaW50ZXJuYWwgcGlwZWxpbmVzIGFuZCAqLworCXVkZWxheSgxMDAwKTsJCQkvKiBidWZmZXJzIGhhdmUgY2xlYW5lZCB1cCAgICAgICAgICAqLworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCS8qIG5vdywgc2V0IHRoZSBDUFUgY2xvY2sgc3BlZWQgcmVnaXN0ZXIgKDB4ODApICovCisJb3V0Yl9wKDB4ODAsUkVHX0NTQ0lSKTsKKwlvdXRiX3AoZWxhbl9tdWx0aXBsaWVyW3N0YXRlXS52YWw4MGgsUkVHX0NTQ0RSKTsKKworCS8qIG5vdywgdGhlIGh5cGVyc3BlZWQgYml0IGluIFBNVSBGb3JjZSBNb2RlIFJlZ2lzdGVyICgweDQwKSAqLworCW91dGJfcCgweDQwLFJFR19DU0NJUik7CisJb3V0Yl9wKGVsYW5fbXVsdGlwbGllcltzdGF0ZV0udmFsNDBoLFJFR19DU0NEUik7CisJdWRlbGF5KDEwMDAwKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKK307CisKKworLyoqCisgKgllbGFuZnJlcV92YWxpZGF0ZXNwZWVkOiB0ZXN0IGlmIGZyZXF1ZW5jeSByYW5nZSBpcyB2YWxpZAorICogICAgICBAcG9saWN5OiB0aGUgcG9saWN5IHRvIHZhbGlkYXRlCisgKgorICoJVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgYSBnaXZlbiBmcmVxdWVuY3kgcmFuZ2UgaW4ga0h6IGlzIHZhbGlkIAorICogICAgICBmb3IgdGhlIGhhcmR3YXJlIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyLiAKKyAqLworCitzdGF0aWMgaW50IGVsYW5mcmVxX3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZlbGFuZnJlcV90YWJsZVswXSk7Cit9CisKK3N0YXRpYyBpbnQgZWxhbmZyZXFfdGFyZ2V0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgCisJCQkgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLCAKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50ICAgIG5ld3N0YXRlID0gMDsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmZWxhbmZyZXFfdGFibGVbMF0sIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllbGFuZnJlcV9zZXRfY3B1X3N0YXRlKG5ld3N0YXRlKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglNb2R1bGUgaW5pdCBhbmQgZXhpdCBjb2RlCisgKi8KKworc3RhdGljIGludCBlbGFuZnJlcV9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmVzdWx0OworCisJLyogY2FwYWJpbGl0eSBjaGVjayAqLworCWlmICgoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCkgfHwKKwkgICAgKGMtPng4NiAhPSA0KSB8fCAoYy0+eDg2X21vZGVsIT0xMCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogbWF4IGZyZXEgKi8KKwlpZiAoIW1heF9mcmVxKQorCQltYXhfZnJlcSA9IGVsYW5mcmVxX2dldF9jcHVfZnJlcXVlbmN5KDApOworCisJLyogdGFibGUgaW5pdCAqLworIAlmb3IgKGk9MDsgKGVsYW5mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgeworCQlpZiAoZWxhbmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID4gbWF4X2ZyZXEpCisJCQllbGFuZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJfQorCisJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCXBvbGljeS0+Y3VyID0gZWxhbmZyZXFfZ2V0X2NwdV9mcmVxdWVuY3koMCk7CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgZWxhbmZyZXFfdGFibGUpOworCWlmIChyZXN1bHQpCisJCXJldHVybiAocmVzdWx0KTsKKworICAgICAgICBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihlbGFuZnJlcV90YWJsZSwgcG9saWN5LT5jcHUpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBlbGFuZnJlcV9jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CisJcmV0dXJuIDA7Cit9CisKKworI2lmbmRlZiBNT0RVTEUKKy8qKgorICogZWxhbmZyZXFfc2V0dXAgLSBlbGFuZnJlcSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIHBhcnNpbmcKKyAqCisgKiBlbGFuZnJlcSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyLiAgVXNlOgorICogIGVsYW5mcmVxPTY2MDAwCisgKiB0byBzZXQgdGhlIG1heGltdW0gQ1BVIGZyZXF1ZW5jeSB0byA2NiBNSHouIE5vdGUgdGhhdCBpbgorICogY2FzZSB5b3UgZG8gbm90IGdpdmUgdGhpcyBib290IHBhcmFtZXRlciwgdGhlIG1heGltdW0KKyAqIGZyZXF1ZW5jeSB3aWxsIGZhbGwgYmFjayB0byBfY3VycmVudF8gQ1BVIGZyZXF1ZW5jeSB3aGljaAorICogbWlnaHQgYmUgbG93ZXIuIElmIHlvdSBidWlsZCB0aGlzIGFzIGEgbW9kdWxlLCB1c2UgdGhlCisgKiBtYXhfZnJlcSBtb2R1bGUgcGFyYW1ldGVyIGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGVsYW5mcmVxX3NldHVwKGNoYXIgKnN0cikKK3sKKwltYXhfZnJlcSA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgJnN0ciwgMCk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiWW91J3JlIHVzaW5nIHRoZSBkZXByZWNhdGVkIGVsYW5mcmVxIGNvbW1hbmQgbGluZSBvcHRpb24uIFVzZSBlbGFuZnJlcS5tYXhfZnJlcSBpbnN0ZWFkLCBwbGVhc2UhXG4iKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImVsYW5mcmVxPSIsIGVsYW5mcmVxX3NldHVwKTsKKyNlbmRpZgorCisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBlbGFuZnJlcV9hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgZWxhbmZyZXFfZHJpdmVyID0geworCS5nZXQJIAk9IGVsYW5mcmVxX2dldF9jcHVfZnJlcXVlbmN5LAorCS52ZXJpZnkgCT0gZWxhbmZyZXFfdmVyaWZ5LAorCS50YXJnZXQgCT0gZWxhbmZyZXFfdGFyZ2V0LAorCS5pbml0CQk9IGVsYW5mcmVxX2NwdV9pbml0LAorCS5leGl0CQk9IGVsYW5mcmVxX2NwdV9leGl0LAorCS5uYW1lCQk9ICJlbGFuZnJlcSIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hdHRyCQk9IGVsYW5mcmVxX2F0dHIsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IGVsYW5mcmVxX2luaXQodm9pZCkgCit7CQorCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCisJLyogVGVzdCBpZiB3ZSBoYXZlIHRoZSByaWdodCBoYXJkd2FyZSAqLworCWlmICgoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCkgfHwKKwkJKGMtPng4NiAhPSA0KSB8fCAoYy0+eDg2X21vZGVsIT0xMCkpCisJeworCQlwcmludGsoS0VSTl9JTkZPICJlbGFuZnJlcTogZXJyb3I6IG5vIEVsYW4gcHJvY2Vzc29yIGZvdW5kIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmZWxhbmZyZXFfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZWxhbmZyZXFfZXhpdCh2b2lkKSAKK3sKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZlbGFuZnJlcV9kcml2ZXIpOworfQorCisKK21vZHVsZV9wYXJhbSAobWF4X2ZyZXEsIGludCwgMDQ0NCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlJvYmVydCBTY2h3ZWJlbCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4sIFN2ZW4gR2VnZ3VzIDxzdmVuQGdlZ2d1cy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImNwdWZyZXEgZHJpdmVyIGZvciBBTUQncyBFbGFuIENQVXMiKTsKKworbW9kdWxlX2luaXQoZWxhbmZyZXFfaW5pdCk7Cittb2R1bGVfZXhpdChlbGFuZnJlcV9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTQ5YWRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKQEAgLTAsMCArMSw1MDIgQEAKKy8qCisgKglDeXJpeCBNZWRpYUdYIGFuZCBOYXRTZW1pIEdlb2RlIFN1c3BlbmQgTW9kdWxhdGlvbgorICoJKEMpIDIwMDIgWndhbmUgTXdhaWthbWJvIDx6d2FuZUBjb21tZmlyZXNlcnZpY2VzLmNvbT4KKyAqCShDKSAyMDAyIEhpcm9zaGkgTWl1cmEgICA8bWl1cmFAZGEtY2hhLm9yZz4KKyAqCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiAKKyAqCisgKiAgICAgIFRoZSBhdXRob3Iocykgb2YgdGhpcyBzb2Z0d2FyZSBzaGFsbCBub3QgYmUgaGVsZCBsaWFibGUgZm9yIGRhbWFnZXMKKyAqICAgICAgb2YgYW55IG5hdHVyZSByZXN1bHRpbmcgZHVlIHRvIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcworICogICAgICBzb2Z0d2FyZSBpcyBwcm92aWRlZCBBUy1JUyB3aXRoIG5vIHdhcnJhbnRpZXMuCisgKgkKKyAqIFRoZW9yaXRpY2FsIG5vdGU6CisgKgorICoJKHNlZSBHZW9kZSh0bSkgQ1M1NTMwIG1hbnVhbCAocmV2LjQuMSkgcGFnZS41NikKKyAqCisgKglDUFUgZnJlcXVlbmN5IGNvbnRyb2wgb24gTmF0U2VtaSBHZW9kZSBHWDEvR1hMViBwcm9jZXNzb3IgYW5kIENTNTV4MAorICoJYXJlIGJhc2VkIG9uIFN1c3BlbmQgTW9kdXJhdGlvbi4KKyAqCisgKglTdXNwZW5kIE1vZHVsYXRpb24gd29ya3MgYnkgYXNzZXJ0aW5nIGFuZCBkZS1hc3NlcnRpbmcgdGhlIFNVU1AjIHBpbgorICoJdG8gQ1BVKEdYMS9HWExWKSBmb3IgY29uZmlndXJhYmxlIGR1cmF0aW9ucy4gV2hlbiBhc3NlcnRpbmcgU1VTUCMKKyAqCXRoZSBDUFUgZW50ZXJzIGFuIGlkbGUgc3RhdGUuIEdYMSBzdG9wcyBpdHMgY29yZSBjbG9jayB3aGVuIFNVU1AjIGlzIAorICoJYXNzZXJ0ZWQgdGhlbiBwb3dlciBjb25zdW1wdGlvbiBpcyByZWR1Y2VkLgorICoKKyAqCVN1c3BlbmQgTW9kdWxhdGlvbidzIE9GRi9PTiBkdXJhdGlvbiBhcmUgY29uZmlndXJhYmxlIAorICoJd2l0aCAnU3VzcGVuZCBNb2R1bGF0aW9uIE9GRiBDb3VudCBSZWdpc3RlcicKKyAqCWFuZCAnU3VzcGVuZCBNb2R1bGF0aW9uIE9OIENvdW50IFJlZ2lzdGVyJy4KKyAqCVRoZXNlIHJlZ2lzdGVycyBhcmUgOGJpdCBjb3VudGVycyB0aGF0IHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mIAorICoJMzJ1cyBpbnRlcnZhbHMgd2hpY2ggdGhlIFNVU1AjIHBpbiBpcyBhc3NlcnRlZChPTikvZGUtYXNzZXJ0ZWQoT0ZGKQorICoJdG8gdGhlIHByb2Nlc3Nvci4KKyAqCisgKglUaGVzZSBjb3VudGVycyBkZWZpbmUgYSByYXRpbyB3aGljaCBpcyB0aGUgZWZmZWN0aXZlIGZyZXF1ZW5jeSAKKyAqIAlvZiBvcGVyYXRpb24gb2YgdGhlIHN5c3RlbS4KKyAqCisgKgkJCSAgICAgICBPRkYgQ291bnQKKyAqCUZfZWZmID0gRmd4ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJICAgICAgICAgICAgICAgIE9GRiBDb3VudCArIE9OIENvdW50CisgKgorICoJMCA8PSBPbiBDb3VudCwgT2ZmIENvdW50IDw9IDI1NQorICoKKyAqCUZyb20gdGhlc2UgbGltaXRzLCB3ZSBjYW4gZ2V0IHJlZ2lzdGVyIHZhbHVlcyAKKyAqCisgKglvZmZfZHVyYXRpb24gKyBvbl9kdXJhdGlvbiA8PSBNQVhfRFVSQVRJT04KKyAqCW9uX2R1cmF0aW9uID0gb2ZmX2R1cmF0aW9uICogKHN0b2NrX2ZyZXEgLSBmcmVxKSAvIGZyZXEKKyAqCisgKiAgICAgIG9mZl9kdXJhdGlvbiAgPSAgKGZyZXEgKiBEVVJBVElPTikgLyBzdG9ja19mcmVxIAorICogICAgICBvbl9kdXJhdGlvbiA9IERVUkFUSU9OIC0gb2ZmX2R1cmF0aW9uIAorICoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENoYW5nZUxvZzoKKyAqICAJRGVjLiAxMiwgMjAwMwlIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgorICogIAkJLSBmaXggb24vb2ZmIHJlZ2lzdGVyIG1pc3Rha2UKKyAqICAJCS0gZml4IGNwdV9raHogY2FsYyB3aGVuIGl0IHN0b3BzIGNwdSBtb2R1bGF0aW9uLgorICoKKyAqCURlYy4gMTEsIDIwMDIgCUhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+CisgKgkJLSByZXdyaXRlIGZvciBDeXJpeCBNZWRpYUdYIEN4NTUxMC81NTIwIGFuZCAKKyAqCQkgIE5hdFNlbWkgR2VvZGUgQ3M1NTMwKEEpLgorICoKKyAqCUp1bC4gPz8sIDIwMDIgIFp3YW5lIE13YWlrYW1ibyA8endhbmVAY29tbWZpcmVzZXJ2aWNlcy5jb20+CisgKgkJLSBjczU1MzBfbW9kIHBhdGNoIGZvciAyLjQuMTktcmMxLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVG9kbworICoJVGVzdCBvbiBtYWNoaW5lcyB3aXRoIDU1MTAsIDU1MzAsIDU1MzBBCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlTdXNwZW5kIE1vZHVsYXRpb24gLSBEZWZpbml0aW9ucwkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gCisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKy8qIFBDSSBjb25maWcgcmVnaXN0ZXJzLCBhbGwgYXQgRjAgKi8KKyNkZWZpbmUgUENJX1BNRVIxICAgICAgICAgICAgICAweDgwICAgIC8qIHBvd2VyIG1hbmFnZW1lbnQgZW5hYmxlIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgUENJX1BNRVIyICAgICAgICAgICAgICAweDgxICAgIC8qIHBvd2VyIG1hbmFnZW1lbnQgZW5hYmxlIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgUENJX1BNRVIzICAgICAgICAgICAgICAweDgyICAgIC8qIHBvd2VyIG1hbmFnZW1lbnQgZW5hYmxlIHJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgUENJX0lSUVRDICAgICAgICAgICAgICAweDhjICAgIC8qIGlycSBzcGVlZHVwIHRpbWVyIGNvdW50ZXIgcmVnaXN0ZXI6dHlwaWNhbCAyIHRvIDRtcyAqLworI2RlZmluZSBQQ0lfVklEVEMgICAgICAgICAgICAgIDB4OGQgICAgLyogdmlkZW8gc3BlZWR1cCB0aW1lciBjb3VudGVyIHJlZ2lzdGVyOiB0eXBpY2FsIDUwIHRvIDEwMG1zICovCisjZGVmaW5lIFBDSV9NT0RPRkYgICAgICAgICAgICAgMHg5NCAgICAvKiBzdXNwZW5kIG1vZHVsYXRpb24gT0ZGIGNvdW50ZXIgcmVnaXN0ZXIsIDEgPSAzMnVzICovCisjZGVmaW5lIFBDSV9NT0RPTiAgICAgICAgICAgICAgMHg5NSAgICAvKiBzdXNwZW5kIG1vZHVsYXRpb24gT04gY291bnRlciByZWdpc3RlciAqLworI2RlZmluZSBQQ0lfU1VTQ0ZHICAgICAgICAgICAgIDB4OTYgICAgLyogc3VzcGVuZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisKKy8qIFBNRVIxIGJpdHMgKi8KKyNkZWZpbmUgR1BNICAgICAgICAgICAgICAgICAgICAoMTw8MCkgIC8qIGdsb2JhbCBwb3dlciBtYW5hZ2VtZW50ICovCisjZGVmaW5lIEdJVCAgICAgICAgICAgICAgICAgICAgKDE8PDEpICAvKiBnbG9iYWxseSBlbmFibGUgUE0gZGV2aWNlIGlkbGUgdGltZXJzICovCisjZGVmaW5lIEdUUiAgICAgICAgICAgICAgICAgICAgKDE8PDIpICAvKiBnbG9iYWxseSBlbmFibGUgSU8gdHJhcHMgKi8KKyNkZWZpbmUgSVJRX1NQRFVQICAgICAgICAgICAgICAoMTw8MykgIC8qIGRpc2FibGUgY2xvY2sgdGhyb3R0bGUgZHVyaW5nIGludGVycnVwdCBoYW5kbGluZyAqLworI2RlZmluZSBWSURfU1BEVVAgICAgICAgICAgICAgICgxPDw0KSAgLyogZGlzYWJsZSBjbG9jayB0aHJvdHRsZSBkdXJpbmcgdmdhIHZpZGVvIGhhbmRsaW5nICovCisKKy8qIFNVU0NGRyBiaXRzICovCisjZGVmaW5lIFNVU01PRCAgICAgICAgICAgICAgICAgKDE8PDApICAvKiBlbmFibGUvZGlzYWJsZSBzdXNwZW5kIG1vZHVsYXRpb24gKi8KKy8qIHRoZSBiZWxvd3Mgc3VwcG9ydCBvbmx5IHdpdGggY3M1NTMwIChhZnRlciByZXYuMS4yKS9jczU1MzBBICovIAorI2RlZmluZSBTTUlTUERVUCAgICAgICAgICAgICAgICgxPDwxKSAgLyogc2VsZWN0IGhvdyBTTUkgcmUtZW5hYmxlIHN1c3BlbmQgbW9kdWxhdGlvbjogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElSUVRDIHRpbWVyIG9yIHJlYWQgU01JIHNwZWVkdXAgZGlzYWJsZSByZWcuKEYxQkFSWzA4LTA5aF0pICovCisjZGVmaW5lIFNVU0NGRyAgICAgICAgICAgICAgICAgKDE8PDIpICAvKiBlbmFibGUgcG93ZXJpbmcgZG93biBhIEdYTFYgcHJvY2Vzc29yLiAiU3BlY2lhbCAzVm9sdCBTdXNwZW5kIiBtb2RlICovCisvKiB0aGUgYmVsb3dzIHN1cHBvcnQgb25seSB3aXRoIGNzNTUzMEEgKi8gCisjZGVmaW5lIFBXUlNWRV9JU0EgICAgICAgICAgICAgKDE8PDMpICAvKiBzdG9wIElTQSBjbG9jayAgKi8KKyNkZWZpbmUgUFdSU1ZFICAgICAgICAgICAgICAgICAoMTw8NCkgIC8qIGFjdGl2ZSBpZGxlICovCisKK3N0cnVjdCBneGZyZXFfcGFyYW1zIHsKKwl1OCBvbl9kdXJhdGlvbjsKKwl1OCBvZmZfZHVyYXRpb247CisJdTggcGNpX3N1c2NmZzsKKwl1OCBwY2lfcG1lcjE7CisJdTggcGNpX3BtZXIyOworCXU4IHBjaV9yZXY7CisJc3RydWN0IHBjaV9kZXYgKmNzNTV4MDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3hmcmVxX3BhcmFtcyAqZ3hfcGFyYW1zOworc3RhdGljIGludCBzdG9ja19mcmVxOworCisvKiBQQ0kgYnVzIGNsb2NrIC0gZGVmYXVsdHMgdG8gMzAuMDAwIGlmIGNwdV9raHogaXMgbm90IGF2YWlsYWJsZSAqLworc3RhdGljIGludCBwY2lfYnVzY2xrID0gMDsKK21vZHVsZV9wYXJhbSAocGNpX2J1c2NsaywgaW50LCAwNDQ0KTsKKworLyogbWF4aW11bSBkdXJhdGlvbiBmb3Igd2hpY2ggdGhlIGNwdSBtYXkgYmUgc3VzcGVuZGVkCisgKiAoMzJ1cyAqIE1BWF9EVVJBVElPTikuIElmIG5vIHBhcmFtZXRlciBpcyBnaXZlbiwgdGhpcyBkZWZhdWx0cworICogdG8gMjU1LiAKKyAqIE5vdGUgdGhhdCB0aGlzIGxlYWRzIHRvIGEgbWF4aW11bSBvZiA4IG1zKCEpIHdoZXJlIHRoZSBDUFUgY2xvY2sKKyAqIGlzIHN1c3BlbmRlZCAtLSBwcm9jZXNzaW5nIHBvd2VyIGlzIGp1c3QgMC4zOSUgb2Ygd2hhdCBpdCB1c2VkIHRvIGJlLAorICogdGhvdWdoLiA3ODEuMjUga0h6KCEpIGZvciBhIDIwMCBNSHogcHJvY2Vzc29yIC0tIHdvdy4gKi8KK3N0YXRpYyBpbnQgbWF4X2R1cmF0aW9uID0gMjU1OworbW9kdWxlX3BhcmFtIChtYXhfZHVyYXRpb24sIGludCwgMDQ0NCk7CisKKy8qIEZvciB0aGUgZGVmYXVsdCBwb2xpY3ksIHdlIHdhbnQgYXQgbGVhc3Qgc29tZSBwcm9jZXNzaW5nIHBvd2VyCisgKiAtIGxldCdzIHNheSA1JS4gKG1pbiA9IG1heGZyZXEgLyBQT0xJQ1lfTUlOX0RJVikKKyAqLworI2RlZmluZSBQT0xJQ1lfTUlOX0RJViAyMAorCisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAiZ3gtc3VzcG1vZCIsIG1zZykKKworLyoqCisgKiAgICAgIHdlIGNhbiBkZXRlY3QgYSBjb3JlIG11bHRpcGlsZXIgZnJvbSBkaXIwX2xzYiAKKyAqICAgICAgZnJvbSBHWDEgZGF0YXNoZWV0IHAuNTYsIAorICoJICAgTVVMVFszOjBdOgorICoJICAgMDAwMCA9IFNZU0NMSyBtdWx0aXBsaWVkIGJ5IDQgKHRlc3Qgb25seSkKKyAqCSAgIDAwMDEgPSBTWVNDTEsgbXVsdGlwbGllZCBieSAxMAorICoJICAgMDAxMCA9IFNZU0NMSyBtdWx0aXBsaWVkIGJ5IDQKKyAqCSAgIDAwMTEgPSBTWVNDTEsgbXVsdGlwbGllZCBieSA2CisgKgkgICAwMTAwID0gU1lTQ0xLIG11bHRpcGxpZWQgYnkgOQorICoJICAgMDEwMSA9IFNZU0NMSyBtdWx0aXBsaWVkIGJ5IDUKKyAqCSAgIDAxMTAgPSBTWVNDTEsgbXVsdGlwbGllZCBieSA3CisgKgkgICAwMTExID0gU1lTQ0xLIG11bHRpcGxpZWQgYnkgOAorICogICAgICAgICAgICAgIG9mIDMzLjNNSHoKKyAqKi8KK3N0YXRpYyBpbnQgZ3hfZnJlcV9tdWx0WzE2XSA9IHsKKwkJNCwgMTAsIDQsIDYsIDksIDUsIDcsIDgsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAlMb3cgTGV2ZWwgY2hpcHNldCBpbnRlcmZhY2UJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZ3hfY2hpcHNldF90YmxbXSBfX2luaXRkYXRhID0geworICAgICAgICB7IFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUzMF9MRUdBQ1ksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKyAgICAgICAgeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKyAgICAgICAgeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKyAgICAgICAgeyAwLCB9LAorfTsKKworLyoqCisgKiAgICAgZ3hfZGV0ZWN0X2NoaXBzZXQ6CisgKgorICoqLworc3RhdGljIF9faW5pdCBzdHJ1Y3QgcGNpX2RldiAqZ3hfZGV0ZWN0X2NoaXBzZXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZ3hfcGNpID0gTlVMTDsKKworCS8qIGNoZWNrIGlmIENQVSBpcyBhIE1lZGlhR1ggb3IgYSBHZW9kZS4gKi8KKyAgICAgICAgaWYgKChjdXJyZW50X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9OU0MpICYmIAorCSAgICAoY3VycmVudF9jcHVfZGF0YS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQ1lSSVgpKSB7CisJCWRwcmludGsoImVycm9yOiBubyBNZWRpYUdYL0dlb2RlIHByb2Nlc3NvciBmb3VuZCFcbiIpOworCQlyZXR1cm4gTlVMTDsJCQorCX0KKworCS8qIGRldGVjdCB3aGljaCBjb21wYW5pb24gY2hpcCBpcyB1c2VkICovCisJd2hpbGUgKChneF9wY2kgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBneF9wY2kpKSAhPSBOVUxMKSB7CisJCWlmICgocGNpX21hdGNoX2RldmljZSAoZ3hfY2hpcHNldF90YmwsIGd4X3BjaSkpICE9IE5VTEwpIHsKKwkJCXJldHVybiBneF9wY2k7CisJCX0KKwl9CisKKwlkcHJpbnRrKCJlcnJvcjogbm8gc3VwcG9ydGVkIGNoaXBzZXQgZm91bmQhXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiAgICAgIGd4X2dldF9jcHVzcGVlZDoKKyAqCisgKiBGaW5kcyBvdXQgYXQgd2hpY2ggZWZmaWNpZW50IGZyZXF1ZW5jeSB0aGUgQ3lyaXggTWVkaWFHWC9OYXRTZW1pIEdlb2RlIENQVSBydW5zLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGd4X2dldF9jcHVzcGVlZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWlmICgoZ3hfcGFyYW1zLT5wY2lfc3VzY2ZnICYgU1VTTU9EKSA9PSAwKSAKKwkJcmV0dXJuIHN0b2NrX2ZyZXE7CisKKwlyZXR1cm4gKHN0b2NrX2ZyZXEgKiBneF9wYXJhbXMtPm9mZl9kdXJhdGlvbikgCisJCS8gKGd4X3BhcmFtcy0+b25fZHVyYXRpb24gKyBneF9wYXJhbXMtPm9mZl9kdXJhdGlvbik7Cit9CisKKy8qKgorICogICAgICBneF92YWxpZGF0ZV9zcGVlZDoKKyAqICAgICAgZGV0ZXJtaW5lIGN1cnJlbnQgY3B1IHNwZWVkCisgKiAgICAgICAKKyoqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGd4X3ZhbGlkYXRlX3NwZWVkKHVuc2lnbmVkIGludCBraHosIHU4ICpvbl9kdXJhdGlvbiwgdTggKm9mZl9kdXJhdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1OCB0bXBfb24sIHRtcF9vZmY7CisJaW50IG9sZF90bXBfZnJlcSA9IHN0b2NrX2ZyZXE7CisJaW50IHRtcF9mcmVxOworCisJKm9mZl9kdXJhdGlvbj0xOworCSpvbl9kdXJhdGlvbj0wOworCisJZm9yIChpPW1heF9kdXJhdGlvbjsgaT4wOyBpLS0pIHsKKwkJdG1wX29mZiA9ICgoa2h6ICogaSkgLyBzdG9ja19mcmVxKSAmIDB4ZmY7IAorCQl0bXBfb24gPSBpIC0gdG1wX29mZjsKKwkJdG1wX2ZyZXEgPSAoc3RvY2tfZnJlcSAqIHRtcF9vZmYpIC8gaTsKKwkJLyogaWYgdGhpcyByZWxhdGlvbiBpcyBjbG9zZXIgdG8ga2h6LCB1c2UgdGhpcy4gSWYgaXQncyBlcXVhbCwKKwkJICogcHJlZmVyIGl0LCB0b28gLSBsb3dlciBsYXRlbmN5ICovCisJCWlmIChhYnModG1wX2ZyZXEgLSBraHopIDw9IGFicyhvbGRfdG1wX2ZyZXEgLSBraHopKSB7CisJCQkqb25fZHVyYXRpb24gPSB0bXBfb247CisJCQkqb2ZmX2R1cmF0aW9uID0gdG1wX29mZjsKKwkJCW9sZF90bXBfZnJlcSA9IHRtcF9mcmVxOworCQl9CisJfQorCisJcmV0dXJuIG9sZF90bXBfZnJlcTsKK30KKworCisvKioKKyAqIAlneF9zZXRfY3B1c3BlZWQ6CisgKgkJc2V0IGNwdSBzcGVlZCBpbiBraHouCisgKiovCisKK3N0YXRpYyB2b2lkIGd4X3NldF9jcHVzcGVlZCh1bnNpZ25lZCBpbnQga2h6KQoreworICAgICAgICB1OCBzdXNjZmcsIHBtZXIxOworCXVuc2lnbmVkIGludCBuZXdfa2h6OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisKKworCWZyZXFzLmNwdSA9IDA7CisJZnJlcXMub2xkID0gZ3hfZ2V0X2NwdXNwZWVkKDApOworCisJbmV3X2toeiA9IGd4X3ZhbGlkYXRlX3NwZWVkKGtoeiwgJmd4X3BhcmFtcy0+b25fZHVyYXRpb24sICZneF9wYXJhbXMtPm9mZl9kdXJhdGlvbik7CisKKwlmcmVxcy5uZXcgPSBuZXdfa2h6OworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAobmV3X2toeiAhPSBzdG9ja19mcmVxKSB7ICAvKiBpZiBuZXcga2h6ID09IDEwMCUgb2YgQ1BVIHNwZWVkLCBpdCBpcyBzcGVjaWFsIGNhc2UgKi8KKwkJc3dpdGNoIChneF9wYXJhbXMtPmNzNTV4MC0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9DWVJJWF81NTMwX0xFR0FDWToKKwkJCXBtZXIxID0gZ3hfcGFyYW1zLT5wY2lfcG1lcjEgfCBJUlFfU1BEVVAgfCBWSURfU1BEVVA7CisJCQkvKiBGSVhNRTogbmVlZCB0byB0ZXN0IG90aGVyIHZhbHVlcyAtLSBad2FuZSxNaXVyYSAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGd4X3BhcmFtcy0+Y3M1NXgwLCBQQ0lfSVJRVEMsIDQpOyAvKiB0eXBpY2FsIDIgdG8gNG1zICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZ3hfcGFyYW1zLT5jczU1eDAsIFBDSV9WSURUQywgMTAwKTsvKiB0eXBpY2FsIDUwIHRvIDEwMG1zICovCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZ3hfcGFyYW1zLT5jczU1eDAsIFBDSV9QTUVSMSwgcG1lcjEpOworCisJCQlpZiAoZ3hfcGFyYW1zLT5wY2lfcmV2IDwgMHgxMCkgeyAgIC8qIENTNTUzMChyZXYgMS4yLCAxLjMpICovCisJCQkJc3VzY2ZnID0gZ3hfcGFyYW1zLT5wY2lfc3VzY2ZnIHwgU1VTTU9EOworCQkJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDUzU1MzBBLEIuLiAqLworCQkJCXN1c2NmZyA9IGd4X3BhcmFtcy0+cGNpX3N1c2NmZyB8IFNVU01PRCB8IFBXUlNWRTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUyMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MTA6CisJCQlzdXNjZmcgPSBneF9wYXJhbXMtPnBjaV9zdXNjZmcgfCBTVVNNT0Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCWRwcmludGsoImZhdGFsOiB0cnkgdG8gc2V0IHVua25vd24gY2hpcHNldC5cbiIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJc3VzY2ZnID0gZ3hfcGFyYW1zLT5wY2lfc3VzY2ZnICYgfihTVVNNT0QpOworCQlneF9wYXJhbXMtPm9mZl9kdXJhdGlvbiA9IDA7CisJCWd4X3BhcmFtcy0+b25fZHVyYXRpb24gPSAwOworCQlkcHJpbnRrKCJzdXNwZW5kIG1vZHVsYXRpb24gZGlzYWJsZWQ6IGNwdSBydW5zIDEwMCBwZXJjZW50IHNwZWVkLlxuIik7CisJfQorCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGd4X3BhcmFtcy0+Y3M1NXgwLCBQQ0lfTU9ET0ZGLCBneF9wYXJhbXMtPm9mZl9kdXJhdGlvbik7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGd4X3BhcmFtcy0+Y3M1NXgwLCBQQ0lfTU9ET04sIGd4X3BhcmFtcy0+b25fZHVyYXRpb24pOworCisgICAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShneF9wYXJhbXMtPmNzNTV4MCwgUENJX1NVU0NGRywgc3VzY2ZnKTsKKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoZ3hfcGFyYW1zLT5jczU1eDAsIFBDSV9TVVNDRkcsICZzdXNjZmcpOworCisgICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWd4X3BhcmFtcy0+cGNpX3N1c2NmZyA9IHN1c2NmZzsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisgICAgICAgIGRwcmludGsoInN1c3BlbmQgbW9kdWxhdGlvbiB3LyBkdXJhdGlvbiBvZiBPTjolZCB1cywgT0ZGOiVkIHVzXG4iLAorICAgICAgICAgICAgICAgIGd4X3BhcmFtcy0+b25fZHVyYXRpb24gKiAzMiwgZ3hfcGFyYW1zLT5vZmZfZHVyYXRpb24gKiAzMik7CisJZHByaW50aygic3VzcGVuZCBtb2R1bGF0aW9uIHcvIGNsb2NrIHNwZWVkOiAlZCBrSHouXG4iLCBmcmVxcy5uZXcpOyAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIEhpZ2ggbGV2ZWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCWNwdWZyZXFfZ3hfdmVyaWZ5OiB0ZXN0IGlmIGZyZXF1ZW5jeSByYW5nZSBpcyB2YWxpZCAKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBhIGdpdmVuIGZyZXF1ZW5jeSByYW5nZSBpbiBrSHogaXMgdmFsaWQgCisgKiAgICAgIGZvciB0aGUgaGFyZHdhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuIAorICovCisKK3N0YXRpYyBpbnQgY3B1ZnJlcV9neF92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdW5zaWduZWQgaW50IHRtcF9mcmVxID0gMDsKKwl1OCB0bXAxLCB0bXAyOworCisgICAgICAgIGlmICghc3RvY2tfZnJlcSB8fCAhcG9saWN5KQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJcG9saWN5LT5jcHUgPSAwOworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCAoc3RvY2tfZnJlcSAvIG1heF9kdXJhdGlvbiksIHN0b2NrX2ZyZXEpOworCisJLyogaXQgbmVlZHMgdG8gYmUgYXNzdXJlZCB0aGF0IGF0IGxlYXN0IG9uZSBzdXBwb3J0ZWQgZnJlcXVlbmN5IGlzCisJICogd2l0aGluIHBvbGljeS0+bWluIGFuZCBwb2xpY3ktPm1heC4gSWYgaXQgaXMgbm90LCBwb2xpY3ktPm1heAorCSAqIG5lZWRzIHRvIGJlIGluY3JlYXNlZCB1bnRpbCBvbmUgZnJldXFlbmN5IGlzIHN1cHBvcnRlZC4KKwkgKiBwb2xpY3ktPm1pbiBtYXkgbm90IGJlIGRlY3JlYXNlZCwgdGhvdWdoLiBUaGlzIHdheSB3ZSBndWFyYW50ZWUgYSAKKwkgKiBzcGVjaWZpYyBwcm9jZXNzaW5nIGNhcGFjaXR5LgorCSAqLworCXRtcF9mcmVxID0gZ3hfdmFsaWRhdGVfc3BlZWQocG9saWN5LT5taW4sICZ0bXAxLCAmdG1wMik7CisJaWYgKHRtcF9mcmVxIDwgcG9saWN5LT5taW4pIAorCQl0bXBfZnJlcSArPSBzdG9ja19mcmVxIC8gbWF4X2R1cmF0aW9uOworCXBvbGljeS0+bWluID0gdG1wX2ZyZXE7CisJaWYgKHBvbGljeS0+bWluID4gcG9saWN5LT5tYXgpIAorCQlwb2xpY3ktPm1heCA9IHRtcF9mcmVxOworCXRtcF9mcmVxID0gZ3hfdmFsaWRhdGVfc3BlZWQocG9saWN5LT5tYXgsICZ0bXAxLCAmdG1wMik7CisJaWYgKHRtcF9mcmVxID4gcG9saWN5LT5tYXgpCisJCXRtcF9mcmVxIC09IHN0b2NrX2ZyZXEgLyBtYXhfZHVyYXRpb247CisJcG9saWN5LT5tYXggPSB0bXBfZnJlcTsKKwlpZiAocG9saWN5LT5tYXggPCBwb2xpY3ktPm1pbikKKwkJcG9saWN5LT5tYXggPSBwb2xpY3ktPm1pbjsKKwljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgKHN0b2NrX2ZyZXEgLyBtYXhfZHVyYXRpb24pLCBzdG9ja19mcmVxKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICAgICAgY3B1ZnJlcV9neF90YXJnZXQ6ICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgY3B1ZnJlcV9neF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXU4IHRtcDEsIHRtcDI7CisJdW5zaWduZWQgaW50IHRtcF9mcmVxOworCisgICAgICAgIGlmICghc3RvY2tfZnJlcSB8fCAhcG9saWN5KQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJcG9saWN5LT5jcHUgPSAwOworCisJdG1wX2ZyZXEgPSBneF92YWxpZGF0ZV9zcGVlZCh0YXJnZXRfZnJlcSwgJnRtcDEsICZ0bXAyKTsKKwl3aGlsZSAodG1wX2ZyZXEgPCBwb2xpY3ktPm1pbikgeworCQl0bXBfZnJlcSArPSBzdG9ja19mcmVxIC8gbWF4X2R1cmF0aW9uOworCQl0bXBfZnJlcSA9IGd4X3ZhbGlkYXRlX3NwZWVkKHRtcF9mcmVxLCAmdG1wMSwgJnRtcDIpOworCX0KKwl3aGlsZSAodG1wX2ZyZXEgPiBwb2xpY3ktPm1heCkgeworCQl0bXBfZnJlcSAtPSBzdG9ja19mcmVxIC8gbWF4X2R1cmF0aW9uOworCQl0bXBfZnJlcSA9IGd4X3ZhbGlkYXRlX3NwZWVkKHRtcF9mcmVxLCAmdG1wMSwgJnRtcDIpOworCX0KKworCWd4X3NldF9jcHVzcGVlZCh0bXBfZnJlcSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcHVmcmVxX2d4X2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCBtYXhmcmVxLCBjdXJmcmVxOworCisJaWYgKCFwb2xpY3kgfHwgcG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBkZXRlcm1pbmUgbWF4aW11bSBmcmVxdWVuY3kgKi8KKwlpZiAocGNpX2J1c2NsaykgeworCQltYXhmcmVxID0gcGNpX2J1c2NsayAqIGd4X2ZyZXFfbXVsdFtnZXRDeDg2KENYODZfRElSMSkgJiAweDBmXTsKKwl9IGVsc2UgaWYgKGNwdV9raHopIHsKKwkJbWF4ZnJlcSA9IGNwdV9raHo7CisJfSBlbHNlIHsKKwkJbWF4ZnJlcSA9IDMwMDAwICogZ3hfZnJlcV9tdWx0W2dldEN4ODYoQ1g4Nl9ESVIxKSAmIDB4MGZdOworCX0KKwlzdG9ja19mcmVxID0gbWF4ZnJlcTsKKwljdXJmcmVxID0gZ3hfZ2V0X2NwdXNwZWVkKDApOworCisJZHByaW50aygiY3B1IG1heCBmcmVxdWVuY3kgaXMgJWQuXG4iLCBtYXhmcmVxKTsKKwlkcHJpbnRrKCJjcHUgY3VycmVudCBmcmVxdWVuY3kgaXMgJWRrSHouXG4iLGN1cmZyZXEpOworCisJLyogc2V0dXAgYmFzaWMgc3RydWN0IGZvciBjcHVmcmVxIEFQSSAqLworCXBvbGljeS0+Y3B1ID0gMDsKKworCWlmIChtYXhfZHVyYXRpb24gPCBQT0xJQ1lfTUlOX0RJVikKKwkJcG9saWN5LT5taW4gPSBtYXhmcmVxIC8gbWF4X2R1cmF0aW9uOworCWVsc2UKKwkJcG9saWN5LT5taW4gPSBtYXhmcmVxIC8gUE9MSUNZX01JTl9ESVY7CisJcG9saWN5LT5tYXggPSBtYXhmcmVxOworCXBvbGljeS0+Y3VyID0gY3VyZnJlcTsKKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby5taW5fZnJlcSA9IG1heGZyZXEgLyBtYXhfZHVyYXRpb247CisJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gbWF4ZnJlcTsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qIAorICogY3B1ZnJlcV9neF9pbml0OgorICogICBNZWRpYUdYL0dlb2RlIEdYIGluaXRpYWxpemUgY3B1ZnJlcSBkcml2ZXIKKyAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBneF9zdXNwbW9kX2RyaXZlciA9IHsKKwkuZ2V0CQk9IGd4X2dldF9jcHVzcGVlZCwKKwkudmVyaWZ5CQk9IGNwdWZyZXFfZ3hfdmVyaWZ5LAorCS50YXJnZXQJCT0gY3B1ZnJlcV9neF90YXJnZXQsCisJLmluaXQJCT0gY3B1ZnJlcV9neF9jcHVfaW5pdCwKKwkubmFtZQkJPSAiZ3gtc3VzcG1vZCIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV9neF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZ3hmcmVxX3BhcmFtcyAqcGFyYW1zOworCXN0cnVjdCBwY2lfZGV2ICpneF9wY2k7CisJdTMyIGNsYXNzX3JldjsKKworCS8qIFRlc3QgaWYgd2UgaGF2ZSB0aGUgcmlnaHQgaGFyZHdhcmUgKi8KKwlpZiAoKGd4X3BjaSA9IGd4X2RldGVjdF9jaGlwc2V0KCkpID09IE5VTEwpIAorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGNoZWNrIHdoZXRoZXIgbW9kdWxlIHBhcmFtZXRlcnMgYXJlIHNhbmUgKi8KKwlpZiAobWF4X2R1cmF0aW9uID4gMHhmZikKKwkJbWF4X2R1cmF0aW9uID0gMHhmZjsKKworCWRwcmludGsoImdlb2RlIHN1c3BlbmQgbW9kdWxhdGlvbiBhdmFpbGFibGUuXG4iKTsKKworCXBhcmFtcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBneGZyZXFfcGFyYW1zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBhcmFtcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IGd4ZnJlcV9wYXJhbXMpKTsKKworCXBhcmFtcy0+Y3M1NXgwID0gZ3hfcGNpOworCWd4X3BhcmFtcyA9IHBhcmFtczsKKworCS8qIGtlZXAgY3M1NXgwIGNvbmZpZ3VyYXRpb25zICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGFyYW1zLT5jczU1eDAsIFBDSV9TVVNDRkcsICYocGFyYW1zLT5wY2lfc3VzY2ZnKSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGFyYW1zLT5jczU1eDAsIFBDSV9QTUVSMSwgJihwYXJhbXMtPnBjaV9wbWVyMSkpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBhcmFtcy0+Y3M1NXgwLCBQQ0lfUE1FUjIsICYocGFyYW1zLT5wY2lfcG1lcjIpKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwYXJhbXMtPmNzNTV4MCwgUENJX01PRE9OLCAmKHBhcmFtcy0+b25fZHVyYXRpb24pKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwYXJhbXMtPmNzNTV4MCwgUENJX01PRE9GRiwgJihwYXJhbXMtPm9mZl9kdXJhdGlvbikpOworICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGFyYW1zLT5jczU1eDAsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmNsYXNzX3Jldik7CisJcGFyYW1zLT5wY2lfcmV2ID0gY2xhc3NfcmV2ICYmIDB4ZmY7CisKKwlpZiAoKHJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZneF9zdXNwbW9kX2RyaXZlcikpKSB7IAorCQlrZnJlZShwYXJhbXMpOworCQlyZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciBlcnJvciEgKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNwdWZyZXFfZ3hfZXhpdCh2b2lkKQoreworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmd4X3N1c3Btb2RfZHJpdmVyKTsKKwlwY2lfZGV2X3B1dChneF9wYXJhbXMtPmNzNTV4MCk7CisJa2ZyZWUoZ3hfcGFyYW1zKTsKK30KKworTU9EVUxFX0FVVEhPUiAoIkhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJDcHVmcmVxIGRyaXZlciBmb3IgQ3lyaXggTWVkaWFHWCBhbmQgTmF0U2VtaSBHZW9kZSIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbW9kdWxlX2luaXQoY3B1ZnJlcV9neF9pbml0KTsKK21vZHVsZV9leGl0KGNwdWZyZXFfZ3hfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjBmOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCkBAIC0wLDAgKzEsNjU4IEBACisvKgorICogIChDKSAyMDAxLTIwMDQgIERhdmUgSm9uZXMuIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4KKyAqICAoQykgMjAwMiAgUGFkcmFpZyBCcmFkeS4gPHBhZHJhaWdAYW50ZWZhY3RvLmNvbT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICogIEJhc2VkIHVwb24gZGF0YXNoZWV0cyAmIHNhbXBsZSBDUFVzIGtpbmRseSBwcm92aWRlZCBieSBWSUEuCisgKgorICogIFZJQSBoYXZlIGN1cnJlbnRseSAzIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBMb25naGF1bC4KKyAqICBWZXJzaW9uIDEgKExvbmdoYXVsKSB1c2VzIHRoZSBCQ1IyIE1TUiBhdCAweDExNDcuCisgKiAgIEl0IGlzIHByZXNlbnQgb25seSBpbiBTYW11ZWwgMSAoQzVBKSwgU2FtdWVsIDIgKEM1Qikgc3RlcHBpbmcgMC4KKyAqICBWZXJzaW9uIDIgb2YgbG9uZ2hhdWwgaXMgdGhlIHNhbWUgYXMgdjEsIGJ1dCBhZGRzIHZvbHRhZ2Ugc2NhbGluZy4KKyAqICAgUHJlc2VudCBpbiBTYW11ZWwgMiAoc3RlcHBpbmdzIDEtNyBvbmx5KSAoQzVCKSwgYW5kIEV6cmEgKEM1QykKKyAqICAgdm9sdGFnZSBzY2FsaW5nIHN1cHBvcnQgaGFzIGN1cnJlbnRseSBiZWVuIGRpc2FibGVkIGluIHRoaXMgZHJpdmVyCisgKiAgIHVudGlsIHdlIGhhdmUgY29kZSB0aGF0IGdldHMgaXQgcmlnaHQuCisgKiAgVmVyc2lvbiAzIG9mIGxvbmdoYXVsIGdvdCByZW5hbWVkIHRvIFBvd2Vyc2F2ZXIgYW5kIHJlZGVzaWduZWQKKyAqICAgdG8gdXNlIHRoZSBQT1dFUlNBVkVSIE1TUiBhdCAweDExMGEuCisgKiAgIEl0IGlzIHByZXNlbnQgaW4gRXpyYS1UIChDNU0pLCBOZWhlbWlhaCAoQzVYKSBhbmQgYWJvdmUuCisgKiAgIEl0J3MgcHJldHR5IG11Y2ggdGhlIHNhbWUgZmVhdHVyZSB3aXNlIHRvIGxvbmdoYXVsIHYyLCB0aG91Z2gKKyAqICAgdGhlcmUgaXMgcHJvdmlzaW9uIGZvciBzY2FsaW5nIEZTQiB0b28sIGJ1dCB0aGlzIGRvZXNuJ3Qgd29yaworICogICB0b28gd2VsbCBpbiBwcmFjdGljZSBzbyB3ZSBkb24ndCBldmVuIHRyeSB0byB1c2UgdGhpcy4KKyAqCisgKiAgQklHIEZBVCBESVNDTEFJTUVSOiBXb3JrIGluIHByb2dyZXNzIGNvZGUuIFBvc3NpYmx5ICpkYW5nZXJvdXMqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJsb25naGF1bC5oIgorCisjZGVmaW5lIFBGWCAibG9uZ2hhdWw6ICIKKworI2RlZmluZSBUWVBFX0xPTkdIQVVMX1YxCTEKKyNkZWZpbmUgVFlQRV9MT05HSEFVTF9WMgkyCisjZGVmaW5lIFRZUEVfUE9XRVJTQVZFUgkJMworCisjZGVmaW5lCUNQVV9TQU1VRUwJMQorI2RlZmluZQlDUFVfU0FNVUVMMgkyCisjZGVmaW5lCUNQVV9FWlJBCTMKKyNkZWZpbmUJQ1BVX0VaUkFfVAk0CisjZGVmaW5lCUNQVV9ORUhFTUlBSAk1CisKK3N0YXRpYyBpbnQgY3B1X21vZGVsOworc3RhdGljIHVuc2lnbmVkIGludCBudW1zY2FsZXM9MTYsIG51bXZzY2FsZXM7CitzdGF0aWMgdW5zaWduZWQgaW50IGZzYjsKK3N0YXRpYyBpbnQgbWludmlkLCBtYXh2aWQ7CitzdGF0aWMgdW5zaWduZWQgaW50IG1pbm11bHQsIG1heG11bHQ7CitzdGF0aWMgaW50IGNhbl9zY2FsZV92b2x0YWdlOworc3RhdGljIGludCB2cm1yZXY7CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IGRvbnRfc2NhbGVfdm9sdGFnZTsKKworCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgImxvbmdoYXVsIiwgbXNnKQorCisKKyNkZWZpbmUgX19obHQoKSAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImhsdCI6IDogOiJtZW1vcnkiKQorCisvKiBDbG9jayByYXRpb3MgbXVsdGlwbGllZCBieSAxMCAqLworc3RhdGljIGludCBjbG9ja19yYXRpb1szMl07CitzdGF0aWMgaW50IGVibGNyX3RhYmxlWzMyXTsKK3N0YXRpYyBpbnQgdm9sdGFnZV90YWJsZVszMl07CitzdGF0aWMgdW5zaWduZWQgaW50IGhpZ2hlc3Rfc3BlZWQsIGxvd2VzdF9zcGVlZDsgLyoga0h6ICovCitzdGF0aWMgaW50IGxvbmdoYXVsX3ZlcnNpb247CitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpsb25naGF1bF90YWJsZTsKKworI2lmZGVmIENPTkZJR19DUFVfRlJFUV9ERUJVRworc3RhdGljIGNoYXIgc3BlZWRidWZmZXJbOF07CisKK3N0YXRpYyBjaGFyICpwcmludF9zcGVlZChpbnQgc3BlZWQpCit7CisJaWYgKHNwZWVkID4gMTAwMCkgeworCQlpZiAoc3BlZWQlMTAwMCA9PSAwKQorCQkJc3ByaW50ZiAoc3BlZWRidWZmZXIsICIlZEdIeiIsIHNwZWVkLzEwMDApOworCQllbHNlCisJCQlzcHJpbnRmIChzcGVlZGJ1ZmZlciwgIiVkLiVkR0h6Iiwgc3BlZWQvMTAwMCwgKHNwZWVkJTEwMDApLzEwMCk7CisJfSBlbHNlCisJCXNwcmludGYgKHNwZWVkYnVmZmVyLCAiJWRNSHoiLCBzcGVlZCk7CisKKwlyZXR1cm4gc3BlZWRidWZmZXI7Cit9CisjZW5kaWYKKworCitzdGF0aWMgdW5zaWduZWQgaW50IGNhbGNfc3BlZWQoaW50IG11bHQpCit7CisJaW50IGtoejsKKwlraHogPSAobXVsdC8xMCkqZnNiOworCWlmIChtdWx0JTEwKQorCQlraHogKz0gZnNiLzI7CisJa2h6ICo9IDEwMDA7CisJcmV0dXJuIGtoejsKK30KKworCitzdGF0aWMgaW50IGxvbmdoYXVsX2dldF9jcHVfbXVsdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaW52YWx1ZT0wLGxvLCBoaTsKKworCXJkbXNyIChNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTiwgbG8sIGhpKTsKKwlpbnZhbHVlID0gKGxvICYgKDE8PDIyfDE8PDIzfDE8PDI0fDE8PDI1KSkgPj4yMjsKKwlpZiAobG9uZ2hhdWxfdmVyc2lvbj09VFlQRV9MT05HSEFVTF9WMiB8fCBsb25naGF1bF92ZXJzaW9uPT1UWVBFX1BPV0VSU0FWRVIpIHsKKwkJaWYgKGxvICYgKDE8PDI3KSkKKwkJCWludmFsdWUrPTE2OworCX0KKwlyZXR1cm4gZWJsY3JfdGFibGVbaW52YWx1ZV07Cit9CisKKworc3RhdGljIHZvaWQgZG9fcG93ZXJzYXZlcih1bmlvbiBtc3JfbG9uZ2hhdWwgKmxvbmdoYXVsLAorCQkJdW5zaWduZWQgaW50IGNsb2NrX3JhdGlvX2luZGV4KQoreworCWludCB2ZXJzaW9uOworCisJc3dpdGNoIChjcHVfbW9kZWwpIHsKKwljYXNlIENQVV9FWlJBX1Q6CisJCXZlcnNpb24gPSAzOworCQlicmVhazsKKwljYXNlIENQVV9ORUhFTUlBSDoKKwkJdmVyc2lvbiA9IDB4ZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCXJkbXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC0+dmFsKTsKKwlsb25naGF1bC0+Yml0cy5Tb2Z0QnVzUmF0aW8gPSBjbG9ja19yYXRpb19pbmRleCAmIDB4ZjsKKwlsb25naGF1bC0+Yml0cy5Tb2Z0QnVzUmF0aW80ID0gKGNsb2NrX3JhdGlvX2luZGV4ICYgMHgxMCkgPj4gNDsKKwlsb25naGF1bC0+Yml0cy5FbmFibGVTb2Z0QnVzUmF0aW8gPSAxOworCWxvbmdoYXVsLT5iaXRzLlJldmlzaW9uS2V5ID0gMDsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC0+dmFsKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJX19obHQoKTsKKworCXJkbXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC0+dmFsKTsKKwlsb25naGF1bC0+Yml0cy5FbmFibGVTb2Z0QnVzUmF0aW8gPSAwOworCWxvbmdoYXVsLT5iaXRzLlJldmlzaW9uS2V5ID0gdmVyc2lvbjsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC0+dmFsKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKy8qKgorICogbG9uZ2hhdWxfc2V0X2NwdV9mcmVxdWVuY3koKQorICogQGNsb2NrX3JhdGlvX2luZGV4IDogYml0cGF0dGVybiBvZiB0aGUgbmV3IG11bHRpcGxpZXIuCisgKgorICogU2V0cyBhIG5ldyBjbG9jayByYXRpby4KKyAqLworCitzdGF0aWMgdm9pZCBsb25naGF1bF9zZXRzdGF0ZSh1bnNpZ25lZCBpbnQgY2xvY2tfcmF0aW9faW5kZXgpCit7CisJaW50IHNwZWVkLCBtdWx0OworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCXVuaW9uIG1zcl9sb25naGF1bCBsb25naGF1bDsKKwl1bmlvbiBtc3JfYmNyMiBiY3IyOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgb2xkX3JhdGlvPS0xOworCisJaWYgKG9sZF9yYXRpbyA9PSBjbG9ja19yYXRpb19pbmRleCkKKwkJcmV0dXJuOworCW9sZF9yYXRpbyA9IGNsb2NrX3JhdGlvX2luZGV4OworCisJbXVsdCA9IGNsb2NrX3JhdGlvW2Nsb2NrX3JhdGlvX2luZGV4XTsKKwlpZiAobXVsdCA9PSAtMSkKKwkJcmV0dXJuOworCisJc3BlZWQgPSBjYWxjX3NwZWVkKG11bHQpOworCWlmICgoc3BlZWQgPiBoaWdoZXN0X3NwZWVkKSB8fCAoc3BlZWQgPCBsb3dlc3Rfc3BlZWQpKQorCQlyZXR1cm47CisKKwlmcmVxcy5vbGQgPSBjYWxjX3NwZWVkKGxvbmdoYXVsX2dldF9jcHVfbXVsdCgpKTsKKwlmcmVxcy5uZXcgPSBzcGVlZDsKKwlmcmVxcy5jcHUgPSAwOyAvKiBsb25naGF1bC5jIGlzIFVQIG9ubHkgZHJpdmVyICovCisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJZHByaW50ayAoIlNldHRpbmcgdG8gRlNCOiVkTUh6IE11bHQ6JWQuJWR4ICglcylcbiIsCisJCQlmc2IsIG11bHQvMTAsIG11bHQlMTAsIHByaW50X3NwZWVkKHNwZWVkLzEwMDApKTsKKworCXN3aXRjaCAobG9uZ2hhdWxfdmVyc2lvbikgeworCisJLyoKKwkgKiBMb25naGF1bCB2MS4gKFNhbXVlbFtDNUFdIGFuZCBTYW11ZWwyIHN0ZXBwaW5nIDBbQzVCXSkKKwkgKiBTb2Z0d2FyZSBjb250cm9sbGVkIG11bHRpcGxpZXJzIG9ubHkuCisJICoKKwkgKiAqTkIqIFVudGlsIHdlIGdldCB2b2x0YWdlIHNjYWxpbmcgd29ya2luZyB2MSAmIHYyIGFyZSB0aGUgc2FtZSBjb2RlLgorCSAqIExvbmdoYXVsIHYyIGFwcGVhcnMgaW4gU2FtdWVsMiBTdGVwcGluZ3MgMS0+NyBbQzViXSBhbmQgRXpyYSBbQzVDXQorCSAqLworCWNhc2UgVFlQRV9MT05HSEFVTF9WMToKKwljYXNlIFRZUEVfTE9OR0hBVUxfVjI6CisJCXJkbXNybCAoTVNSX1ZJQV9CQ1IyLCBiY3IyLnZhbCk7CisJCS8qIEVuYWJsZSBzb2Z0d2FyZSBjbG9jayBtdWx0aXBsaWVyICovCisJCWJjcjIuYml0cy5FU09GVEJGID0gMTsKKwkJYmNyMi5iaXRzLkNMT0NLTVVMID0gY2xvY2tfcmF0aW9faW5kZXg7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCXdybXNybCAoTVNSX1ZJQV9CQ1IyLCBiY3IyLnZhbCk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKworCQlfX2hsdCgpOworCisJCS8qIERpc2FibGUgc29mdHdhcmUgY2xvY2sgbXVsdGlwbGllciAqLworCQlyZG1zcmwgKE1TUl9WSUFfQkNSMiwgYmNyMi52YWwpOworCQliY3IyLmJpdHMuRVNPRlRCRiA9IDA7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCXdybXNybCAoTVNSX1ZJQV9CQ1IyLCBiY3IyLnZhbCk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJYnJlYWs7CisKKwkvKgorCSAqIExvbmdoYXVsIHYzIChha2EgUG93ZXJzYXZlcikuIChFenJhLVQgW0M1TV0gJiBOZWhlbWlhaCBbQzVOXSkKKwkgKiBXZSBjYW4gc2NhbGUgdm9sdGFnZSB3aXRoIHRoaXMgdG9vLCBidXQgdGhhdCdzIGN1cnJlbnRseQorCSAqIGRpc2FibGVkIHVudGlsIHdlIGNvbWUgdXAgd2l0aCBhIGRlY2VudCAnbWF0Y2ggZnJlcSB0byB2b2x0YWdlJworCSAqIGFsZ29yaXRobS4KKwkgKiBXaGVuIHdlIGFkZCB2b2x0YWdlIHNjYWxpbmcsIHdlIHdpbGwgYWxzbyBuZWVkIHRvIGRvIHRoZQorCSAqIHZvbHRhZ2UvZnJlcSBzZXR0aW5nIGluIG9yZGVyIGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uCisJICogb2Ygc2NhbGluZyAobGlrZSB3ZSBkbyBpbiBwb3dlcm5vdy1rNy5jKQorCSAqIE5laGVtaWFoIGNhbiBkbyBGU0Igc2NhbGluZyB0b28sIGJ1dCB0aGlzIGhhcyBuZXZlciBiZWVuIHByb3ZlbgorCSAqIHRvIHdvcmsgaW4gcHJhY3RpY2UuCisJICovCisJY2FzZSBUWVBFX1BPV0VSU0FWRVI6CisJCWRvX3Bvd2Vyc2F2ZXIoJmxvbmdoYXVsLCBjbG9ja19yYXRpb19pbmRleCk7CisJCWJyZWFrOworCX0KKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworfQorCisvKgorICogQ2VudGF1ciBkZWNpZGVkIHRvIG1ha2UgbGlmZSBhIGxpdHRsZSBtb3JlIHRyaWNreS4KKyAqIE9ubHkgbG9uZ2hhdWwgdjEgaXMgYWxsb3dlZCB0byByZWFkIEVCTENSIEJTRUxbMDoxXS4KKyAqIFNhbXVlbDIgYW5kIGFib3ZlIGhhdmUgdG8gdHJ5IGFuZCBndWVzcyB3aGF0IHRoZSBGU0IgaXMuCisgKiBXZSBkbyB0aGlzIGJ5IGFzc3VtaW5nIHdlIGJvb3RlZCBhdCBtYXhpbXVtIG11bHRpcGxpZXIsIGFuZCBpbnRlcnBvbGF0ZQorICogYmV0d2VlbiB0aGF0IHZhbHVlIG11bHRpcGxpZWQgYnkgcG9zc2libGUgRlNCcyBhbmQgY3B1X21oeiB3aGljaAorICogd2FzIGNhbGN1bGF0ZWQgYXQgYm9vdCB0aW1lLiBSZWFsbHkgdWdseSwgYnV0IG5vIG90aGVyIHdheSB0byBkbyB0aGlzLgorICovCisKKyNkZWZpbmUgUk9VTkRJTkcJMHhmCisKK3N0YXRpYyBpbnQgX2d1ZXNzKGludCBndWVzcykKK3sKKwlpbnQgdGFyZ2V0OworCisJdGFyZ2V0ID0gKChtYXhtdWx0LzEwKSpndWVzcyk7CisJaWYgKG1heG11bHQlMTAgIT0gMCkKKwkJdGFyZ2V0ICs9IChndWVzcy8yKTsKKwl0YXJnZXQgKz0gUk9VTkRJTkcvMjsKKwl0YXJnZXQgJj0gflJPVU5ESU5HOworCXJldHVybiB0YXJnZXQ7Cit9CisKKworc3RhdGljIGludCBndWVzc19mc2Iodm9pZCkKK3sKKwlpbnQgc3BlZWQgPSAoY3B1X2toei8xMDAwKTsKKwlpbnQgaTsKKwlpbnQgc3BlZWRzWzNdID0geyA2NiwgMTAwLCAxMzMgfTsKKworCXNwZWVkICs9IFJPVU5ESU5HLzI7CisJc3BlZWQgJj0gflJPVU5ESU5HOworCisJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCWlmIChfZ3Vlc3Moc3BlZWRzW2ldKSA9PSBzcGVlZCkKKwkJCXJldHVybiBzcGVlZHNbaV07CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGxvbmdoYXVsX2dldF9yYW5nZXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGludmFsdWU7CisJdW5zaWduZWQgaW50IG11bHRpcGxpZXJzWzMyXT0geworCQk1MCwzMCw0MCwxMDAsNTUsMzUsNDUsOTUsOTAsNzAsODAsNjAsMTIwLDc1LDg1LDY1LAorCQktMSwxMTAsMTIwLC0xLDEzNSwxMTUsMTI1LDEwNSwxMzAsMTUwLDE2MCwxNDAsLTEsMTU1LC0xLDE0NSB9OworCXVuc2lnbmVkIGludCBqLCBrID0gMDsKKwl1bmlvbiBtc3JfbG9uZ2hhdWwgbG9uZ2hhdWw7CisJdW5zaWduZWQgbG9uZyBsbywgaGk7CisJdW5zaWduZWQgaW50IGVibGNyX2ZzYl90YWJsZV92MVtdID0geyA2NiwgMTMzLCAxMDAsIC0xIH07CisJdW5zaWduZWQgaW50IGVibGNyX2ZzYl90YWJsZV92MltdID0geyAxMzMsIDEwMCwgLTEsIDY2IH07CisKKwlzd2l0Y2ggKGxvbmdoYXVsX3ZlcnNpb24pIHsKKwljYXNlIFRZUEVfTE9OR0hBVUxfVjE6CisJY2FzZSBUWVBFX0xPTkdIQVVMX1YyOgorCQkvKiBVZ2gsIExvbmdoYXVsIHYxIGRpZG4ndCBoYXZlIHRoZSBtaW4vbWF4IE1TUnMuCisJCSAgIEFzc3VtZSBtaW49My4weCAmIG1heCA9IHdoYXRldmVyIHdlIGJvb3RlZCBhdC4gKi8KKwkJbWlubXVsdCA9IDMwOworCQltYXhtdWx0ID0gbG9uZ2hhdWxfZ2V0X2NwdV9tdWx0KCk7CisJCXJkbXNyIChNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTiwgbG8sIGhpKTsKKwkJaW52YWx1ZSA9IChsbyAmICgxPDwxOHwxPDwxOSkpID4+MTg7CisJCWlmIChjcHVfbW9kZWw9PUNQVV9TQU1VRUwgfHwgY3B1X21vZGVsPT1DUFVfU0FNVUVMMikKKwkJCWZzYiA9IGVibGNyX2ZzYl90YWJsZV92MVtpbnZhbHVlXTsKKwkJZWxzZQorCQkJZnNiID0gZ3Vlc3NfZnNiKCk7CisJCWJyZWFrOworCisJY2FzZSBUWVBFX1BPV0VSU0FWRVI6CisJCS8qIEV6cmEtVCAqLworCQlpZiAoY3B1X21vZGVsPT1DUFVfRVpSQV9UKSB7CisJCQlyZG1zcmwgKE1TUl9WSUFfTE9OR0hBVUwsIGxvbmdoYXVsLnZhbCk7CisJCQlpbnZhbHVlID0gbG9uZ2hhdWwuYml0cy5NYXhNSHpCUjsKKwkJCWlmIChsb25naGF1bC5iaXRzLk1heE1IekJSNCkKKwkJCQlpbnZhbHVlICs9IDE2OworCQkJbWF4bXVsdD1tdWx0aXBsaWVyc1tpbnZhbHVlXTsKKworCQkJaW52YWx1ZSA9IGxvbmdoYXVsLmJpdHMuTWluTUh6QlI7CisJCQlpZiAobG9uZ2hhdWwuYml0cy5NaW5NSHpCUjQgPT0gMSkKKwkJCQltaW5tdWx0ID0gMzA7CisJCQllbHNlCisJCQkJbWlubXVsdCA9IG11bHRpcGxpZXJzW2ludmFsdWVdOworCQkJZnNiID0gZWJsY3JfZnNiX3RhYmxlX3YyW2xvbmdoYXVsLmJpdHMuTWF4TUh6RlNCXTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTmVoZW1pYWggKi8KKwkJaWYgKGNwdV9tb2RlbD09Q1BVX05FSEVNSUFIKSB7CisJCQlyZG1zcmwgKE1TUl9WSUFfTE9OR0hBVUwsIGxvbmdoYXVsLnZhbCk7CisKKwkJCS8qCisJCQkgKiBUT0RPOiBUaGlzIGNvZGUgd29ya3MsIGJ1dCByYWlzZXMgYSBsb3Qgb2YgcXVlc3Rpb25zLgorCQkJICogLSBTb21lIE5laGVtaWFoJ3Mgc2VlbSB0byBoYXZlIGJyb2tlbiBNaW4vTWF4TUh6QlIncy4KKwkJCSAqICAgV2UgZ2V0IGFyb3VuZCB0aGlzIGJ5IHVzaW5nIGEgaGFyZGNvZGVkIG11bHRpcGxpZXIgb2YgNC4weAorCQkJICogICBmb3IgdGhlIG1pbmltaW11bSBzcGVlZCwgYW5kIHRoZSBzcGVlZCB3ZSBib290ZWQgdXAgYXQgZm9yIHRoZSBtYXguCisJCQkgKiAgIFRoaXMgaXMgZG9uZSBpbiBsb25naGF1bF9nZXRfY3B1X211bHQoKSBieSByZWFkaW5nIHRoZSBFQkxDUiByZWdpc3Rlci4KKwkJCSAqIC0gQWNjb3JkaW5nIHRvIHNvbWUgVklBIGRvY3VtZW50YXRpb24gRUJMQ1IgaXMgb25seQorCQkJICogICBpbiBwcmUtTmVoZW1pYWggQzNzLiBIb3cgdGhpcyBzdGlsbCB3b3JrcyBpcyBhIG15c3RlcnkuCisJCQkgKiAgIFdlJ3JlIHBvc3NpYmx5IHVzaW5nIHNvbWV0aGluZyB1bmRvY3VtZW50ZWQgYW5kIHVuc3VwcG9ydGVkLAorCQkJICogICBCdXQgaXQgd29ya3MsIHNvIHdlIGRvbid0IGdydW1ibGUuCisJCQkgKi8KKwkJCW1pbm11bHQ9NDA7CisJCQltYXhtdWx0PWxvbmdoYXVsX2dldF9jcHVfbXVsdCgpOworCisJCQkvKiBTdGFydGluZyB3aXRoIHRoZSAxLjJHSHogcGFydHMsIHRoZXJlcyBhIDIwME1IeiBidXMuICovCisJCQlpZiAoKGNwdV9raHovMTAwMCkgPiAxMjAwKQorCQkJCWZzYiA9IDIwMDsKKwkJCWVsc2UKKwkJCQlmc2IgPSBlYmxjcl9mc2JfdGFibGVfdjJbbG9uZ2hhdWwuYml0cy5NYXhNSHpGU0JdOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkcHJpbnRrICgiTWluTXVsdDolZC4lZHggTWF4TXVsdDolZC4lZHhcbiIsCisJCSBtaW5tdWx0LzEwLCBtaW5tdWx0JTEwLCBtYXhtdWx0LzEwLCBtYXhtdWx0JTEwKTsKKworCWlmIChmc2IgPT0gLTEpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJJbnZhbGlkIChyZXNlcnZlZCkgRlNCIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhpZ2hlc3Rfc3BlZWQgPSBjYWxjX3NwZWVkKG1heG11bHQpOworCWxvd2VzdF9zcGVlZCA9IGNhbGNfc3BlZWQobWlubXVsdCk7CisJZHByaW50ayAoIkZTQjolZE1IeiAgTG93ZXN0IHNwZWVkOiAlcyAgIEhpZ2hlc3Qgc3BlZWQ6JXNcbiIsIGZzYiwKKwkJIHByaW50X3NwZWVkKGxvd2VzdF9zcGVlZC8xMDAwKSwgCisJCSBwcmludF9zcGVlZChoaWdoZXN0X3NwZWVkLzEwMDApKTsKKworCWlmIChsb3dlc3Rfc3BlZWQgPT0gaGlnaGVzdF9zcGVlZCkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggImhpZ2hlc3RzcGVlZCA9PSBsb3dlc3QsIGFib3J0aW5nLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobG93ZXN0X3NwZWVkID4gaGlnaGVzdF9zcGVlZCkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIm5vbnNlbnNlISBsb3dlc3QgKCVkID4gJWQpICFcbiIsCisJCQlsb3dlc3Rfc3BlZWQsIGhpZ2hlc3Rfc3BlZWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb25naGF1bF90YWJsZSA9IGttYWxsb2MoKG51bXNjYWxlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSksIEdGUF9LRVJORUwpOworCWlmKCFsb25naGF1bF90YWJsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGo9MDsgaiA8IG51bXNjYWxlczsgaisrKSB7CisJCXVuc2lnbmVkIGludCByYXRpbzsKKwkJcmF0aW8gPSBjbG9ja19yYXRpb1tqXTsKKwkJaWYgKHJhdGlvID09IC0xKQorCQkJY29udGludWU7CisJCWlmIChyYXRpbyA+IG1heG11bHQgfHwgcmF0aW8gPCBtaW5tdWx0KQorCQkJY29udGludWU7CisJCWxvbmdoYXVsX3RhYmxlW2tdLmZyZXF1ZW5jeSA9IGNhbGNfc3BlZWQocmF0aW8pOworCQlsb25naGF1bF90YWJsZVtrXS5pbmRleAk9IGo7CisJCWsrKzsKKwl9CisKKwlsb25naGF1bF90YWJsZVtrXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwlpZiAoIWspIHsKKwkJa2ZyZWUgKGxvbmdoYXVsX3RhYmxlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19pbml0IGxvbmdoYXVsX3NldHVwX3ZvbHRhZ2VzY2FsaW5nKHZvaWQpCit7CisJdW5pb24gbXNyX2xvbmdoYXVsIGxvbmdoYXVsOworCisJcmRtc3JsIChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCisJaWYgKCEobG9uZ2hhdWwuYml0cy5SZXZpc2lvbklEICYgMSkpCisJCXJldHVybjsKKworCW1pbnZpZCA9IGxvbmdoYXVsLmJpdHMuTWluaW11bVZJRDsKKwltYXh2aWQgPSBsb25naGF1bC5iaXRzLk1heGltdW1WSUQ7CisJdnJtcmV2ID0gbG9uZ2hhdWwuYml0cy5WUk1SZXY7CisKKwlpZiAobWludmlkID09IDAgfHwgbWF4dmlkID09IDApIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJCb2d1cyB2YWx1ZXMgTWluOiVkLiUwM2QgTWF4OiVkLiUwM2QuICIKKwkJCQkJIlZvbHRhZ2Ugc2NhbGluZyBkaXNhYmxlZC5cbiIsCisJCQkJCW1pbnZpZC8xMDAwLCBtaW52aWQlMTAwMCwgbWF4dmlkLzEwMDAsIG1heHZpZCUxMDAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtaW52aWQgPT0gbWF4dmlkKSB7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiQ2xhaW1zIHRvIHN1cHBvcnQgdm9sdGFnZSBzY2FsaW5nIGJ1dCBtaW4gJiBtYXggYXJlICIKKwkJCQkiYm90aCAlZC4lMDNkLiBWb2x0YWdlIHNjYWxpbmcgZGlzYWJsZWRcbiIsCisJCQkJbWF4dmlkLzEwMDAsIG1heHZpZCUxMDAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh2cm1yZXY9PTApIHsKKwkJZHByaW50ayAoIlZSTSA4LjUgXG4iKTsKKwkJbWVtY3B5ICh2b2x0YWdlX3RhYmxlLCB2cm04NXNjYWxlcywgc2l6ZW9mKHZvbHRhZ2VfdGFibGUpKTsKKwkJbnVtdnNjYWxlcyA9ICh2b2x0YWdlX3RhYmxlW21heHZpZF0tdm9sdGFnZV90YWJsZVttaW52aWRdKS8yNTsKKwl9IGVsc2UgeworCQlkcHJpbnRrICgiTW9iaWxlIFZSTSBcbiIpOworCQltZW1jcHkgKHZvbHRhZ2VfdGFibGUsIG1vYmlsZXZybXNjYWxlcywgc2l6ZW9mKHZvbHRhZ2VfdGFibGUpKTsKKwkJbnVtdnNjYWxlcyA9ICh2b2x0YWdlX3RhYmxlW21heHZpZF0tdm9sdGFnZV90YWJsZVttaW52aWRdKS81OworCX0KKworCS8qIEN1cnJlbnQgdm9sdGFnZSBpc24ndCByZWFkYWJsZSBhdCBmaXJzdCwgc28gd2UgbmVlZCB0bworCSAgIHNldCBpdCB0byBhIGtub3duIHZhbHVlLiBUaGUgc3BlYyBzYXlzIHRvIHVzZSBtYXh2aWQgKi8KKwlsb25naGF1bC5iaXRzLlJldmlzaW9uS2V5ID0gbG9uZ2hhdWwuYml0cy5SZXZpc2lvbklEOwkvKiBGSVhNRTogVGhpcyBpcyBiYWQuICovCisJbG9uZ2hhdWwuYml0cy5FbmFibGVTb2Z0VklEID0gMTsKKwlsb25naGF1bC5iaXRzLlNvZnRWSUQgPSBtYXh2aWQ7CisJd3Jtc3JsIChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCisJbWludmlkID0gdm9sdGFnZV90YWJsZVttaW52aWRdOworCW1heHZpZCA9IHZvbHRhZ2VfdGFibGVbbWF4dmlkXTsKKworCWRwcmludGsgKCJNaW4gVklEPSVkLiUwM2QgTWF4IFZJRD0lZC4lMDNkLCAlZCBwb3NzaWJsZSB2b2x0YWdlIHNjYWxlc1xuIiwKKwkJbWF4dmlkLzEwMDAsIG1heHZpZCUxMDAwLCBtaW52aWQvMTAwMCwgbWludmlkJTEwMDAsIG51bXZzY2FsZXMpOworCisJY2FuX3NjYWxlX3ZvbHRhZ2UgPSAxOworfQorCisKK3N0YXRpYyBpbnQgbG9uZ2hhdWxfdmVyaWZ5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCBsb25naGF1bF90YWJsZSk7Cit9CisKKworc3RhdGljIGludCBsb25naGF1bF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLCB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50IHRhYmxlX2luZGV4ID0gMDsKKwl1bnNpZ25lZCBpbnQgbmV3X2Nsb2NrX3JhdGlvID0gMDsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBsb25naGF1bF90YWJsZSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmdGFibGVfaW5kZXgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5ld19jbG9ja19yYXRpbyA9IGxvbmdoYXVsX3RhYmxlW3RhYmxlX2luZGV4XS5pbmRleCAmIDB4RkY7CisKKwlsb25naGF1bF9zZXRzdGF0ZShuZXdfY2xvY2tfcmF0aW8pOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBsb25naGF1bF9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoY3B1KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gY2FsY19zcGVlZChsb25naGF1bF9nZXRfY3B1X211bHQoKSk7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgbG9uZ2hhdWxfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGE7CisJY2hhciAqY3B1bmFtZT1OVUxMOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgeworCWNhc2UgNjoKKwkJY3B1X21vZGVsID0gQ1BVX1NBTVVFTDsKKwkJY3B1bmFtZSA9ICJDMyAnU2FtdWVsJyBbQzVBXSI7CisJCWxvbmdoYXVsX3ZlcnNpb24gPSBUWVBFX0xPTkdIQVVMX1YxOworCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBzYW11ZWwxX2Nsb2NrX3JhdGlvLCBzaXplb2Yoc2FtdWVsMV9jbG9ja19yYXRpbykpOworCQltZW1jcHkgKGVibGNyX3RhYmxlLCBzYW11ZWwxX2VibGNyLCBzaXplb2Yoc2FtdWVsMV9lYmxjcikpOworCQlicmVhazsKKworCWNhc2UgNzoKKwkJbG9uZ2hhdWxfdmVyc2lvbiA9IFRZUEVfTE9OR0hBVUxfVjE7CisJCXN3aXRjaCAoYy0+eDg2X21hc2spIHsKKwkJY2FzZSAwOgorCQkJY3B1X21vZGVsID0gQ1BVX1NBTVVFTDI7CisJCQljcHVuYW1lID0gIkMzICdTYW11ZWwgMicgW0M1Ql0iOworCQkJLyogTm90ZSwgdGhpcyBpcyBub3QgYSB0eXBvLCBlYXJseSBTYW11ZWwyJ3MgaGFkIFNhbXVlbDEgcmF0aW9zLiAqLworCQkJbWVtY3B5IChjbG9ja19yYXRpbywgc2FtdWVsMV9jbG9ja19yYXRpbywgc2l6ZW9mKHNhbXVlbDFfY2xvY2tfcmF0aW8pKTsKKwkJCW1lbWNweSAoZWJsY3JfdGFibGUsIHNhbXVlbDJfZWJsY3IsIHNpemVvZihzYW11ZWwyX2VibGNyKSk7CisJCQlicmVhazsKKwkJY2FzZSAxIC4uLiAxNToKKwkJCWlmIChjLT54ODZfbWFzayA8IDgpIHsKKwkJCQljcHVfbW9kZWwgPSBDUFVfU0FNVUVMMjsKKwkJCQljcHVuYW1lID0gIkMzICdTYW11ZWwgMicgW0M1Ql0iOworCQkJfSBlbHNlIHsKKwkJCQljcHVfbW9kZWwgPSBDUFVfRVpSQTsKKwkJCQljcHVuYW1lID0gIkMzICdFenJhJyBbQzVDXSI7CisJCQl9CisJCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBlenJhX2Nsb2NrX3JhdGlvLCBzaXplb2YoZXpyYV9jbG9ja19yYXRpbykpOworCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgZXpyYV9lYmxjciwgc2l6ZW9mKGV6cmFfZWJsY3IpKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSA4OgorCQljcHVfbW9kZWwgPSBDUFVfRVpSQV9UOworCQljcHVuYW1lID0gIkMzICdFenJhLVQnIFtDNU1dIjsKKwkJbG9uZ2hhdWxfdmVyc2lvbiA9IFRZUEVfUE9XRVJTQVZFUjsKKwkJbnVtc2NhbGVzPTMyOworCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBlenJhdF9jbG9ja19yYXRpbywgc2l6ZW9mKGV6cmF0X2Nsb2NrX3JhdGlvKSk7CisJCW1lbWNweSAoZWJsY3JfdGFibGUsIGV6cmF0X2VibGNyLCBzaXplb2YoZXpyYXRfZWJsY3IpKTsKKwkJYnJlYWs7CisKKwljYXNlIDk6CisJCWNwdV9tb2RlbCA9IENQVV9ORUhFTUlBSDsKKwkJbG9uZ2hhdWxfdmVyc2lvbiA9IFRZUEVfUE9XRVJTQVZFUjsKKwkJbnVtc2NhbGVzPTMyOworCQlzd2l0Y2ggKGMtPng4Nl9tYXNrKSB7CisJCWNhc2UgMCAuLi4gMToKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEEnIFtDNU5dIjsKKwkJCW1lbWNweSAoY2xvY2tfcmF0aW8sIG5laGVtaWFoX2FfY2xvY2tfcmF0aW8sIHNpemVvZihuZWhlbWlhaF9hX2Nsb2NrX3JhdGlvKSk7CisJCQltZW1jcHkgKGVibGNyX3RhYmxlLCBuZWhlbWlhaF9hX2VibGNyLCBzaXplb2YobmVoZW1pYWhfYV9lYmxjcikpOworCQkJYnJlYWs7CisJCWNhc2UgMiAuLi4gNDoKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEInIFtDNU5dIjsKKwkJCW1lbWNweSAoY2xvY2tfcmF0aW8sIG5laGVtaWFoX2JfY2xvY2tfcmF0aW8sIHNpemVvZihuZWhlbWlhaF9iX2Nsb2NrX3JhdGlvKSk7CisJCQltZW1jcHkgKGVibGNyX3RhYmxlLCBuZWhlbWlhaF9iX2VibGNyLCBzaXplb2YobmVoZW1pYWhfYl9lYmxjcikpOworCQkJYnJlYWs7CisJCWNhc2UgNSAuLi4gMTU6CisJCQljcHVuYW1lID0gIkMzICdOZWhlbWlhaCBDJyBbQzVOXSI7CisJCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBuZWhlbWlhaF9jX2Nsb2NrX3JhdGlvLCBzaXplb2YobmVoZW1pYWhfY19jbG9ja19yYXRpbykpOworCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgbmVoZW1pYWhfY19lYmxjciwgc2l6ZW9mKG5laGVtaWFoX2NfZWJsY3IpKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJY3B1bmFtZSA9ICJVbmtub3duIjsKKwkJYnJlYWs7CisJfQorCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJWSUEgJXMgQ1BVIGRldGVjdGVkLiAgIiwgY3B1bmFtZSk7CisJc3dpdGNoIChsb25naGF1bF92ZXJzaW9uKSB7CisJY2FzZSBUWVBFX0xPTkdIQVVMX1YxOgorCWNhc2UgVFlQRV9MT05HSEFVTF9WMjoKKwkJcHJpbnRrICgiTG9uZ2hhdWwgdiVkIHN1cHBvcnRlZC5cbiIsIGxvbmdoYXVsX3ZlcnNpb24pOworCQlicmVhazsKKwljYXNlIFRZUEVfUE9XRVJTQVZFUjoKKwkJcHJpbnRrICgiUG93ZXJzYXZlciBzdXBwb3J0ZWQuXG4iKTsKKwkJYnJlYWs7CisJfTsKKworCXJldCA9IGxvbmdoYXVsX2dldF9yYW5nZXMoKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoKGxvbmdoYXVsX3ZlcnNpb249PVRZUEVfTE9OR0hBVUxfVjIgfHwgbG9uZ2hhdWxfdmVyc2lvbj09VFlQRV9QT1dFUlNBVkVSKSAmJgorCQkgKGRvbnRfc2NhbGVfdm9sdGFnZT09MCkpCisJCWxvbmdoYXVsX3NldHVwX3ZvbHRhZ2VzY2FsaW5nKCk7CisKKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBDUFVGUkVRX0VURVJOQUw7CisJcG9saWN5LT5jdXIgPSBjYWxjX3NwZWVkKGxvbmdoYXVsX2dldF9jcHVfbXVsdCgpKTsKKworCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBsb25naGF1bF90YWJsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKGxvbmdoYXVsX3RhYmxlLCBwb2xpY3ktPmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbG9uZ2hhdWxfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogbG9uZ2hhdWxfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBsb25naGF1bF9kcml2ZXIgPSB7CisJLnZlcmlmeQk9IGxvbmdoYXVsX3ZlcmlmeSwKKwkudGFyZ2V0CT0gbG9uZ2hhdWxfdGFyZ2V0LAorCS5nZXQJPSBsb25naGF1bF9nZXQsCisJLmluaXQJPSBsb25naGF1bF9jcHVfaW5pdCwKKwkuZXhpdAk9IF9fZGV2ZXhpdF9wKGxvbmdoYXVsX2NwdV9leGl0KSwKKwkubmFtZQk9ICJsb25naGF1bCIsCisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJPSBsb25naGF1bF9hdHRyLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBsb25naGF1bF9pbml0KHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGE7CisKKwlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0NFTlRBVVIgfHwgYy0+eDg2ICE9IDYpCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoIChjLT54ODZfbW9kZWwpIHsKKwljYXNlIDYgLi4uIDk6CisJCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmbG9uZ2hhdWxfZHJpdmVyKTsKKwlkZWZhdWx0OgorCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIlVua25vd24gVklBIENQVS4gQ29udGFjdCBkYXZlakBjb2RlbW9ua2V5Lm9yZy51a1xuIik7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGxvbmdoYXVsX2V4aXQodm9pZCkKK3sKKwlpbnQgaT0wOworCisJZm9yIChpPTA7IGkgPCBudW1zY2FsZXM7IGkrKykgeworCQlpZiAoY2xvY2tfcmF0aW9baV0gPT0gbWF4bXVsdCkgeworCQkJbG9uZ2hhdWxfc2V0c3RhdGUoaSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmxvbmdoYXVsX2RyaXZlcik7CisJa2ZyZWUobG9uZ2hhdWxfdGFibGUpOworfQorCittb2R1bGVfcGFyYW0gKGRvbnRfc2NhbGVfdm9sdGFnZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZG9udF9zY2FsZV92b2x0YWdlLCAiRG9uJ3Qgc2NhbGUgdm9sdGFnZSBvZiBwcm9jZXNzb3IiKTsKKworTU9EVUxFX0FVVEhPUiAoIkRhdmUgSm9uZXMgPGRhdmVqQGNvZGVtb25rZXkub3JnLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiTG9uZ2hhdWwgZHJpdmVyIGZvciBWSUEgQ3lyaXggcHJvY2Vzc29ycy4iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK21vZHVsZV9pbml0KGxvbmdoYXVsX2luaXQpOworbW9kdWxlX2V4aXQobG9uZ2hhdWxfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaCBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQ5NWMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5oCkBAIC0wLDAgKzEsNDY2IEBACisvKgorICogIGxvbmdoYXVsLmgKKyAqICAoQykgMjAwMyBEYXZlIEpvbmVzLgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogIFZJQS1zcGVjaWZpYyBpbmZvcm1hdGlvbgorICovCisKK3VuaW9uIG1zcl9iY3IyIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBSZXNldmVkOjE5LAkvLyAxODowCisJCUVTT0ZUQkY6MSwJCS8vIDE5CisJCVJlc2VydmVkMjozLAkJLy8gMjI6MjAKKwkJQ0xPQ0tNVUw6NCwJCS8vIDI2OjIzCisJCVJlc2VydmVkMzo1OwkJLy8gMzE6MjcKKwl9IGJpdHM7CisJdW5zaWduZWQgbG9uZyB2YWw7Cit9OworCit1bmlvbiBtc3JfbG9uZ2hhdWwgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIFJldmlzaW9uSUQ6NCwJLy8gMzowCisJCVJldmlzaW9uS2V5OjQsCQkvLyA3OjQKKwkJRW5hYmxlU29mdEJ1c1JhdGlvOjEsCS8vIDgKKwkJRW5hYmxlU29mdFZJRDoxLAkvLyA5CisJCUVuYWJsZVNvZnRCU0VMOjEsCS8vIDEwCisJCVJlc2VydmVkOjMsCQkvLyAxMToxMworCQlTb2Z0QnVzUmF0aW80OjEsCS8vIDE0CisJCVZSTVJldjoxLAkJLy8gMTUKKwkJU29mdEJ1c1JhdGlvOjQsCQkvLyAxOToxNgorCQlTb2Z0VklEOjUsCQkvLyAyNDoyMAorCQlSZXNlcnZlZDI6MywJCS8vIDI3OjI1CisJCVNvZnRCU0VMOjIsCQkvLyAyOToyOAorCQlSZXNlcnZlZDM6MiwJCS8vIDMxOjMwCisJCU1heE1IekJSOjQsCQkvLyAzNTozMgorCQlNYXhpbXVtVklEOjUsCQkvLyA0MDozNgorCQlNYXhNSHpGU0I6MiwJCS8vIDQyOjQxCisJCU1heE1IekJSNDoxLAkJLy8gNDMKKwkJUmVzZXJ2ZWQ0OjQsCQkvLyA0Nzo0NAorCQlNaW5NSHpCUjo0LAkJLy8gNTE6NDgKKwkJTWluaW11bVZJRDo1LAkJLy8gNTY6NTIKKwkJTWluTUh6RlNCOjIsCQkvLyA1ODo1NworCQlNaW5NSHpCUjQ6MSwJCS8vIDU5CisJCVJlc2VydmVkNTo0OwkJLy8gNjM6NjAKKwl9IGJpdHM7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKK307CisKKy8qCisgKiBDbG9jayByYXRpbyB0YWJsZXMuIERpdi9Nb2QgYnkgMTAgdG8gZ2V0IHJhdGlvLgorICogVGhlIGVibGNyIG9uZXMgc3BlY2lmeSB0aGUgcmF0aW8gcmVhZCBmcm9tIHRoZSBDUFUuCisgKiBUaGUgY2xvY2tfcmF0aW8gb25lcyBzcGVjaWZ5IHdoYXQgdG8gd3JpdGUgdG8gdGhlIENQVS4KKyAqLworCisvKgorICogVklBIEMzIFNhbXVlbCAxICAmIFNhbXVlbCAyIChzdGVwcGluZyAwKQorICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgc2FtdWVsMV9jbG9ja19yYXRpb1sxNl0gPSB7CisJLTEsIC8qIDAwMDAgLT4gUkVTRVJWRUQgKi8KKwkzMCwgLyogMDAwMSAtPiAgMy4weCAqLworCTQwLCAvKiAwMDEwIC0+ICA0LjB4ICovCisJLTEsIC8qIDAwMTEgLT4gUkVTRVJWRUQgKi8KKwktMSwgLyogMDEwMCAtPiBSRVNFUlZFRCAqLworCTM1LCAvKiAwMTAxIC0+ICAzLjV4ICovCisJNDUsIC8qIDAxMTAgLT4gIDQuNXggKi8KKwk1NSwgLyogMDExMSAtPiAgNS41eCAqLworCTYwLCAvKiAxMDAwIC0+ICA2LjB4ICovCisJNzAsIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgLyogMTAxMCAtPiAgOC4weCAqLworCTUwLCAvKiAxMDExIC0+ICA1LjB4ICovCisJNjUsIC8qIDExMDAgLT4gIDYuNXggKi8KKwk3NSwgLyogMTEwMSAtPiAgNy41eCAqLworCS0xLCAvKiAxMTEwIC0+IFJFU0VSVkVEICovCisJLTEsIC8qIDExMTEgLT4gUkVTRVJWRUQgKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzYW11ZWwxX2VibGNyWzE2XSA9IHsKKwk1MCwgLyogMDAwMCAtPiBSRVNFUlZFRCAqLworCTMwLCAvKiAwMDAxIC0+ICAzLjB4ICovCisJNDAsIC8qIDAwMTAgLT4gIDQuMHggKi8KKwktMSwgLyogMDAxMSAtPiBSRVNFUlZFRCAqLworCTU1LCAvKiAwMTAwIC0+ICA1LjV4ICovCisJMzUsIC8qIDAxMDEgLT4gIDMuNXggKi8KKwk0NSwgLyogMDExMCAtPiAgNC41eCAqLworCS0xLCAvKiAwMTExIC0+IFJFU0VSVkVEICovCisJLTEsIC8qIDEwMDAgLT4gUkVTRVJWRUQgKi8KKwk3MCwgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAvKiAxMDEwIC0+ICA4LjB4ICovCisJNjAsIC8qIDEwMTEgLT4gIDYuMHggKi8KKwktMSwgLyogMTEwMCAtPiBSRVNFUlZFRCAqLworCTc1LCAvKiAxMTAxIC0+ICA3LjV4ICovCisJLTEsIC8qIDExMTAgLT4gUkVTRVJWRUQgKi8KKwk2NSwgLyogMTExMSAtPiAgNi41eCAqLworfTsKKworLyoKKyAqIFZJQSBDMyBTYW11ZWwyIFN0ZXBwaW5nIDEtPjE1CisgKi8KK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzYW11ZWwyX2VibGNyWzE2XSA9IHsKKwk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KKwkzMCwgIC8qIDAwMDEgLT4gIDMuMHggKi8KKwk0MCwgIC8qIDAwMTAgLT4gIDQuMHggKi8KKwkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KKwk1NSwgIC8qIDAxMDAgLT4gIDUuNXggKi8KKwkzNSwgIC8qIDAxMDEgLT4gIDMuNXggKi8KKwk0NSwgIC8qIDAxMTAgLT4gIDQuNXggKi8KKwkxMTAsIC8qIDAxMTEgLT4gMTEuMHggKi8KKwk5MCwgIC8qIDEwMDAgLT4gIDkuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk2MCwgIC8qIDEwMTEgLT4gIDYuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwkxMzAsIC8qIDExMTAgLT4gMTMuMHggKi8KKwk2NSwgIC8qIDExMTEgLT4gIDYuNXggKi8KK307CisKKy8qCisgKiBWSUEgQzMgRXpyYQorICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgZXpyYV9jbG9ja19yYXRpb1sxNl0gPSB7CisJMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCisJMzAsICAvKiAwMDAxIC0+ICAzLjB4ICovCisJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCisJOTAsICAvKiAwMDExIC0+ICA5LjB4ICovCisJOTUsICAvKiAwMTAwIC0+ICA5LjV4ICovCisJMzUsICAvKiAwMTAxIC0+ICAzLjV4ICovCisJNDUsICAvKiAwMTEwIC0+ICA0LjV4ICovCisJNTUsICAvKiAwMTExIC0+ICA1LjV4ICovCisJNjAsICAvKiAxMDAwIC0+ICA2LjB4ICovCisJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCisJODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCisJNTAsICAvKiAxMDExIC0+ICA1LjB4ICovCisJNjUsICAvKiAxMTAwIC0+ICA2LjV4ICovCisJNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCisJODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCisJMTIwLCAvKiAxMTExIC0+IDEyLjB4ICovCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgZXpyYV9lYmxjclsxNl0gPSB7CisJNTAsICAvKiAwMDAwIC0+ICA1LjB4ICovCisJMzAsICAvKiAwMDAxIC0+ICAzLjB4ICovCisJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJNTUsICAvKiAwMTAwIC0+ICA1LjV4ICovCisJMzUsICAvKiAwMTAxIC0+ICAzLjV4ICovCisJNDUsICAvKiAwMTEwIC0+ICA0LjV4ICovCisJOTUsICAvKiAwMTExIC0+ICA5LjV4ICovCisJOTAsICAvKiAxMDAwIC0+ICA5LjB4ICovCisJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCisJODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCisJNjAsICAvKiAxMDExIC0+ICA2LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCisJODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCisJNjUsICAvKiAxMTExIC0+ICA2LjV4ICovCit9OworCisvKgorICogVklBIEMzIChFenJhLVQpIFtDNU1dLgorICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgZXpyYXRfY2xvY2tfcmF0aW9bMzJdID0geworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTMwLCAgLyogMDAwMSAtPiAgMy4weCAqLworCTQwLCAgLyogMDAxMCAtPiAgNC4weCAqLworCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLworCTk1LCAgLyogMDEwMCAtPiAgOS41eCAqLworCTM1LCAgLyogMDEwMSAtPiAgMy41eCAqLworCTQ1LCAgLyogMDExMCAtPiAgNC41eCAqLworCTU1LCAgLyogMDExMSAtPiAgNS41eCAqLworCTYwLCAgLyogMTAwMCAtPiAgNi4weCAqLworCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLworCTUwLCAgLyogMTAxMSAtPiAgNS4weCAqLworCTY1LCAgLyogMTEwMCAtPiAgNi41eCAqLworCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLworCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLworCTEyMCwgLyogMTExMSAtPiAgMTIuMHggKi8KKworCS0xLCAgLyogMDAwMCAtPiBSRVNFUlZFRCAoMTAuMHgpICovCisJMTEwLCAvKiAwMDAxIC0+IDExLjB4ICovCisJMTIwLCAvKiAwMDEwIC0+IDEyLjB4ICovCisJLTEsICAvKiAwMDExIC0+IFJFU0VSVkVEICg5LjB4KSovCisJMTA1LCAvKiAwMTAwIC0+IDEwLjV4ICovCisJMTE1LCAvKiAwMTAxIC0+IDExLjV4ICovCisJMTI1LCAvKiAwMTEwIC0+IDEyLjV4ICovCisJMTM1LCAvKiAwMTExIC0+IDEzLjV4ICovCisJMTQwLCAvKiAxMDAwIC0+IDE0LjB4ICovCisJMTUwLCAvKiAxMDAxIC0+IDE1LjB4ICovCisJMTYwLCAvKiAxMDEwIC0+IDE2LjB4ICovCisJMTMwLCAvKiAxMDExIC0+IDEzLjB4ICovCisJMTQ1LCAvKiAxMTAwIC0+IDE0LjV4ICovCisJMTU1LCAvKiAxMTAxIC0+IDE1LjV4ICovCisJLTEsICAvKiAxMTEwIC0+IFJFU0VSVkVEICgxMy4weCkgKi8KKwktMSwgIC8qIDExMTEgLT4gUkVTRVJWRUQgKDEyLjB4KSAqLworfTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGV6cmF0X2VibGNyWzMyXSA9IHsKKwk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KKwkzMCwgIC8qIDAwMDEgLT4gIDMuMHggKi8KKwk0MCwgIC8qIDAwMTAgLT4gIDQuMHggKi8KKwkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KKwk1NSwgIC8qIDAxMDAgLT4gIDUuNXggKi8KKwkzNSwgIC8qIDAxMDEgLT4gIDMuNXggKi8KKwk0NSwgIC8qIDAxMTAgLT4gIDQuNXggKi8KKwk5NSwgIC8qIDAxMTEgLT4gIDkuNXggKi8KKwk5MCwgIC8qIDEwMDAgLT4gIDkuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk2MCwgIC8qIDEwMTEgLT4gIDYuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KKwk2NSwgIC8qIDExMTEgLT4gIDYuNXggKi8KKworCS0xLCAgLyogMDAwMCAtPiBSRVNFUlZFRCAoOS4weCkgKi8KKwkxMTAsIC8qIDAwMDEgLT4gMTEuMHggKi8KKwkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KKwktMSwgIC8qIDAwMTEgLT4gUkVTRVJWRUQgKDEwLjB4KSovCisJMTM1LCAvKiAwMTAwIC0+IDEzLjV4ICovCisJMTE1LCAvKiAwMTAxIC0+IDExLjV4ICovCisJMTI1LCAvKiAwMTEwIC0+IDEyLjV4ICovCisJMTA1LCAvKiAwMTExIC0+IDEwLjV4ICovCisJMTMwLCAvKiAxMDAwIC0+IDEzLjB4ICovCisJMTUwLCAvKiAxMDAxIC0+IDE1LjB4ICovCisJMTYwLCAvKiAxMDEwIC0+IDE2LjB4ICovCisJMTQwLCAvKiAxMDExIC0+IDE0LjB4ICovCisJLTEsICAvKiAxMTAwIC0+IFJFU0VSVkVEICgxMi4weCkgKi8KKwkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KKwktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLworCTE0NSwgLyogMTExMSAtPiAxNC41eCAqLworfTsKKworLyoKKyAqIFZJQSBDMyBOZWhlbWlhaCAqLworIAorc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2FfY2xvY2tfcmF0aW9bMzJdID0geworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLworCS0xLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KKwk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KKwk5NSwgIC8qIDAxMDAgLT4gIDkuNXggKi8KKwktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCisJLTEsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLworCTU1LCAgLyogMDExMSAtPiAgNS41eCAqLworCTYwLCAgLyogMTAwMCAtPiAgNi4weCAqLworCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLworCTUwLCAgLyogMTAxMSAtPiAgNS4weCAqLworCTY1LCAgLyogMTEwMCAtPiAgNi41eCAqLworCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLworCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLworCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCS0xLCAgLyogMDAwMSAtPiBSRVNFUlZFRCAqLworCTEyMCwgLyogMDAxMCAtPiAxMi4weCAqLworCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLworCTEwNSwgLyogMDEwMCAtPiAxMC41eCAqLworCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLworCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLworCTEzNSwgLyogMDExMSAtPiAxMy41eCAqLworCTE0MCwgLyogMTAwMCAtPiAxNC4weCAqLworCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLworCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLworCTEzMCwgLyogMTAxMSAtPiAxMy4weCAqLworCTE0NSwgLyogMTEwMCAtPiAxNC41eCAqLworCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLworCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCisJMTIwLCAvKiAxMTExIC0+IDEyLjB4ICovCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgIG5laGVtaWFoX2JfY2xvY2tfcmF0aW9bMzJdID0geworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLworCS0xLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KKwk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KKwk5NSwgIC8qIDAxMDAgLT4gIDkuNXggKi8KKwktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCisJLTEsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLworCTU1LCAgLyogMDExMSAtPiAgNS41eCAqLworCTYwLCAgLyogMTAwMCAtPiAgNi4weCAqLworCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLworCTUwLCAgLyogMTAxMSAtPiAgNS4weCAqLworCTY1LCAgLyogMTEwMCAtPiAgNi41eCAqLworCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLworCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLworCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTExMCwgLyogMDAwMSAtPiAxMS4weCAqLworCTEyMCwgLyogMDAxMCAtPiAxMi4weCAqLworCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLworCTEwNSwgLyogMDEwMCAtPiAxMC41eCAqLworCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLworCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLworCTEzNSwgLyogMDExMSAtPiAxMy41eCAqLworCTE0MCwgLyogMTAwMCAtPiAxNC4weCAqLworCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLworCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLworCTEzMCwgLyogMTAxMSAtPiAxMy4weCAqLworCTE0NSwgLyogMTEwMCAtPiAxNC41eCAqLworCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLworCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCisJMTIwLCAvKiAxMTExIC0+IDEyLjB4ICovCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgIG5laGVtaWFoX2NfY2xvY2tfcmF0aW9bMzJdID0geworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLworCTQwLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KKwk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KKwk5NSwgIC8qIDAxMDAgLT4gIDkuNXggKi8KKwktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCisJNDUsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLworCTU1LCAgLyogMDExMSAtPiAgNS41eCAqLworCTYwLCAgLyogMTAwMCAtPiAgNi4weCAqLworCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLworCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLworCTUwLCAgLyogMTAxMSAtPiAgNS4weCAqLworCTY1LCAgLyogMTEwMCAtPiAgNi41eCAqLworCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLworCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLworCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLworCTEwMCwgLyogMDAwMCAtPiAxMC4weCAqLworCTExMCwgLyogMDAwMSAtPiAxMS4weCAqLworCTEyMCwgLyogMDAxMCAtPiAxMi4weCAqLworCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLworCTEwNSwgLyogMDEwMCAtPiAxMC41eCAqLworCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLworCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLworCTEzNSwgLyogMDExMSAtPiAxMy41eCAqLworCTE0MCwgLyogMTAwMCAtPiAxNC4weCAqLworCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLworCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLworCTEzMCwgLyogMTAxMSAtPiAxMy4weCAqLworCTE0NSwgLyogMTEwMCAtPiAxNC41eCAqLworCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLworCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCisJMTIwLCAvKiAxMTExIC0+IDEyLjB4ICovCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgbmVoZW1pYWhfYV9lYmxjclszMl0gPSB7CisJNTAsICAvKiAwMDAwIC0+ICA1LjB4ICovCisJMTYwLCAvKiAwMDAxIC0+IDE2LjB4ICovCisJLTEsICAvKiAwMDEwIC0+ICBSRVNFUlZFRCAqLworCTEwMCwgLyogMDAxMSAtPiAxMC4weCAqLworCTU1LCAgLyogMDEwMCAtPiAgNS41eCAqLworCS0xLCAgLyogMDEwMSAtPiAgUkVTRVJWRUQgKi8KKwktMSwgIC8qIDAxMTAgLT4gIFJFU0VSVkVEICovCisJOTUsICAvKiAwMTExIC0+ICA5LjV4ICovCisJOTAsICAvKiAxMDAwIC0+ICA5LjB4ICovCisJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCisJODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCisJNjAsICAvKiAxMDExIC0+ICA2LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCisJODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCisJNjUsICAvKiAxMTExIC0+ICA2LjV4ICovCisJOTAsICAvKiAwMDAwIC0+ICA5LjB4ICovCisJLTEsICAvKiAwMDAxIC0+IFJFU0VSVkVEICovCisJMTIwLCAvKiAwMDEwIC0+IDEyLjB4ICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJMTM1LCAvKiAwMTAwIC0+IDEzLjV4ICovCisJMTE1LCAvKiAwMTAxIC0+IDExLjV4ICovCisJMTI1LCAvKiAwMTEwIC0+IDEyLjV4ICovCisJMTA1LCAvKiAwMTExIC0+IDEwLjV4ICovCisJMTMwLCAvKiAxMDAwIC0+IDEzLjB4ICovCisJMTUwLCAvKiAxMDAxIC0+IDE1LjB4ICovCisJMTYwLCAvKiAxMDEwIC0+IDE2LjB4ICovCisJMTQwLCAvKiAxMDExIC0+IDE0LjB4ICovCisJMTIwLCAvKiAxMTAwIC0+IDEyLjB4ICovCisJMTU1LCAvKiAxMTAxIC0+IDE1LjV4ICovCisJLTEsICAvKiAxMTEwIC0+IFJFU0VSVkVEICgxMy4weCkgKi8KKwkxNDUgLyogMTExMSAtPiAxNC41eCAqLworICAgLyogZW5kIG9mIHRhYmxlICAqLworfTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBuZWhlbWlhaF9iX2VibGNyWzMyXSA9IHsKKwk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KKwkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KKwktMSwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJNTUsICAvKiAwMTAwIC0+ICA1LjV4ICovCisJLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLworCS0xLCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KKwk5NSwgIC8qIDAxMTEgLT4gIDkuNXggKi8KKwk5MCwgIC8qIDEwMDAgLT4gIDkuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk2MCwgIC8qIDEwMTEgLT4gIDYuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KKwk2NSwgIC8qIDExMTEgLT4gIDYuNXggKi8KKwk5MCwgIC8qIDAwMDAgLT4gIDkuMHggKi8KKwkxMTAsIC8qIDAwMDEgLT4gMTEuMHggKi8KKwkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KKwkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KKwkxMzUsIC8qIDAxMDAgLT4gMTMuNXggKi8KKwkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KKwkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KKwkxMDUsIC8qIDAxMTEgLT4gMTAuNXggKi8KKwkxMzAsIC8qIDEwMDAgLT4gMTMuMHggKi8KKwkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KKwkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KKwkxNDAsIC8qIDEwMTEgLT4gMTQuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KKwktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLworCTE0NSAvKiAxMTExIC0+IDE0LjV4ICovCisJICAgLyogZW5kIG9mIHRhYmxlICAqLworfTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBuZWhlbWlhaF9jX2VibGNyWzMyXSA9IHsKKwk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KKwkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KKwk0MCwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCisJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCisJNTUsICAvKiAwMTAwIC0+ICA1LjV4ICovCisJLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLworCTQ1LCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KKwk5NSwgIC8qIDAxMTEgLT4gIDkuNXggKi8KKwk5MCwgIC8qIDEwMDAgLT4gIDkuMHggKi8KKwk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KKwk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KKwk2MCwgIC8qIDEwMTEgLT4gIDYuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KKwk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KKwk2NSwgIC8qIDExMTEgLT4gIDYuNXggKi8KKwk5MCwgIC8qIDAwMDAgLT4gIDkuMHggKi8KKwkxMTAsIC8qIDAwMDEgLT4gMTEuMHggKi8KKwkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KKwkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KKwkxMzUsIC8qIDAxMDAgLT4gMTMuNXggKi8KKwkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KKwkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KKwkxMDUsIC8qIDAxMTEgLT4gMTAuNXggKi8KKwkxMzAsIC8qIDEwMDAgLT4gMTMuMHggKi8KKwkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KKwkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KKwkxNDAsIC8qIDEwMTEgLT4gMTQuMHggKi8KKwkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KKwkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KKwktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLworCTE0NSAvKiAxMTExIC0+IDE0LjV4ICovCisJICAvKiBlbmQgb2YgdGFibGUgICovCit9OworCisvKiAKKyAqIFZvbHRhZ2Ugc2NhbGVzLiBEaXYvTW9kIGJ5IDEwMDAgdG8gZ2V0IGFjdHVhbCB2b2x0YWdlLgorICogV2hpY2ggc2NhbGUgdG8gdXNlIGRlcGVuZHMgb24gdGhlIFZSTSB0eXBlIGluIHVzZS4KKyAqLworc3RhdGljIGludCBfX2luaXRkYXRhIHZybTg1c2NhbGVzWzMyXSA9IHsKKwkxMjUwLCAxMjAwLCAxMTUwLCAxMTAwLCAxMDUwLCAxODAwLCAxNzUwLCAxNzAwLAorCTE2NTAsIDE2MDAsIDE1NTAsIDE1MDAsIDE0NTAsIDE0MDAsIDEzNTAsIDEzMDAsCisJMTI3NSwgMTIyNSwgMTE3NSwgMTEyNSwgMTA3NSwgMTgyNSwgMTc3NSwgMTcyNSwKKwkxNjc1LCAxNjI1LCAxNTc1LCAxNTI1LCAxNDc1LCAxNDI1LCAxMzc1LCAxMzI1LAorfTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIG1vYmlsZXZybXNjYWxlc1szMl0gPSB7CisJMjAwMCwgMTk1MCwgMTkwMCwgMTg1MCwgMTgwMCwgMTc1MCwgMTcwMCwgMTY1MCwKKwkxNjAwLCAxNTUwLCAxNTAwLCAxNDUwLCAxNTAwLCAxMzUwLCAxMzAwLCAtMSwKKwkxMjc1LCAxMjUwLCAxMjI1LCAxMjAwLCAxMTc1LCAxMTUwLCAxMTI1LCAxMTAwLAorCTEwNzUsIDEwNTAsIDEwMjUsIDEwMDAsIDk3NSwgOTUwLCA5MjUsIC0xLAorfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25ncnVuLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdydW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzg2OGRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25ncnVuLmMKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiAoQykgMjAwMiAtIDIwMDMgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgImxvbmdydW4iLCBtc2cpCisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIJbG9uZ3J1bl9kcml2ZXI7CisKKy8qKgorICogbG9uZ3J1bl97bG93LGhpZ2h9X2ZyZXEgaXMgbmVlZGVkIGZvciB0aGUgY29udmVyc2lvbiBvZiBjcHVmcmVxIGtIegorICogdmFsdWVzIGludG8gcGVyIGNlbnQgdmFsdWVzLiBJbiBUTVRBIG1pY3JvY29kZSwgdGhlIGZvbGxvd2luZyBpcyB2YWxpZDoKKyAqIHBlcmZvcm1hbmNlX3BjdGcgPSAoY3VycmVudF9mcmVxIC0gbG93X2ZyZXEpLyhoaWdoX2ZyZXEgLSBsb3dfZnJlcSkKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBsb25ncnVuX2xvd19mcmVxLCBsb25ncnVuX2hpZ2hfZnJlcTsKKworCisvKioKKyAqIGxvbmdydW5fZ2V0X3BvbGljeSAtIGdldCB0aGUgY3VycmVudCBMb25nUnVuIHBvbGljeQorICogQHBvbGljeTogc3RydWN0IGNwdWZyZXFfcG9saWN5IHdoZXJlIGN1cnJlbnQgcG9saWN5IGlzIHdyaXR0ZW4gaW50bworICoKKyAqIFJlYWRzIHRoZSBjdXJyZW50IExvbmdSdW4gcG9saWN5IGJ5IGFjY2VzcyB0byBNU1JfVE1UQV9MT05HUlVOX0ZMQUdTCisgKiBhbmQgTVNSX1RNVEFfTE9OR1JVTl9DVFJMCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBsb25ncnVuX2dldF9wb2xpY3koc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdTMyIG1zcl9sbywgbXNyX2hpOworCisJcmRtc3IoTVNSX1RNVEFfTE9OR1JVTl9GTEFHUywgbXNyX2xvLCBtc3JfaGkpOworCWRwcmludGsoImxvbmdydW4gZmxhZ3MgYXJlICV4IC0gJXhcbiIsIG1zcl9sbywgbXNyX2hpKTsKKwlpZiAobXNyX2xvICYgMHgwMSkKKwkJcG9saWN5LT5wb2xpY3kgPSBDUFVGUkVRX1BPTElDWV9QRVJGT1JNQU5DRTsKKwllbHNlCisJCXBvbGljeS0+cG9saWN5ID0gQ1BVRlJFUV9QT0xJQ1lfUE9XRVJTQVZFOworCisJcmRtc3IoTVNSX1RNVEFfTE9OR1JVTl9DVFJMLCBtc3JfbG8sIG1zcl9oaSk7CisJZHByaW50aygibG9uZ3J1biBjdHJsIGlzICV4IC0gJXhcbiIsIG1zcl9sbywgbXNyX2hpKTsKKwltc3JfbG8gJj0gMHgwMDAwMDA3RjsKKwltc3JfaGkgJj0gMHgwMDAwMDA3RjsKKworCWlmICggbG9uZ3J1bl9oaWdoX2ZyZXEgPD0gbG9uZ3J1bl9sb3dfZnJlcSApIHsKKwkJLyogQXNzdW1lIGRlZ2VuZXJhdGUgTG9uZ3J1biB0YWJsZSAqLworCQlwb2xpY3ktPm1pbiA9IHBvbGljeS0+bWF4ID0gbG9uZ3J1bl9oaWdoX2ZyZXE7CisJfSBlbHNlIHsKKwkJcG9saWN5LT5taW4gPSBsb25ncnVuX2xvd19mcmVxICsgbXNyX2xvICoKKwkJCSgobG9uZ3J1bl9oaWdoX2ZyZXEgLSBsb25ncnVuX2xvd19mcmVxKSAvIDEwMCk7CisJCXBvbGljeS0+bWF4ID0gbG9uZ3J1bl9sb3dfZnJlcSArIG1zcl9oaSAqCisJCQkoKGxvbmdydW5faGlnaF9mcmVxIC0gbG9uZ3J1bl9sb3dfZnJlcSkgLyAxMDApOworCX0KKwlwb2xpY3ktPmNwdSA9IDA7Cit9CisKKworLyoqCisgKiBsb25ncnVuX3NldF9wb2xpY3kgLSBzZXRzIGEgbmV3IENQVUZyZXEgcG9saWN5CisgKiBAcG9saWN5OiBuZXcgcG9saWN5CisgKgorICogU2V0cyBhIG5ldyBDUFVGcmVxIHBvbGljeSBvbiBMb25nUnVuLWNhcGFibGUgcHJvY2Vzc29ycy4gVGhpcyBmdW5jdGlvbgorICogaGFzIHRvIGJlIGNhbGxlZCB3aXRoIGNwdWZyZXFfZHJpdmVyIGxvY2tlZC4KKyAqLworc3RhdGljIGludCBsb25ncnVuX3NldF9wb2xpY3koc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdTMyIG1zcl9sbywgbXNyX2hpOworCXUzMiBwY3RnX2xvLCBwY3RnX2hpOworCisJaWYgKCFwb2xpY3kpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCBsb25ncnVuX2hpZ2hfZnJlcSA8PSBsb25ncnVuX2xvd19mcmVxICkgeworCQkvKiBBc3N1bWUgZGVnZW5lcmF0ZSBMb25ncnVuIHRhYmxlICovCisJCXBjdGdfbG8gPSBwY3RnX2hpID0gMTAwOworCX0gZWxzZSB7CisJCXBjdGdfbG8gPSAocG9saWN5LT5taW4gLSBsb25ncnVuX2xvd19mcmVxKSAvCisJCQkoKGxvbmdydW5faGlnaF9mcmVxIC0gbG9uZ3J1bl9sb3dfZnJlcSkgLyAxMDApOworCQlwY3RnX2hpID0gKHBvbGljeS0+bWF4IC0gbG9uZ3J1bl9sb3dfZnJlcSkgLworCQkJKChsb25ncnVuX2hpZ2hfZnJlcSAtIGxvbmdydW5fbG93X2ZyZXEpIC8gMTAwKTsKKwl9CisKKwlpZiAocGN0Z19oaSA+IDEwMCkKKwkJcGN0Z19oaSA9IDEwMDsKKwlpZiAocGN0Z19sbyA+IHBjdGdfaGkpCisJCXBjdGdfbG8gPSBwY3RnX2hpOworCisJLyogcGVyZm9ybWFuY2Ugb3IgZWNvbm9teSBtb2RlICovCisJcmRtc3IoTVNSX1RNVEFfTE9OR1JVTl9GTEFHUywgbXNyX2xvLCBtc3JfaGkpOworCW1zcl9sbyAmPSAweEZGRkZGRkZFOworCXN3aXRjaCAocG9saWN5LT5wb2xpY3kpIHsKKwljYXNlIENQVUZSRVFfUE9MSUNZX1BFUkZPUk1BTkNFOgorCQltc3JfbG8gfD0gMHgwMDAwMDAwMTsKKwkJYnJlYWs7CisJY2FzZSBDUFVGUkVRX1BPTElDWV9QT1dFUlNBVkU6CisJCWJyZWFrOworCX0KKwl3cm1zcihNU1JfVE1UQV9MT05HUlVOX0ZMQUdTLCBtc3JfbG8sIG1zcl9oaSk7CisKKwkvKiBsb3dlciBhbmQgdXBwZXIgYm91bmRhcnkgKi8KKwlyZG1zcihNU1JfVE1UQV9MT05HUlVOX0NUUkwsIG1zcl9sbywgbXNyX2hpKTsKKwltc3JfbG8gJj0gMHhGRkZGRkY4MDsKKwltc3JfaGkgJj0gMHhGRkZGRkY4MDsKKwltc3JfbG8gfD0gcGN0Z19sbzsKKwltc3JfaGkgfD0gcGN0Z19oaTsKKwl3cm1zcihNU1JfVE1UQV9MT05HUlVOX0NUUkwsIG1zcl9sbywgbXNyX2hpKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogbG9uZ3J1bl92ZXJpZnlfcG9saXkgLSB2ZXJpZmllcyBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogdGhlIHBvbGljeSB0byB2ZXJpZnkKKyAqCisgKiBWYWxpZGF0ZXMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kuIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIGNhbGxlZCB3aXRoCisgKiBjcHVmcmVxX2RyaXZlciBsb2NrZWQuCisgKi8KK3N0YXRpYyBpbnQgbG9uZ3J1bl92ZXJpZnlfcG9saWN5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWlmICghcG9saWN5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvbGljeS0+Y3B1ID0gMDsKKwljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwKKwkJcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxLAorCQlwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEpOworCisJaWYgKChwb2xpY3ktPnBvbGljeSAhPSBDUFVGUkVRX1BPTElDWV9QT1dFUlNBVkUpICYmCisJICAgIChwb2xpY3ktPnBvbGljeSAhPSBDUFVGUkVRX1BPTElDWV9QRVJGT1JNQU5DRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9uZ3J1bl9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1MzIgZWF4LCBlYngsIGVjeCwgZWR4OworCisJaWYgKGNwdSkKKwkJcmV0dXJuIDA7CisKKwljcHVpZCgweDgwODYwMDA3LCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwlkcHJpbnRrKCJjcHVpZCBlYXggaXMgJXVcbiIsIGVheCk7CisKKwlyZXR1cm4gKGVheCAqIDEwMDApOworfQorCisvKioKKyAqIGxvbmdydW5fZGV0ZXJtaW5lX2ZyZXFzIC0gZGV0ZXJtaW5lcyB0aGUgbG93ZXN0IGFuZCBoaWdoZXN0IHBvc3NpYmxlIGNvcmUgZnJlcXVlbmN5CisgKiBAbG93X2ZyZXE6IGFuIGludCB0byBwdXQgdGhlIGxvd2VzdCBmcmVxdWVuY3kgaW50bworICogQGhpZ2hfZnJlcTogYW4gaW50IHRvIHB1dCB0aGUgaGlnaGVzdCBmcmVxdWVuY3kgaW50bworICoKKyAqIERldGVybWluZXMgdGhlIGxvd2VzdCBhbmQgaGlnaGVzdCBwb3NzaWJsZSBjb3JlIGZyZXF1ZW5jaWVzIG9uIHRoaXMgQ1BVLgorICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHRoZSBwZXJmb3JtYW5jZSBwZXJjZW50YWdlIGFjY29yZGluZyB0bworICogVE1UQSBydWxlczoKKyAqIHBlcmZvcm1hbmNlX3BjdGcgPSAodGFyZ2V0X2ZyZXEgLSBsb3dfZnJlcSkvKGhpZ2hfZnJlcSAtIGxvd19mcmVxKQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBsb25ncnVuX2RldGVybWluZV9mcmVxcyh1bnNpZ25lZCBpbnQgKmxvd19mcmVxLAorCQkJCQkJICAgdW5zaWduZWQgaW50ICpoaWdoX2ZyZXEpCit7CisJdTMyIG1zcl9sbywgbXNyX2hpOworCXUzMiBzYXZlX2xvLCBzYXZlX2hpOworCXUzMiBlYXgsIGVieCwgZWN4LCBlZHg7CisJdTMyIHRyeV9oaTsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKKworCWlmICghbG93X2ZyZXEgfHwgIWhpZ2hfZnJlcSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9MUlRJKSkgeworCQkvKiBpZiB0aGUgTG9uZ1J1biBUYWJsZSBJbnRlcmZhY2UgaXMgcHJlc2VudCwgdGhlCisJCSAqIGRldGVjdGlvbiBpcyBhIGJpdCBlYXNpZXI6CisJCSAqIEZvciBtaW5pbXVtIGZyZXF1ZW5jeSwgcmVhZCBvdXQgdGhlIG1heGltdW0KKwkJICogbGV2ZWwgKG1zcl9oaSksIHdyaXRlIHRoYXQgaW50byAiY3VycmVudGx5CisJCSAqIHNlbGVjdGVkIGxldmVsIiwgYW5kIHJlYWQgb3V0IHRoZSBmcmVxdWVuY3kuCisJCSAqIEZvciBtYXhpbXVtIGZyZXF1ZW5jeSwgcmVhZCBvdXQgbGV2ZWwgemVyby4KKwkJICovCisJCS8qIG1pbmltdW0gKi8KKwkJcmRtc3IoTVNSX1RNVEFfTFJUSV9SRUFET1VULCBtc3JfbG8sIG1zcl9oaSk7CisJCXdybXNyKE1TUl9UTVRBX0xSVElfUkVBRE9VVCwgbXNyX2hpLCBtc3JfaGkpOworCQlyZG1zcihNU1JfVE1UQV9MUlRJX1ZPTFRfTUhaLCBtc3JfbG8sIG1zcl9oaSk7CisJCSpsb3dfZnJlcSA9IG1zcl9sbyAqIDEwMDA7IC8qIHRvIGtIeiAqLworCisJCS8qIG1heGltdW0gKi8KKwkJd3Jtc3IoTVNSX1RNVEFfTFJUSV9SRUFET1VULCAwLCBtc3JfaGkpOworCQlyZG1zcihNU1JfVE1UQV9MUlRJX1ZPTFRfTUhaLCBtc3JfbG8sIG1zcl9oaSk7CisJCSpoaWdoX2ZyZXEgPSBtc3JfbG8gKiAxMDAwOyAvKiB0byBrSHogKi8KKworCQlkcHJpbnRrKCJsb25ncnVuIHRhYmxlIGludGVyZmFjZSB0b2xkICV1IC0gJXUga0h6XG4iLCAqbG93X2ZyZXEsICpoaWdoX2ZyZXEpOworCisJCWlmICgqbG93X2ZyZXEgPiAqaGlnaF9mcmVxKQorCQkJKmxvd19mcmVxID0gKmhpZ2hfZnJlcTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc2V0IHRoZSB1cHBlciBib3JkZXIgdG8gdGhlIHZhbHVlIGRldGVybWluZWQgZHVyaW5nIFRTQyBpbml0ICovCisJKmhpZ2hfZnJlcSA9IChjcHVfa2h6IC8gMTAwMCk7CisJKmhpZ2hfZnJlcSA9ICpoaWdoX2ZyZXEgKiAxMDAwOworCWRwcmludGsoImhpZ2ggZnJlcXVlbmN5IGlzICV1IGtIelxuIiwgKmhpZ2hfZnJlcSk7CisKKwkvKiBnZXQgY3VycmVudCBib3JkZXJzICovCisJcmRtc3IoTVNSX1RNVEFfTE9OR1JVTl9DVFJMLCBtc3JfbG8sIG1zcl9oaSk7CisJc2F2ZV9sbyA9IG1zcl9sbyAmIDB4MDAwMDAwN0Y7CisJc2F2ZV9oaSA9IG1zcl9oaSAmIDB4MDAwMDAwN0Y7CisKKwkvKiBpZiBjdXJyZW50IHBlcmZfcGN0ZyBpcyBsYXJnZXIgdGhhbiA5MCUsIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlCisJICogdXBwZXIgbGltaXQgdG8gbWFrZSB0aGUgY2FsY3VsYXRpb24gbW9yZSBhY2N1cmF0ZS4KKwkgKi8KKwljcHVpZCgweDgwODYwMDA3LCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwkvKiB0cnkgZGVjcmVhc2luZyBpbiAxMCUgc3RlcHMsIHNvbWUgcHJvY2Vzc29ycyByZWFjdCBvbmx5CisJICogb24gc29tZSBiYXJyaWVyIHZhbHVlcyAqLworCWZvciAodHJ5X2hpID0gODA7IHRyeV9oaSA+IDAgJiYgZWN4ID4gOTA7IHRyeV9oaSAtPTEwKSB7CisJCS8qIHNldCB0byAwIHRvIHRyeV9oaSBwZXJmX3BjdGcgKi8KKwkJbXNyX2xvICY9IDB4RkZGRkZGODA7CisJCW1zcl9oaSAmPSAweEZGRkZGRjgwOworCQltc3JfbG8gfD0gMDsKKwkJbXNyX2hpIHw9IHRyeV9oaTsKKwkJd3Jtc3IoTVNSX1RNVEFfTE9OR1JVTl9DVFJMLCBtc3JfbG8sIG1zcl9oaSk7CisKKwkJLyogcmVhZCBvdXQgY3VycmVudCBjb3JlIE1IeiBhbmQgY3VycmVudCBwZXJmX3BjdGcgKi8KKwkJY3B1aWQoMHg4MDg2MDAwNywgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisKKwkJLyogcmVzdG9yZSB2YWx1ZXMgKi8KKwkJd3Jtc3IoTVNSX1RNVEFfTE9OR1JVTl9DVFJMLCBzYXZlX2xvLCBzYXZlX2hpKTsKKwl9CisJZHByaW50aygicGVyY2VudGFnZSBpcyAldSAlJSwgZnJlcSBpcyAldSBNSHpcbiIsIGVjeCwgZWF4KTsKKworCS8qIHBlcmZvcm1hbmNlX3BjdGcgPSAoY3VycmVudF9mcmVxIC0gbG93X2ZyZXEpLyhoaWdoX2ZyZXEgLSBsb3dfZnJlcSkKKwkgKiBlcWFscworCSAqIGxvd19mcmVxICogKCAxIC0gcGVyZl9wY3RnKSA9IChjdXJfZnJlcSAtIGhpZ2hfZnJlcSAqIHBlcmZfcGN0ZykKKwkgKgorCSAqIGhpZ2hfZnJlcSAqIHBlcmZfcGN0ZyBpcyBzdG9yZWQgdGVtcG9hcmlseSBpbnRvICJlYngiLgorCSAqLworCWVieCA9ICgoKGNwdV9raHogLyAxMDAwKSAqIGVjeCkgLyAxMDApOyAvKiB0byBNSHogKi8KKworCWlmICgoZWN4ID4gOTUpIHx8IChlY3ggPT0gMCkgfHwgKGVheCA8IGVieCkpCisJCXJldHVybiAtRUlPOworCisJZWR4ID0gKGVheCAtIGVieCkgLyAoMTAwIC0gZWN4KTsKKwkqbG93X2ZyZXEgPSBlZHggKiAxMDAwOyAvKiBiYWNrIHRvIGtIeiAqLworCisJZHByaW50aygibG93IGZyZXF1ZW5jeSBpcyAldSBrSHpcbiIsICpsb3dfZnJlcSk7CisKKwlpZiAoKmxvd19mcmVxID4gKmhpZ2hfZnJlcSkKKwkJKmxvd19mcmVxID0gKmhpZ2hfZnJlcTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGxvbmdydW5fY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwkvKiBjYXBhYmlsaXR5IGNoZWNrICovCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogZGV0ZWN0IGxvdyBhbmQgaGlnaCBmcmVxdWVuY3kgKi8KKwlyZXN1bHQgPSBsb25ncnVuX2RldGVybWluZV9mcmVxcygmbG9uZ3J1bl9sb3dfZnJlcSwgJmxvbmdydW5faGlnaF9mcmVxKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCisJcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxID0gbG9uZ3J1bl9sb3dfZnJlcTsKKwlwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEgPSBsb25ncnVuX2hpZ2hfZnJlcTsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCWxvbmdydW5fZ2V0X3BvbGljeShwb2xpY3kpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBsb25ncnVuX2RyaXZlciA9IHsKKwkuZmxhZ3MJCT0gQ1BVRlJFUV9DT05TVF9MT09QUywKKwkudmVyaWZ5CQk9IGxvbmdydW5fdmVyaWZ5X3BvbGljeSwKKwkuc2V0cG9saWN5CT0gbG9uZ3J1bl9zZXRfcG9saWN5LAorCS5nZXQJCT0gbG9uZ3J1bl9nZXQsCisJLmluaXQJCT0gbG9uZ3J1bl9jcHVfaW5pdCwKKwkubmFtZQkJPSAibG9uZ3J1biIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworCisvKioKKyAqIGxvbmdydW5faW5pdCAtIGluaXRpYWxpemVzIHRoZSBUcmFuc21ldGEgQ3J1c29lIExvbmdSdW4gQ1BVRnJlcSBkcml2ZXIKKyAqCisgKiBJbml0aWFsaXplcyB0aGUgTG9uZ1J1biBzdXBwb3J0LgorICovCitzdGF0aWMgaW50IF9faW5pdCBsb25ncnVuX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKKworCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfVFJBTlNNRVRBIHx8CisJICAgICFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0xPTkdSVU4pKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmbG9uZ3J1bl9kcml2ZXIpOworfQorCisKKy8qKgorICogbG9uZ3J1bl9leGl0IC0gdW5yZWdpc3RlcnMgTG9uZ1J1biBzdXBwb3J0CisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBsb25ncnVuX2V4aXQodm9pZCkKK3sKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZsb25ncnVuX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUiAoIkRvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIkxvbmdSdW4gZHJpdmVyIGZvciBUcmFuc21ldGEgQ3J1c29lIGFuZCBFZmZpY2VvbiBwcm9jZXNzb3JzLiIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbW9kdWxlX2luaXQobG9uZ3J1bl9pbml0KTsKK21vZHVsZV9leGl0KGxvbmdydW5fZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2MjJkNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcDQtY2xvY2ttb2QuYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqCVBlbnRpdW0gNC9YZW9uIENQVSBvbiBkZW1hbmQgY2xvY2sgbW9kdWxhdGlvbi9zcGVlZCBzY2FsaW5nCisgKgkoQykgMjAwMiAtIDIwMDMgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgorICoJKEMpIDIwMDIgWndhbmUgTXdhaWthbWJvIDx6d2FuZUBjb21tZmlyZXNlcnZpY2VzLmNvbT4KKyAqCShDKSAyMDAyIEFyamFuIHZhbiBkZSBWZW4gPGFyamFudkByZWRoYXQuY29tPgorICoJKEMpIDIwMDIgVG9yYSBULiBFbmdzdGFkCisgKglBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoZSBhdXRob3Iocykgb2YgdGhpcyBzb2Z0d2FyZSBzaGFsbCBub3QgYmUgaGVsZCBsaWFibGUgZm9yIGRhbWFnZXMKKyAqICAgICAgb2YgYW55IG5hdHVyZSByZXN1bHRpbmcgZHVlIHRvIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcworICogICAgICBzb2Z0d2FyZSBpcyBwcm92aWRlZCBBUy1JUyB3aXRoIG5vIHdhcnJhbnRpZXMuCisgKgkKKyAqCURhdGUJCUVycmF0YQkJCURlc2NyaXB0aW9uCisgKgkyMDAyMDUyNQlONDQsIE8xNwkxMi41JSBvciAyNSUgREMgY2F1c2VzIGxvY2t1cAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gCisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorCisjaW5jbHVkZSAic3BlZWRzdGVwLWxpYi5oIgorCisjZGVmaW5lIFBGWAkicDQtY2xvY2ttb2Q6ICIKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAicDQtY2xvY2ttb2QiLCBtc2cpCisKKy8qCisgKiBEdXR5IEN5Y2xlICgzYml0cyksIG5vdGUgRENfRElTQUJMRSBpcyBub3Qgc3BlY2lmaWVkIGluCisgKiBpbnRlbCBkb2NzIGkganVzdCB1c2UgaXQgdG8gbWVhbiBkaXNhYmxlCisgKi8KK2VudW0geworCURDX1JFU1YsIERDX0RGTFQsIERDXzI1UFQsIERDXzM4UFQsIERDXzUwUFQsCisJRENfNjRQVCwgRENfNzVQVCwgRENfODhQVCwgRENfRElTQUJMRQorfTsKKworI2RlZmluZSBEQ19FTlRSSUVTCTgKKworCitzdGF0aWMgaW50IGhhc19ONDRfTzE3X2VycmF0YVtOUl9DUFVTXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RvY2tfZnJlcTsKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgcDRjbG9ja21vZF9kcml2ZXI7CitzdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfcDRfZ2V0KHVuc2lnbmVkIGludCBjcHUpOworCitzdGF0aWMgaW50IGNwdWZyZXFfcDRfc2V0ZGModW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IG5ld3N0YXRlKQoreworCXUzMiBsLCBoOworCisJaWYgKCFjcHVfb25saW5lKGNwdSkgfHwgKG5ld3N0YXRlID4gRENfRElTQUJMRSkgfHwgKG5ld3N0YXRlID09IERDX1JFU1YpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJkbXNyKE1TUl9JQTMyX1RIRVJNX1NUQVRVUywgbCwgaCk7CisKKwlpZiAobCAmIDB4MDEpCisJCWRwcmludGsoIkNQVSMlZCBjdXJyZW50bHkgdGhlcm1hbCB0aHJvdHRsZWRcbiIsIGNwdSk7CisKKwlpZiAoaGFzX040NF9PMTdfZXJyYXRhW2NwdV0gJiYgKG5ld3N0YXRlID09IERDXzI1UFQgfHwgbmV3c3RhdGUgPT0gRENfREZMVCkpCisJCW5ld3N0YXRlID0gRENfMzhQVDsKKworCXJkbXNyKE1TUl9JQTMyX1RIRVJNX0NPTlRST0wsIGwsIGgpOworCWlmIChuZXdzdGF0ZSA9PSBEQ19ESVNBQkxFKSB7CisJCWRwcmludGsoIkNQVSMlZCBkaXNhYmxpbmcgbW9kdWxhdGlvblxuIiwgY3B1KTsKKwkJd3Jtc3IoTVNSX0lBMzJfVEhFUk1fQ09OVFJPTCwgbCAmIH4oMTw8NCksIGgpOworCX0gZWxzZSB7CisJCWRwcmludGsoIkNQVSMlZCBzZXR0aW5nIGR1dHkgY3ljbGUgdG8gJWQlJVxuIiwKKwkJCWNwdSwgKCgxMjUgKiBuZXdzdGF0ZSkgLyAxMCkpOworCQkvKiBiaXRzIDYzIC0gNQk6IHJlc2VydmVkIAorCQkgKiBiaXQgIDQJOiBlbmFibGUvZGlzYWJsZQorCQkgKiBiaXRzIDMtMQk6IGR1dHkgY3ljbGUKKwkJICogYml0ICAwCTogcmVzZXJ2ZWQKKwkJICovCisJCWwgPSAobCAmIH4xNCk7CisJCWwgPSBsIHwgKDE8PDQpIHwgKChuZXdzdGF0ZSAmIDB4Nyk8PDEpOworCQl3cm1zcihNU1JfSUEzMl9USEVSTV9DT05UUk9MLCBsLCBoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIHA0Y2xvY2ttb2RfdGFibGVbXSA9IHsKKwl7RENfUkVTViwgQ1BVRlJFUV9FTlRSWV9JTlZBTElEfSwKKwl7RENfREZMVCwgMH0sCisJe0RDXzI1UFQsIDB9LAorCXtEQ18zOFBULCAwfSwKKwl7RENfNTBQVCwgMH0sCisJe0RDXzY0UFQsIDB9LAorCXtEQ183NVBULCAwfSwKKwl7RENfODhQVCwgMH0sCisJe0RDX0RJU0FCTEUsIDB9LAorCXtEQ19SRVNWLCBDUFVGUkVRX1RBQkxFX0VORH0sCit9OworCisKK3N0YXRpYyBpbnQgY3B1ZnJlcV9wNF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGludCAgICBuZXdzdGF0ZSA9IERDX1JFU1Y7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJY3B1bWFza190IGNwdXNfYWxsb3dlZDsKKwlpbnQgaTsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmcDRjbG9ja21vZF90YWJsZVswXSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZyZXFzLm9sZCA9IGNwdWZyZXFfcDRfZ2V0KHBvbGljeS0+Y3B1KTsKKwlmcmVxcy5uZXcgPSBzdG9ja19mcmVxICogcDRjbG9ja21vZF90YWJsZVtuZXdzdGF0ZV0uaW5kZXggLyA4OworCisJaWYgKGZyZXFzLm5ldyA9PSBmcmVxcy5vbGQpCisJCXJldHVybiAwOworCisJLyogbm90aWZpZXJzICovCisJZm9yX2VhY2hfY3B1X21hc2soaSwgcG9saWN5LT5jcHVzKSB7CisJCWZyZXFzLmNwdSA9IGk7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisJfQorCisJLyogcnVuIG9uIGVhY2ggbG9naWNhbCBDUFUsIHNlZSBzZWN0aW9uIDEzLjE1LjMgb2YgSUEzMiBJbnRlbCBBcmNoaXRlY3R1cmUgU29mdHdhcmUKKwkgKiBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzIAorCSAqLworCWNwdXNfYWxsb3dlZCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGksIHBvbGljeS0+Y3B1cykgeworCQljcHVtYXNrX3QgdGhpc19jcHUgPSBjcHVtYXNrX29mX2NwdShpKTsKKworCQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHRoaXNfY3B1KTsKKwkJQlVHX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBpKTsKKworCQljcHVmcmVxX3A0X3NldGRjKGksIHA0Y2xvY2ttb2RfdGFibGVbbmV3c3RhdGVdLmluZGV4KTsKKwl9CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVzX2FsbG93ZWQpOworCisJLyogbm90aWZpZXJzICovCisJZm9yX2VhY2hfY3B1X21hc2soaSwgcG9saWN5LT5jcHVzKSB7CisJCWZyZXFzLmNwdSA9IGk7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY3B1ZnJlcV9wNF92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZwNGNsb2NrbW9kX3RhYmxlWzBdKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfcDRfZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJaWYgKChjLT54ODYgPT0gMHgwNikgJiYgKGMtPng4Nl9tb2RlbCA9PSAweDA5KSkgeworCQkvKiBQZW50aXVtIE0gKEJhbmlhcykgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIldhcm5pbmc6IFBlbnRpdW0gTSBkZXRlY3RlZC4gIgorCQkgICAgICAgIlRoZSBzcGVlZHN0ZXBfY2VudHJpbm8gbW9kdWxlIG9mZmVycyB2b2x0YWdlIHNjYWxpbmciCisJCSAgICAgICAiIGluIGFkZGl0aW9uIG9mIGZyZXF1ZW5jeSBzY2FsaW5nLiBZb3Ugc2hvdWxkIHVzZSAiCisJCSAgICAgICAidGhhdCBpbnN0ZWFkIG9mIHA0LWNsb2NrbW9kLCBpZiBwb3NzaWJsZS5cbiIpOworCQlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KFNQRUVEU1RFUF9QUk9DRVNTT1JfUE0pOworCX0KKworCWlmICgoYy0+eDg2ID09IDB4MDYpICYmIChjLT54ODZfbW9kZWwgPT0gMHgwRCkpIHsKKwkJLyogUGVudGl1bSBNIChEb3RoYW4pICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJXYXJuaW5nOiBQZW50aXVtIE0gZGV0ZWN0ZWQuICIKKwkJICAgICAgICJUaGUgc3BlZWRzdGVwX2NlbnRyaW5vIG1vZHVsZSBvZmZlcnMgdm9sdGFnZSBzY2FsaW5nIgorCQkgICAgICAgIiBpbiBhZGRpdGlvbiBvZiBmcmVxdWVuY3kgc2NhbGluZy4gWW91IHNob3VsZCB1c2UgIgorCQkgICAgICAgInRoYXQgaW5zdGVhZCBvZiBwNC1jbG9ja21vZCwgaWYgcG9zc2libGUuXG4iKTsKKwkJLyogb24gUC00cywgdGhlIFRTQyBydW5zIHdpdGggY29uc3RhbnQgZnJlcXVlbmN5IGluZGVwZW5kZW50IHdoZXRoZXIKKwkJICogdGhyb3R0bGluZyBpcyBhY3RpdmUgb3Igbm90LiAqLworCQlwNGNsb2NrbW9kX2RyaXZlci5mbGFncyB8PSBDUFVGUkVRX0NPTlNUX0xPT1BTOworCQlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KFNQRUVEU1RFUF9QUk9DRVNTT1JfUE0pOworCX0KKworCWlmIChjLT54ODYgIT0gMHhGKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmtub3duIHA0LWNsb2NrbW9kLWNhcGFibGUgQ1BVLiBQbGVhc2Ugc2VuZCBhbiBlLW1haWwgdG8gPGxpbnV4QGJyb2RvLmRlPlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIG9uIFAtNHMsIHRoZSBUU0MgcnVucyB3aXRoIGNvbnN0YW50IGZyZXF1ZW5jeSBpbmRlcGVuZGVudCB3aGV0aGVyCisJICogdGhyb3R0bGluZyBpcyBhY3RpdmUgb3Igbm90LiAqLworCXA0Y2xvY2ttb2RfZHJpdmVyLmZsYWdzIHw9IENQVUZSRVFfQ09OU1RfTE9PUFM7CisKKwlpZiAoc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IoKSA9PSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0TSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiV2FybmluZzogUGVudGl1bSA0LU0gZGV0ZWN0ZWQuICIKKwkJICAgICAgICJUaGUgc3BlZWRzdGVwLWljaCBvciBhY3BpIGNwdWZyZXEgbW9kdWxlcyBvZmZlciAiCisJCSAgICAgICAidm9sdGFnZSBzY2FsaW5nIGluIGFkZGl0aW9uIG9mIGZyZXF1ZW5jeSBzY2FsaW5nLiAiCisJCSAgICAgICAiWW91IHNob3VsZCB1c2UgZWl0aGVyIG9uZSBpbnN0ZWFkIG9mIHA0LWNsb2NrbW9kLCAiCisJCSAgICAgICAiaWYgcG9zc2libGUuXG4iKTsKKwkJcmV0dXJuIHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShTUEVFRFNURVBfUFJPQ0VTU09SX1A0TSk7CisJfQorCisJcmV0dXJuIHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShTUEVFRFNURVBfUFJPQ0VTU09SX1A0RCk7Cit9CisKKyAKKworc3RhdGljIGludCBjcHVmcmVxX3A0X2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YVtwb2xpY3ktPmNwdV07CisJaW50IGNwdWlkID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworI2lmZGVmIENPTkZJR19TTVAKKwlwb2xpY3ktPmNwdXMgPSBjcHVfc2libGluZ19tYXBbcG9saWN5LT5jcHVdOworI2VuZGlmCisKKwkvKiBFcnJhdGEgd29ya2Fyb3VuZCAqLworCWNwdWlkID0gKGMtPng4NiA8PCA4KSB8IChjLT54ODZfbW9kZWwgPDwgNCkgfCBjLT54ODZfbWFzazsKKwlzd2l0Y2ggKGNwdWlkKSB7CisJY2FzZSAweDBmMDc6CisJY2FzZSAweDBmMGE6CisJY2FzZSAweDBmMTE6CisJY2FzZSAweDBmMTI6CisJCWhhc19ONDRfTzE3X2VycmF0YVtwb2xpY3ktPmNwdV0gPSAxOworCQlkcHJpbnRrKCJoYXMgZXJyYXRhIC0tIGRpc2FibGluZyBsb3cgZnJlcXVlbmNpZXNcbiIpOworCX0KKwkKKwkvKiBnZXQgbWF4IGZyZXF1ZW5jeSAqLworCXN0b2NrX2ZyZXEgPSBjcHVmcmVxX3A0X2dldF9mcmVxdWVuY3koYyk7CisJaWYgKCFzdG9ja19mcmVxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHRhYmxlIGluaXQgKi8KKwlmb3IgKGk9MTsgKHA0Y2xvY2ttb2RfdGFibGVbaV0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EKTsgaSsrKSB7CisJCWlmICgoaTwyKSAmJiAoaGFzX040NF9PMTdfZXJyYXRhW3BvbGljeS0+Y3B1XSkpCisJCQlwNGNsb2NrbW9kX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKKwkJZWxzZQorCQkJcDRjbG9ja21vZF90YWJsZVtpXS5mcmVxdWVuY3kgPSAoc3RvY2tfZnJlcSAqIGkpLzg7CisJfQorCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKHA0Y2xvY2ttb2RfdGFibGUsIHBvbGljeS0+Y3B1KTsKKwkKKwkvKiBjcHVpbmZvIGFuZCBkZWZhdWx0IHBvbGljeSB2YWx1ZXMgKi8KKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSAxMDAwMDAwOyAvKiBhc3N1bWVkICovCisJcG9saWN5LT5jdXIgPSBzdG9ja19mcmVxOworCisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCAmcDRjbG9ja21vZF90YWJsZVswXSk7Cit9CisKKworc3RhdGljIGludCBjcHVmcmVxX3A0X2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsgICAgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV9wNF9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwljcHVtYXNrX3QgY3B1c19hbGxvd2VkOworCXUzMiBsLCBoOworCisJY3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKKwlCVUdfT04oc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSk7CisKKwlyZG1zcihNU1JfSUEzMl9USEVSTV9DT05UUk9MLCBsLCBoKTsKKworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1c19hbGxvd2VkKTsKKworCWlmIChsICYgMHgxMCkgeworCQlsID0gbCA+PiAxOworCQlsICY9IDB4NzsKKwl9IGVsc2UKKwkJbCA9IERDX0RJU0FCTEU7CisKKwlpZiAobCAhPSBEQ19ESVNBQkxFKQorCQlyZXR1cm4gKHN0b2NrX2ZyZXEgKiBsIC8gOCk7CisKKwlyZXR1cm4gc3RvY2tfZnJlcTsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIHA0Y2xvY2ttb2RfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBwNGNsb2NrbW9kX2RyaXZlciA9IHsKKwkudmVyaWZ5IAk9IGNwdWZyZXFfcDRfdmVyaWZ5LAorCS50YXJnZXQJCT0gY3B1ZnJlcV9wNF90YXJnZXQsCisJLmluaXQJCT0gY3B1ZnJlcV9wNF9jcHVfaW5pdCwKKwkuZXhpdAkJPSBjcHVmcmVxX3A0X2NwdV9leGl0LAorCS5nZXQJCT0gY3B1ZnJlcV9wNF9nZXQsCisJLm5hbWUJCT0gInA0LWNsb2NrbW9kIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJCT0gcDRjbG9ja21vZF9hdHRyLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3A0X2luaXQodm9pZCkKK3sJCisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGE7CisJaW50IHJldDsKKworCS8qCisJICogVEhFUk1fQ09OVFJPTCBpcyBhcmNoaXRlY3R1cmFsIGZvciBJQTMyIG5vdywgc28gCisJICogd2UgY2FuIHJlbHkgb24gdGhlIGNhcGFiaWxpdHkgY2hlY2tzCisJICovCisJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXRlc3RfYml0KFg4Nl9GRUFUVVJFX0FDUEksIGMtPng4Nl9jYXBhYmlsaXR5KSB8fAorCQkhdGVzdF9iaXQoWDg2X0ZFQVRVUkVfQUNDLCBjLT54ODZfY2FwYWJpbGl0eSkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnA0Y2xvY2ttb2RfZHJpdmVyKTsKKwlpZiAoIXJldCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlA0L1hlb24oVE0pIENQVSBPbi1EZW1hbmQgQ2xvY2sgTW9kdWxhdGlvbiBhdmFpbGFibGVcbiIpOworCisJcmV0dXJuIChyZXQpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcHVmcmVxX3A0X2V4aXQodm9pZCkKK3sKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZwNGNsb2NrbW9kX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUiAoIlp3YW5lIE13YWlrYW1ibyA8endhbmVAY29tbWZpcmVzZXJ2aWNlcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJjcHVmcmVxIGRyaXZlciBmb3IgUGVudGl1bShUTSkgNC9YZW9uKFRNKSIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbGF0ZV9pbml0Y2FsbChjcHVmcmVxX3A0X2luaXQpOworbW9kdWxlX2V4aXQoY3B1ZnJlcV9wNF9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjJmOGNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNi5jCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogIFRoaXMgZmlsZSB3YXMgYmFzZWQgdXBvbiBjb2RlIGluIFBvd2VydHdlYWsgTGludXggKGh0dHA6Ly9wb3dlcnR3ZWFrLnNmLm5ldCkKKyAqICAoQykgMjAwMC0yMDAzICBEYXZlIEpvbmVzLCBBcmphbiB2YW4gZGUgVmVuLCBKYW5uZSBQ5G5r5GzkLCBEb21pbmlrIEJyb2Rvd3NraS4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisKKyNkZWZpbmUgUE9XRVJOT1dfSU9QT1JUIDB4ZmZmMCAgICAgICAgIC8qIGl0IGRvZXNuJ3QgbWF0dGVyIHdoZXJlLCBhcyBsb25nCisJCQkJCSAgYXMgaXQgaXMgdW51c2VkICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICBidXNmcmVxOyAgIC8qIEZTQiwgaW4gMTAga0h6ICovCitzdGF0aWMgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgbWF4X211bHRpcGxpZXI7CisKKworLyogQ2xvY2sgcmF0aW8gbXVsdGlwbGllZCBieSAxMCAtIHNlZSB0YWJsZSAyNyBpbiBBTUQjMjM0NDYgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgY2xvY2tfcmF0aW9bXSA9IHsKKwl7NDUsICAvKiAwMDAgLT4gNC41eCAqLyAwfSwKKwl7NTAsICAvKiAwMDEgLT4gNS4weCAqLyAwfSwKKwl7NDAsICAvKiAwMTAgLT4gNC4weCAqLyAwfSwKKwl7NTUsICAvKiAwMTEgLT4gNS41eCAqLyAwfSwKKwl7MjAsICAvKiAxMDAgLT4gMi4weCAqLyAwfSwKKwl7MzAsICAvKiAxMDEgLT4gMy4weCAqLyAwfSwKKwl7NjAsICAvKiAxMTAgLT4gNi4weCAqLyAwfSwKKwl7MzUsICAvKiAxMTEgLT4gMy41eCAqLyAwfSwKKwl7MCwgQ1BVRlJFUV9UQUJMRV9FTkR9Cit9OworCisKKy8qKgorICogcG93ZXJub3dfazZfZ2V0X2NwdV9tdWx0aXBsaWVyIC0gcmV0dXJucyB0aGUgY3VycmVudCBGU0IgbXVsdGlwbGllcgorICoKKyAqICAgUmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5nIG9mIHRoZSBmcmVxdWVuY3kgbXVsdGlwbGllci4gQ29yZSBjbG9jaworICogc3BlZWQgaXMgZnJlcXVlbmN5IG9mIHRoZSBGcm9udC1TaWRlIEJ1cyBtdWx0aXBsaWVkIHdpdGggdGhpcyB2YWx1ZS4KKyAqLworc3RhdGljIGludCBwb3dlcm5vd19rNl9nZXRfY3B1X211bHRpcGxpZXIodm9pZCkKK3sKKwl1NjQgICAgICAgICAgICAgaW52YWx1ZSA9IDA7CisJdTMyICAgICAgICAgICAgIG1zcnZhbDsKKwkKKwltc3J2YWwgPSBQT1dFUk5PV19JT1BPUlQgKyAweDE7CisJd3Jtc3IoTVNSX0s2X0VQTVIsIG1zcnZhbCwgMCk7IC8qIGVuYWJsZSB0aGUgUG93ZXJOb3cgcG9ydCAqLworCWludmFsdWU9aW5sKFBPV0VSTk9XX0lPUE9SVCArIDB4OCk7CisJbXNydmFsID0gUE9XRVJOT1dfSU9QT1JUICsgMHgwOworCXdybXNyKE1TUl9LNl9FUE1SLCBtc3J2YWwsIDApOyAvKiBkaXNhYmxlIGl0IGFnYWluICovCisKKwlyZXR1cm4gY2xvY2tfcmF0aW9bKGludmFsdWUgPj4gNSkmN10uaW5kZXg7Cit9CisKKworLyoqCisgKiBwb3dlcm5vd19rNl9zZXRfc3RhdGUgLSBzZXQgdGhlIFBvd2VyTm93ISBtdWx0aXBsaWVyCisgKiBAYmVzdF9pOiBjbG9ja19yYXRpb1tiZXN0X2ldIGlzIHRoZSB0YXJnZXQgbXVsdGlwbGllcgorICoKKyAqICAgVHJpZXMgdG8gY2hhbmdlIHRoZSBQb3dlck5vdyEgbXVsdGlwbGllcgorICovCitzdGF0aWMgdm9pZCBwb3dlcm5vd19rNl9zZXRfc3RhdGUgKHVuc2lnbmVkIGludCBiZXN0X2kpCit7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgb3V0dmFsdWU9MCwgaW52YWx1ZT0wOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIG1zcnZhbDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAgICBmcmVxczsKKworCWlmIChjbG9ja19yYXRpb1tiZXN0X2ldLmluZGV4ID4gbWF4X211bHRpcGxpZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBpbnZhbGlkIHRhcmdldCBmcmVxdWVuY3lcbiIpOworCQlyZXR1cm47CisJfQorCisJZnJlcXMub2xkID0gYnVzZnJlcSAqIHBvd2Vybm93X2s2X2dldF9jcHVfbXVsdGlwbGllcigpOworCWZyZXFzLm5ldyA9IGJ1c2ZyZXEgKiBjbG9ja19yYXRpb1tiZXN0X2ldLmluZGV4OworCWZyZXFzLmNwdSA9IDA7IC8qIHBvd2Vybm93LWs2LmMgaXMgVVAgb25seSBkcml2ZXIgKi8KKwkKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJLyogd2Ugbm93IG5lZWQgdG8gdHJhbnNmb3JtIGJlc3RfaSB0byB0aGUgQlZDIGZvcm1hdCwgc2VlIEFNRCMyMzQ0NiAqLworCisJb3V0dmFsdWUgPSAoMTw8MTIpIHwgKDE8PDEwKSB8ICgxPDw5KSB8IChiZXN0X2k8PDUpOworCisJbXNydmFsID0gUE9XRVJOT1dfSU9QT1JUICsgMHgxOworCXdybXNyKE1TUl9LNl9FUE1SLCBtc3J2YWwsIDApOyAvKiBlbmFibGUgdGhlIFBvd2VyTm93IHBvcnQgKi8KKwlpbnZhbHVlPWlubChQT1dFUk5PV19JT1BPUlQgKyAweDgpOworCWludmFsdWUgPSBpbnZhbHVlICYgMHhmOworCW91dHZhbHVlID0gb3V0dmFsdWUgfCBpbnZhbHVlOworCW91dGwob3V0dmFsdWUgLChQT1dFUk5PV19JT1BPUlQgKyAweDgpKTsKKwltc3J2YWwgPSBQT1dFUk5PV19JT1BPUlQgKyAweDA7CisJd3Jtc3IoTVNSX0s2X0VQTVIsIG1zcnZhbCwgMCk7IC8qIGRpc2FibGUgaXQgYWdhaW4gKi8KKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuOworfQorCisKKy8qKgorICogcG93ZXJub3dfazZfdmVyaWZ5IC0gdmVyaWZpZXMgYSBuZXcgQ1BVZnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqCisgKiBQb2xpY3kgbXVzdCBiZSB3aXRoaW4gbG93ZXN0IGFuZCBoaWdoZXN0IHBvc3NpYmxlIENQVSBGcmVxdWVuY3ksCisgKiBhbmQgYXQgbGVhc3Qgb25lIHBvc3NpYmxlIHN0YXRlIG11c3QgYmUgd2l0aGluIG1pbiBhbmQgbWF4LgorICovCitzdGF0aWMgaW50IHBvd2Vybm93X2s2X3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgJmNsb2NrX3JhdGlvWzBdKTsKK30KKworCisvKioKKyAqIHBvd2Vybm93X2s2X3NldHBvbGljeSAtIHNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqIEB0YXJnZXRfZnJlcTogdGhlIHRhcmdldCBmcmVxdWVuY3kKKyAqIEByZWxhdGlvbjogaG93IHRoYXQgZnJlcXVlbmN5IHJlbGF0ZXMgdG8gYWNoaWV2ZWQgZnJlcXVlbmN5IChDUFVGUkVRX1JFTEFUSU9OX0wgb3IgQ1BVRlJFUV9SRUxBVElPTl9IKQorICoKKyAqIHNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqLworc3RhdGljIGludCBwb3dlcm5vd19rNl90YXJnZXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50ICAgIG5ld3N0YXRlID0gMDsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmY2xvY2tfcmF0aW9bMF0sIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwb3dlcm5vd19rNl9zZXRfc3RhdGUobmV3c3RhdGUpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwb3dlcm5vd19rNl9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmVzdWx0OworCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogZ2V0IGZyZXF1ZW5jaWVzICovCisJbWF4X211bHRpcGxpZXIgPSBwb3dlcm5vd19rNl9nZXRfY3B1X211bHRpcGxpZXIoKTsKKwlidXNmcmVxID0gY3B1X2toeiAvIG1heF9tdWx0aXBsaWVyOworCisJLyogdGFibGUgaW5pdCAqLworIAlmb3IgKGk9MDsgKGNsb2NrX3JhdGlvW2ldLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCk7IGkrKykgeworCQlpZiAoY2xvY2tfcmF0aW9baV0uaW5kZXggPiBtYXhfbXVsdGlwbGllcikKKwkJCWNsb2NrX3JhdGlvW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKKwkJZWxzZQorCQkJY2xvY2tfcmF0aW9baV0uZnJlcXVlbmN5ID0gYnVzZnJlcSAqIGNsb2NrX3JhdGlvW2ldLmluZGV4OworCX0KKworCS8qIGNwdWluZm8gYW5kIGRlZmF1bHQgcG9saWN5IHZhbHVlcyAqLworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IENQVUZSRVFfRVRFUk5BTDsKKwlwb2xpY3ktPmN1ciA9IGJ1c2ZyZXEgKiBtYXhfbXVsdGlwbGllcjsKKworCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBjbG9ja19yYXRpbyk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIChyZXN1bHQpOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoY2xvY2tfcmF0aW8sIHBvbGljeS0+Y3B1KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcG93ZXJub3dfazZfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpPTA7IGk8ODsgaSsrKSB7CisJCWlmIChpPT1tYXhfbXVsdGlwbGllcikKKwkJCXBvd2Vybm93X2s2X3NldF9zdGF0ZShpKTsKKwl9CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworIAlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwb3dlcm5vd19rNl9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gYnVzZnJlcSAqIHBvd2Vybm93X2s2X2dldF9jcHVfbXVsdGlwbGllcigpOworfQorCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogcG93ZXJub3dfazZfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBwb3dlcm5vd19rNl9kcml2ZXIgPSB7CisJLnZlcmlmeSAJPSBwb3dlcm5vd19rNl92ZXJpZnksCisJLnRhcmdldCAJPSBwb3dlcm5vd19rNl90YXJnZXQsCisJLmluaXQJCT0gcG93ZXJub3dfazZfY3B1X2luaXQsCisJLmV4aXQJCT0gcG93ZXJub3dfazZfY3B1X2V4aXQsCisJLmdldAkJPSBwb3dlcm5vd19rNl9nZXQsCisJLm5hbWUJCT0gInBvd2Vybm93LWs2IiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJCT0gcG93ZXJub3dfazZfYXR0ciwKK307CisKKworLyoqCisgKiBwb3dlcm5vd19rNl9pbml0IC0gaW5pdGlhbGl6ZXMgdGhlIGs2IFBvd2VyTm93ISBDUFVGcmVxIGRyaXZlcgorICoKKyAqICAgSW5pdGlhbGl6ZXMgdGhlIEs2IFBvd2VyTm93ISBzdXBwb3J0LiBSZXR1cm5zIC1FTk9ERVYgb24gdW5zdXBwb3J0ZWQKKyAqIGRldmljZXMsIC1FSU5WQUwgb3IgLUVOT01FTSBvbiBwcm9ibGVtcyBkdXJpbmcgaW5pdGlhdGl6YXRpb24sIGFuZCB6ZXJvCisgKiBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBwb3dlcm5vd19rNl9pbml0KHZvaWQpCit7CQorCXN0cnVjdCBjcHVpbmZvX3g4NiAgICAgICpjID0gY3B1X2RhdGE7CisKKwlpZiAoKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQpIHx8IChjLT54ODYgIT0gNSkgfHwKKwkJKChjLT54ODZfbW9kZWwgIT0gMTIpICYmIChjLT54ODZfbW9kZWwgIT0gMTMpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKFBPV0VSTk9XX0lPUE9SVCwgMTYsICJQb3dlck5vdyEiKSkgeworCQlwcmludGsoImNwdWZyZXE6IFBvd2VyTm93IElPUE9SVCByZWdpb24gYWxyZWFkeSB1c2VkLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmcG93ZXJub3dfazZfZHJpdmVyKSkgeworCQlyZWxlYXNlX3JlZ2lvbiAoUE9XRVJOT1dfSU9QT1JULCAxNik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qKgorICogcG93ZXJub3dfazZfZXhpdCAtIHVucmVnaXN0ZXJzIEFNRCBLNi0yKy8zKyBQb3dlck5vdyEgc3VwcG9ydAorICoKKyAqICAgVW5yZWdpc3RlcnMgQU1EIEs2LTIrIC8gSzYtMysgUG93ZXJOb3chIHN1cHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBwb3dlcm5vd19rNl9leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmcG93ZXJub3dfazZfZHJpdmVyKTsKKwlyZWxlYXNlX3JlZ2lvbiAoUE9XRVJOT1dfSU9QT1JULCAxNik7Cit9CisKKworTU9EVUxFX0FVVEhPUiAoIkFyamFuIHZhbiBkZSBWZW4gPGFyamFudkByZWRoYXQuY29tPiwgRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+LCBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJQb3dlck5vdyEgZHJpdmVyIGZvciBBTUQgSzYtMisgLyBLNi0zKyBwcm9jZXNzb3JzLiIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbW9kdWxlX2luaXQocG93ZXJub3dfazZfaW5pdCk7Cittb2R1bGVfZXhpdChwb3dlcm5vd19rNl9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTNmNjUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCkBAIC0wLDAgKzEsNjkwIEBACisvKgorICogIEFNRCBLNyBQb3dlcm5vdyBkcml2ZXIuCisgKiAgKEMpIDIwMDMgRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+IG9uIGJlaGFsZiBvZiBTdVNFIExhYnMuCisgKiAgKEMpIDIwMDMtMjAwNCBEYXZlIEpvbmVzIDxkYXZlakByZWRoYXQuY29tPgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKiAgQmFzZWQgdXBvbiBkYXRhc2hlZXRzICYgc2FtcGxlIENQVXMga2luZGx5IHByb3ZpZGVkIGJ5IEFNRC4KKyAqCisgKiBFcnJhdGEgNTogUHJvY2Vzc29yIG1heSBmYWlsIHRvIGV4ZWN1dGUgYSBGSUQvVklEIGNoYW5nZSBpbiBwcmVzZW5jZSBvZiBpbnRlcnJ1cHQuCisgKiAtIFdlIGNsaS9zdGkgb24gc3RlcHBpbmcgQTAgQ1BVcyBhcm91bmQgdGhlIEZJRC9WSUQgdHJhbnNpdGlvbi4KKyAqIEVycmF0YSAxNTogUHJvY2Vzc29ycyB3aXRoIGhhbGYgZnJlcXVlbmN5IG11bHRpcGxpZXJzIG1heSBoYW5nIHVwb24gd2FrZXVwIGZyb20gZGlzY29ubmVjdC4KKyAqIC0gV2UgZGlzYWJsZSBoYWxmIG11bHRpcGxpZXJzIGlmIEFDUEkgaXMgdXNlZCBvbiBBMCBzdGVwcGluZyBDUFVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorCisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzdfQUNQSQorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJwb3dlcm5vdy1rNy5oIgorCisjZGVmaW5lIFBGWCAicG93ZXJub3c6ICIKKworCitzdHJ1Y3QgcHNiX3MgeworCXU4IHNpZ25hdHVyZVsxMF07CisJdTggdGFibGV2ZXJzaW9uOworCXU4IGZsYWdzOworCXUxNiBzZXR0bGluZ3RpbWU7CisJdTggcmVzZXJ2ZWQxOworCXU4IG51bXBzdDsKK307CisKK3N0cnVjdCBwc3RfcyB7CisJdTMyIGNwdWlkOworCXU4IGZzYnNwZWVkOworCXU4IG1heGZpZDsKKwl1OCBzdGFydHZpZDsKKwl1OCBudW1wc3RhdGVzOworfTsKKworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzdfQUNQSQordW5pb24gcG93ZXJub3dfYWNwaV9jb250cm9sX3QgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgZmlkOjUsCisJCXZpZDo1LAorCQlzZ3RjOjIwLAorCQlyZXMxOjI7CisJfSBiaXRzOworCXVuc2lnbmVkIGxvbmcgdmFsOworfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRX0RFQlVHCisvKiBkaXZpZGUgYnkgMTAwMCB0byBnZXQgVkNvcmUgdm9sdGFnZSBpbiBWLiAqLworc3RhdGljIGludCBtb2JpbGVfdmlkX3RhYmxlWzMyXSA9IHsKKyAgICAyMDAwLCAxOTUwLCAxOTAwLCAxODUwLCAxODAwLCAxNzUwLCAxNzAwLCAxNjUwLAorICAgIDE2MDAsIDE1NTAsIDE1MDAsIDE0NTAsIDE0MDAsIDEzNTAsIDEzMDAsIDAsCisgICAgMTI3NSwgMTI1MCwgMTIyNSwgMTIwMCwgMTE3NSwgMTE1MCwgMTEyNSwgMTEwMCwKKyAgICAxMDc1LCAxMDUwLCAxMDI1LCAxMDAwLCA5NzUsIDk1MCwgOTI1LCAwLAorfTsKKyNlbmRpZgorCisvKiBkaXZpZGUgYnkgMTAgdG8gZ2V0IEZJRC4gKi8KK3N0YXRpYyBpbnQgZmlkX2NvZGVzWzMyXSA9IHsKKyAgICAxMTAsIDExNSwgMTIwLCAxMjUsIDUwLCA1NSwgNjAsIDY1LAorICAgIDcwLCA3NSwgODAsIDg1LCA5MCwgOTUsIDEwMCwgMTA1LAorICAgIDMwLCAxOTAsIDQwLCAyMDAsIDEzMCwgMTM1LCAxNDAsIDIxMCwKKyAgICAxNTAsIDIyNSwgMTYwLCAxNjUsIDE3MCwgMTgwLCAtMSwgLTEsCit9OworCisvKiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIGluIG9yZGVyIHRvIGZvcmNlIEFDUEkgaW5zdGVhZCBvZiBsZWdhY3kgbWV0aG9kIGZvcgorICogY29uZmlndXJhdGlvbiBwdXJwb3NlLgorICovCisKK3N0YXRpYyBpbnQgYWNwaV9mb3JjZTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqcG93ZXJub3dfdGFibGU7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FuX3NjYWxlX2J1czsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FuX3NjYWxlX3ZpZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWluaW11bV9zcGVlZD0tMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4aW11bV9zcGVlZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtYmVyX3NjYWxlczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnNiOworc3RhdGljIHVuc2lnbmVkIGludCBsYXRlbmN5Oworc3RhdGljIGNoYXIgaGF2ZV9hMDsKKworI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJwb3dlcm5vdy1rNyIsIG1zZykKKworc3RhdGljIGludCBjaGVja19mc2IodW5zaWduZWQgaW50IGZzYnNwZWVkKQoreworCWludCBkZWx0YTsKKwl1bnNpZ25lZCBpbnQgZiA9IGZzYiAvIDEwMDA7CisKKwlkZWx0YSA9IChmc2JzcGVlZCA+IGYpID8gZnNic3BlZWQgLSBmIDogZiAtIGZzYnNwZWVkOworCXJldHVybiAoZGVsdGEgPCA1KTsKK30KKworc3RhdGljIGludCBjaGVja19wb3dlcm5vdyh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCXVuc2lnbmVkIGludCBtYXhlaSwgZWF4LCBlYngsIGVjeCwgZWR4OworCisJaWYgKChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EKSB8fCAoYy0+eDg2ICE9NikpIHsKKyNpZmRlZiBNT0RVTEUKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJUaGlzIG1vZHVsZSBvbmx5IHdvcmtzIHdpdGggQU1EIEs3IENQVXNcbiIpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCS8qIEdldCBtYXhpbXVtIGNhcGFiaWxpdGllcyAqLworCW1heGVpID0gY3B1aWRfZWF4ICgweDgwMDAwMDAwKTsKKwlpZiAobWF4ZWkgPCAweDgwMDAwMDA3KSB7CS8qIEFueSBwb3dlcm5vdyBpbmZvID8gKi8KKyNpZmRlZiBNT0RVTEUKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJObyBwb3dlcm5vdyBjYXBhYmlsaXRpZXMgZGV0ZWN0ZWRcbiIpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCWlmICgoYy0+eDg2X21vZGVsID09IDYpICYmIChjLT54ODZfbWFzayA9PSAwKSkgeworCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIks3IDY2MFtBMF0gY29yZSBkZXRlY3RlZCwgZW5hYmxpbmcgZXJyYXRhIHdvcmthcm91bmRzXG4iKTsKKwkJaGF2ZV9hMCA9IDE7CisJfQorCisJY3B1aWQoMHg4MDAwMDAwNywgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisKKwkvKiBDaGVjayB3ZSBjYW4gYWN0dWFsbHkgZG8gc29tZXRoaW5nIGJlZm9yZSB3ZSBzYXkgYW55dGhpbmcuKi8KKwlpZiAoIShlZHggJiAoMSA8PCAxIHwgMSA8PCAyKSkpCisJCXJldHVybiAwOworCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJQb3dlck5PVyEgVGVjaG5vbG9neSBwcmVzZW50LiBDYW4gc2NhbGU6ICIpOworCisJaWYgKGVkeCAmIDEgPDwgMSkgeworCQlwcmludGsgKCJmcmVxdWVuY3kiKTsKKwkJY2FuX3NjYWxlX2J1cz0xOworCX0KKworCWlmICgoZWR4ICYgKDEgPDwgMSB8IDEgPDwgMikpID09IDB4NikKKwkJcHJpbnRrICgiIGFuZCAiKTsKKworCWlmIChlZHggJiAxIDw8IDIpIHsKKwkJcHJpbnRrICgidm9sdGFnZSIpOworCQljYW5fc2NhbGVfdmlkPTE7CisJfQorCisJcHJpbnRrICgiLlxuIik7CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBnZXRfcmFuZ2VzICh1bnNpZ25lZCBjaGFyICpwc3QpCit7CisJdW5zaWduZWQgaW50IGo7CisJdW5zaWduZWQgaW50IHNwZWVkOworCXU4IGZpZCwgdmlkOworCisJcG93ZXJub3dfdGFibGUgPSBrbWFsbG9jKChzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqIChudW1iZXJfc2NhbGVzICsgMSkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvd2Vybm93X3RhYmxlKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocG93ZXJub3dfdGFibGUsIDAsIChzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqIChudW1iZXJfc2NhbGVzICsgMSkpKTsKKworCWZvciAoaj0wIDsgaiA8IG51bWJlcl9zY2FsZXM7IGorKykgeworCQlmaWQgPSAqcHN0Kys7CisKKwkJcG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5ID0gKGZzYiAqIGZpZF9jb2Rlc1tmaWRdKSAvIDEwOworCQlwb3dlcm5vd190YWJsZVtqXS5pbmRleCA9IGZpZDsgLyogbG93ZXIgOCBiaXRzICovCisKKwkJc3BlZWQgPSBwb3dlcm5vd190YWJsZVtqXS5mcmVxdWVuY3k7CisKKwkJaWYgKChmaWRfY29kZXNbZmlkXSAlIDEwKT09NSkgeworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzdfQUNQSQorCQkJaWYgKGhhdmVfYTAgPT0gMSkKKwkJCQlwb3dlcm5vd190YWJsZVtqXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisjZW5kaWYKKwkJfQorCisJCWlmIChzcGVlZCA8IG1pbmltdW1fc3BlZWQpCisJCQltaW5pbXVtX3NwZWVkID0gc3BlZWQ7CisJCWlmIChzcGVlZCA+IG1heGltdW1fc3BlZWQpCisJCQltYXhpbXVtX3NwZWVkID0gc3BlZWQ7CisKKwkJdmlkID0gKnBzdCsrOworCQlwb3dlcm5vd190YWJsZVtqXS5pbmRleCB8PSAodmlkIDw8IDgpOyAvKiB1cHBlciA4IGJpdHMgKi8KKworCQlkcHJpbnRrICgiICAgRklEOiAweCV4ICglZC4lZHggWyVkTUh6XSkgICIKKwkJCSAiVklEOiAweCV4ICglZC4lMDNkVilcbiIsIGZpZCwgZmlkX2NvZGVzW2ZpZF0gLyAxMCwgCisJCQkgZmlkX2NvZGVzW2ZpZF0gJSAxMCwgc3BlZWQvMTAwMCwgdmlkLAkKKwkJCSBtb2JpbGVfdmlkX3RhYmxlW3ZpZF0vMTAwMCwKKwkJCSBtb2JpbGVfdmlkX3RhYmxlW3ZpZF0lMTAwMCk7CisJfQorCXBvd2Vybm93X3RhYmxlW251bWJlcl9zY2FsZXNdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCXBvd2Vybm93X3RhYmxlW251bWJlcl9zY2FsZXNdLmluZGV4ID0gMDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGNoYW5nZV9GSUQoaW50IGZpZCkKK3sKKwl1bmlvbiBtc3JfZmlkdmlkY3RsIGZpZHZpZGN0bDsKKworCXJkbXNybCAoTVNSX0s3X0ZJRF9WSURfQ1RMLCBmaWR2aWRjdGwudmFsKTsKKwlpZiAoZmlkdmlkY3RsLmJpdHMuRklEICE9IGZpZCkgeworCQlmaWR2aWRjdGwuYml0cy5TR1RDID0gbGF0ZW5jeTsKKwkJZmlkdmlkY3RsLmJpdHMuRklEID0gZmlkOworCQlmaWR2aWRjdGwuYml0cy5WSURDID0gMDsKKwkJZmlkdmlkY3RsLmJpdHMuRklEQyA9IDE7CisJCXdybXNybCAoTVNSX0s3X0ZJRF9WSURfQ1RMLCBmaWR2aWRjdGwudmFsKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgY2hhbmdlX1ZJRChpbnQgdmlkKQoreworCXVuaW9uIG1zcl9maWR2aWRjdGwgZmlkdmlkY3RsOworCisJcmRtc3JsIChNU1JfSzdfRklEX1ZJRF9DVEwsIGZpZHZpZGN0bC52YWwpOworCWlmIChmaWR2aWRjdGwuYml0cy5WSUQgIT0gdmlkKSB7CisJCWZpZHZpZGN0bC5iaXRzLlNHVEMgPSBsYXRlbmN5OworCQlmaWR2aWRjdGwuYml0cy5WSUQgPSB2aWQ7CisJCWZpZHZpZGN0bC5iaXRzLkZJREMgPSAwOworCQlmaWR2aWRjdGwuYml0cy5WSURDID0gMTsKKwkJd3Jtc3JsIChNU1JfSzdfRklEX1ZJRF9DVEwsIGZpZHZpZGN0bC52YWwpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBjaGFuZ2Vfc3BlZWQgKHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1OCBmaWQsIHZpZDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwl1bmlvbiBtc3JfZmlkdmlkc3RhdHVzIGZpZHZpZHN0YXR1czsKKwlpbnQgY2ZpZDsKKworCS8qIGZpZCBhcmUgdGhlIGxvd2VyIDggYml0cyBvZiB0aGUgaW5kZXggd2Ugc3RvcmVkIGludG8KKwkgKiB0aGUgY3B1ZnJlcSBmcmVxdWVuY3kgdGFibGUgaW4gcG93ZXJub3dfZGVjb2RlX2Jpb3MsCisJICogdmlkIGFyZSB0aGUgdXBwZXIgOCBiaXRzLgorCSAqLworCisJZmlkID0gcG93ZXJub3dfdGFibGVbaW5kZXhdLmluZGV4ICYgMHhGRjsKKwl2aWQgPSAocG93ZXJub3dfdGFibGVbaW5kZXhdLmluZGV4ICYgMHhGRjAwKSA+PiA4OworCisJZnJlcXMuY3B1ID0gMDsKKworCXJkbXNybCAoTVNSX0s3X0ZJRF9WSURfU1RBVFVTLCBmaWR2aWRzdGF0dXMudmFsKTsKKwljZmlkID0gZmlkdmlkc3RhdHVzLmJpdHMuQ0ZJRDsKKwlmcmVxcy5vbGQgPSBmc2IgKiBmaWRfY29kZXNbY2ZpZF0gLyAxMDsKKworCWZyZXFzLm5ldyA9IHBvd2Vybm93X3RhYmxlW2luZGV4XS5mcmVxdWVuY3k7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJLyogTm93IGRvIHRoZSBtYWdpYyBwb2tpbmcgaW50byB0aGUgTVNScy4gICovCisKKwlpZiAoaGF2ZV9hMCA9PSAxKQkvKiBBMCBlcnJhdGEgNSAqLworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJaWYgKGZyZXFzLm9sZCA+IGZyZXFzLm5ldykgeworCQkvKiBHb2luZyBkb3duLCBzbyBjaGFuZ2UgRklEIGZpcnN0ICovCisJCWNoYW5nZV9GSUQoZmlkKTsKKwkJY2hhbmdlX1ZJRCh2aWQpOworCX0gZWxzZSB7CisJCS8qIEdvaW5nIHVwLCBzbyBjaGFuZ2UgVklEIGZpcnN0ICovCisJCWNoYW5nZV9WSUQodmlkKTsKKwkJY2hhbmdlX0ZJRChmaWQpOworCX0KKworCisJaWYgKGhhdmVfYTAgPT0gMSkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Cit9CisKKworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzdfQUNQSQorCitzdGF0aWMgc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICphY3BpX3Byb2Nlc3Nvcl9wZXJmOworCitzdGF0aWMgaW50IHBvd2Vybm93X2FjcGlfaW5pdCh2b2lkKQoreworCWludCBpOworCWludCByZXR2YWwgPSAwOworCXVuaW9uIHBvd2Vybm93X2FjcGlfY29udHJvbF90IHBjOworCisJaWYgKGFjcGlfcHJvY2Vzc29yX3BlcmYgIT0gTlVMTCAmJiBwb3dlcm5vd190YWJsZSAhPSBOVUxMKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyMDsKKwl9CisKKwlhY3BpX3Byb2Nlc3Nvcl9wZXJmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlKSwKKwkJCQkgICAgICBHRlBfS0VSTkVMKTsKKworCWlmICghYWNwaV9wcm9jZXNzb3JfcGVyZikgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycjA7CisJfQorCisJbWVtc2V0KGFjcGlfcHJvY2Vzc29yX3BlcmYsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UpKTsKKworCWlmIChhY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZShhY3BpX3Byb2Nlc3Nvcl9wZXJmLCAwKSkgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIGVycjE7CisJfQorCisJaWYgKGFjcGlfcHJvY2Vzc29yX3BlcmYtPmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnIyOworCX0KKworCWlmIChhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnIyOworCX0KKworCW51bWJlcl9zY2FsZXMgPSBhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5zdGF0ZV9jb3VudDsKKworCWlmIChudW1iZXJfc2NhbGVzIDwgMikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycjI7CisJfQorCisJcG93ZXJub3dfdGFibGUgPSBrbWFsbG9jKChudW1iZXJfc2NhbGVzICsgMSkgKiAoc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvd2Vybm93X3RhYmxlKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyMjsKKwl9CisKKwltZW1zZXQocG93ZXJub3dfdGFibGUsIDAsICgobnVtYmVyX3NjYWxlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSkpKTsKKworCXBjLnZhbCA9ICh1bnNpZ25lZCBsb25nKSBhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5zdGF0ZXNbMF0uY29udHJvbDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyX3NjYWxlczsgaSsrKSB7CisJCXU4IGZpZCwgdmlkOworCQl1bnNpZ25lZCBpbnQgc3BlZWQ7CisKKwkJcGMudmFsID0gKHVuc2lnbmVkIGxvbmcpIGFjcGlfcHJvY2Vzc29yX3BlcmYtPnN0YXRlc1tpXS5jb250cm9sOworCQlkcHJpbnRrICgiYWNwaTogIFAlZDogJWQgTUh6ICVkIG1XICVkIHVTIGNvbnRyb2wgJTA4eCBTR1RDICVkXG4iLAorCQkJIGksCisJCQkgKHUzMikgYWNwaV9wcm9jZXNzb3JfcGVyZi0+c3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5LAorCQkJICh1MzIpIGFjcGlfcHJvY2Vzc29yX3BlcmYtPnN0YXRlc1tpXS5wb3dlciwKKwkJCSAodTMyKSBhY3BpX3Byb2Nlc3Nvcl9wZXJmLT5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5LAorCQkJICh1MzIpIGFjcGlfcHJvY2Vzc29yX3BlcmYtPnN0YXRlc1tpXS5jb250cm9sLAorCQkJIHBjLmJpdHMuc2d0Yyk7CisKKwkJdmlkID0gcGMuYml0cy52aWQ7CisJCWZpZCA9IHBjLmJpdHMuZmlkOworCisJCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSA9IGZzYiAqIGZpZF9jb2Rlc1tmaWRdIC8gMTA7CisJCXBvd2Vybm93X3RhYmxlW2ldLmluZGV4ID0gZmlkOyAvKiBsb3dlciA4IGJpdHMgKi8KKwkJcG93ZXJub3dfdGFibGVbaV0uaW5kZXggfD0gKHZpZCA8PCA4KTsgLyogdXBwZXIgOCBiaXRzICovCisKKwkJc3BlZWQgPSBwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3k7CisKKwkJaWYgKChmaWRfY29kZXNbZmlkXSAlIDEwKT09NSkgeworCQkJaWYgKGhhdmVfYTAgPT0gMSkKKwkJCQlwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCX0KKworCQlkcHJpbnRrICgiICAgRklEOiAweCV4ICglZC4lZHggWyVkTUh6XSkgICIKKwkJCSAiVklEOiAweCV4ICglZC4lMDNkVilcbiIsIGZpZCwgZmlkX2NvZGVzW2ZpZF0gLyAxMCwgCisJCQkgZmlkX2NvZGVzW2ZpZF0gJSAxMCwgc3BlZWQvMTAwMCwgdmlkLAkKKwkJCSBtb2JpbGVfdmlkX3RhYmxlW3ZpZF0vMTAwMCwKKwkJCSBtb2JpbGVfdmlkX3RhYmxlW3ZpZF0lMTAwMCk7CisKKwkJaWYgKGxhdGVuY3kgPCBwYy5iaXRzLnNndGMpCisJCQlsYXRlbmN5ID0gcGMuYml0cy5zZ3RjOworCisJCWlmIChzcGVlZCA8IG1pbmltdW1fc3BlZWQpCisJCQltaW5pbXVtX3NwZWVkID0gc3BlZWQ7CisJCWlmIChzcGVlZCA+IG1heGltdW1fc3BlZWQpCisJCQltYXhpbXVtX3NwZWVkID0gc3BlZWQ7CisJfQorCisJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CisJcG93ZXJub3dfdGFibGVbaV0uaW5kZXggPSAwOworCisJLyogbm90aWZ5IEJJT1MgdGhhdCB3ZSBleGlzdCAqLworCWFjcGlfcHJvY2Vzc29yX25vdGlmeV9zbW0oVEhJU19NT0RVTEUpOworCisJcmV0dXJuIDA7CisKK2VycjI6CisJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZShhY3BpX3Byb2Nlc3Nvcl9wZXJmLCAwKTsKK2VycjE6CisJa2ZyZWUoYWNwaV9wcm9jZXNzb3JfcGVyZik7CitlcnIwOgorCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJBQ1BJIHBlcmZsaWIgY2FuIG5vdCBiZSB1c2VkIGluIHRoaXMgcGxhdGZvcm1cbiIpOworCWFjcGlfcHJvY2Vzc29yX3BlcmYgPSBOVUxMOworCXJldHVybiByZXR2YWw7Cit9CisjZWxzZQorc3RhdGljIGludCBwb3dlcm5vd19hY3BpX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAibm8gc3VwcG9ydCBmb3IgQUNQSSBwcm9jZXNzb3IgZm91bmQuIgorCSAgICAgICAiICBQbGVhc2UgcmVjb21waWxlIHlvdXIga2VybmVsIHdpdGggQUNQSSBwcm9jZXNzb3JcbiIpOworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcG93ZXJub3dfZGVjb2RlX2Jpb3MgKGludCBtYXhmaWQsIGludCBzdGFydHZpZCkKK3sKKwlzdHJ1Y3QgcHNiX3MgKnBzYjsKKwlzdHJ1Y3QgcHN0X3MgKnBzdDsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGludCBldHVwbGU7CisJdW5zaWduZWQgaW50IHJldDsKKworCWV0dXBsZSA9IGNwdWlkX2VheCgweDgwMDAwMDAxKTsKKworCWZvciAoaT0weEMwMDAwOyBpIDwgMHhmZmZmMCA7IGkrPTE2KSB7CisKKwkJcCA9IHBoeXNfdG9fdmlydChpKTsKKworCQlpZiAobWVtY21wKHAsICJBTURLN1BOT1chIiwgIDEwKSA9PSAwKXsKKwkJCWRwcmludGsgKCJGb3VuZCBQU0IgaGVhZGVyIGF0ICVwXG4iLCBwKTsKKwkJCXBzYiA9IChzdHJ1Y3QgcHNiX3MgKikgcDsKKwkJCWRwcmludGsgKCJUYWJsZSB2ZXJzaW9uOiAweCV4XG4iLCBwc2ItPnRhYmxldmVyc2lvbik7CisJCQlpZiAocHNiLT50YWJsZXZlcnNpb24gIT0gMHgxMikgeworCQkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiU29ycnksIG9ubHkgdjEuMiB0YWJsZXMgc3VwcG9ydGVkIHJpZ2h0IG5vd1xuIik7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisKKwkJCWRwcmludGsgKCJGbGFnczogMHgleFxuIiwgcHNiLT5mbGFncyk7CisJCQlpZiAoKHBzYi0+ZmxhZ3MgJiAxKT09MCkgeworCQkJCWRwcmludGsgKCJNb2JpbGUgdm9sdGFnZSByZWd1bGF0b3JcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlkcHJpbnRrICgiRGVza3RvcCB2b2x0YWdlIHJlZ3VsYXRvclxuIik7CisJCQl9CisKKwkJCWxhdGVuY3kgPSBwc2ItPnNldHRsaW5ndGltZTsKKwkJCWlmIChsYXRlbmN5IDwgMTAwKSB7CisJCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJCSU9TIHNldCBzZXR0bGluZyB0aW1lIHRvICVkIG1pY3Jvc2Vjb25kcy4iCisJCQkJCQkiU2hvdWxkIGJlIGF0IGxlYXN0IDEwMC4gQ29ycmVjdGluZy5cbiIsIGxhdGVuY3kpOworCQkJCWxhdGVuY3kgPSAxMDA7CisJCQl9CisJCQlkcHJpbnRrICgiU2V0dGxpbmcgVGltZTogJWQgbWljcm9zZWNvbmRzLlxuIiwgcHNiLT5zZXR0bGluZ3RpbWUpOworCQkJZHByaW50ayAoIkhhcyAlZCBQU1QgdGFibGVzLiAoT25seSBkdW1waW5nIG9uZXMgcmVsZXZhbnQgdG8gdGhpcyBDUFUpLlxuIiwgcHNiLT5udW1wc3QpOworCisJCQlwICs9IHNpemVvZiAoc3RydWN0IHBzYl9zKTsKKworCQkJcHN0ID0gKHN0cnVjdCBwc3RfcyAqKSBwOworCisJCQlmb3IgKGkgPSAwIDsgaSA8cHNiLT5udW1wc3Q7IGkrKykgeworCQkJCXBzdCA9IChzdHJ1Y3QgcHN0X3MgKikgcDsKKwkJCQludW1iZXJfc2NhbGVzID0gcHN0LT5udW1wc3RhdGVzOworCisJCQkJaWYgKChldHVwbGUgPT0gcHN0LT5jcHVpZCkgJiYgY2hlY2tfZnNiKHBzdC0+ZnNic3BlZWQpICYmCisJCQkJICAgIChtYXhmaWQ9PXBzdC0+bWF4ZmlkKSAmJiAoc3RhcnR2aWQ9PXBzdC0+c3RhcnR2aWQpKQorCQkJCXsKKwkJCQkJZHByaW50ayAoIlBTVDolZCAoQCVwKVxuIiwgaSwgcHN0KTsKKwkJCQkJZHByaW50ayAoIiBjcHVpZDogMHgleCAgZnNiOiAlZCAgbWF4RklEOiAweCV4ICBzdGFydHZpZDogMHgleFxuIiwgCisJCQkJCQkgcHN0LT5jcHVpZCwgcHN0LT5mc2JzcGVlZCwgcHN0LT5tYXhmaWQsIHBzdC0+c3RhcnR2aWQpOworCisJCQkJCXJldCA9IGdldF9yYW5nZXMgKChjaGFyICopIHBzdCArIHNpemVvZiAoc3RydWN0IHBzdF9zKSk7CisJCQkJCXJldHVybiByZXQ7CisKKwkJCQl9IGVsc2UgeworCQkJCQlwID0gKGNoYXIgKikgcHN0ICsgc2l6ZW9mIChzdHJ1Y3QgcHN0X3MpOworCQkJCQlmb3IgKGo9MCA7IGogPCBudW1iZXJfc2NhbGVzOyBqKyspCisJCQkJCQlwKz0yOworCQkJCX0KKwkJCX0KKwkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiTm8gUFNUIHRhYmxlcyBtYXRjaCB0aGlzIGNwdWlkICgweCV4KVxuIiwgZXR1cGxlKTsKKwkJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVGhpcyBpcyBpbmRpY2F0aXZlIG9mIGEgYnJva2VuIEJJT1MuXG4iKTsKKworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcCsrOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCisKK3N0YXRpYyBpbnQgcG93ZXJub3dfdGFyZ2V0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCisJCQkgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGludCBuZXdzdGF0ZTsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCBwb3dlcm5vd190YWJsZSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNoYW5nZV9zcGVlZChuZXdzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHBvd2Vybm93X3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIHBvd2Vybm93X3RhYmxlKTsKK30KKworLyoKKyAqIFdlIHVzZSB0aGUgZmFjdCB0aGF0IHRoZSBidXMgZnJlcXVlbmN5IGlzIHNvbWVob3cKKyAqIGEgbXVsdGlwbGUgb2YgMTAwMDAwLzMga2h6LCB0aGVuIHdlIGNvbXB1dGUgc2d0YyBhY2NvcmRpbmcKKyAqIHRvIHRoaXMgbXVsdGlwbGUuCisgKiBUaGF0IHdheSwgd2UgbWF0Y2ggbW9yZSBob3cgQU1EIHRoaW5rcyBhbGwgb2YgdGhhdCB3b3JrLgorICogV2Ugd2lsbCB0aGVuIGdldCB0aGUgc2FtZSBraW5kIG9mIGJlaGF2aW91ciBhbHJlYWR5IHRlc3RlZCB1bmRlcgorICogdGhlICJ3ZWxsLWtub3duIiBvdGhlciBPUy4KKyAqLworc3RhdGljIGludCBfX2luaXQgZml4dXBfc2d0Yyh2b2lkKQoreworCXVuc2lnbmVkIGludCBzZ3RjOworCXVuc2lnbmVkIGludCBtOworCisJbSA9IGZzYiAvIDMzMzM7CisJaWYgKChtICUgMTApID49IDUpCisJCW0gKz0gNTsKKworCW0gLz0gMTA7CisKKwlzZ3RjID0gMTAwICogbSAqIGxhdGVuY3k7CisJc2d0YyA9IHNndGMgLyAzOworCWlmIChzZ3RjID4gMHhmZmZmZikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiU0dUQyB0b28gbGFyZ2UgJWRcbiIsIHNndGMpOworCQlzZ3RjID0gMHhmZmZmZjsKKwl9CisJcmV0dXJuIHNndGM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG93ZXJub3dfZ2V0KHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5pb24gbXNyX2ZpZHZpZHN0YXR1cyBmaWR2aWRzdGF0dXM7CisJdW5zaWduZWQgaW50IGNmaWQ7CisKKwlpZiAoY3B1KQorCQlyZXR1cm4gMDsKKwlyZG1zcmwgKE1TUl9LN19GSURfVklEX1NUQVRVUywgZmlkdmlkc3RhdHVzLnZhbCk7CisJY2ZpZCA9IGZpZHZpZHN0YXR1cy5iaXRzLkNGSUQ7CisKKwlyZXR1cm4gKGZzYiAqIGZpZF9jb2Rlc1tjZmlkXSAvIDEwKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBhY2VyX2NwdWZyZXFfcHN0KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGxhcHRvcCB3aXRoIGJyb2tlbiBQU1QgdGFibGVzIGluIEJJT1MgZGV0ZWN0ZWQuXG4iLCBkLT5pZGVudCk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiWW91IG5lZWQgdG8gZG93bmdyYWRlIHRvIDNBMjEgKDA5LzA5LzIwMDIpLCBvciB0cnkgYSBuZXdlciBCSU9TIHRoYW4gM0E3MSAoMDEvMjAvMjAwMylcbiIpOworCXByaW50ayhLRVJOX1dBUk5JTkcgImNwdWZyZXEgc2NhbGluZyBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHJlc3VsdCBvZiB0aGlzLlxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTb21lIEF0aGxvbiBsYXB0b3BzIGhhdmUgcmVhbGx5IGZ1Y2tlZCBQU1QgdGFibGVzLgorICogQSBCSU9TIHVwZGF0ZSBpcyBhbGwgdGhhdCBjYW4gc2F2ZSB0aGVtLgorICogTWVudGlvbiB0aGlzLCBhbmQgZGlzYWJsZSBjcHVmcmVxLgorICovCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBwb3dlcm5vd19kbWlfdGFibGVbXSA9IHsKKwl7CisJCS5jYWxsYmFjayA9IGFjZXJfY3B1ZnJlcV9wc3QsCisJCS5pZGVudCA9ICJBY2VyIEFzcGlyZSIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSW5zeWRlIFNvZnR3YXJlIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIjNBNzEiKSwKKwkJfSwKKwl9LAorCXsgfQorfTsKKworc3RhdGljIGludCBfX2luaXQgcG93ZXJub3dfY3B1X2luaXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuaW9uIG1zcl9maWR2aWRzdGF0dXMgZmlkdmlkc3RhdHVzOworCWludCByZXN1bHQ7CisKKwlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZG1zcmwgKE1TUl9LN19GSURfVklEX1NUQVRVUywgZmlkdmlkc3RhdHVzLnZhbCk7CisKKwkvKiBBIEs3IHdpdGggcG93ZXJub3cgdGVjaG5vbG9neSBpcyBzZXQgdG8gbWF4IGZyZXF1ZW5jeSBieSBCSU9TICovCisJZnNiID0gKDEwICogY3B1X2toeikgLyBmaWRfY29kZXNbZmlkdmlkc3RhdHVzLmJpdHMuTUZJRF07CisJaWYgKCFmc2IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggImNhbiBub3QgZGV0ZXJtaW5lIGJ1cyBmcmVxdWVuY3lcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZHByaW50aygiRlNCOiAlM2QuJTAzZCBNSHpcbiIsIGZzYi8xMDAwLCBmc2IlMTAwMCk7CisKKwlpZiAoZG1pX2NoZWNrX3N5c3RlbShwb3dlcm5vd19kbWlfdGFibGUpIHx8IGFjcGlfZm9yY2UpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJQU0IvUFNUIGtub3duIHRvIGJlIGJyb2tlbi4gIFRyeWluZyBBQ1BJIGluc3RlYWRcbiIpOworCQlyZXN1bHQgPSBwb3dlcm5vd19hY3BpX2luaXQoKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBwb3dlcm5vd19kZWNvZGVfYmlvcyhmaWR2aWRzdGF0dXMuYml0cy5NRklELCBmaWR2aWRzdGF0dXMuYml0cy5TVklEKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJUcnlpbmcgQUNQSSBwZXJmbGliXG4iKTsKKwkJCW1heGltdW1fc3BlZWQgPSAwOworCQkJbWluaW11bV9zcGVlZCA9IC0xOworCQkJbGF0ZW5jeSA9IDA7CisJCQlyZXN1bHQgPSBwb3dlcm5vd19hY3BpX2luaXQoKTsKKwkJCWlmIChyZXN1bHQpIHsKKwkJCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkFDUEkgYW5kIGxlZ2FjeSBtZXRob2RzIGZhaWxlZFxuIik7CisJCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJTZWUgaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9wcm9qZWN0cy9jcHVmcmVxL3Bvd2Vybm93LWs3LnNodG1sXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFNHVEMgdXNlIHRoZSBidXMgY2xvY2sgYXMgdGltZXIgKi8KKwkJCWxhdGVuY3kgPSBmaXh1cF9zZ3RjKCk7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiU0dUQzogJWRcbiIsIGxhdGVuY3kpOworCQl9CisJfQorCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiTWluaW11bSBzcGVlZCAlZCBNSHouIE1heGltdW0gc3BlZWQgJWQgTUh6LlxuIiwKKwkJCQltaW5pbXVtX3NwZWVkLzEwMDAsIG1heGltdW1fc3BlZWQvMTAwMCk7CisKKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IGNwdWZyZXFfc2NhbGUoMjAwMDAwMFVMLCBmc2IsIGxhdGVuY3kpOworCisJcG9saWN5LT5jdXIgPSBwb3dlcm5vd19nZXQoMCk7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihwb3dlcm5vd190YWJsZSwgcG9saWN5LT5jcHUpOworCisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBwb3dlcm5vd190YWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXJub3dfY3B1X2V4aXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KSB7CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCisjaWZkZWYgQ09ORklHX1g4Nl9QT1dFUk5PV19LN19BQ1BJCisJaWYgKGFjcGlfcHJvY2Vzc29yX3BlcmYpIHsKKwkJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZShhY3BpX3Byb2Nlc3Nvcl9wZXJmLCAwKTsKKwkJa2ZyZWUoYWNwaV9wcm9jZXNzb3JfcGVyZik7CisJfQorI2VuZGlmCisKKwlpZiAocG93ZXJub3dfdGFibGUpCisJCWtmcmVlKHBvd2Vybm93X3RhYmxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogcG93ZXJub3dfdGFibGVfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBwb3dlcm5vd19kcml2ZXIgPSB7CisJLnZlcmlmeQk9IHBvd2Vybm93X3ZlcmlmeSwKKwkudGFyZ2V0CT0gcG93ZXJub3dfdGFyZ2V0LAorCS5nZXQJPSBwb3dlcm5vd19nZXQsCisJLmluaXQJPSBwb3dlcm5vd19jcHVfaW5pdCwKKwkuZXhpdAk9IHBvd2Vybm93X2NwdV9leGl0LAorCS5uYW1lCT0gInBvd2Vybm93LWs3IiwKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuYXR0cgk9IHBvd2Vybm93X3RhYmxlX2F0dHIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwb3dlcm5vd19pbml0ICh2b2lkKQoreworCWlmIChjaGVja19wb3dlcm5vdygpPT0wKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnBvd2Vybm93X2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHBvd2Vybm93X2V4aXQgKHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmcG93ZXJub3dfZHJpdmVyKTsKK30KKworbW9kdWxlX3BhcmFtKGFjcGlfZm9yY2UsICBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhY3BpX2ZvcmNlLCAiRm9yY2UgQUNQSSB0byBiZSB1c2VkLiIpOworCitNT0RVTEVfQVVUSE9SICgiRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJQb3dlcm5vdyBkcml2ZXIgZm9yIEFNRCBLNyBwcm9jZXNzb3JzLiIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbGF0ZV9pbml0Y2FsbChwb3dlcm5vd19pbml0KTsKK21vZHVsZV9leGl0KHBvd2Vybm93X2V4aXQpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhNjNiMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogICRJZDogcG93ZXJub3ctazcuaCx2IDEuMiAyMDAzLzAyLzEwIDE4OjI2OjAxIGRhdmVqIEV4cCAkCisgKiAgKEMpIDIwMDMgRGF2ZSBKb25lcy4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBBTUQtc3BlY2lmaWMgaW5mb3JtYXRpb24KKyAqCisgKi8KKwordW5pb24gbXNyX2ZpZHZpZGN0bCB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgRklEOjUsCQkJLy8gNDowCisJCXJlc2VydmVkMTozLAkvLyA3OjUKKwkJVklEOjUsCQkJLy8gMTI6OAorCQlyZXNlcnZlZDI6MywJLy8gMTU6MTMKKwkJRklEQzoxLAkJCS8vIDE2CisJCVZJREM6MSwJCQkvLyAxNworCQlyZXNlcnZlZDM6MiwJLy8gMTk6MTgKKwkJRklEQ0hHUkFUSU86MSwJLy8gMjAKKwkJcmVzZXJ2ZWQ0OjExLAkvLyAzMS0yMQorCQlTR1RDOjIwLAkJLy8gMzI6NTEKKwkJcmVzZXJ2ZWQ1OjEyOwkvLyA2Mzo1MgorCX0gYml0czsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworfTsKKwordW5pb24gbXNyX2ZpZHZpZHN0YXR1cyB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgQ0ZJRDo1LAkJCS8vIDQ6MAorCQlyZXNlcnZlZDE6MywJLy8gNzo1CisJCVNGSUQ6NSwJCQkvLyAxMjo4CisJCXJlc2VydmVkMjozLAkvLyAxNToxMworCQlNRklEOjUsCQkJLy8gMjA6MTYKKwkJcmVzZXJ2ZWQzOjExLAkvLyAzMToyMQorCQlDVklEOjUsCQkJLy8gMzY6MzIKKwkJcmVzZXJ2ZWQ0OjMsCS8vIDM5OjM3CisJCVNWSUQ6NSwJCQkvLyA0NDo0MAorCQlyZXNlcnZlZDU6MywJLy8gNDc6NDUKKwkJTVZJRDo1LAkJCS8vIDUyOjQ4CisJCXJlc2VydmVkNjoxMTsJLy8gNjM6NTMKKwl9IGJpdHM7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1ZmY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYwpAQCAtMCwwICsxLDExMzUgQEAKKy8qCisgKiAgIChjKSAyMDAzLCAyMDA0IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqICBZb3VyIHVzZSBvZiB0aGlzIGNvZGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiAgR05VIGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgdmVyc2lvbiAyLiBTZWUgIkNPUFlJTkciIG9yCisgKiAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCisgKgorICogIFN1cHBvcnQgOiBwYXVsLmRldnJpZW5kdEBhbWQuY29tCisgKgorICogIEJhc2VkIG9uIHRoZSBwb3dlcm5vdy1rNy5jIG1vZHVsZSB3cml0dGVuIGJ5IERhdmUgSm9uZXMuCisgKiAgKEMpIDIwMDMgRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+IG9uIGJlaGFsZiBvZiBTdVNFIExhYnMKKyAqICAoQykgMjAwNCBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+CisgKiAgKEMpIDIwMDQgUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqICBCYXNlZCB1cG9uIGRhdGFzaGVldHMgJiBzYW1wbGUgQ1BVcyBraW5kbHkgcHJvdmlkZWQgYnkgQU1ELgorICoKKyAqICBWYWx1YWJsZSBpbnB1dCBncmF0ZWZ1bGx5IHJlY2VpdmVkIGZyb20gRGF2ZSBKb25lcywgUGF2ZWwgTWFjaGVrLAorICogIERvbWluaWsgQnJvZG93c2tpLCBhbmQgb3RoZXJzLgorICogIFByb2Nlc3NvciBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIENoYXB0ZXIgOSAoUG93ZXIgYW5kIFRoZXJtYWwgTWFuYWdlbWVudCkKKyAqICBvZiB0aGUgIkJJT1MgYW5kIEtlcm5lbCBEZXZlbG9wZXIncyBHdWlkZSBmb3IgdGhlIEFNRCBBdGhsb24gNjQgYW5kIEFNRAorICogIE9wdGVyb24gUHJvY2Vzc29ycyIgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHd3dy5hbWQuY29tCisgKgorICogIFRhYmxlcyBmb3Igc3BlY2lmaWMgQ1BVcyBjYW4gYmUgaW5mcmVycmVkIGZyb20KKyAqCWh0dHA6Ly93d3cuYW1kLmNvbS91cy1lbi9hc3NldHMvY29udGVudF90eXBlL3doaXRlX3BhcGVyc19hbmRfdGVjaF9kb2NzLzMwNDMwLnBkZgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKworI2lmZGVmIENPTkZJR19YODZfUE9XRVJOT1dfSzhfQUNQSQorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgorI2VuZGlmCisKKyNkZWZpbmUgUEZYICJwb3dlcm5vdy1rODogIgorI2RlZmluZSBCRlggUEZYICJCSU9TIGVycm9yOiAiCisjZGVmaW5lIFZFUlNJT04gInZlcnNpb24gMS4wMC4wOWUiCisjaW5jbHVkZSAicG93ZXJub3ctazguaCIKKworLyogc2VyaWFsaXplIGZyZXEgY2hhbmdlcyAgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKGZpZHZpZF9zZW0pOworCitzdGF0aWMgc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKnBvd2Vybm93X2RhdGFbTlJfQ1BVU107CisKKy8qIFJldHVybiBhIGZyZXF1ZW5jeSBpbiBNSHosIGdpdmVuIGFuIGlucHV0IGZpZCAqLworc3RhdGljIHUzMiBmaW5kX2ZyZXFfZnJvbV9maWQodTMyIGZpZCkKK3sKKwlyZXR1cm4gODAwICsgKGZpZCAqIDEwMCk7Cit9CisKKy8qIFJldHVybiBhIGZyZXF1ZW5jeSBpbiBLSHosIGdpdmVuIGFuIGlucHV0IGZpZCAqLworc3RhdGljIHUzMiBmaW5kX2toel9mcmVxX2Zyb21fZmlkKHUzMiBmaWQpCit7CisJcmV0dXJuIDEwMDAgKiBmaW5kX2ZyZXFfZnJvbV9maWQoZmlkKTsKK30KKworLyogUmV0dXJuIGEgdm9sdGFnZSBpbiBtaWxpVm9sdHMsIGdpdmVuIGFuIGlucHV0IHZpZCAqLworc3RhdGljIHUzMiBmaW5kX21pbGxpdm9sdHNfZnJvbV92aWQoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiB2aWQpCit7CisJcmV0dXJuIDE1NTAtdmlkKjI1OworfQorCisvKiBSZXR1cm4gdGhlIHZjbyBmaWQgZm9yIGFuIGlucHV0IGZpZAorICoKKyAqIEVhY2ggImxvdyIgZmlkIGhhcyBjb3JyZXNwb25kaW5nICJoaWdoIiBmaWQsIGFuZCB5b3UgY2FuIGdldCB0byAibG93IiBmaWRzCisgKiBvbmx5IGZyb20gY29ycmVzcG9uZGluZyBoaWdoIGZpZHMuIFRoaXMgcmV0dXJucyAiaGlnaCIgZmlkIGNvcnJlc3BvbmRpbmcgdG8KKyAqICJsb3ciIG9uZS4KKyAqLworc3RhdGljIHUzMiBjb252ZXJ0X2ZpZF90b192Y29fZmlkKHUzMiBmaWQpCit7CisJaWYgKGZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pIHsKKwkJcmV0dXJuIDggKyAoMiAqIGZpZCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZpZDsKKwl9Cit9CisKKy8qCisgKiBSZXR1cm4gMSBpZiB0aGUgcGVuZGluZyBiaXQgaXMgc2V0LiBVbmxlc3Mgd2UganVzdCBpbnN0cnVjdGVkIHRoZSBwcm9jZXNzb3IKKyAqIHRvIHRyYW5zaXRpb24gdG8gYSBuZXcgc3RhdGUsIHNlZWluZyB0aGlzIGJpdCBzZXQgaXMgcmVhbGx5IGJhZCBuZXdzLgorICovCitzdGF0aWMgaW50IHBlbmRpbmdfYml0X3N0dWNrKHZvaWQpCit7CisJdTMyIGxvLCBoaTsKKworCXJkbXNyKE1TUl9GSURWSURfU1RBVFVTLCBsbywgaGkpOworCXJldHVybiBsbyAmIE1TUl9TX0xPX0NIQU5HRV9QRU5ESU5HID8gMSA6IDA7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIGdsb2JhbCBjdXJyZW50IGZpZCAvIHZpZCB2YWx1ZXMgZnJvbSB0aGUgc3RhdHVzIG1zci4KKyAqIFJldHVybnMgMSBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkKK3sKKwl1MzIgbG8sIGhpOworCXUzMiBpID0gMDsKKworCWxvID0gTVNSX1NfTE9fQ0hBTkdFX1BFTkRJTkc7CisJd2hpbGUgKGxvICYgTVNSX1NfTE9fQ0hBTkdFX1BFTkRJTkcpIHsKKwkJaWYgKGkrKyA+IDB4MTAwMDAwMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZGV0ZWN0ZWQgY2hhbmdlIHBlbmRpbmcgc3R1Y2tcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmRtc3IoTVNSX0ZJRFZJRF9TVEFUVVMsIGxvLCBoaSk7CisJfQorCisJZGF0YS0+Y3VycnZpZCA9IGhpICYgTVNSX1NfSElfQ1VSUkVOVF9WSUQ7CisJZGF0YS0+Y3VycmZpZCA9IGxvICYgTVNSX1NfTE9fQ1VSUkVOVF9GSUQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogdGhlIGlzb2Nocm9ub3VzIHJlbGllZiB0aW1lICovCitzdGF0aWMgdm9pZCBjb3VudF9vZmZfaXJ0KHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhKQoreworCXVkZWxheSgoMSA8PCBkYXRhLT5pcnQpICogMTApOworCXJldHVybjsKK30KKworLyogdGhlIHZvbHRhZ2Ugc3RhYmFsaXphdGlvbiB0aW1lICovCitzdGF0aWMgdm9pZCBjb3VudF9vZmZfdnN0KHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhKQoreworCXVkZWxheShkYXRhLT52c3RhYmxlICogVlNUX1VOSVRTXzIwVVMpOworCXJldHVybjsKK30KKworLyogbmVlZCB0byBpbml0IHRoZSBjb250cm9sIG1zciB0byBhIHNhZmUgdmFsdWUgKGZvciBlYWNoIGNwdSkgKi8KK3N0YXRpYyB2b2lkIGZpZHZpZF9tc3JfaW5pdCh2b2lkKQoreworCXUzMiBsbywgaGk7CisJdTggZmlkLCB2aWQ7CisKKwlyZG1zcihNU1JfRklEVklEX1NUQVRVUywgbG8sIGhpKTsKKwl2aWQgPSBoaSAmIE1TUl9TX0hJX0NVUlJFTlRfVklEOworCWZpZCA9IGxvICYgTVNSX1NfTE9fQ1VSUkVOVF9GSUQ7CisJbG8gPSBmaWQgfCAodmlkIDw8IE1TUl9DX0xPX1ZJRF9TSElGVCk7CisJaGkgPSBNU1JfQ19ISV9TVFBfR05UX0JFTklHTjsKKwlkcHJpbnRrKCJjcHUlZCwgaW5pdCBsbyAweCV4LCBoaSAweCV4XG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIGxvLCBoaSk7CisJd3Jtc3IoTVNSX0ZJRFZJRF9DVEwsIGxvLCBoaSk7Cit9CisKKworLyogd3JpdGUgdGhlIG5ldyBmaWQgdmFsdWUgYWxvbmcgd2l0aCB0aGUgb3RoZXIgY29udHJvbCBmaWVsZHMgdG8gdGhlIG1zciAqLworc3RhdGljIGludCB3cml0ZV9uZXdfZmlkKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgZmlkKQoreworCXUzMiBsbzsKKwl1MzIgc2F2ZXZpZCA9IGRhdGEtPmN1cnJ2aWQ7CisKKwlpZiAoKGZpZCAmIElOVkFMSURfRklEX01BU0spIHx8IChkYXRhLT5jdXJydmlkICYgSU5WQUxJRF9WSURfTUFTSykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW50ZXJuYWwgZXJyb3IgLSBvdmVyZmxvdyBvbiBmaWQgd3JpdGVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlsbyA9IGZpZCB8IChkYXRhLT5jdXJydmlkIDw8IE1TUl9DX0xPX1ZJRF9TSElGVCkgfCBNU1JfQ19MT19JTklUX0ZJRF9WSUQ7CisKKwlkcHJpbnRrKCJ3cml0aW5nIGZpZCAweCV4LCBsbyAweCV4LCBoaSAweCV4XG4iLAorCQlmaWQsIGxvLCBkYXRhLT5wbGxsb2NrICogUExMX0xPQ0tfQ09OVkVSU0lPTik7CisKKwl3cm1zcihNU1JfRklEVklEX0NUTCwgbG8sIGRhdGEtPnBsbGxvY2sgKiBQTExfTE9DS19DT05WRVJTSU9OKTsKKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJcmV0dXJuIDE7CisKKwljb3VudF9vZmZfaXJ0KGRhdGEpOworCisJaWYgKHNhdmV2aWQgIT0gZGF0YS0+Y3VycnZpZCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2aWQgY2hhbmdlIG9uIGZpZCB0cmFucywgb2xkIDB4JXgsIG5ldyAweCV4XG4iLAorCQkgICAgICAgc2F2ZXZpZCwgZGF0YS0+Y3VycnZpZCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChmaWQgIT0gZGF0YS0+Y3VycmZpZCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJmaWQgdHJhbnMgZmFpbGVkLCBmaWQgMHgleCwgY3VyciAweCV4XG4iLCBmaWQsCisJCSAgICAgICAgZGF0YS0+Y3VycmZpZCk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKiBXcml0ZSBhIG5ldyB2aWQgdG8gdGhlIGhhcmR3YXJlICovCitzdGF0aWMgaW50IHdyaXRlX25ld192aWQoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiB2aWQpCit7CisJdTMyIGxvOworCXUzMiBzYXZlZmlkID0gZGF0YS0+Y3VycmZpZDsKKworCWlmICgoZGF0YS0+Y3VycmZpZCAmIElOVkFMSURfRklEX01BU0spIHx8ICh2aWQgJiBJTlZBTElEX1ZJRF9NQVNLKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbnRlcm5hbCBlcnJvciAtIG92ZXJmbG93IG9uIHZpZCB3cml0ZVxuIik7CisJCXJldHVybiAxOworCX0KKworCWxvID0gZGF0YS0+Y3VycmZpZCB8ICh2aWQgPDwgTVNSX0NfTE9fVklEX1NISUZUKSB8IE1TUl9DX0xPX0lOSVRfRklEX1ZJRDsKKworCWRwcmludGsoIndyaXRpbmcgdmlkIDB4JXgsIGxvIDB4JXgsIGhpIDB4JXhcbiIsCisJCXZpZCwgbG8sIFNUT1BfR1JBTlRfNU5TKTsKKworCXdybXNyKE1TUl9GSURWSURfQ1RMLCBsbywgU1RPUF9HUkFOVF81TlMpOworCisJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQorCQlyZXR1cm4gMTsKKworCWlmIChzYXZlZmlkICE9IGRhdGEtPmN1cnJmaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmlkIGNoYW5nZWQgb24gdmlkIHRyYW5zLCBvbGQgMHgleCBuZXcgMHgleFxuIiwKKwkJICAgICAgIHNhdmVmaWQsIGRhdGEtPmN1cnJmaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAodmlkICE9IGRhdGEtPmN1cnJ2aWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmlkIHRyYW5zIGZhaWxlZCwgdmlkIDB4JXgsIGN1cnIgMHgleFxuIiwgdmlkLAorCQkJCWRhdGEtPmN1cnJ2aWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlZHVjZSB0aGUgdmlkIGJ5IHRoZSBtYXggb2Ygc3RlcCBvciByZXF2aWQuCisgKiBEZWNyZWFzaW5nIHZpZCBjb2RlcyByZXByZXNlbnQgaW5jcmVhc2luZyB2b2x0YWdlczoKKyAqIHZpZCBvZiAwIGlzIDEuNTUwViwgdmlkIG9mIDB4MWUgaXMgMC44MDBWLCB2aWQgb2YgMHgxZiBpcyBvZmYuCisgKi8KK3N0YXRpYyBpbnQgZGVjcmVhc2VfdmlkX2NvZGVfYnlfc3RlcChzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIHJlcXZpZCwgdTMyIHN0ZXApCit7CisJaWYgKChkYXRhLT5jdXJydmlkIC0gcmVxdmlkKSA+IHN0ZXApCisJCXJlcXZpZCA9IGRhdGEtPmN1cnJ2aWQgLSBzdGVwOworCisJaWYgKHdyaXRlX25ld192aWQoZGF0YSwgcmVxdmlkKSkKKwkJcmV0dXJuIDE7CisKKwljb3VudF9vZmZfdnN0KGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYW5nZSB0aGUgZmlkIGFuZCB2aWQsIGJ5IHRoZSAzIHBoYXNlcy4gKi8KK3N0YXRpYyBpbnQgdHJhbnNpdGlvbl9maWRfdmlkKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgcmVxZmlkLCB1MzIgcmVxdmlkKQoreworCWlmIChjb3JlX3ZvbHRhZ2VfcHJlX3RyYW5zaXRpb24oZGF0YSwgcmVxdmlkKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoY29yZV9mcmVxdWVuY3lfdHJhbnNpdGlvbihkYXRhLCByZXFmaWQpKQorCQlyZXR1cm4gMTsKKworCWlmIChjb3JlX3ZvbHRhZ2VfcG9zdF90cmFuc2l0aW9uKGRhdGEsIHJlcXZpZCkpCisJCXJldHVybiAxOworCisJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQorCQlyZXR1cm4gMTsKKworCWlmICgocmVxZmlkICE9IGRhdGEtPmN1cnJmaWQpIHx8IChyZXF2aWQgIT0gZGF0YS0+Y3VycnZpZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIChjcHUlZCk6IHJlcSAweCV4IDB4JXgsIGN1cnIgMHgleCAweCV4XG4iLAorCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSwKKwkJCQlyZXFmaWQsIHJlcXZpZCwgZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CisJCXJldHVybiAxOworCX0KKworCWRwcmludGsoInRyYW5zaXRpb25lZCAoY3B1JWQpOiBuZXcgZmlkIDB4JXgsIHZpZCAweCV4XG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIGRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFBoYXNlIDEgLSBjb3JlIHZvbHRhZ2UgdHJhbnNpdGlvbiAuLi4gc2V0dXAgdm9sdGFnZSAqLworc3RhdGljIGludCBjb3JlX3ZvbHRhZ2VfcHJlX3RyYW5zaXRpb24oc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiByZXF2aWQpCit7CisJdTMyIHJ2b3N0ZXBzID0gZGF0YS0+cnZvOworCXUzMiBzYXZlZmlkID0gZGF0YS0+Y3VycmZpZDsKKworCWRwcmludGsoInBoMSAoY3B1JWQpOiBzdGFydCwgY3VycmZpZCAweCV4LCBjdXJydmlkIDB4JXgsIHJlcXZpZCAweCV4LCBydm8gMHgleFxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLAorCQlkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkLCByZXF2aWQsIGRhdGEtPnJ2byk7CisKKwl3aGlsZSAoZGF0YS0+Y3VycnZpZCA+IHJlcXZpZCkgeworCQlkcHJpbnRrKCJwaDE6IGN1cnIgMHgleCwgcmVxIHZpZCAweCV4XG4iLAorCQkJZGF0YS0+Y3VycnZpZCwgcmVxdmlkKTsKKwkJaWYgKGRlY3JlYXNlX3ZpZF9jb2RlX2J5X3N0ZXAoZGF0YSwgcmVxdmlkLCBkYXRhLT52aWRtdnMpKQorCQkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKChydm9zdGVwcyA+IDApICAmJiAoKGRhdGEtPnJ2byArIGRhdGEtPmN1cnJ2aWQpID4gcmVxdmlkKSkgeworCQlpZiAoZGF0YS0+Y3VycnZpZCA9PSAwKSB7CisJCQlydm9zdGVwcyA9IDA7CisJCX0gZWxzZSB7CisJCQlkcHJpbnRrKCJwaDE6IGNoYW5naW5nIHZpZCBmb3IgcnZvLCByZXEgMHgleFxuIiwKKwkJCQlkYXRhLT5jdXJydmlkIC0gMSk7CisJCQlpZiAoZGVjcmVhc2VfdmlkX2NvZGVfYnlfc3RlcChkYXRhLCBkYXRhLT5jdXJydmlkIC0gMSwgMSkpCisJCQkJcmV0dXJuIDE7CisJCQlydm9zdGVwcy0tOworCQl9CisJfQorCisJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQorCQlyZXR1cm4gMTsKKworCWlmIChzYXZlZmlkICE9IGRhdGEtPmN1cnJmaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicGgxIGVyciwgY3VycmZpZCBjaGFuZ2VkIDB4JXhcbiIsIGRhdGEtPmN1cnJmaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkcHJpbnRrKCJwaDEgY29tcGxldGUsIGN1cnJmaWQgMHgleCwgY3VycnZpZCAweCV4XG4iLAorCQlkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKKworCXJldHVybiAwOworfQorCisvKiBQaGFzZSAyIC0gY29yZSBmcmVxdWVuY3kgdHJhbnNpdGlvbiAqLworc3RhdGljIGludCBjb3JlX2ZyZXF1ZW5jeV90cmFuc2l0aW9uKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgcmVxZmlkKQoreworCXUzMiB2Y29yZXFmaWQsIHZjb2N1cnJmaWQsIHZjb2ZpZGRpZmYsIHNhdmV2aWQgPSBkYXRhLT5jdXJydmlkOworCisJaWYgKChyZXFmaWQgPCBISV9GSURfVEFCTEVfQk9UVE9NKSAmJiAoZGF0YS0+Y3VycmZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInBoMjogaWxsZWdhbCBsby1sbyB0cmFuc2l0aW9uIDB4JXggMHgleFxuIiwKKwkJCXJlcWZpZCwgZGF0YS0+Y3VycmZpZCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChkYXRhLT5jdXJyZmlkID09IHJlcWZpZCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJwaDIgbnVsbCBmaWQgdHJhbnNpdGlvbiAweCV4XG4iLCBkYXRhLT5jdXJyZmlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZHByaW50aygicGgyIChjcHUlZCk6IHN0YXJ0aW5nLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleCwgcmVxZmlkIDB4JXhcbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSwKKwkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCwgcmVxZmlkKTsKKworCXZjb3JlcWZpZCA9IGNvbnZlcnRfZmlkX3RvX3Zjb19maWQocmVxZmlkKTsKKwl2Y29jdXJyZmlkID0gY29udmVydF9maWRfdG9fdmNvX2ZpZChkYXRhLT5jdXJyZmlkKTsKKwl2Y29maWRkaWZmID0gdmNvY3VycmZpZCA+IHZjb3JlcWZpZCA/IHZjb2N1cnJmaWQgLSB2Y29yZXFmaWQKKwkgICAgOiB2Y29yZXFmaWQgLSB2Y29jdXJyZmlkOworCisJd2hpbGUgKHZjb2ZpZGRpZmYgPiAyKSB7CisJCWlmIChyZXFmaWQgPiBkYXRhLT5jdXJyZmlkKSB7CisJCQlpZiAoZGF0YS0+Y3VycmZpZCA+IExPX0ZJRF9UQUJMRV9UT1ApIHsKKwkJCQlpZiAod3JpdGVfbmV3X2ZpZChkYXRhLCBkYXRhLT5jdXJyZmlkICsgMikpIHsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAod3JpdGVfbmV3X2ZpZAorCQkJCSAgICAoZGF0YSwgMiArIGNvbnZlcnRfZmlkX3RvX3Zjb19maWQoZGF0YS0+Y3VycmZpZCkpKSB7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh3cml0ZV9uZXdfZmlkKGRhdGEsIGRhdGEtPmN1cnJmaWQgLSAyKSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCisJCXZjb2N1cnJmaWQgPSBjb252ZXJ0X2ZpZF90b192Y29fZmlkKGRhdGEtPmN1cnJmaWQpOworCQl2Y29maWRkaWZmID0gdmNvY3VycmZpZCA+IHZjb3JlcWZpZCA/IHZjb2N1cnJmaWQgLSB2Y29yZXFmaWQKKwkJICAgIDogdmNvcmVxZmlkIC0gdmNvY3VycmZpZDsKKwl9CisKKwlpZiAod3JpdGVfbmV3X2ZpZChkYXRhLCByZXFmaWQpKQorCQlyZXR1cm4gMTsKKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZGF0YS0+Y3VycmZpZCAhPSByZXFmaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJInBoMjogbWlzbWF0Y2gsIGZhaWxlZCBmaWQgdHJhbnNpdGlvbiwgY3VyciAweCV4LCByZXEgMHgleFxuIiwKKwkJCWRhdGEtPmN1cnJmaWQsIHJlcWZpZCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChzYXZldmlkICE9IGRhdGEtPmN1cnJ2aWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicGgyOiB2aWQgY2hhbmdlZCwgc2F2ZSAweCV4LCBjdXJyIDB4JXhcbiIsCisJCQlzYXZldmlkLCBkYXRhLT5jdXJydmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZHByaW50aygicGgyIGNvbXBsZXRlLCBjdXJyZmlkIDB4JXgsIGN1cnJ2aWQgMHgleFxuIiwKKwkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUGhhc2UgMyAtIGNvcmUgdm9sdGFnZSB0cmFuc2l0aW9uIGZsb3cgLi4uIGp1bXAgdG8gdGhlIGZpbmFsIHZpZC4gKi8KK3N0YXRpYyBpbnQgY29yZV92b2x0YWdlX3Bvc3RfdHJhbnNpdGlvbihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIHJlcXZpZCkKK3sKKwl1MzIgc2F2ZWZpZCA9IGRhdGEtPmN1cnJmaWQ7CisJdTMyIHNhdmVyZXF2aWQgPSByZXF2aWQ7CisKKwlkcHJpbnRrKCJwaDMgKGNwdSVkKTogc3RhcnRpbmcsIGN1cnJmaWQgMHgleCwgY3VycnZpZCAweCV4XG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksCisJCWRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOworCisJaWYgKHJlcXZpZCAhPSBkYXRhLT5jdXJydmlkKSB7CisJCWlmICh3cml0ZV9uZXdfdmlkKGRhdGEsIHJlcXZpZCkpCisJCQlyZXR1cm4gMTsKKworCQlpZiAoc2F2ZWZpZCAhPSBkYXRhLT5jdXJyZmlkKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkgICAgICAgInBoMzogYmFkIGZpZCBjaGFuZ2UsIHNhdmUgMHgleCwgY3VyciAweCV4XG4iLAorCQkJICAgICAgIHNhdmVmaWQsIGRhdGEtPmN1cnJmaWQpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAoZGF0YS0+Y3VycnZpZCAhPSByZXF2aWQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSAgICAgICAicGgzOiBmYWlsZWQgdmlkIHRyYW5zaXRpb25cbiwgcmVxIDB4JXgsIGN1cnIgMHgleCIsCisJCQkgICAgICAgcmVxdmlkLCBkYXRhLT5jdXJydmlkKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQorCQlyZXR1cm4gMTsKKworCWlmIChzYXZlcmVxdmlkICE9IGRhdGEtPmN1cnJ2aWQpIHsKKwkJZHByaW50aygicGgzIGZhaWxlZCwgY3VycnZpZCAweCV4XG4iLCBkYXRhLT5jdXJydmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHNhdmVmaWQgIT0gZGF0YS0+Y3VycmZpZCkgeworCQlkcHJpbnRrKCJwaDMgZmFpbGVkLCBjdXJyZmlkIGNoYW5nZWQgMHgleFxuIiwKKwkJCWRhdGEtPmN1cnJmaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkcHJpbnRrKCJwaDMgY29tcGxldGUsIGN1cnJmaWQgMHgleCwgY3VycnZpZCAweCV4XG4iLAorCQlkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJydmlkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX3N1cHBvcnRlZF9jcHUodW5zaWduZWQgaW50IGNwdSkKK3sKKwljcHVtYXNrX3Qgb2xkbWFzayA9IENQVV9NQVNLX0FMTDsKKwl1MzIgZWF4LCBlYngsIGVjeCwgZWR4OworCXVuc2lnbmVkIGludCByYyA9IDA7CisKKwlvbGRtYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoY3B1KSk7CisJc2NoZWR1bGUoKTsKKworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1KSB7CisJCXByaW50ayhLRVJOX0VSUiAibGltaXRpbmcgdG8gY3B1ICV1IGZhaWxlZFxuIiwgY3B1KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGN1cnJlbnRfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0FNRCkKKwkJZ290byBvdXQ7CisKKwllYXggPSBjcHVpZF9lYXgoQ1BVSURfUFJPQ0VTU09SX1NJR05BVFVSRSk7CisJaWYgKCgoZWF4ICYgQ1BVSURfVVNFX1hGQU1fWE1PRCkgIT0gQ1BVSURfVVNFX1hGQU1fWE1PRCkgfHwKKwkgICAgKChlYXggJiBDUFVJRF9YRkFNKSAhPSBDUFVJRF9YRkFNX0s4KSB8fAorCSAgICAoKGVheCAmIENQVUlEX1hNT0QpID4gQ1BVSURfWE1PRF9SRVZfRSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlByb2Nlc3NvciBjcHVpZCAleCBub3Qgc3VwcG9ydGVkXG4iLCBlYXgpOworCQlnb3RvIG91dDsKKwl9CisKKwllYXggPSBjcHVpZF9lYXgoQ1BVSURfR0VUX01BWF9DQVBBQklMSVRJRVMpOworCWlmIChlYXggPCBDUFVJRF9GUkVRX1ZPTFRfQ0FQQUJJTElUSUVTKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCSAgICAgICAiTm8gZnJlcXVlbmN5IGNoYW5nZSBjYXBhYmlsaXRpZXMgZGV0ZWN0ZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwljcHVpZChDUFVJRF9GUkVRX1ZPTFRfQ0FQQUJJTElUSUVTLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwlpZiAoKGVkeCAmIFBfU1RBVEVfVFJBTlNJVElPTl9DQVBBQkxFKSAhPSBQX1NUQVRFX1RSQU5TSVRJT05fQ0FQQUJMRSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUG93ZXIgc3RhdGUgdHJhbnNpdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gMTsKKworb3V0OgorCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgb2xkbWFzayk7CisJc2NoZWR1bGUoKTsKKwlyZXR1cm4gcmM7CisKK30KKworc3RhdGljIGludCBjaGVja19wc3RfdGFibGUoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHN0cnVjdCBwc3RfcyAqcHN0LCB1OCBtYXh2aWQpCit7CisJdW5zaWduZWQgaW50IGo7CisJdTggbGFzdGZpZCA9IDB4ZmY7CisKKwlmb3IgKGogPSAwOyBqIDwgZGF0YS0+bnVtcHM7IGorKykgeworCQlpZiAocHN0W2pdLnZpZCA+IExFQVNUX1ZJRCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmlkICVkIGludmFsaWQgOiAweCV4XG4iLCBqLCBwc3Rbal0udmlkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChwc3Rbal0udmlkIDwgZGF0YS0+cnZvKSB7CS8qIHZpZCArIHJ2byA+PSAwICovCisJCQlwcmludGsoS0VSTl9FUlIgQkZYICIwIHZpZCBleGNlZWRlZCB3aXRoIHBzdGF0ZSAlZFxuIiwgaik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlpZiAocHN0W2pdLnZpZCA8IG1heHZpZCArIGRhdGEtPnJ2bykgewkvKiB2aWQgKyBydm8gPj0gbWF4dmlkICovCisJCQlwcmludGsoS0VSTl9FUlIgQkZYICJtYXh2aWQgZXhjZWVkZWQgd2l0aCBwc3RhdGUgJWRcbiIsIGopOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKChwc3Rbal0uZmlkID4gTUFYX0ZJRCkKKwkJICAgIHx8IChwc3Rbal0uZmlkICYgMSkKKwkJICAgIHx8IChqICYmIChwc3Rbal0uZmlkIDwgSElfRklEX1RBQkxFX0JPVFRPTSkpKSB7CisJCQkvKiBPbmx5IGZpcnN0IGZpZCBpcyBhbGxvd2VkIHRvIGJlIGluICJsb3ciIHJhbmdlICovCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0d28gbG93IGZpZHMgLSAlZCA6IDB4JXhcbiIsIGosIHBzdFtqXS5maWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHBzdFtqXS5maWQgPCBsYXN0ZmlkKQorCQkJbGFzdGZpZCA9IHBzdFtqXS5maWQ7CisJfQorCWlmIChsYXN0ZmlkICYgMSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsYXN0ZmlkIGludmFsaWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGxhc3RmaWQgPiBMT19GSURfVEFCTEVfVE9QKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAgImZpcnN0IGZpZCBub3QgZnJvbSBsbyBmcmVxIHRhYmxlXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9iYXNpY3Moc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEpCit7CisJaW50IGo7CisJZm9yIChqID0gMDsgaiA8IGRhdGEtPm51bXBzOyBqKyspIHsKKwkJaWYgKGRhdGEtPnBvd2Vybm93X3RhYmxlW2pdLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQpCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiICAgJWQgOiBmaWQgMHgleCAoJWQgTUh6KSwgdmlkIDB4JXggKCVkIG1WKVxuIiwgaiwKKwkJCQlkYXRhLT5wb3dlcm5vd190YWJsZVtqXS5pbmRleCAmIDB4ZmYsCisJCQkJZGF0YS0+cG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5LzEwMDAsCisJCQkJZGF0YS0+cG93ZXJub3dfdGFibGVbal0uaW5kZXggPj4gOCwKKwkJCQlmaW5kX21pbGxpdm9sdHNfZnJvbV92aWQoZGF0YSwgZGF0YS0+cG93ZXJub3dfdGFibGVbal0uaW5kZXggPj4gOCkpOworCX0KKwlpZiAoZGF0YS0+YmF0cHMpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJPbmx5ICVkIHBzdGF0ZXMgb24gYmF0dGVyeVxuIiwgZGF0YS0+YmF0cHMpOworfQorCitzdGF0aWMgaW50IGZpbGxfcG93ZXJub3dfdGFibGUoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHN0cnVjdCBwc3RfcyAqcHN0LCB1OCBtYXh2aWQpCit7CisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpwb3dlcm5vd190YWJsZTsKKwl1bnNpZ25lZCBpbnQgajsKKworCWlmIChkYXRhLT5iYXRwcykgeyAgICAvKiB1c2UgQUNQSSBzdXBwb3J0IHRvIGdldCBmdWxsIHNwZWVkIG9uIG1haW5zIHBvd2VyICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJPbmx5ICVkIHBzdGF0ZXMgdXNhYmxlICh1c2UgQUNQSSBkcml2ZXIgZm9yIGZ1bGwgcmFuZ2VcbiIsIGRhdGEtPmJhdHBzKTsKKwkJZGF0YS0+bnVtcHMgPSBkYXRhLT5iYXRwczsKKwl9CisKKwlmb3IgKCBqPTE7IGo8ZGF0YS0+bnVtcHM7IGorKyApIHsKKwkJaWYgKHBzdFtqLTFdLmZpZCA+PSBwc3Rbal0uZmlkKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJQU1Qgb3V0IG9mIHNlcXVlbmNlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKGRhdGEtPm51bXBzIDwgMikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJubyBwIHN0YXRlcyB0byB0cmFuc2l0aW9uXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGNoZWNrX3BzdF90YWJsZShkYXRhLCBwc3QsIG1heHZpZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcG93ZXJub3dfdGFibGUgPSBrbWFsbG9jKChzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKQorCQkqIChkYXRhLT5udW1wcyArIDEpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwb3dlcm5vd190YWJsZSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJwb3dlcm5vd190YWJsZSBtZW1vcnkgYWxsb2MgZmFpbHVyZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaiA9IDA7IGogPCBkYXRhLT5udW1wczsgaisrKSB7CisJCXBvd2Vybm93X3RhYmxlW2pdLmluZGV4ID0gcHN0W2pdLmZpZDsgLyogbG93ZXIgOCBiaXRzICovCisJCXBvd2Vybm93X3RhYmxlW2pdLmluZGV4IHw9IChwc3Rbal0udmlkIDw8IDgpOyAvKiB1cHBlciA4IGJpdHMgKi8KKwkJcG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5ID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZChwc3Rbal0uZmlkKTsKKwl9CisJcG93ZXJub3dfdGFibGVbZGF0YS0+bnVtcHNdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCXBvd2Vybm93X3RhYmxlW2RhdGEtPm51bXBzXS5pbmRleCA9IDA7CisKKwlpZiAocXVlcnlfY3VycmVudF92YWx1ZXNfd2l0aF9wZW5kaW5nX3dhaXQoZGF0YSkpIHsKKwkJa2ZyZWUocG93ZXJub3dfdGFibGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkcHJpbnRrKCJjZmlkIDB4JXgsIGN2aWQgMHgleFxuIiwgZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CisJZGF0YS0+cG93ZXJub3dfdGFibGUgPSBwb3dlcm5vd190YWJsZTsKKwlwcmludF9iYXNpY3MoZGF0YSk7CisKKwlmb3IgKGogPSAwOyBqIDwgZGF0YS0+bnVtcHM7IGorKykKKwkJaWYgKChwc3Rbal0uZmlkPT1kYXRhLT5jdXJyZmlkKSAmJiAocHN0W2pdLnZpZD09ZGF0YS0+Y3VycnZpZCkpCisJCQlyZXR1cm4gMDsKKworCWRwcmludGsoImN1cnJmaWQvdmlkIGRvIG5vdCBtYXRjaCBQU1QsIGlnbm9yaW5nXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogRmluZCBhbmQgdmFsaWRhdGUgdGhlIFBTQi9QU1QgdGFibGUgaW4gQklPUy4gKi8KK3N0YXRpYyBpbnQgZmluZF9wc2JfdGFibGUoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHBzYl9zICpwc2I7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIG12czsKKwl1OCBtYXh2aWQ7CisJdTMyIGNwc3QgPSAwOworCXUzMiB0aGlzY3B1aWQ7CisKKwlmb3IgKGkgPSAweGMwMDAwOyBpIDwgMHhmZmZmMDsgaSArPSAweDEwKSB7CisJCS8qIFNjYW4gQklPUyBsb29raW5nIGZvciB0aGUgc2lnbmF0dXJlLiAqLworCQkvKiBJdCBjYW4gbm90IGJlIGF0IGZmZmYwIC0gaXQgaXMgdG9vIGJpZy4gKi8KKworCQlwc2IgPSBwaHlzX3RvX3ZpcnQoaSk7CisJCWlmIChtZW1jbXAocHNiLCBQU0JfSURfU1RSSU5HLCBQU0JfSURfU1RSSU5HX0xFTikgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWRwcmludGsoImZvdW5kIFBTQiBoZWFkZXIgYXQgMHglcFxuIiwgcHNiKTsKKworCQlkcHJpbnRrKCJ0YWJsZSB2ZXJzOiAweCV4XG4iLCBwc2ItPnRhYmxldmVyc2lvbik7CisJCWlmIChwc2ItPnRhYmxldmVyc2lvbiAhPSBQU0JfVkVSU0lPTl8xXzQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gQkZYICJQU0IgdGFibGUgaXMgbm90IHYxLjRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlkcHJpbnRrKCJmbGFnczogMHgleFxuIiwgcHNiLT5mbGFnczEpOworCQlpZiAocHNiLT5mbGFnczEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBCRlggInVua25vd24gZmxhZ3NcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlkYXRhLT52c3RhYmxlID0gcHNiLT52c3RhYmxlOworCQlkcHJpbnRrKCJ2b2x0YWdlIHN0YWJpbGl6YXRpb24gdGltZTogJWQoKjIwdXMpXG4iLCBkYXRhLT52c3RhYmxlKTsKKworCQlkcHJpbnRrKCJmbGFnczI6IDB4JXhcbiIsIHBzYi0+ZmxhZ3MyKTsKKwkJZGF0YS0+cnZvID0gcHNiLT5mbGFnczIgJiAzOworCQlkYXRhLT5pcnQgPSAoKHBzYi0+ZmxhZ3MyKSA+PiAyKSAmIDM7CisJCW12cyA9ICgocHNiLT5mbGFnczIpID4+IDQpICYgMzsKKwkJZGF0YS0+dmlkbXZzID0gMSA8PCBtdnM7CisJCWRhdGEtPmJhdHBzID0gKChwc2ItPmZsYWdzMikgPj4gNikgJiAzOworCisJCWRwcmludGsoInJhbXAgdm9sdGFnZSBvZmZzZXQ6ICVkXG4iLCBkYXRhLT5ydm8pOworCQlkcHJpbnRrKCJpc29jaHJvbm91cyByZWxpZWYgdGltZTogJWRcbiIsIGRhdGEtPmlydCk7CisJCWRwcmludGsoIm1heGltdW0gdm9sdGFnZSBzdGVwOiAlZCAtIDB4JXhcbiIsIG12cywgZGF0YS0+dmlkbXZzKTsKKworCQlkcHJpbnRrKCJudW1wc3Q6IDB4JXhcbiIsIHBzYi0+bnVtX3RhYmxlcyk7CisJCWNwc3QgPSBwc2ItPm51bV90YWJsZXM7CisJCWlmICgocHNiLT5jcHVpZCA9PSAweDAwMDAwZmMwKSB8fCAocHNiLT5jcHVpZCA9PSAweDAwMDAwZmUwKSApeworCQkJdGhpc2NwdWlkID0gY3B1aWRfZWF4KENQVUlEX1BST0NFU1NPUl9TSUdOQVRVUkUpOworCQkJaWYgKCh0aGlzY3B1aWQgPT0gMHgwMDAwMGZjMCkgfHwgKHRoaXNjcHVpZCA9PSAweDAwMDAwZmUwKSApIHsKKwkJCQljcHN0ID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoY3BzdCAhPSAxKSB7CisJCQlwcmludGsoS0VSTl9FUlIgQkZYICJudW1wc3QgbXVzdCBiZSAxXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJZGF0YS0+cGxsbG9jayA9IHBzYi0+cGxsbG9ja3RpbWU7CisJCWRwcmludGsoInBsbGxvY2t0aW1lOiAweCV4ICh1bml0cyAxdXMpXG4iLCBwc2ItPnBsbGxvY2t0aW1lKTsKKwkJZHByaW50aygibWF4ZmlkOiAweCV4XG4iLCBwc2ItPm1heGZpZCk7CisJCWRwcmludGsoIm1heHZpZDogMHgleFxuIiwgcHNiLT5tYXh2aWQpOworCQltYXh2aWQgPSBwc2ItPm1heHZpZDsKKworCQlkYXRhLT5udW1wcyA9IHBzYi0+bnVtcHM7CisJCWRwcmludGsoIm51bXBzdGF0ZXM6IDB4JXhcbiIsIGRhdGEtPm51bXBzKTsKKwkJcmV0dXJuIGZpbGxfcG93ZXJub3dfdGFibGUoZGF0YSwgKHN0cnVjdCBwc3RfcyAqKShwc2IrMSksIG1heHZpZCk7CisJfQorCS8qCisJICogSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIGNvbXBsYWluIHRvIEJJT1MgbWFudWZhY3R1cmVyLiBJZgorCSAqIGhlIHRlbGxzIHlvdSAid2UgZG8gbm90IHN1cHBvcnQgTGludXgiIG9yIHNvbWUgc2ltaWxhcgorCSAqIG5vbnNlbnNlLCByZW1lbWJlciB0aGF0IFdpbmRvd3MgMjAwMCB1c2VzIHRoZSBzYW1lIGxlZ2FjeQorCSAqIG1lY2hhbmlzbSB0aGF0IHRoZSBvbGQgTGludXggUFNCIGRyaXZlciB1c2VzLiBUZWxsIHRoZW0gaXQKKwkgKiBpcyBicm9rZW4gd2l0aCBXaW5kb3dzIDIwMDAuCisJICoKKwkgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBBTUQgZG9jdW1lbnRhdGlvbiBpcyBjaGFwdGVyIDkgaW4gdGhlCisJICogQklPUyBhbmQgS2VybmVsIERldmVsb3BlcidzIEd1aWRlLCB3aGljaCBpcyBhdmFpbGFibGUgb24KKwkgKiB3d3cuYW1kLmNvbQorCSAqLworCXByaW50ayhLRVJOX0VSUiBQRlggIkJJT1MgZXJyb3IgLSBubyBQU0JcbiIpOworCXJldHVybiAtRU5PREVWOworfQorCisjaWZkZWYgQ09ORklHX1g4Nl9QT1dFUk5PV19LOF9BQ1BJCitzdGF0aWMgdm9pZCBwb3dlcm5vd19rOF9hY3BpX3BzdF92YWx1ZXMoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlpZiAoIWRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCkKKwkJcmV0dXJuOworCisJZGF0YS0+aXJ0ID0gKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaW5kZXhdLmNvbnRyb2wgPj4gSVJUX1NISUZUKSAmIElSVF9NQVNLOworCWRhdGEtPnJ2byA9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2luZGV4XS5jb250cm9sID4+IFJWT19TSElGVCkgJiBSVk9fTUFTSzsKKwlkYXRhLT5wbGxsb2NrID0gKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaW5kZXhdLmNvbnRyb2wgPj4gUExMX0xfU0hJRlQpICYgUExMX0xfTUFTSzsKKwlkYXRhLT52aWRtdnMgPSAxIDw8ICgoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpbmRleF0uY29udHJvbCA+PiBNVlNfU0hJRlQpICYgTVZTX01BU0spOworCWRhdGEtPnZzdGFibGUgPSAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpbmRleF0uY29udHJvbCA+PiBWU1RfU0hJRlQpICYgVlNUX01BU0s7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXJub3dfazhfY3B1X2luaXRfYWNwaShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkKK3sKKwlpbnQgaTsKKwlpbnQgY250bG9mcmVxID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnBvd2Vybm93X3RhYmxlOworCisJaWYgKGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsIGRhdGEtPmNwdSkpIHsKKwkJZHByaW50aygicmVnaXN0ZXIgcGVyZm9ybWFuY2UgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogdmVyaWZ5IHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgQUNQSSBzdHJ1Y3R1cmVzICovCisJaWYgKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCA8PSAxKSB7CisJCWRwcmludGsoIk5vIEFDUEkgUC1TdGF0ZXNcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKChkYXRhLT5hY3BpX2RhdGEuY29udHJvbF9yZWdpc3Rlci5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkgfHwKKwkJKGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpKSB7CisJCWRwcmludGsoIkludmFsaWQgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXJzICgleCAtICV4KVxuIiwKKwkJCWRhdGEtPmFjcGlfZGF0YS5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkLAorCQkJZGF0YS0+YWNwaV9kYXRhLnN0YXR1c19yZWdpc3Rlci5zcGFjZV9pZCk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBmaWxsIGluIGRhdGEtPnBvd2Vybm93X3RhYmxlICovCisJcG93ZXJub3dfdGFibGUgPSBrbWFsbG9jKChzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKQorCQkqIChkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQgKyAxKSksIEdGUF9LRVJORUwpOworCWlmICghcG93ZXJub3dfdGFibGUpIHsKKwkJZHByaW50aygicG93ZXJub3dfdGFibGUgbWVtb3J5IGFsbG9jIGZhaWx1cmVcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudDsgaSsrKSB7CisJCXUzMiBmaWQgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvbnRyb2wgJiBGSURfTUFTSzsKKwkJdTMyIHZpZCA9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvbnRyb2wgPj4gVklEX1NISUZUKSAmIFZJRF9NQVNLOworCisJCWRwcmludGsoIiAgICVkIDogZmlkIDB4JXgsIHZpZCAweCV4XG4iLCBpLCBmaWQsIHZpZCk7CisKKwkJcG93ZXJub3dfdGFibGVbaV0uaW5kZXggPSBmaWQ7IC8qIGxvd2VyIDggYml0cyAqLworCQlwb3dlcm5vd190YWJsZVtpXS5pbmRleCB8PSAodmlkIDw8IDgpOyAvKiB1cHBlciA4IGJpdHMgKi8KKwkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZChmaWQpOworCisJCS8qIHZlcmlmeSBmcmVxdWVuY3kgaXMgT0sgKi8KKwkJaWYgKChwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPiAoTUFYX0ZSRVEgKiAxMDAwKSkgfHwKKwkJCShwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgPCAoTUlOX0ZSRVEgKiAxMDAwKSkpIHsKKwkJCWRwcmludGsoImludmFsaWQgZnJlcSAldSBrSHosIGlnbm9yaW5nXG4iLCBwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kpOworCQkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCQkJY29udGludWU7CisJCX0KKworCQkvKiB2ZXJpZnkgdm9sdGFnZSBpcyBPSyAtIEJJT1NzIGFyZSB1c2luZyAib2ZmIiB0byBpbmRpY2F0ZSBpbnZhbGlkICovCisJCWlmICh2aWQgPT0gMHgxZikgeworCQkJZHByaW50aygiaW52YWxpZCB2aWQgJXUsIGlnbm9yaW5nXG4iLCB2aWQpOworCQkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCQkJY29udGludWU7CisJCX0KKworIAkJaWYgKGZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pIHsKKyAJCQlpZiAoY250bG9mcmVxKSB7CisgCQkJCS8qIGlmIGJvdGggZW50cmllcyBhcmUgdGhlIHNhbWUsIGlnbm9yZSB0aGlzCisgCQkJCSAqIG9uZS4uLiAKKyAJCQkJICovCisgCQkJCWlmICgocG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ICE9IHBvd2Vybm93X3RhYmxlW2NudGxvZnJlcV0uZnJlcXVlbmN5KSB8fAorIAkJCQkgICAgKHBvd2Vybm93X3RhYmxlW2ldLmluZGV4ICE9IHBvd2Vybm93X3RhYmxlW2NudGxvZnJlcV0uaW5kZXgpKSB7CisgCQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJUb28gbWFueSBsbyBmcmVxIHRhYmxlIGVudHJpZXNcbiIpOworIAkJCQkJZ290byBlcnJfb3V0X21lbTsKKyAJCQkJfQorCQkJCQorIAkJCQlkcHJpbnRrKCJkb3VibGUgbG93IGZyZXF1ZW5jeSB0YWJsZSBlbnRyeSwgaWdub3JpbmcgaXQuXG4iKTsKKyAJCQkJcG93ZXJub3dfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworIAkJCQljb250aW51ZTsKKyAJCQl9IGVsc2UKKyAJCQkJY250bG9mcmVxID0gaTsKKwkJfQorCisJCWlmIChwb3dlcm5vd190YWJsZVtpXS5mcmVxdWVuY3kgIT0gKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImludmFsaWQgZnJlcSBlbnRyaWVzICV1IGtIeiB2cy4gJXUga0h6XG4iLAorCQkJCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSwKKwkJCQkodW5zaWduZWQgaW50KSAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDApKTsKKwkJCXBvd2Vybm93X3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJcG93ZXJub3dfdGFibGVbZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50XS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwlwb3dlcm5vd190YWJsZVtkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnRdLmluZGV4ID0gMDsKKwlkYXRhLT5wb3dlcm5vd190YWJsZSA9IHBvd2Vybm93X3RhYmxlOworCisJLyogZmlsbCBpbiBkYXRhICovCisJZGF0YS0+bnVtcHMgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQ7CisJcHJpbnRfYmFzaWNzKGRhdGEpOworCXBvd2Vybm93X2s4X2FjcGlfcHN0X3ZhbHVlcyhkYXRhLCAwKTsKKworCS8qIG5vdGlmeSBCSU9TIHRoYXQgd2UgZXhpc3QgKi8KKwlhY3BpX3Byb2Nlc3Nvcl9ub3RpZnlfc21tKFRISVNfTU9EVUxFKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X21lbToKKwlrZnJlZShwb3dlcm5vd190YWJsZSk7CisKK2Vycl9vdXQ6CisJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmZGF0YS0+YWNwaV9kYXRhLCBkYXRhLT5jcHUpOworCisJLyogZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50IGluZm9ybXMgdXMgYXQgLT5leGl0KCkgd2hldGhlciBBQ1BJIHdhcyB1c2VkICovCisJZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50ID0gMDsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBwb3dlcm5vd19rOF9jcHVfZXhpdF9hY3BpKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhKQoreworCWlmIChkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQpCisJCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJmRhdGEtPmFjcGlfZGF0YSwgZGF0YS0+Y3B1KTsKK30KKworI2Vsc2UKK3N0YXRpYyBpbnQgcG93ZXJub3dfazhfY3B1X2luaXRfYWNwaShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkgeyByZXR1cm4gLUVOT0RFVjsgfQorc3RhdGljIHZvaWQgcG93ZXJub3dfazhfY3B1X2V4aXRfYWNwaShzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSkgeyByZXR1cm47IH0KK3N0YXRpYyB2b2lkIHBvd2Vybm93X2s4X2FjcGlfcHN0X3ZhbHVlcyhzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGluZGV4KSB7IHJldHVybjsgfQorI2VuZGlmIC8qIENPTkZJR19YODZfUE9XRVJOT1dfSzhfQUNQSSAqLworCisvKiBUYWtlIGEgZnJlcXVlbmN5LCBhbmQgaXNzdWUgdGhlIGZpZC92aWQgdHJhbnNpdGlvbiBjb21tYW5kICovCitzdGF0aWMgaW50IHRyYW5zaXRpb25fZnJlcXVlbmN5KHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdTMyIGZpZDsKKwl1MzIgdmlkOworCWludCByZXM7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisKKwlkcHJpbnRrKCJjcHUgJWQgdHJhbnNpdGlvbiB0byBpbmRleCAldVxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBpbmRleCk7CisKKwkvKiBmaWQgYXJlIHRoZSBsb3dlciA4IGJpdHMgb2YgdGhlIGluZGV4IHdlIHN0b3JlZCBpbnRvCisJICogdGhlIGNwdWZyZXEgZnJlcXVlbmN5IHRhYmxlIGluIGZpbmRfcHNiX3RhYmxlLCB2aWQgYXJlIAorCSAqIHRoZSB1cHBlciA4IGJpdHMuCisJICovCisKKwlmaWQgPSBkYXRhLT5wb3dlcm5vd190YWJsZVtpbmRleF0uaW5kZXggJiAweEZGOworCXZpZCA9IChkYXRhLT5wb3dlcm5vd190YWJsZVtpbmRleF0uaW5kZXggJiAweEZGMDApID4+IDg7CisKKwlkcHJpbnRrKCJ0YWJsZSBtYXRjaGVkIGZpZCAweCV4LCBnaXZpbmcgdmlkIDB4JXhcbiIsIGZpZCwgdmlkKTsKKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKGRhdGEtPmN1cnJ2aWQgPT0gdmlkKSAmJiAoZGF0YS0+Y3VycmZpZCA9PSBmaWQpKSB7CisJCWRwcmludGsoInRhcmdldCBtYXRjaGVzIGN1cnJlbnQgdmFsdWVzIChmaWQgMHgleCwgdmlkIDB4JXgpXG4iLAorCQkJZmlkLCB2aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGZpZCA8IEhJX0ZJRF9UQUJMRV9CT1RUT00pICYmIChkYXRhLT5jdXJyZmlkIDwgSElfRklEX1RBQkxFX0JPVFRPTSkpIHsKKwkJcHJpbnRrKCJpZ25vcmluZyBpbGxlZ2FsIGNoYW5nZSBpbiBsbyBmcmVxIHRhYmxlLSV4IHRvIDB4JXhcbiIsCisJCSAgICAgICBkYXRhLT5jdXJyZmlkLCBmaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkcHJpbnRrKCJjcHUgJWQsIGNoYW5naW5nIHRvIGZpZCAweCV4LCB2aWQgMHgleFxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBmaWQsIHZpZCk7CisKKwlmcmVxcy5jcHUgPSBkYXRhLT5jcHU7CisKKwlmcmVxcy5vbGQgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGRhdGEtPmN1cnJmaWQpOworCWZyZXFzLm5ldyA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZmlkKTsKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJZG93bigmZmlkdmlkX3NlbSk7CisJcmVzID0gdHJhbnNpdGlvbl9maWRfdmlkKGRhdGEsIGZpZCwgdmlkKTsKKwl1cCgmZmlkdmlkX3NlbSk7CisKKwlmcmVxcy5uZXcgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGRhdGEtPmN1cnJmaWQpOworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuIHJlczsKK30KKworLyogRHJpdmVyIGVudHJ5IHBvaW50IHRvIHN3aXRjaCB0byB0aGUgdGFyZ2V0IGZyZXF1ZW5jeSAqLworc3RhdGljIGludCBwb3dlcm5vd2s4X3RhcmdldChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbCwgdW5zaWduZWQgdGFyZ2ZyZXEsIHVuc2lnbmVkIHJlbGF0aW9uKQoreworCWNwdW1hc2tfdCBvbGRtYXNrID0gQ1BVX01BU0tfQUxMOworCXN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhID0gcG93ZXJub3dfZGF0YVtwb2wtPmNwdV07CisJdTMyIGNoZWNrZmlkID0gZGF0YS0+Y3VycmZpZDsKKwl1MzIgY2hlY2t2aWQgPSBkYXRhLT5jdXJydmlkOworCXVuc2lnbmVkIGludCBuZXdzdGF0ZTsKKwlpbnQgcmV0ID0gLUVJTzsKKworCS8qIG9ubHkgcnVuIG9uIHNwZWNpZmljIENQVSBmcm9tIGhlcmUgb24gKi8KKwlvbGRtYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUocG9sLT5jcHUpKTsKKwlzY2hlZHVsZSgpOworCisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSBwb2wtPmNwdSkgeworCQlwcmludGsoS0VSTl9FUlIgImxpbWl0aW5nIHRvIGNwdSAldSBmYWlsZWRcbiIsIHBvbC0+Y3B1KTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmIChwZW5kaW5nX2JpdF9zdHVjaygpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxpbmcgdGFyZywgY2hhbmdlIHBlbmRpbmcgYml0IHNldFxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlkcHJpbnRrKCJ0YXJnOiBjcHUgJWQsICVkIGtIeiwgbWluICVkLCBtYXggJWQsIHJlbGF0aW9uICVkXG4iLAorCQlwb2wtPmNwdSwgdGFyZ2ZyZXEsIHBvbC0+bWluLCBwb2wtPm1heCwgcmVsYXRpb24pOworCisJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlkcHJpbnRrKCJ0YXJnOiBjdXJyIGZpZCAweCV4LCB2aWQgMHgleFxuIiwKKwkJZGF0YS0+Y3VycmZpZCwgZGF0YS0+Y3VycnZpZCk7CisKKwlpZiAoKGNoZWNrdmlkICE9IGRhdGEtPmN1cnJ2aWQpIHx8IChjaGVja2ZpZCAhPSBkYXRhLT5jdXJyZmlkKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiZXJyb3IgLSBvdXQgb2Ygc3luYywgZmlkIDB4JXggMHgleCwgdmlkIDB4JXggMHgleFxuIiwKKwkJICAgICAgIGNoZWNrZmlkLCBkYXRhLT5jdXJyZmlkLCBjaGVja3ZpZCwgZGF0YS0+Y3VycnZpZCk7CisJfQorCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2wsIGRhdGEtPnBvd2Vybm93X3RhYmxlLCB0YXJnZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCisJCWdvdG8gZXJyX291dDsKKworCXBvd2Vybm93X2s4X2FjcGlfcHN0X3ZhbHVlcyhkYXRhLCBuZXdzdGF0ZSk7CisKKwlpZiAodHJhbnNpdGlvbl9mcmVxdWVuY3koZGF0YSwgbmV3c3RhdGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInRyYW5zaXRpb24gZnJlcXVlbmN5IGZhaWxlZFxuIik7CisJCXJldCA9IDE7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlwb2wtPmN1ciA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CisJcmV0ID0gMDsKKworZXJyX291dDoKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZG1hc2spOworCXNjaGVkdWxlKCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBEcml2ZXIgZW50cnkgcG9pbnQgdG8gdmVyaWZ5IHRoZSBwb2xpY3kgYW5kIHJhbmdlIG9mIGZyZXF1ZW5jaWVzICovCitzdGF0aWMgaW50IHBvd2Vybm93azhfdmVyaWZ5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9sKQoreworCXN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhID0gcG93ZXJub3dfZGF0YVtwb2wtPmNwdV07CisKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbCwgZGF0YS0+cG93ZXJub3dfdGFibGUpOworfQorCisvKiBwZXIgQ1BVIGluaXQgZW50cnkgcG9pbnQgdG8gdGhlIGRyaXZlciAqLworc3RhdGljIGludCBfX2luaXQgcG93ZXJub3drOF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbCkKK3sKKwlzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YTsKKwljcHVtYXNrX3Qgb2xkbWFzayA9IENQVV9NQVNLX0FMTDsKKwlpbnQgcmM7CisKKwlpZiAoIWNoZWNrX3N1cHBvcnRlZF9jcHUocG9sLT5jcHUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2MgcG93ZXJub3dfazhfZGF0YSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGRhdGEsMCxzaXplb2Yoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEpKTsKKworCWRhdGEtPmNwdSA9IHBvbC0+Y3B1OworCisJaWYgKHBvd2Vybm93X2s4X2NwdV9pbml0X2FjcGkoZGF0YSkpIHsKKwkJLyoKKwkJICogVXNlIHRoZSBQU0IgQklPUyBzdHJ1Y3R1cmUuIFRoaXMgaXMgb25seSBhdmFpbGFiZSBvbgorCQkgKiBhbiBVUCB2ZXJzaW9uLCBhbmQgaXMgZGVwcmVjYXRlZCBieSBBTUQuCisJCSAqLworCisJCWlmICgobnVtX29ubGluZV9jcHVzKCkgIT0gMSkgfHwgKG51bV9wb3NzaWJsZV9jcHVzKCkgIT0gMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJNUCBzeXN0ZW1zIG5vdCBzdXBwb3J0ZWQgYnkgUFNCIEJJT1Mgc3RydWN0dXJlXG4iKTsKKwkJCWtmcmVlKGRhdGEpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKHBvbC0+Y3B1ICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggImluaXQgbm90IGNwdSAwXG4iKTsKKwkJCWtmcmVlKGRhdGEpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJcmMgPSBmaW5kX3BzYl90YWJsZShkYXRhKTsKKwkJaWYgKHJjKSB7CisJCQlrZnJlZShkYXRhKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyogb25seSBydW4gb24gc3BlY2lmaWMgQ1BVIGZyb20gaGVyZSBvbiAqLworCW9sZG1hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShwb2wtPmNwdSkpOworCXNjaGVkdWxlKCk7CisKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IHBvbC0+Y3B1KSB7CisJCXByaW50ayhLRVJOX0VSUiAibGltaXRpbmcgdG8gY3B1ICV1IGZhaWxlZFxuIiwgcG9sLT5jcHUpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKHBlbmRpbmdfYml0X3N0dWNrKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGluZyBpbml0LCBjaGFuZ2UgcGVuZGluZyBiaXQgc2V0XG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJZ290byBlcnJfb3V0OworCisJZmlkdmlkX21zcl9pbml0KCk7CisKKwkvKiBydW4gb24gYW55IENQVSBhZ2FpbiAqLworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgb2xkbWFzayk7CisJc2NoZWR1bGUoKTsKKworCXBvbC0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisKKwkvKiBUYWtlIGEgY3J1ZGUgZ3Vlc3MgaGVyZS4gCisJICogVGhhdCBndWVzcyB3YXMgaW4gbWljcm9zZWNvbmRzLCBzbyBtdWx0aXBseSB3aXRoIDEwMDAgKi8KKwlwb2wtPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gKCgoZGF0YS0+cnZvICsgOCkgKiBkYXRhLT52c3RhYmxlICogVlNUX1VOSVRTXzIwVVMpCisJICAgICsgKDMgKiAoMSA8PCBkYXRhLT5pcnQpICogMTApKSAqIDEwMDA7CisKKwlwb2wtPmN1ciA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CisJZHByaW50aygicG9saWN5IGN1cnJlbnQgZnJlcXVlbmN5ICVkIGtIelxuIiwgcG9sLT5jdXIpOworCisJLyogbWluL21heCB0aGUgY3B1IGlzIGNhcGFibGUgb2YgKi8KKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2wsIGRhdGEtPnBvd2Vybm93X3RhYmxlKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbnZhbGlkIHBvd2Vybm93X3RhYmxlXG4iKTsKKwkJcG93ZXJub3dfazhfY3B1X2V4aXRfYWNwaShkYXRhKTsKKwkJa2ZyZWUoZGF0YS0+cG93ZXJub3dfdGFibGUpOworCQlrZnJlZShkYXRhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoZGF0YS0+cG93ZXJub3dfdGFibGUsIHBvbC0+Y3B1KTsKKworCXByaW50aygiY3B1X2luaXQgZG9uZSwgY3VycmVudCBmaWQgMHgleCwgdmlkIDB4JXhcbiIsCisJICAgICAgIGRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOworCisJcG93ZXJub3dfZGF0YVtwb2wtPmNwdV0gPSBkYXRhOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBvbGRtYXNrKTsKKwlzY2hlZHVsZSgpOworCXBvd2Vybm93X2s4X2NwdV9leGl0X2FjcGkoZGF0YSk7CisKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcG93ZXJub3drOF9jcHVfZXhpdCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2wpCit7CisJc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEgPSBwb3dlcm5vd19kYXRhW3BvbC0+Y3B1XTsKKworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwb3dlcm5vd19rOF9jcHVfZXhpdF9hY3BpKGRhdGEpOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9sLT5jcHUpOworCisJa2ZyZWUoZGF0YS0+cG93ZXJub3dfdGFibGUpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG93ZXJub3drOF9nZXQgKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEgPSBwb3dlcm5vd19kYXRhW2NwdV07CisJY3B1bWFza190IG9sZG1hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJdW5zaWduZWQgaW50IGtoeiA9IDA7CisKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImxpbWl0aW5nIHRvIENQVSAlZCBmYWlsZWQgaW4gcG93ZXJub3drOF9nZXRcbiIsIGNwdSk7CisJCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgb2xkbWFzayk7CisJCXJldHVybiAwOworCX0KKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKKwkJZ290byBvdXQ7CisKKwlraHogPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGRhdGEtPmN1cnJmaWQpOworCisgb3V0OgorCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIG9sZG1hc2spOworCisJcmV0dXJuIGtoejsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIHBvd2Vybm93X2s4X2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgY3B1ZnJlcV9hbWQ2NF9kcml2ZXIgPSB7CisJLnZlcmlmeSA9IHBvd2Vybm93azhfdmVyaWZ5LAorCS50YXJnZXQgPSBwb3dlcm5vd2s4X3RhcmdldCwKKwkuaW5pdCA9IHBvd2Vybm93azhfY3B1X2luaXQsCisJLmV4aXQgPSBfX2RldmV4aXRfcChwb3dlcm5vd2s4X2NwdV9leGl0KSwKKwkuZ2V0ID0gcG93ZXJub3drOF9nZXQsCisJLm5hbWUgPSAicG93ZXJub3ctazgiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5hdHRyID0gcG93ZXJub3dfazhfYXR0ciwKK307CisKKy8qIGRyaXZlciBlbnRyeSBwb2ludCBmb3IgaW5pdCAqLworc3RhdGljIGludCBfX2luaXQgcG93ZXJub3drOF9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGksIHN1cHBvcnRlZF9jcHVzID0gMDsKKworCWZvciAoaT0wOyBpPE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNwdV9vbmxpbmUoaSkpCisJCQljb250aW51ZTsKKwkJaWYgKGNoZWNrX3N1cHBvcnRlZF9jcHUoaSkpCisJCQlzdXBwb3J0ZWRfY3B1cysrOworCX0KKworCWlmIChzdXBwb3J0ZWRfY3B1cyA9PSBudW1fb25saW5lX2NwdXMoKSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiRm91bmQgJWQgQU1EIEF0aGxvbiA2NCAvIE9wdGVyb24gcHJvY2Vzc29ycyAoIiBWRVJTSU9OICIpXG4iLAorCQkJc3VwcG9ydGVkX2NwdXMpOworCQlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmNwdWZyZXFfYW1kNjRfZHJpdmVyKTsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogZHJpdmVyIGVudHJ5IHBvaW50IGZvciB0ZXJtICovCitzdGF0aWMgdm9pZCBfX2V4aXQgcG93ZXJub3drOF9leGl0KHZvaWQpCit7CisJZHByaW50aygiZXhpdFxuIik7CisKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZjcHVmcmVxX2FtZDY0X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlBhdWwgRGV2cmllbmR0IDxwYXVsLmRldnJpZW5kdEBhbWQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTUQgQXRobG9uIDY0IGFuZCBPcHRlcm9uIHByb2Nlc3NvciBmcmVxdWVuY3kgZHJpdmVyLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitsYXRlX2luaXRjYWxsKHBvd2Vybm93azhfaW5pdCk7Cittb2R1bGVfZXhpdChwb3dlcm5vd2s4X2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5oIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWJjODQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiAgKGMpIDIwMDMsIDIwMDQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICogIFlvdXIgdXNlIG9mIHRoaXMgY29kZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqICBHTlUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSB2ZXJzaW9uIDIuIFNlZSAiQ09QWUlORyIgb3IKKyAqICBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKKyAqLworCitzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSB7CisJdW5zaWduZWQgaW50IGNwdTsKKworCXUzMiBudW1wczsgIC8qIG51bWJlciBvZiBwLXN0YXRlcyAqLworCXUzMiBiYXRwczsgIC8qIG51bWJlciBvZiBwLXN0YXRlcyBzdXBwb3J0ZWQgb24gYmF0dGVyeSAqLworCisJLyogdGhlc2UgdmFsdWVzIGFyZSBjb25zdGFudCB3aGVuIHRoZSBQU0IgaXMgdXNlZCB0byBkZXRlcm1pbmUKKwkgKiB2aWQvZmlkIHBhaXJpbmdzLCBidXQgYXJlIG1vZGlmaWVkIGR1cmluZyB0aGUgLT50YXJnZXQoKSBjYWxsCisJICogd2hlbiBBQ1BJIGlzIHVzZWQgKi8KKwl1MzIgcnZvOyAgICAgLyogcmFtcCB2b2x0YWdlIG9mZnNldCAqLworCXUzMiBpcnQ7ICAgICAvKiBpc29jaHJvbm91cyByZWxpZWYgdGltZSAqLworCXUzMiB2aWRtdnM7ICAvKiB1c2FibGUgdmFsdWUgY2FsY3VsYXRlZCBmcm9tIG12cyAqLworCXUzMiB2c3RhYmxlOyAvKiB2b2x0YWdlIHN0YWJpbGl6YXRpb24gdGltZSwgdW5pdHMgMjAgdXMgKi8KKwl1MzIgcGxsbG9jazsgLyogcGxsIGxvY2sgdGltZSwgdW5pdHMgMSB1cyAqLworCisJLyoga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBmaWQgLyB2aWQgKi8KKwl1MzIgY3VycnZpZCwgY3VycmZpZDsKKworCS8qIHRoZSBwb3dlcm5vd190YWJsZSBpbmNsdWRlcyBhbGwgZnJlcXVlbmN5IGFuZCB2aWQvZmlkIHBhaXJpbmdzOgorCSAqIGZpZCBhcmUgdGhlIGxvd2VyIDggYml0cyBvZiB0aGUgaW5kZXgsIHZpZCBhcmUgdGhlIHVwcGVyIDggYml0cy4KKwkgKiBmcmVxdWVuY3kgaXMgaW4ga0h6ICovCisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICAqcG93ZXJub3dfdGFibGU7CisKKyNpZmRlZiBDT05GSUdfWDg2X1BPV0VSTk9XX0s4X0FDUEkKKwkvKiB0aGUgYWNwaSB0YWJsZSBuZWVkcyB0byBiZSBrZXB0LiBpdCdzIG9ubHkgYXZhaWxhYmxlIGlmIEFDUEkgd2FzCisJICogdXNlZCB0byBkZXRlcm1pbmUgdmFsaWQgZnJlcXVlbmN5L3ZpZC9maWQgc3RhdGVzICovCisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlIGFjcGlfZGF0YTsKKyNlbmRpZgorfTsKKworCisvKiBwcm9jZXNzb3IncyBjcHVpZCBpbnN0cnVjdGlvbiBzdXBwb3J0ICovCisjZGVmaW5lIENQVUlEX1BST0NFU1NPUl9TSUdOQVRVUkUJMQkvKiBmdW5jdGlvbiAxICovCisjZGVmaW5lIENQVUlEX1hGQU0JCQkweDBmZjAwMDAwCS8qIGV4dGVuZGVkIGZhbWlseSAqLworI2RlZmluZSBDUFVJRF9YRkFNX0s4CQkJMAorI2RlZmluZSBDUFVJRF9YTU9ECQkJMHgwMDBmMDAwMAkvKiBleHRlbmRlZCBtb2RlbCAqLworI2RlZmluZSBDUFVJRF9YTU9EX1JFVl9FCQkweDAwMDIwMDAwCisjZGVmaW5lIENQVUlEX1VTRV9YRkFNX1hNT0QJCTB4MDAwMDBmMDAKKyNkZWZpbmUgQ1BVSURfR0VUX01BWF9DQVBBQklMSVRJRVMJMHg4MDAwMDAwMAorI2RlZmluZSBDUFVJRF9GUkVRX1ZPTFRfQ0FQQUJJTElUSUVTCTB4ODAwMDAwMDcKKyNkZWZpbmUgUF9TVEFURV9UUkFOU0lUSU9OX0NBUEFCTEUJNgorCisvKiBNb2RlbCBTcGVjaWZpYyBSZWdpc3RlcnMgZm9yIHAtc3RhdGUgdHJhbnNpdGlvbnMuIE1TUnMgYXJlIDY0LWJpdC4gRm9yICAgICAqLworLyogd3JpdGVzICh3cm1zciAtIG9wY29kZSAwZiAzMCksIHRoZSByZWdpc3RlciBudW1iZXIgaXMgcGxhY2VkIGluIGVjeCwgYW5kICAgKi8KKy8qIHRoZSB2YWx1ZSB0byB3cml0ZSBpcyBwbGFjZWQgaW4gZWR4OmVheC4gRm9yIHJlYWRzIChyZG1zciAtIG9wY29kZSAwZiAzMiksICovCisvKiB0aGUgcmVnaXN0ZXIgbnVtYmVyIGlzIHBsYWNlZCBpbiBlY3gsIGFuZCB0aGUgZGF0YSBpcyByZXR1cm5lZCBpbiBlZHg6ZWF4LiAqLworCisjZGVmaW5lIE1TUl9GSURWSURfQ1RMICAgICAgMHhjMDAxMDA0MQorI2RlZmluZSBNU1JfRklEVklEX1NUQVRVUyAgIDB4YzAwMTAwNDIKKworLyogRmllbGQgZGVmaW5pdGlvbnMgd2l0aGluIHRoZSBGSUQgVklEIExvdyBDb250cm9sIE1TUiA6ICovCisjZGVmaW5lIE1TUl9DX0xPX0lOSVRfRklEX1ZJRCAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBNU1JfQ19MT19ORVdfVklEICAgICAgICAgIDB4MDAwMDFmMDAKKyNkZWZpbmUgTVNSX0NfTE9fTkVXX0ZJRCAgICAgICAgICAweDAwMDAwMDJmCisjZGVmaW5lIE1TUl9DX0xPX1ZJRF9TSElGVCAgICAgICAgOAorCisvKiBGaWVsZCBkZWZpbml0aW9ucyB3aXRoaW4gdGhlIEZJRCBWSUQgSGlnaCBDb250cm9sIE1TUiA6ICovCisjZGVmaW5lIE1TUl9DX0hJX1NUUF9HTlRfVE8gICAgICAgMHgwMDBmZmZmZgorCisvKiBGaWVsZCBkZWZpbml0aW9ucyB3aXRoaW4gdGhlIEZJRCBWSUQgTG93IFN0YXR1cyBNU1IgOiAqLworI2RlZmluZSBNU1JfU19MT19DSEFOR0VfUEVORElORyAgIDB4ODAwMDAwMDAJLyogY2xlYXJlZCB3aGVuIGNvbXBsZXRlZCAqLworI2RlZmluZSBNU1JfU19MT19NQVhfUkFNUF9WSUQgICAgIDB4MWYwMDAwMDAKKyNkZWZpbmUgTVNSX1NfTE9fTUFYX0ZJRCAgICAgICAgICAweDAwM2YwMDAwCisjZGVmaW5lIE1TUl9TX0xPX1NUQVJUX0ZJRCAgICAgICAgMHgwMDAwM2YwMAorI2RlZmluZSBNU1JfU19MT19DVVJSRU5UX0ZJRCAgICAgIDB4MDAwMDAwM2YKKworLyogRmllbGQgZGVmaW5pdGlvbnMgd2l0aGluIHRoZSBGSUQgVklEIEhpZ2ggU3RhdHVzIE1TUiA6ICovCisjZGVmaW5lIE1TUl9TX0hJX01BWF9XT1JLSU5HX1ZJRCAgMHgwMDFmMDAwMAorI2RlZmluZSBNU1JfU19ISV9TVEFSVF9WSUQgICAgICAgIDB4MDAwMDFmMDAKKyNkZWZpbmUgTVNSX1NfSElfQ1VSUkVOVF9WSUQgICAgICAweDAwMDAwMDFmCisjZGVmaW5lIE1TUl9DX0hJX1NUUF9HTlRfQkVOSUdOICAgMHgwMDAwMDAwMQorCisvKgorICogVGhlcmUgYXJlIHJlc3RyaWN0aW9ucyBmcmVxdWVuY2llcyBoYXZlIHRvIGZvbGxvdzoKKyAqIC0gb25seSAxIGVudHJ5IGluIHRoZSBsb3cgZmlkIHRhYmxlICggPD0xLjRHSHogKQorICogLSBsb3dlc3QgZW50cnkgaW4gdGhlIGhpZ2ggZmlkIHRhYmxlIG11c3QgYmUgPj0gMiAqIHRoZSBlbnRyeSBpbiB0aGUKKyAqICAgbG93IGZpZCB0YWJsZQorICogLSBsb3dlc3QgZW50cnkgaW4gdGhlIGhpZ2ggZmlkIHRhYmxlIG11c3QgYmUgYSA8PSAyMDBNSHogKyAyICogdGhlIGVudHJ5CisgKiAgIGluIHRoZSBsb3cgZmlkIHRhYmxlCisgKiAtIHRoZSBwYXJ0cyBjYW4gb25seSBzdGVwIGF0IDIwMCBNSHogaW50ZXJ2YWxzLCBzbyAxLjkgR0h6IGlzIG5ldmVyIHZhbGlkCisgKiAtIGxvd2VzdCBmcmVxdWVuY3kgbXVzdCBiZSA+PSBpbnRlcnByb2Nlc3NvciBoeXBlcnRyYW5zcG9ydCBsaW5rIHNwZWVkCisgKiAgIChvbmx5IGFwcGxpZXMgdG8gTVAgc3lzdGVtcyBvYnZpb3VzbHkpCisgKi8KKworLyogZmlkcyAoZnJlcXVlbmN5IGlkZW50aWZpZXJzKSBhcmUgYXJyYW5nZWQgaW4gMiB0YWJsZXMgLSBsbyBhbmQgaGkgKi8KKyNkZWZpbmUgTE9fRklEX1RBQkxFX1RPUCAgICAgNgkvKiBmaWQgdmFsdWVzIG1hcmtpbmcgdGhlIGJvdW5kYXJ5ICAgICovCisjZGVmaW5lIEhJX0ZJRF9UQUJMRV9CT1RUT00gIDgJLyogYmV0d2VlbiB0aGUgbG93IGFuZCBoaWdoIHRhYmxlcyAgICAqLworCisjZGVmaW5lIExPX1ZDT0ZSRVFfVEFCTEVfVE9QICAgIDE0MDAJLyogY29ycmVzcG9uZGluZyB2Y28gZnJlcXVlbmN5IHZhbHVlcyAqLworI2RlZmluZSBISV9WQ09GUkVRX1RBQkxFX0JPVFRPTSAxNjAwCisKKyNkZWZpbmUgTUlOX0ZSRVFfUkVTT0xVVElPTiAgMjAwIC8qIGZpZHMganVtcCBieSAyIG1hdGNoaW5nIGZyZXEganVtcHMgYnkgMjAwICovCisKKyNkZWZpbmUgTUFYX0ZJRCAweDJhCS8qIFNwZWMgb25seSBnaXZlcyBGSUQgdmFsdWVzIGFzIGZhciBhcyA1IEdIeiAqLworI2RlZmluZSBMRUFTVF9WSUQgMHgxZQkvKiBMb3dlc3QgKG51bWVyaWNhbGx5IGhpZ2hlc3QpIHVzZWZ1bCB2aWQgdmFsdWUgKi8KKworI2RlZmluZSBNSU5fRlJFUSA4MDAJLyogTWluIGFuZCBtYXggZnJlcXMsIHBlciBzcGVjICovCisjZGVmaW5lIE1BWF9GUkVRIDUwMDAKKworI2RlZmluZSBJTlZBTElEX0ZJRF9NQVNLIDB4ZmZmZmZmYzEgIC8qIG5vdCBhIHZhbGlkIGZpZCBpZiB0aGVzZSBiaXRzIGFyZSBzZXQgKi8KKyNkZWZpbmUgSU5WQUxJRF9WSURfTUFTSyAweGZmZmZmZmUwICAvKiBub3QgYSB2YWxpZCB2aWQgaWYgdGhlc2UgYml0cyBhcmUgc2V0ICovCisKKyNkZWZpbmUgU1RPUF9HUkFOVF81TlMgMSAvKiBtaW4gcG9zcyBtZW1vcnkgYWNjZXNzIGxhdGVuY3kgZm9yIHZvbHRhZ2UgY2hhbmdlICovCisKKyNkZWZpbmUgUExMX0xPQ0tfQ09OVkVSU0lPTiAoMTAwMC81KSAvKiBtcyB0byBucywgdGhlbiBkaXZpZGUgYnkgY2xvY2sgcGVyaW9kICovCisKKyNkZWZpbmUgTUFYSU1VTV9WSURfU1RFUFMgMSAgLyogQ3VycmVudCBjcHVzIG9ubHkgYWxsb3cgYSBzaW5nbGUgc3RlcCBvZiAyNW1WICovCisjZGVmaW5lIFZTVF9VTklUU18yMFVTIDIwICAgLyogVm9sdGFnZSBTdGFiYWxpemF0aW9uIFRpbWUgaXMgaW4gdW5pdHMgb2YgMjB1cyAqLworCisvKgorICogTW9zdCB2YWx1ZXMgb2YgaW50ZXJlc3QgYXJlIGVub2NvZGVkIGluIGEgc2luZ2xlIGZpZWxkIG9mIHRoZSBfUFNTCisgKiBlbnRyaWVzOiB0aGUgImNvbnRyb2wiIHZhbHVlLgorICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIElSVF9TSElGVCAgICAgIDMwCisjZGVmaW5lIFJWT19TSElGVCAgICAgIDI4CisjZGVmaW5lIFBMTF9MX1NISUZUICAgIDIwCisjZGVmaW5lIE1WU19TSElGVCAgICAgIDE4CisjZGVmaW5lIFZTVF9TSElGVCAgICAgIDExCisjZGVmaW5lIFZJRF9TSElGVCAgICAgICA2CisjZGVmaW5lIElSVF9NQVNLICAgICAgICAzCisjZGVmaW5lIFJWT19NQVNLICAgICAgICAzCisjZGVmaW5lIFBMTF9MX01BU0sgICAweDdmCisjZGVmaW5lIE1WU19NQVNLICAgICAgICAzCisjZGVmaW5lIFZTVF9NQVNLICAgICAweDdmCisjZGVmaW5lIFZJRF9NQVNLICAgICAweDFmCisjZGVmaW5lIEZJRF9NQVNLICAgICAweDNmCisKKworLyoKKyAqIFZlcnNpb24gMS40IG9mIHRoZSBQU0IgdGFibGUuIFRoaXMgdGFibGUgaXMgY29uc3RydWN0ZWQgYnkgQklPUyBhbmQgaXMKKyAqIHRvIHRlbGwgdGhlIE9TJ3MgcG93ZXIgbWFuYWdlbWVudCBkcml2ZXIgd2hpY2ggVklEcyBhbmQgRklEcyBhcmUKKyAqIHN1cHBvcnRlZCBieSB0aGlzIHBhcnRpY3VsYXIgcHJvY2Vzc29yLgorICogSWYgdGhlIGRhdGEgaW4gdGhlIFBTQiAvIFBTVCBpcyB3cm9uZywgdGhlbiB0aGlzIGRyaXZlciB3aWxsIHByb2dyYW0gdGhlCisgKiB3cm9uZyB2YWx1ZXMgaW50byBoYXJkd2FyZSwgd2hpY2ggaXMgdmVyeSBsaWtlbHkgdG8gbGVhZCB0byBhIGNyYXNoLgorICovCisKKyNkZWZpbmUgUFNCX0lEX1NUUklORyAgICAgICJBTURLN1BOT1chIgorI2RlZmluZSBQU0JfSURfU1RSSU5HX0xFTiAgMTAKKworI2RlZmluZSBQU0JfVkVSU0lPTl8xXzQgIDB4MTQKKworc3RydWN0IHBzYl9zIHsKKwl1OCBzaWduYXR1cmVbMTBdOworCXU4IHRhYmxldmVyc2lvbjsKKwl1OCBmbGFnczE7CisJdTE2IHZzdGFibGU7CisJdTggZmxhZ3MyOworCXU4IG51bV90YWJsZXM7CisJdTMyIGNwdWlkOworCXU4IHBsbGxvY2t0aW1lOworCXU4IG1heGZpZDsKKwl1OCBtYXh2aWQ7CisJdTggbnVtcHM7Cit9OworCisvKiBQYWlycyBvZiBmaWQvdmlkIHZhbHVlcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHZlcnNpb24gMS40IFBTQiB0YWJsZS4gKi8KK3N0cnVjdCBwc3RfcyB7CisJdTggZmlkOworCXU4IHZpZDsKK307CisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAicG93ZXJub3ctazgiLCBtc2cpCisKK3N0YXRpYyBpbnQgY29yZV92b2x0YWdlX3ByZV90cmFuc2l0aW9uKHN0cnVjdCBwb3dlcm5vd19rOF9kYXRhICpkYXRhLCB1MzIgcmVxdmlkKTsKK3N0YXRpYyBpbnQgY29yZV92b2x0YWdlX3Bvc3RfdHJhbnNpdGlvbihzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdTMyIHJlcXZpZCk7CitzdGF0aWMgaW50IGNvcmVfZnJlcXVlbmN5X3RyYW5zaXRpb24oc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHUzMiByZXFmaWQpOworCitzdGF0aWMgdm9pZCBwb3dlcm5vd19rOF9hY3BpX3BzdF92YWx1ZXMoc3RydWN0IHBvd2Vybm93X2s4X2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Q1NjEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwpAQCAtMCwwICsxLDcxNSBAQAorLyoKKyAqIGNwdWZyZXEgZHJpdmVyIGZvciBFbmhhbmNlZCBTcGVlZFN0ZXAsIGFzIGZvdW5kIGluIEludGVsJ3MgUGVudGl1bQorICogTSAocGFydCBvZiB0aGUgQ2VudHJpbm8gY2hpcHNldCkuCisgKgorICogRGVzcGl0ZSB0aGUgIlNwZWVkU3RlcCIgaW4gdGhlIG5hbWUsIHRoaXMgaXMgYWxtb3N0IGVudGlyZWx5IHVubGlrZQorICogdHJhZGl0aW9uYWwgU3BlZWRTdGVwLgorICoKKyAqIE1vZGVsbGVkIG9uIHNwZWVkc3RlcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4KKyAqCisgKiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORworICoKKyAqIFRoaXMgZHJpdmVyIG1hbmlwdWxhdGVzIHRoZSBQRVJGX0NUTCBNU1IsIHdoaWNoIGlzIG9ubHkgc29tZXdoYXQKKyAqIGRvY3VtZW50ZWQuICBXaGlsZSBpdCBzZWVtcyB0byB3b3JrIG9uIG15IGxhcHRvcCwgaXQgaGFzIG5vdCBiZWVuCisgKiB0ZXN0ZWQgYW55d2hlcmUgZWxzZSwgYW5kIGl0IG1heSBub3Qgd29yayBmb3IgeW91LCBkbyBzdHJhbmdlCisgKiB0aGluZ3Mgb3Igc2ltcGx5IGNyYXNoLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworI2lmZGVmIENPTkZJR19YODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorCisjaW5jbHVkZSAic3BlZWRzdGVwLWVzdC1jb21tb24uaCIKKworI2RlZmluZSBQRlgJCSJzcGVlZHN0ZXAtY2VudHJpbm86ICIKKyNkZWZpbmUgTUFJTlRBSU5FUgkiSmVyZW15IEZpdHpoYXJkaW5nZSA8amVyZW15QGdvb3Aub3JnPiIKKworI2RlZmluZSBkcHJpbnRrKG1zZy4uLikgY3B1ZnJlcV9kZWJ1Z19wcmludGsoQ1BVRlJFUV9ERUJVR19EUklWRVIsICJzcGVlZHN0ZXAtY2VudHJpbm8iLCBtc2cpCisKKworc3RydWN0IGNwdV9pZAoreworCV9fdTgJeDg2OyAgICAgICAgICAgIC8qIENQVSBmYW1pbHkgKi8KKwlfX3U4CXg4Nl9tb2RlbDsJLyogbW9kZWwgKi8KKwlfX3U4CXg4Nl9tYXNrOwkvKiBzdGVwcGluZyAqLworfTsKKworZW51bSB7CisJQ1BVX0JBTklBUywKKwlDUFVfRE9USEFOX0ExLAorCUNQVV9ET1RIQU5fQTIsCisJQ1BVX0RPVEhBTl9CMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2lkIGNwdV9pZHNbXSA9IHsKKwlbQ1BVX0JBTklBU10JPSB7IDYsICA5LCA1IH0sCisJW0NQVV9ET1RIQU5fQTFdCT0geyA2LCAxMywgMSB9LAorCVtDUFVfRE9USEFOX0EyXQk9IHsgNiwgMTMsIDIgfSwKKwlbQ1BVX0RPVEhBTl9CMF0JPSB7IDYsIDEzLCA2IH0sCit9OworI2RlZmluZSBOX0lEUwkoc2l6ZW9mKGNwdV9pZHMpL3NpemVvZihjcHVfaWRzWzBdKSkKKworc3RydWN0IGNwdV9tb2RlbAoreworCWNvbnN0IHN0cnVjdCBjcHVfaWQgKmNwdV9pZDsKKwljb25zdCBjaGFyCSptb2RlbF9uYW1lOworCXVuc2lnbmVkCW1heF9mcmVxOyAvKiBtYXggY2xvY2sgaW4ga0h6ICovCisKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKm9wX3BvaW50czsgLyogY2xvY2svdm9sdGFnZSBwYWlycyAqLworfTsKK3N0YXRpYyBpbnQgY2VudHJpbm9fdmVyaWZ5X2NwdV9pZChjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMsIGNvbnN0IHN0cnVjdCBjcHVfaWQgKngpOworCisvKiBPcGVyYXRpbmcgcG9pbnRzIGZvciBjdXJyZW50IENQVSAqLworc3RhdGljIHN0cnVjdCBjcHVfbW9kZWwgKmNlbnRyaW5vX21vZGVsW05SX0NQVVNdOworc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfaWQgKmNlbnRyaW5vX2NwdVtOUl9DUFVTXTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBjZW50cmlub19kcml2ZXI7CisKKyNpZmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19UQUJMRQorCisvKiBDb21wdXRlcyB0aGUgY29ycmVjdCBmb3JtIGZvciBJQTMyX1BFUkZfQ1RMIE1TUiBmb3IgYSBwYXJ0aWN1bGFyCisgICBmcmVxdWVuY3kvdm9sdGFnZSBvcGVyYXRpbmcgcG9pbnQ7IGZyZXF1ZW5jeSBpbiBNSHosIHZvbHRzIGluIG1WLgorICAgVGhpcyBpcyBzdG9yZWQgYXMgImluZGV4IiBpbiB0aGUgc3RydWN0dXJlLiAqLworI2RlZmluZSBPUChtaHosIG12KQkJCQkJCQlcCisJewkJCQkJCQkJXAorCQkuZnJlcXVlbmN5ID0gKG1oeikgKiAxMDAwLAkJCQlcCisJCS5pbmRleCA9ICgoKG1oeikvMTAwKSA8PCA4KSB8ICgobXYgLSA3MDApIC8gMTYpCQlcCisJfQorCisvKgorICogVGhlc2Ugdm9sdGFnZSB0YWJsZXMgd2VyZSBkZXJpdmVkIGZyb20gdGhlIEludGVsIFBlbnRpdW0gTQorICogZGF0YXNoZWV0LCBkb2N1bWVudCAyNTI2MTIwMi5wZGYsIFRhYmxlIDUuICBJIGhhdmUgdmVyaWZpZWQgdGhleQorICogYXJlIGNvbnNpc3RlbnQgd2l0aCBteSBJQk0gVGhpbmtQYWQgWDMxLCB3aGljaCBoYXMgYSAxLjNHSHogUGVudGl1bQorICogTS4KKyAqLworCisvKiBVbHRyYSBMb3cgVm9sdGFnZSBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29yIDkwME1IeiAoQmFuaWFzKSAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBiYW5pYXNfOTAwW10gPQoreworCU9QKDYwMCwgIDg0NCksCisJT1AoODAwLCAgOTg4KSwKKwlPUCg5MDAsIDEwMDQpLAorCXsgLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EIH0KK307CisKKy8qIFVsdHJhIExvdyBWb2x0YWdlIEludGVsIFBlbnRpdW0gTSBwcm9jZXNzb3IgMTAwME1IeiAoQmFuaWFzKSAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBiYW5pYXNfMTAwMFtdID0KK3sKKwlPUCg2MDAsICAgODQ0KSwKKwlPUCg4MDAsICAgOTcyKSwKKwlPUCg5MDAsICAgOTg4KSwKKwlPUCgxMDAwLCAxMDA0KSwKKwl7IC5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORCB9Cit9OworCisvKiBMb3cgVm9sdGFnZSBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29yIDEuMTBHSHogKEJhbmlhcykgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgYmFuaWFzXzExMDBbXSA9Cit7CisJT1AoIDYwMCwgIDk1NiksCisJT1AoIDgwMCwgMTAyMCksCisJT1AoIDkwMCwgMTEwMCksCisJT1AoMTAwMCwgMTE2NCksCisJT1AoMTEwMCwgMTE4MCksCisJeyAuZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQgfQorfTsKKworCisvKiBMb3cgVm9sdGFnZSBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29yIDEuMjBHSHogKEJhbmlhcykgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgYmFuaWFzXzEyMDBbXSA9Cit7CisJT1AoIDYwMCwgIDk1NiksCisJT1AoIDgwMCwgMTAwNCksCisJT1AoIDkwMCwgMTAyMCksCisJT1AoMTAwMCwgMTEwMCksCisJT1AoMTEwMCwgMTE2NCksCisJT1AoMTIwMCwgMTE4MCksCisJeyAuZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQgfQorfTsKKworLyogSW50ZWwgUGVudGl1bSBNIHByb2Nlc3NvciAxLjMwR0h6IChCYW5pYXMpICovCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGJhbmlhc18xMzAwW10gPQoreworCU9QKCA2MDAsICA5NTYpLAorCU9QKCA4MDAsIDEyNjApLAorCU9QKDEwMDAsIDEyOTIpLAorCU9QKDEyMDAsIDEzNTYpLAorCU9QKDEzMDAsIDEzODgpLAorCXsgLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EIH0KK307CisKKy8qIEludGVsIFBlbnRpdW0gTSBwcm9jZXNzb3IgMS40MEdIeiAoQmFuaWFzKSAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBiYW5pYXNfMTQwMFtdID0KK3sKKwlPUCggNjAwLCAgOTU2KSwKKwlPUCggODAwLCAxMTgwKSwKKwlPUCgxMDAwLCAxMzA4KSwKKwlPUCgxMjAwLCAxNDM2KSwKKwlPUCgxNDAwLCAxNDg0KSwKKwl7IC5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORCB9Cit9OworCisvKiBJbnRlbCBQZW50aXVtIE0gcHJvY2Vzc29yIDEuNTBHSHogKEJhbmlhcykgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgYmFuaWFzXzE1MDBbXSA9Cit7CisJT1AoIDYwMCwgIDk1NiksCisJT1AoIDgwMCwgMTExNiksCisJT1AoMTAwMCwgMTIyOCksCisJT1AoMTIwMCwgMTM1NiksCisJT1AoMTQwMCwgMTQ1MiksCisJT1AoMTUwMCwgMTQ4NCksCisJeyAuZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQgfQorfTsKKworLyogSW50ZWwgUGVudGl1bSBNIHByb2Nlc3NvciAxLjYwR0h6IChCYW5pYXMpICovCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGJhbmlhc18xNjAwW10gPQoreworCU9QKCA2MDAsICA5NTYpLAorCU9QKCA4MDAsIDEwMzYpLAorCU9QKDEwMDAsIDExNjQpLAorCU9QKDEyMDAsIDEyNzYpLAorCU9QKDE0MDAsIDE0MjApLAorCU9QKDE2MDAsIDE0ODQpLAorCXsgLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EIH0KK307CisKKy8qIEludGVsIFBlbnRpdW0gTSBwcm9jZXNzb3IgMS43MEdIeiAoQmFuaWFzKSAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBiYW5pYXNfMTcwMFtdID0KK3sKKwlPUCggNjAwLCAgOTU2KSwKKwlPUCggODAwLCAxMDA0KSwKKwlPUCgxMDAwLCAxMTE2KSwKKwlPUCgxMjAwLCAxMjI4KSwKKwlPUCgxNDAwLCAxMzA4KSwKKwlPUCgxNzAwLCAxNDg0KSwKKwl7IC5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORCB9Cit9OworI3VuZGVmIE9QCisKKyNkZWZpbmUgX0JBTklBUyhjcHVpZCwgbWF4LCBuYW1lKQlcCit7CS5jcHVfaWQJCT0gY3B1aWQsCVwKKwkubW9kZWxfbmFtZQk9ICJJbnRlbChSKSBQZW50aXVtKFIpIE0gcHJvY2Vzc29yICIgbmFtZSAiTUh6IiwgXAorCS5tYXhfZnJlcQk9IChtYXgpKjEwMDAsCVwKKwkub3BfcG9pbnRzCT0gYmFuaWFzXyMjbWF4LAlcCit9CisjZGVmaW5lIEJBTklBUyhtYXgpCV9CQU5JQVMoJmNwdV9pZHNbQ1BVX0JBTklBU10sIG1heCwgI21heCkKKworLyogQ1BVIG1vZGVscywgdGhlaXIgb3BlcmF0aW5nIGZyZXF1ZW5jeSByYW5nZSwgYW5kIGZyZXEvdm9sdGFnZQorICAgb3BlcmF0aW5nIHBvaW50cyAqLworc3RhdGljIHN0cnVjdCBjcHVfbW9kZWwgbW9kZWxzW10gPQoreworCV9CQU5JQVMoJmNwdV9pZHNbQ1BVX0JBTklBU10sIDkwMCwgIiA5MDAiKSwKKwlCQU5JQVMoMTAwMCksCisJQkFOSUFTKDExMDApLAorCUJBTklBUygxMjAwKSwKKwlCQU5JQVMoMTMwMCksCisJQkFOSUFTKDE0MDApLAorCUJBTklBUygxNTAwKSwKKwlCQU5JQVMoMTYwMCksCisJQkFOSUFTKDE3MDApLAorCisJLyogTlVMTCBtb2RlbF9uYW1lIGlzIGEgd2lsZGNhcmQgKi8KKwl7ICZjcHVfaWRzW0NQVV9ET1RIQU5fQTFdLCBOVUxMLCAwLCBOVUxMIH0sCisJeyAmY3B1X2lkc1tDUFVfRE9USEFOX0EyXSwgTlVMTCwgMCwgTlVMTCB9LAorCXsgJmNwdV9pZHNbQ1BVX0RPVEhBTl9CMF0sIE5VTEwsIDAsIE5VTEwgfSwKKworCXsgTlVMTCwgfQorfTsKKyN1bmRlZiBfQkFOSUFTCisjdW5kZWYgQkFOSUFTCisKK3N0YXRpYyBpbnQgY2VudHJpbm9fY3B1X2luaXRfdGFibGUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjcHUgPSAmY3B1X2RhdGFbcG9saWN5LT5jcHVdOworCXN0cnVjdCBjcHVfbW9kZWwgKm1vZGVsOworCisJZm9yKG1vZGVsID0gbW9kZWxzOyBtb2RlbC0+Y3B1X2lkICE9IE5VTEw7IG1vZGVsKyspCisJCWlmIChjZW50cmlub192ZXJpZnlfY3B1X2lkKGNwdSwgbW9kZWwtPmNwdV9pZCkgJiYKKwkJICAgIChtb2RlbC0+bW9kZWxfbmFtZSA9PSBOVUxMIHx8CisJCSAgICAgc3RyY21wKGNwdS0+eDg2X21vZGVsX2lkLCBtb2RlbC0+bW9kZWxfbmFtZSkgPT0gMCkpCisJCQlicmVhazsKKworCWlmIChtb2RlbC0+Y3B1X2lkID09IE5VTEwpIHsKKwkJLyogTm8gbWF0Y2ggYXQgYWxsICovCisJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAibm8gc3VwcG9ydCBmb3IgQ1BVIG1vZGVsIFwiJXNcIjogIgorCQkgICAgICAgInNlbmQgL3Byb2MvY3B1aW5mbyB0byAiIE1BSU5UQUlORVIgIlxuIiwKKwkJICAgICAgIGNwdS0+eDg2X21vZGVsX2lkKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaWYgKG1vZGVsLT5vcF9wb2ludHMgPT0gTlVMTCkgeworCQkvKiBNYXRjaGVkIGEgbm9uLW1hdGNoICovCisJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAibm8gdGFibGUgc3VwcG9ydCBmb3IgQ1BVIG1vZGVsIFwiJXNcIjogXG4iLAorCQkgICAgICAgY3B1LT54ODZfbW9kZWxfaWQpOworI2lmbmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJCisJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAidHJ5IGNvbXBpbGluZyB3aXRoIENPTkZJR19YODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkgZW5hYmxlZFxuIik7CisjZW5kaWYKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJY2VudHJpbm9fbW9kZWxbcG9saWN5LT5jcHVdID0gbW9kZWw7CisKKwlkcHJpbnRrKCJmb3VuZCBcIiVzXCI6IG1heCBmcmVxdWVuY3k6ICVka0h6XG4iLAorCSAgICAgICBtb2RlbC0+bW9kZWxfbmFtZSwgbW9kZWwtPm1heF9mcmVxKTsKKworCXJldHVybiAwOworfQorCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgY2VudHJpbm9fY3B1X2luaXRfdGFibGUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpIHsgcmV0dXJuIC1FTk9ERVY7IH0KKyNlbmRpZiAvKiBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19UQUJMRSAqLworCitzdGF0aWMgaW50IGNlbnRyaW5vX3ZlcmlmeV9jcHVfaWQoY29uc3Qgc3RydWN0IGNwdWluZm9feDg2ICpjLCBjb25zdCBzdHJ1Y3QgY3B1X2lkICp4KQoreworCWlmICgoYy0+eDg2ID09IHgtPng4NikgJiYKKwkgICAgKGMtPng4Nl9tb2RlbCA9PSB4LT54ODZfbW9kZWwpICYmCisJICAgIChjLT54ODZfbWFzayA9PSB4LT54ODZfbWFzaykpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiBUbyBiZSBjYWxsZWQgb25seSBhZnRlciBjZW50cmlub19tb2RlbCBpcyBpbml0aWFsaXplZCAqLworc3RhdGljIHVuc2lnbmVkIGV4dHJhY3RfY2xvY2sodW5zaWduZWQgbXNyLCB1bnNpZ25lZCBpbnQgY3B1LCBpbnQgZmFpbHNhZmUpCit7CisJaW50IGk7CisKKwkvKgorCSAqIEV4dHJhY3QgY2xvY2sgaW4ga0h6IGZyb20gUEVSRl9DVEwgdmFsdWUKKwkgKiBmb3IgY2VudHJpbm8sIGFzIHNvbWUgRFNEVHMgYXJlIGJ1Z2d5LgorCSAqIElkZWFsbHksIHRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgdGhlIGFjcGlfZGF0YSBzdHJ1Y3R1cmUuCisJICovCisJaWYgKChjZW50cmlub19jcHVbY3B1XSA9PSAmY3B1X2lkc1tDUFVfQkFOSUFTXSkgfHwKKwkgICAgKGNlbnRyaW5vX2NwdVtjcHVdID09ICZjcHVfaWRzW0NQVV9ET1RIQU5fQTFdKSB8fAorCSAgICAoY2VudHJpbm9fY3B1W2NwdV0gPT0gJmNwdV9pZHNbQ1BVX0RPVEhBTl9CMF0pKSB7CisJCW1zciA9IChtc3IgPj4gOCkgJiAweGZmOworCQlyZXR1cm4gbXNyICogMTAwMDAwOworCX0KKworCWlmICgoIWNlbnRyaW5vX21vZGVsW2NwdV0pIHx8ICghY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzKSkKKwkJcmV0dXJuIDA7CisKKwltc3IgJj0gMHhmZmZmOworCWZvciAoaT0wO2NlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQ7IGkrKykgeworCQlpZiAobXNyID09IGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5pbmRleCkKKwkJCXJldHVybiBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uZnJlcXVlbmN5OworCX0KKwlpZiAoZmFpbHNhZmUpCisJCXJldHVybiBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaS0xXS5mcmVxdWVuY3k7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IENQVSBmcmVxdWVuY3kgaW4ga0h6ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9jdXJfZnJlcSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGwsIGg7CisJdW5zaWduZWQgY2xvY2tfZnJlcTsKKwljcHVtYXNrX3Qgc2F2ZWRfbWFzazsKKworCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSkKKwkJcmV0dXJuIDA7CisKKwlyZG1zcihNU1JfSUEzMl9QRVJGX1NUQVRVUywgbCwgaCk7CisJY2xvY2tfZnJlcSA9IGV4dHJhY3RfY2xvY2sobCwgY3B1LCAwKTsKKworCWlmICh1bmxpa2VseShjbG9ja19mcmVxID09IDApKSB7CisJCS8qCisJCSAqIE9uIHNvbWUgQ1BVcywgd2UgY2FuIHNlZSB0cmFuc2llbnQgTVNSIHZhbHVlcyAod2hpY2ggYXJlCisJCSAqIG5vdCBwcmVzZW50IGluIF9QU1MpLCB3aGlsZSBDUFUgaXMgZG9pbmcgc29tZSBhdXRvbWF0aWMKKwkJICogUC1zdGF0ZSB0cmFuc2l0aW9uIChsaWtlIFRNMikuIEdldCB0aGUgbGFzdCBmcmVxIHNldCAKKwkJICogaW4gUEVSRl9DVEwuCisJCSAqLworCQlyZG1zcihNU1JfSUEzMl9QRVJGX0NUTCwgbCwgaCk7CisJCWNsb2NrX2ZyZXEgPSBleHRyYWN0X2Nsb2NrKGwsIGNwdSwgMSk7CisJfQorCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKKwlyZXR1cm4gY2xvY2tfZnJlcTsKK30KKworCisjaWZkZWYgQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fQUNQSQorCitzdGF0aWMgc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlIHA7CisKKy8qCisgKiBjZW50cmlub19jcHVfaW5pdF9hY3BpIC0gcmVnaXN0ZXIgd2l0aCBBQ1BJIFAtU3RhdGVzIGxpYnJhcnkKKyAqCisgKiBSZWdpc3RlciB3aXRoIHRoZSBBQ1BJIFAtU3RhdGVzIGxpYnJhcnkgKHBhcnQgb2YgZHJpdmVycy9hY3BpL3Byb2Nlc3Nvci5jKQorICogaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGNvcnJlY3QgZnJlcXVlbmN5IGFuZCB2b2x0YWdlIHBhaXJpbmdzIGJ5IHJlYWRpbmcKKyAqIHRoZSBfUFNTIG9mIHRoZSBBQ1BJIERTRFQgb3IgU1NEVCB0YWJsZXMuCisgKi8KK3N0YXRpYyBpbnQgY2VudHJpbm9fY3B1X2luaXRfYWNwaShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwl1bmlvbiBhY3BpX29iamVjdAkJYXJnMCA9IHtBQ1BJX1RZUEVfQlVGRkVSfTsKKwl1MzIJCQkJYXJnMF9idWZbM107CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJCWFyZ19saXN0ID0gezEsICZhcmcwfTsKKwl1bnNpZ25lZCBsb25nCQkJY3VyX2ZyZXE7CisJaW50CQkJCXJlc3VsdCA9IDAsIGk7CisJdW5zaWduZWQgaW50CQkJY3B1ID0gcG9saWN5LT5jcHU7CisKKwkvKiBfUERDIHNldHRpbmdzICovCisJYXJnMC5idWZmZXIubGVuZ3RoID0gMTI7CisJYXJnMC5idWZmZXIucG9pbnRlciA9ICh1OCAqKSBhcmcwX2J1ZjsKKwlhcmcwX2J1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOworCWFyZzBfYnVmWzFdID0gMTsKKwlhcmcwX2J1ZlsyXSA9IEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUCB8IEFDUElfUERDX0VTVF9DQVBBQklMSVRZX01TUjsKKworCXAucGRjID0gJmFyZ19saXN0OworCisJLyogcmVnaXN0ZXIgd2l0aCBBQ1BJIGNvcmUgKi8KKwlpZiAoYWNwaV9wcm9jZXNzb3JfcmVnaXN0ZXJfcGVyZm9ybWFuY2UoJnAsIGNwdSkpIHsKKwkJZHByaW50ayhLRVJOX0lORk8gUEZYICJvYnRhaW5pbmcgQUNQSSBkYXRhIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHZlcmlmeSB0aGUgYWNwaV9kYXRhICovCisJaWYgKHAuc3RhdGVfY291bnQgPD0gMSkgeworCQlkcHJpbnRrKCJObyBQLVN0YXRlc1xuIik7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3VucmVnOworCX0KKworCWlmICgocC5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB8fAorCSAgICAocC5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpKSB7CisJCWRwcmludGsoIkludmFsaWQgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXJzICgleCAtICV4KVxuIiwKKwkJCXAuY29udHJvbF9yZWdpc3Rlci5zcGFjZV9pZCwgcC5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQpOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGVycl91bnJlZzsKKwl9CisKKwlmb3IgKGk9MDsgaTxwLnN0YXRlX2NvdW50OyBpKyspIHsKKwkJaWYgKHAuc3RhdGVzW2ldLmNvbnRyb2wgIT0gcC5zdGF0ZXNbaV0uc3RhdHVzKSB7CisJCQlkcHJpbnRrKCJEaWZmZXJlbnQgY29udHJvbCAoJXgpIGFuZCBzdGF0dXMgdmFsdWVzICgleClcbiIsCisJCQkJcC5zdGF0ZXNbaV0uY29udHJvbCwgcC5zdGF0ZXNbaV0uc3RhdHVzKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl91bnJlZzsKKwkJfQorCisJCWlmICghcC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kpIHsKKwkJCWRwcmludGsoIlplcm8gY29yZSBmcmVxdWVuY3kgZm9yIHN0YXRlICV1XG4iLCBpKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl91bnJlZzsKKwkJfQorCisJCWlmIChwLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSA+IHAuc3RhdGVzWzBdLmNvcmVfZnJlcXVlbmN5KSB7CisJCQlkcHJpbnRrKCJQJXUgaGFzIGxhcmdlciBmcmVxdWVuY3kgKCV1KSB0aGFuIFAwICgldSksIHNraXBwaW5nXG4iLCBpLAorCQkJCXAuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5LCBwLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSk7CisJCQlwLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCWNlbnRyaW5vX21vZGVsW2NwdV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1X21vZGVsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZW50cmlub19tb2RlbFtjcHVdKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VucmVnOworCX0KKwltZW1zZXQoY2VudHJpbm9fbW9kZWxbY3B1XSwgMCwgc2l6ZW9mKHN0cnVjdCBjcHVfbW9kZWwpKTsKKworCWNlbnRyaW5vX21vZGVsW2NwdV0tPm1vZGVsX25hbWU9TlVMTDsKKwljZW50cmlub19tb2RlbFtjcHVdLT5tYXhfZnJlcSA9IHAuc3RhdGVzWzBdLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKwljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHMgPSAga21hbGxvYyhzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqCisJCQkJCSAgICAgKHAuc3RhdGVfY291bnQgKyAxKSwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGlmICghY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycl9rZnJlZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wOyBpPHAuc3RhdGVfY291bnQ7IGkrKykgeworCQljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uaW5kZXggPSBwLnN0YXRlc1tpXS5jb250cm9sOworCQljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uZnJlcXVlbmN5ID0gcC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOworCQlkcHJpbnRrKCJhZGRpbmcgc3RhdGUgJWkgd2l0aCBmcmVxdWVuY3kgJXUgYW5kIGNvbnRyb2wgdmFsdWUgJTA0eFxuIiwgCisJCQlpLCBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uZnJlcXVlbmN5LCBjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uaW5kZXgpOworCX0KKwljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbcC5zdGF0ZV9jb3VudF0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CisKKwljdXJfZnJlcSA9IGdldF9jdXJfZnJlcShjcHUpOworCisJZm9yIChpPTA7IGk8cC5zdGF0ZV9jb3VudDsgaSsrKSB7CisJCWlmICghcC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kpIHsKKwkJCWRwcmludGsoInNraXBwaW5nIHN0YXRlICV1XG4iLCBpKTsKKwkJCWNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5mcmVxdWVuY3kgPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQ7CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJaWYgKGV4dHJhY3RfY2xvY2soY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmluZGV4LCBjcHUsIDApICE9CisJCSAgICAoY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmZyZXF1ZW5jeSkpIHsKKwkJCWRwcmludGsoIkludmFsaWQgZW5jb2RlZCBmcmVxdWVuY3kgKCV1IHZzLiAldSlcbiIsCisJCQkJZXh0cmFjdF9jbG9jayhjZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uaW5kZXgsIGNwdSwgMCksCisJCQkJY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmZyZXF1ZW5jeSk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfa2ZyZWVfYWxsOworCQl9CisKKwkJaWYgKGN1cl9mcmVxID09IGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5mcmVxdWVuY3kpCisJCQlwLnN0YXRlID0gaTsKKwl9CisKKwkvKiBub3RpZnkgQklPUyB0aGF0IHdlIGV4aXN0ICovCisJYWNwaV9wcm9jZXNzb3Jfbm90aWZ5X3NtbShUSElTX01PRFVMRSk7CisKKwlyZXR1cm4gMDsKKworIGVycl9rZnJlZV9hbGw6CisJa2ZyZWUoY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzKTsKKyBlcnJfa2ZyZWU6CisJa2ZyZWUoY2VudHJpbm9fbW9kZWxbY3B1XSk7CisgZXJyX3VucmVnOgorCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJnAsIGNwdSk7CisJZHByaW50ayhLRVJOX0lORk8gUEZYICJpbnZhbGlkIEFDUEkgZGF0YVxuIik7CisJcmV0dXJuIChyZXN1bHQpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGNlbnRyaW5vX2NwdV9pbml0X2FjcGkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpIHsgcmV0dXJuIC1FTk9ERVY7IH0KKyNlbmRpZgorCitzdGF0aWMgaW50IGNlbnRyaW5vX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqY3B1ID0gJmNwdV9kYXRhW3BvbGljeS0+Y3B1XTsKKwl1bnNpZ25lZCBmcmVxOworCXVuc2lnbmVkIGwsIGg7CisJaW50IHJldDsKKwlpbnQgaTsKKworCS8qIE9ubHkgSW50ZWwgbWFrZXMgRW5oYW5jZWQgU3BlZWRzdGVwLWNhcGFibGUgQ1BVcyAqLworCWlmIChjcHUtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fCAhY3B1X2hhcyhjcHUsIFg4Nl9GRUFUVVJFX0VTVCkpCisJCXJldHVybiAtRU5PREVWOworCisJZm9yIChpID0gMDsgaSA8IE5fSURTOyBpKyspCisJCWlmIChjZW50cmlub192ZXJpZnlfY3B1X2lkKGNwdSwgJmNwdV9pZHNbaV0pKQorCQkJYnJlYWs7CisKKwlpZiAoaSAhPSBOX0lEUykKKwkJY2VudHJpbm9fY3B1W3BvbGljeS0+Y3B1XSA9ICZjcHVfaWRzW2ldOworCisJaWYgKGlzX2NvbnN0X2xvb3BzX2NwdShwb2xpY3ktPmNwdSkpIHsKKwkJY2VudHJpbm9fZHJpdmVyLmZsYWdzIHw9IENQVUZSRVFfQ09OU1RfTE9PUFM7CisJfQorCisJaWYgKGNlbnRyaW5vX2NwdV9pbml0X2FjcGkocG9saWN5KSkgeworCQlpZiAocG9saWN5LT5jcHUgIT0gMCkKKwkJCXJldHVybiAtRU5PREVWOworCisJCWlmICghY2VudHJpbm9fY3B1W3BvbGljeS0+Y3B1XSkgeworCQkJZHByaW50ayhLRVJOX0lORk8gUEZYICJmb3VuZCB1bnN1cHBvcnRlZCBDUFUgd2l0aCAiCisJCQkiRW5oYW5jZWQgU3BlZWRTdGVwOiBzZW5kIC9wcm9jL2NwdWluZm8gdG8gIgorCQkJTUFJTlRBSU5FUiAiXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJaWYgKGNlbnRyaW5vX2NwdV9pbml0X3RhYmxlKHBvbGljeSkpIHsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyogQ2hlY2sgdG8gc2VlIGlmIEVuaGFuY2VkIFNwZWVkU3RlcCBpcyBlbmFibGVkLCBhbmQgdHJ5IHRvCisJICAgZW5hYmxlIGl0IGlmIG5vdC4gKi8KKwlyZG1zcihNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbCwgaCk7CisKKwlpZiAoIShsICYgKDE8PDE2KSkpIHsKKwkJbCB8PSAoMTw8MTYpOworCQlkcHJpbnRrKCJ0cnlpbmcgdG8gZW5hYmxlIEVuaGFuY2VkIFNwZWVkU3RlcCAoJXgpXG4iLCBsKTsKKwkJd3Jtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGwsIGgpOworCisJCS8qIGNoZWNrIHRvIHNlZSBpZiBpdCBzdHVjayAqLworCQlyZG1zcihNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbCwgaCk7CisJCWlmICghKGwgJiAoMTw8MTYpKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImNvdWxkbid0IGVuYWJsZSBFbmhhbmNlZCBTcGVlZFN0ZXBcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlmcmVxID0gZ2V0X2N1cl9mcmVxKHBvbGljeS0+Y3B1KTsKKworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDEwMDAwOyAvKiAxMHVTIHRyYW5zaXRpb24gbGF0ZW5jeSAqLworCXBvbGljeS0+Y3VyID0gZnJlcTsKKworCWRwcmludGsoImNlbnRyaW5vX2NwdV9pbml0OiBjdXI9JWRrSHpcbiIsIHBvbGljeS0+Y3VyKTsKKworCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBjZW50cmlub19tb2RlbFtwb2xpY3ktPmNwdV0tPm9wX3BvaW50cyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIChyZXQpOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoY2VudHJpbm9fbW9kZWxbcG9saWN5LT5jcHVdLT5vcF9wb2ludHMsIHBvbGljeS0+Y3B1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNlbnRyaW5vX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKKworCWlmICghY2VudHJpbm9fbW9kZWxbY3B1XSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihjcHUpOworCisjaWZkZWYgQ09ORklHX1g4Nl9TUEVFRFNURVBfQ0VOVFJJTk9fQUNQSQorCWlmICghY2VudHJpbm9fbW9kZWxbY3B1XS0+bW9kZWxfbmFtZSkgeworCQlkcHJpbnRrKCJ1bnJlZ2lzdGVyaW5nIGFuZCBmcmVlaW5nIEFDUEkgZGF0YVxuIik7CisJCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJnAsIGNwdSk7CisJCWtmcmVlKGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50cyk7CisJCWtmcmVlKGNlbnRyaW5vX21vZGVsW2NwdV0pOworCX0KKyNlbmRpZgorCisJY2VudHJpbm9fbW9kZWxbY3B1XSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjZW50cmlub192ZXJpZnkgLSB2ZXJpZmllcyBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogbmV3IHBvbGljeQorICoKKyAqIExpbWl0IG11c3QgYmUgd2l0aGluIHRoaXMgbW9kZWwncyBmcmVxdWVuY3kgcmFuZ2UgYXQgbGVhc3Qgb25lCisgKiBib3JkZXIgaW5jbHVkZWQuCisgKi8KK3N0YXRpYyBpbnQgY2VudHJpbm9fdmVyaWZ5IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwgY2VudHJpbm9fbW9kZWxbcG9saWN5LT5jcHVdLT5vcF9wb2ludHMpOworfQorCisvKioKKyAqIGNlbnRyaW5vX3NldHBvbGljeSAtIHNldCBhIG5ldyBDUFVGcmVxIHBvbGljeQorICogQHBvbGljeTogbmV3IHBvbGljeQorICogQHRhcmdldF9mcmVxOiB0aGUgdGFyZ2V0IGZyZXF1ZW5jeQorICogQHJlbGF0aW9uOiBob3cgdGhhdCBmcmVxdWVuY3kgcmVsYXRlcyB0byBhY2hpZXZlZCBmcmVxdWVuY3kgKENQVUZSRVFfUkVMQVRJT05fTCBvciBDUFVGUkVRX1JFTEFUSU9OX0gpCisgKgorICogU2V0cyBhIG5ldyBDUFVGcmVxIHBvbGljeS4KKyAqLworc3RhdGljIGludCBjZW50cmlub190YXJnZXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50ICAgIG5ld3N0YXRlID0gMDsKKwl1bnNpZ25lZCBpbnQJbXNyLCBvbGRtc3IsIGgsIGNwdSA9IHBvbGljeS0+Y3B1OworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzCWZyZXFzOworCWNwdW1hc2tfdAkJc2F2ZWRfbWFzazsKKwlpbnQJCQlyZXR2YWw7CisKKwlpZiAoY2VudHJpbm9fbW9kZWxbY3B1XSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogU3VwcG9ydCBmb3IgU01QIHN5c3RlbXMuCisJICogTWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIG9uIHRoZSBDUFUgdGhhdCB3YW50cyB0byBjaGFuZ2UgZnJlcXVlbmN5CisJICovCisJc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHBvbGljeS0+Y3B1cyk7CisJaWYgKCFjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBwb2xpY3ktPmNwdXMpKSB7CisJCWRwcmludGsoImNvdWxkbid0IGxpbWl0IHRvIENQVXMgaW4gdGhpcyBkb21haW5cbiIpOworCQlyZXR1cm4oLUVBR0FJTik7CisJfQorCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50cywgdGFyZ2V0X2ZyZXEsCisJCQkJCSAgIHJlbGF0aW9uLCAmbmV3c3RhdGUpKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gbWlncmF0ZV9lbmQ7CisJfQorCisJbXNyID0gY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW25ld3N0YXRlXS5pbmRleDsKKwlyZG1zcihNU1JfSUEzMl9QRVJGX0NUTCwgb2xkbXNyLCBoKTsKKworCWlmIChtc3IgPT0gKG9sZG1zciAmIDB4ZmZmZikpIHsKKwkJcmV0dmFsID0gMDsKKwkJZHByaW50aygibm8gY2hhbmdlIG5lZWRlZCAtIG1zciB3YXMgYW5kIG5lZWRzIHRvIGJlICV4XG4iLCBvbGRtc3IpOworCQlnb3RvIG1pZ3JhdGVfZW5kOworCX0KKworCWZyZXFzLmNwdSA9IGNwdTsKKwlmcmVxcy5vbGQgPSBleHRyYWN0X2Nsb2NrKG9sZG1zciwgY3B1LCAwKTsKKwlmcmVxcy5uZXcgPSBleHRyYWN0X2Nsb2NrKG1zciwgY3B1LCAwKTsKKworCWRwcmludGsoInRhcmdldD0lZGtIeiBvbGQ9JWQgbmV3PSVkIG1zcj0lMDR4XG4iLAorCQl0YXJnZXRfZnJlcSwgZnJlcXMub2xkLCBmcmVxcy5uZXcsIG1zcik7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJLyogYWxsIGJ1dCAxNiBMU0IgYXJlICJyZXNlcnZlZCIsIHNvIHRyZWF0IHRoZW0gd2l0aAorCSAgIGNhcmUgKi8KKwlvbGRtc3IgJj0gfjB4ZmZmZjsKKwltc3IgJj0gMHhmZmZmOworCW9sZG1zciB8PSBtc3I7CisKKwl3cm1zcihNU1JfSUEzMl9QRVJGX0NUTCwgb2xkbXNyLCBoKTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dmFsID0gMDsKK21pZ3JhdGVfZW5kOgorCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgc2F2ZWRfbWFzayk7CisJcmV0dXJuIChyZXR2YWwpOworfQorCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciogY2VudHJpbm9fYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBjZW50cmlub19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImNlbnRyaW5vIiwgLyogc2hvdWxkIGJlIHNwZWVkc3RlcC1jZW50cmlubywKKwkJCQkJIGJ1dCB0aGVyZSdzIGEgMTYgY2hhciBsaW1pdCAqLworCS5pbml0CQk9IGNlbnRyaW5vX2NwdV9pbml0LAorCS5leGl0CQk9IGNlbnRyaW5vX2NwdV9leGl0LAorCS52ZXJpZnkJCT0gY2VudHJpbm9fdmVyaWZ5LAorCS50YXJnZXQJCT0gY2VudHJpbm9fdGFyZ2V0LAorCS5nZXQJCT0gZ2V0X2N1cl9mcmVxLAorCS5hdHRyICAgICAgICAgICA9IGNlbnRyaW5vX2F0dHIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworCisvKioKKyAqIGNlbnRyaW5vX2luaXQgLSBpbml0aWFsaXplcyB0aGUgRW5oYW5jZWQgU3BlZWRTdGVwIENQVUZyZXEgZHJpdmVyCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIEVuaGFuY2VkIFNwZWVkU3RlcCBzdXBwb3J0LiBSZXR1cm5zIC1FTk9ERVYgb24KKyAqIHVuc3VwcG9ydGVkIGRldmljZXMsIC1FTk9FTlQgaWYgdGhlcmUncyBubyB2b2x0YWdlIHRhYmxlIGZvciB0aGlzCisgKiBwYXJ0aWN1bGFyIENQVSBtb2RlbCwgLUVJTlZBTCBvbiBwcm9ibGVtcyBkdXJpbmcgaW5pdGlhdGl6YXRpb24sCisgKiBhbmQgemVybyBvbiBzdWNjZXNzLgorICoKKyAqIFRoaXMgaXMgcXVpdGUgcGlja3kuICBOb3Qgb25seSBkb2VzIHRoZSBDUFUgaGF2ZSB0byBhZHZlcnRpc2UgdGhlCisgKiAiZXN0IiBmbGFnIGluIHRoZSBjcHVpZCBjYXBhYmlsaXR5IGZsYWdzLCB3ZSBsb29rIGZvciBhIHNwZWNpZmljCisgKiBDUFUgbW9kZWwgYW5kIHN0ZXBwaW5nLCBhbmQgd2UgbmVlZCB0byBoYXZlIHRoZSBleGFjdCBtb2RlbCBuYW1lIGluCisgKiBvdXIgdm9sdGFnZSB0YWJsZXMuICBUaGF0IGlzLCBiZSBwYXJhbm9pZCBhYm91dCBub3QgcmVsZWFzaW5nCisgKiBzb21lb25lJ3MgdmFsdWFibGUgbWFnaWMgc21va2UuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNlbnRyaW5vX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmNwdSA9IGNwdV9kYXRhOworCisJaWYgKCFjcHVfaGFzKGNwdSwgWDg2X0ZFQVRVUkVfRVNUKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmNlbnRyaW5vX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjZW50cmlub19leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmY2VudHJpbm9fZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUiAoIkplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIkVuaGFuY2VkIFNwZWVkU3RlcCBkcml2ZXIgZm9yIEludGVsIFBlbnRpdW0gTSBwcm9jZXNzb3JzLiIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKKworbGF0ZV9pbml0Y2FsbChjZW50cmlub19pbml0KTsKK21vZHVsZV9leGl0KGNlbnRyaW5vX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtZXN0LWNvbW1vbi5oIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtZXN0LWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTk5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1lc3QtY29tbW9uLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIFJvdXRpbmVzIGNvbW1vbiBmb3IgZHJpdmVycyBoYW5kbGluZyBFbmhhbmNlZCBTcGVlZHN0ZXAgVGVjaG5vbG9neQorICogIENvcHlyaWdodCAoQykgMjAwNCBWZW5rYXRlc2ggUGFsbGlwYWRpIDx2ZW5rYXRlc2gucGFsbGlwYWRpQGludGVsLmNvbT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyIC0tIHNlZQorICogIENPUFlJTkcgZm9yIGRldGFpbHMuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgaXNfY29uc3RfbG9vcHNfY3B1KHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGNwdWluZm9feDg2IAkqYyA9IGNwdV9kYXRhICsgY3B1OworCisJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fCAhY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FU1QpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogb24gUC00cywgdGhlIFRTQyBydW5zIHdpdGggY29uc3RhbnQgZnJlcXVlbmN5IGluZGVwZW5kZW50IG9mIGNwdSBmcmVxCisJICogd2hlbiB3ZSB1c2UgRVNUCisJICovCisJaWYgKGMtPng4NiA9PSAweGYpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtaWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3ZDE4YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jCkBAIC0wLDAgKzEsNDI0IEBACisvKgorICogKEMpIDIwMDEgIERhdmUgSm9uZXMsIEFyamFuIHZhbiBkZSB2ZW4uCisgKiAoQykgMjAwMiAtIDIwMDMgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICogIEJhc2VkIHVwb24gcmV2ZXJzZSBlbmdpbmVlcmVkIGluZm9ybWF0aW9uLCBhbmQgb24gSW50ZWwgZG9jdW1lbnRhdGlvbgorICogIGZvciBjaGlwc2V0cyBJQ0gyLU0gYW5kIElDSDMtTS4KKyAqCisgKiAgTWFueSB0aGFua3MgdG8gRHVjcm90IEJydW5vIGZvciBmaW5kaW5nIGFuZCBmaXhpbmcgdGhlIGxhc3QKKyAqICAibWlzc2luZyBsaW5rIiBmb3IgSUNIMi1NL0lDSDMtTSBzdXBwb3J0LCBhbmQgdG8gVGhvbWFzIFdpbmtsZXIKKyAqICBmb3IgZXh0ZW5zaXZlIHRlc3RpbmcuCisgKgorICogIEJJRyBGQVQgRElTQ0xBSU1FUjogV29yayBpbiBwcm9ncmVzcyBjb2RlLiBQb3NzaWJseSAqZGFuZ2Vyb3VzKgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICBTUEVFRFNURVAgLSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAic3BlZWRzdGVwLWxpYi5oIgorCisKKy8qIHNwZWVkc3RlcF9jaGlwc2V0OgorICogICBJdCBpcyBuZWNlc3NhcnkgdG8ga25vdyB3aGljaCBjaGlwc2V0IGlzIHVzZWQuIEFzIGFjY2Vzc2VzIHRvCisgKiB0aGlzIGRldmljZSBvY2N1ciBhdCB2YXJpb3VzIHBsYWNlcyBpbiB0aGlzIG1vZHVsZSwgd2UgbmVlZCBhCisgKiBzdGF0aWMgc3RydWN0IHBjaV9kZXYgKiBwb2ludGluZyB0byB0aGF0IGRldmljZS4KKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpzcGVlZHN0ZXBfY2hpcHNldF9kZXY7CisKKworLyogc3BlZWRzdGVwX3Byb2Nlc3NvcgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkc3RlcF9wcm9jZXNzb3IgPSAwOworCisKKy8qCisgKiAgIFRoZXJlIGFyZSBvbmx5IHR3byBmcmVxdWVuY3kgc3RhdGVzIGZvciBlYWNoIHByb2Nlc3Nvci4gVmFsdWVzCisgKiBhcmUgaW4ga0h6IGZvciB0aGUgdGltZSBiZWluZy4KKyAqLworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBzcGVlZHN0ZXBfZnJlcXNbXSA9IHsKKwl7U1BFRURTVEVQX0hJR0gsCTB9LAorCXtTUEVFRFNURVBfTE9XLAkJMH0sCisJezAsCQkJQ1BVRlJFUV9UQUJMRV9FTkR9LAorfTsKKworCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgInNwZWVkc3RlcC1pY2giLCBtc2cpCisKKworLyoqCisgKiBzcGVlZHN0ZXBfc2V0X3N0YXRlIC0gc2V0IHRoZSBTcGVlZFN0ZXAgc3RhdGUKKyAqIEBzdGF0ZTogbmV3IHByb2Nlc3NvciBmcmVxdWVuY3kgc3RhdGUgKFNQRUVEU1RFUF9MT1cgb3IgU1BFRURTVEVQX0hJR0gpCisgKgorICogICBUcmllcyB0byBjaGFuZ2UgdGhlIFNwZWVkU3RlcCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgc3BlZWRzdGVwX3NldF9zdGF0ZSAodW5zaWduZWQgaW50IHN0YXRlKQoreworCXUzMiBwbWJhc2U7CisJdTggcG0yX2JsazsKKwl1OCB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFzcGVlZHN0ZXBfY2hpcHNldF9kZXYgfHwgKHN0YXRlID4gMHgxKSkKKwkJcmV0dXJuOworCisJLyogZ2V0IFBNQkFTRSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzcGVlZHN0ZXBfY2hpcHNldF9kZXYsIDB4NDAsICZwbWJhc2UpOworCWlmICghKHBtYmFzZSAmIDB4MDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3BlZWRzdGVwLWljaDogY291bGQgbm90IGZpbmQgc3BlZWRzdGVwIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXBtYmFzZSAmPSAweEZGRkZGRkZFOworCWlmICghcG1iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3BlZWRzdGVwLWljaDogY291bGQgbm90IGZpbmQgc3BlZWRzdGVwIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIERpc2FibGUgSVJRcyAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIHJlYWQgc3RhdGUgKi8KKwl2YWx1ZSA9IGluYihwbWJhc2UgKyAweDUwKTsKKworCWRwcmludGsoInJlYWQgYXQgcG1iYXNlIDB4JXggKyAweDUwIHJldHVybmVkIDB4JXhcbiIsIHBtYmFzZSwgdmFsdWUpOworCisJLyogd3JpdGUgbmV3IHN0YXRlICovCisJdmFsdWUgJj0gMHhGRTsKKwl2YWx1ZSB8PSBzdGF0ZTsKKworCWRwcmludGsoIndyaXRpbmcgMHgleCB0byBwbWJhc2UgMHgleCArIDB4NTBcbiIsIHZhbHVlLCBwbWJhc2UpOworCisJLyogRGlzYWJsZSBidXMgbWFzdGVyIGFyYml0cmF0aW9uICovCisJcG0yX2JsayA9IGluYihwbWJhc2UgKyAweDIwKTsKKwlwbTJfYmxrIHw9IDB4MDE7CisJb3V0YihwbTJfYmxrLCAocG1iYXNlICsgMHgyMCkpOworCisJLyogQWN0dWFsIHRyYW5zaXRpb24gKi8KKwlvdXRiKHZhbHVlLCAocG1iYXNlICsgMHg1MCkpOworCisJLyogUmVzdG9yZSBidXMgbWFzdGVyIGFyYml0cmF0aW9uICovCisJcG0yX2JsayAmPSAweGZlOworCW91dGIocG0yX2JsaywgKHBtYmFzZSArIDB4MjApKTsKKworCS8qIGNoZWNrIGlmIHRyYW5zaXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KKwl2YWx1ZSA9IGluYihwbWJhc2UgKyAweDUwKTsKKworCS8qIEVuYWJsZSBJUlFzICovCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJZHByaW50aygicmVhZCBhdCBwbWJhc2UgMHgleCArIDB4NTAgcmV0dXJuZWQgMHgleFxuIiwgcG1iYXNlLCB2YWx1ZSk7CisKKwlpZiAoc3RhdGUgPT0gKHZhbHVlICYgMHgxKSkgeworCQlkcHJpbnRrKCJjaGFuZ2UgdG8gJXUgTUh6IHN1Y2NlZWRlZFxuIiwgKHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShzcGVlZHN0ZXBfcHJvY2Vzc29yKSAvIDEwMDApKTsKKwl9IGVsc2UgeworCQlwcmludGsgKEtFUk5fRVJSICJjcHVmcmVxOiBjaGFuZ2UgZmFpbGVkIC0gSS9PIGVycm9yXG4iKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBzcGVlZHN0ZXBfYWN0aXZhdGUgLSBhY3RpdmF0ZSBTcGVlZFN0ZXAgY29udHJvbCBpbiB0aGUgY2hpcHNldAorICoKKyAqICAgVHJpZXMgdG8gYWN0aXZhdGUgdGhlIFNwZWVkU3RlcCBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzLgorICogUmV0dXJucyAtRUlOVkFMIG9uIGFuIHVuc3VwcG9ydGVkIGNoaXBzZXQsIGFuZCB6ZXJvIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgc3BlZWRzdGVwX2FjdGl2YXRlICh2b2lkKQoreworCXUxNiB2YWx1ZSA9IDA7CisKKwlpZiAoIXNwZWVkc3RlcF9jaGlwc2V0X2RldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChzcGVlZHN0ZXBfY2hpcHNldF9kZXYsIDB4MDBBMCwgJnZhbHVlKTsKKwlpZiAoISh2YWx1ZSAmIDB4MDgpKSB7CisJCXZhbHVlIHw9IDB4MDg7CisJCWRwcmludGsoImFjdGl2YXRpbmcgU3BlZWRTdGVwIChUTSkgcmVnaXN0ZXJzXG4iKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNwZWVkc3RlcF9jaGlwc2V0X2RldiwgMHgwMEEwLCB2YWx1ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBzcGVlZHN0ZXBfZGV0ZWN0X2NoaXBzZXQgLSBkZXRlY3QgdGhlIFNvdXRoYnJpZGdlIHdoaWNoIGNvbnRhaW5zIFNwZWVkU3RlcCBsb2dpYworICoKKyAqICAgRGV0ZWN0cyBJQ0gyLU0sIElDSDMtTSBhbmQgSUNINC1NIHNvIGZhci4gVGhlIHBjaV9kZXYgcG9pbnRzIHRvCisgKiB0aGUgTFBDIGJyaWRnZSAvIFBNIG1vZHVsZSB3aGljaCBjb250YWlucyBhbGwgcG93ZXItbWFuYWdlbWVudAorICogZnVuY3Rpb25zLiBSZXR1cm5zIHRoZSBTUEVFRFNURVBfQ0hJUFNFVF8tbnVtYmVyIGZvciB0aGUgZGV0ZWN0ZWQKKyAqIGNoaXBzZXQsIG9yIHplcm8gb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZGV0ZWN0X2NoaXBzZXQgKHZvaWQpCit7CisJc3BlZWRzdGVwX2NoaXBzZXRfZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8xMiwKKwkJCSAgICAgIFBDSV9BTllfSUQsCisJCQkgICAgICBQQ0lfQU5ZX0lELAorCQkJICAgICAgTlVMTCk7CisJaWYgKHNwZWVkc3RlcF9jaGlwc2V0X2RldikKKwkJcmV0dXJuIDQ7IC8qIDQtTSAqLworCisJc3BlZWRzdGVwX2NoaXBzZXRfZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFDQV8xMiwKKwkJCSAgICAgIFBDSV9BTllfSUQsCisJCQkgICAgICBQQ0lfQU5ZX0lELAorCQkJICAgICAgTlVMTCk7CisJaWYgKHNwZWVkc3RlcF9jaGlwc2V0X2RldikKKwkJcmV0dXJuIDM7IC8qIDMtTSAqLworCisKKwlzcGVlZHN0ZXBfY2hpcHNldF9kZXYgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzEwLAorCQkJICAgICAgUENJX0FOWV9JRCwKKwkJCSAgICAgIFBDSV9BTllfSUQsCisJCQkgICAgICBOVUxMKTsKKwlpZiAoc3BlZWRzdGVwX2NoaXBzZXRfZGV2KSB7CisJCS8qIHNwZWVkc3RlcC5jIGNhdXNlcyBsb2NrdXBzIG9uIERlbGwgSW5zcGlyb25zIDgwMDAgYW5kCisJCSAqIDgxMDAgd2hpY2ggdXNlIGEgcHJldHR5IG9sZCByZXZpc2lvbiBvZiB0aGUgODI4MTUKKwkJICogaG9zdCBicmlnZS4gQWJvcnQgb24gdGhlc2Ugc3lzdGVtcy4KKwkJICovCisJCXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqaG9zdGJyaWRnZTsKKwkJdTggcmV2ID0gMDsKKworCQlob3N0YnJpZGdlICA9IHBjaV9nZXRfc3Vic3lzKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODE1X01DLAorCQkJICAgICAgUENJX0FOWV9JRCwKKwkJCSAgICAgIFBDSV9BTllfSUQsCisJCQkgICAgICBOVUxMKTsKKworCQlpZiAoIWhvc3RicmlkZ2UpCisJCQlyZXR1cm4gMjsgLyogMi1NICovCisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaG9zdGJyaWRnZSwgUENJX1JFVklTSU9OX0lELCAmcmV2KTsKKwkJaWYgKHJldiA8IDUpIHsKKwkJCWRwcmludGsoImhvc3RicmlkZ2UgZG9lcyBub3Qgc3VwcG9ydCBzcGVlZHN0ZXBcbiIpOworCQkJc3BlZWRzdGVwX2NoaXBzZXRfZGV2ID0gTlVMTDsKKwkJCXBjaV9kZXZfcHV0KGhvc3RicmlkZ2UpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlwY2lfZGV2X3B1dChob3N0YnJpZGdlKTsKKwkJcmV0dXJuIDI7IC8qIDItTSAqLworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IF9zcGVlZHN0ZXBfZ2V0KGNwdW1hc2tfdCBjcHVzKQoreworCXVuc2lnbmVkIGludCBzcGVlZDsKKwljcHVtYXNrX3QgY3B1c19hbGxvd2VkOworCisJY3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1cyk7CisJc3BlZWQgPSBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koc3BlZWRzdGVwX3Byb2Nlc3Nvcik7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVzX2FsbG93ZWQpOworCWRwcmludGsoImRldGVjdGVkICV1IGtIeiBhcyBjdXJyZW50IGZyZXF1ZW5jeVxuIiwgc3BlZWQpOworCXJldHVybiBzcGVlZDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0KHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIF9zcGVlZHN0ZXBfZ2V0KGNwdW1hc2tfb2ZfY3B1KGNwdSkpOworfQorCisvKioKKyAqIHNwZWVkc3RlcF90YXJnZXQgLSBzZXQgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqIEB0YXJnZXRfZnJlcTogdGhlIHRhcmdldCBmcmVxdWVuY3kKKyAqIEByZWxhdGlvbjogaG93IHRoYXQgZnJlcXVlbmN5IHJlbGF0ZXMgdG8gYWNoaWV2ZWQgZnJlcXVlbmN5IChDUFVGUkVRX1JFTEFUSU9OX0wgb3IgQ1BVRlJFUV9SRUxBVElPTl9IKQorICoKKyAqIFNldHMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kuCisgKi8KK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3RhcmdldCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGludCBuZXdzdGF0ZSA9IDA7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJY3B1bWFza190IGNwdXNfYWxsb3dlZDsKKwlpbnQgaTsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmc3BlZWRzdGVwX2ZyZXFzWzBdLCB0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZnJlcXMub2xkID0gX3NwZWVkc3RlcF9nZXQocG9saWN5LT5jcHVzKTsKKwlmcmVxcy5uZXcgPSBzcGVlZHN0ZXBfZnJlcXNbbmV3c3RhdGVdLmZyZXF1ZW5jeTsKKwlmcmVxcy5jcHUgPSBwb2xpY3ktPmNwdTsKKworCWRwcmludGsoInRyYW5zaXRpbmcgZnJvbSAldSB0byAldSBrSHpcbiIsIGZyZXFzLm9sZCwgZnJlcXMubmV3KTsKKworCS8qIG5vIHRyYW5zaXRpb24gbmVjZXNzYXJ5ICovCisJaWYgKGZyZXFzLm9sZCA9PSBmcmVxcy5uZXcpCisJCXJldHVybiAwOworCisJY3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCisJZm9yX2VhY2hfY3B1X21hc2soaSwgcG9saWN5LT5jcHVzKSB7CisJCWZyZXFzLmNwdSA9IGk7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisJfQorCisJLyogc3dpdGNoIHRvIHBoeXNpY2FsIENQVSB3aGVyZSBzdGF0ZSBpcyB0byBiZSBjaGFuZ2VkICovCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBwb2xpY3ktPmNwdXMpOworCisJc3BlZWRzdGVwX3NldF9zdGF0ZShuZXdzdGF0ZSk7CisKKwkvKiBhbGxvdyB0byBiZSBydW4gb24gYWxsIENQVXMgKi8KKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdXNfYWxsb3dlZCk7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCBwb2xpY3ktPmNwdXMpIHsKKwkJZnJlcXMuY3B1ID0gaTsKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBzcGVlZHN0ZXBfdmVyaWZ5IC0gdmVyaWZpZXMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqCisgKiBMaW1pdCBtdXN0IGJlIHdpdGhpbiBzcGVlZHN0ZXBfbG93X2ZyZXEgYW5kIHNwZWVkc3RlcF9oaWdoX2ZyZXEsIHdpdGgKKyAqIGF0IGxlYXN0IG9uZSBib3JkZXIgaW5jbHVkZWQuCisgKi8KK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZzcGVlZHN0ZXBfZnJlcXNbMF0pOworfQorCisKK3N0YXRpYyBpbnQgc3BlZWRzdGVwX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCBzcGVlZDsKKwljcHVtYXNrX3QgY3B1c19hbGxvd2VkOworCisJLyogb25seSBydW4gb24gQ1BVIHRvIGJlIHNldCwgb3Igb24gaXRzIHNpYmxpbmcgKi8KKyNpZmRlZiBDT05GSUdfU01QCisJcG9saWN5LT5jcHVzID0gY3B1X3NpYmxpbmdfbWFwW3BvbGljeS0+Y3B1XTsKKyNlbmRpZgorCisJY3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgcG9saWN5LT5jcHVzKTsKKworCS8qIGRldGVjdCBsb3cgYW5kIGhpZ2ggZnJlcXVlbmN5ICovCisJcmVzdWx0ID0gc3BlZWRzdGVwX2dldF9mcmVxcyhzcGVlZHN0ZXBfcHJvY2Vzc29yLAorCQkJCSAgICAgJnNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfTE9XXS5mcmVxdWVuY3ksCisJCQkJICAgICAmc3BlZWRzdGVwX2ZyZXFzW1NQRUVEU1RFUF9ISUdIXS5mcmVxdWVuY3ksCisJCQkJICAgICAmc3BlZWRzdGVwX3NldF9zdGF0ZSk7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVzX2FsbG93ZWQpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwkvKiBnZXQgY3VycmVudCBzcGVlZCBzZXR0aW5nICovCisJc3BlZWQgPSBfc3BlZWRzdGVwX2dldChwb2xpY3ktPmNwdXMpOworCWlmICghc3BlZWQpCisJCXJldHVybiAtRUlPOworCisJZHByaW50aygiY3VycmVudGx5IGF0ICVzIHNwZWVkIHNldHRpbmcgLSAlaSBNSHpcbiIsCisJCShzcGVlZCA9PSBzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0xPV10uZnJlcXVlbmN5KSA/ICJsb3ciIDogImhpZ2giLAorCQkoc3BlZWQgLyAxMDAwKSk7CisKKwkvKiBjcHVpbmZvIGFuZCBkZWZhdWx0IHBvbGljeSB2YWx1ZXMgKi8KKwlwb2xpY3ktPmdvdmVybm9yID0gQ1BVRlJFUV9ERUZBVUxUX0dPVkVSTk9SOworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBDUFVGUkVRX0VURVJOQUw7CisJcG9saWN5LT5jdXIgPSBzcGVlZDsKKworCXJlc3VsdCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCBzcGVlZHN0ZXBfZnJlcXMpOworCWlmIChyZXN1bHQpCisJCXJldHVybiAocmVzdWx0KTsKKworICAgICAgICBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihzcGVlZHN0ZXBfZnJlcXMsIHBvbGljeS0+Y3B1KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc3BlZWRzdGVwX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIHNwZWVkc3RlcF9hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgc3BlZWRzdGVwX2RyaXZlciA9IHsKKwkubmFtZQk9ICJzcGVlZHN0ZXAtaWNoIiwKKwkudmVyaWZ5CT0gc3BlZWRzdGVwX3ZlcmlmeSwKKwkudGFyZ2V0CT0gc3BlZWRzdGVwX3RhcmdldCwKKwkuaW5pdAk9IHNwZWVkc3RlcF9jcHVfaW5pdCwKKwkuZXhpdAk9IHNwZWVkc3RlcF9jcHVfZXhpdCwKKwkuZ2V0CT0gc3BlZWRzdGVwX2dldCwKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuYXR0cgk9IHNwZWVkc3RlcF9hdHRyLAorfTsKKworCisvKioKKyAqIHNwZWVkc3RlcF9pbml0IC0gaW5pdGlhbGl6ZXMgdGhlIFNwZWVkU3RlcCBDUFVGcmVxIGRyaXZlcgorICoKKyAqICAgSW5pdGlhbGl6ZXMgdGhlIFNwZWVkU3RlcCBzdXBwb3J0LiBSZXR1cm5zIC1FTk9ERVYgb24gdW5zdXBwb3J0ZWQKKyAqIGRldmljZXMsIC1FSU5WQUwgb24gcHJvYmxlbXMgZHVyaW5nIGluaXRpYXRpemF0aW9uLCBhbmQgemVybyBvbgorICogc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgc3BlZWRzdGVwX2luaXQodm9pZCkKK3sKKwkvKiBkZXRlY3QgcHJvY2Vzc29yICovCisJc3BlZWRzdGVwX3Byb2Nlc3NvciA9IHNwZWVkc3RlcF9kZXRlY3RfcHJvY2Vzc29yKCk7CisJaWYgKCFzcGVlZHN0ZXBfcHJvY2Vzc29yKSB7CisJCWRwcmludGsoIkludGVsKFIpIFNwZWVkU3RlcChUTSkgY2FwYWJsZSBwcm9jZXNzb3Igbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogZGV0ZWN0IGNoaXBzZXQgKi8KKwlpZiAoIXNwZWVkc3RlcF9kZXRlY3RfY2hpcHNldCgpKSB7CisJCWRwcmludGsoIkludGVsKFIpIFNwZWVkU3RlcChUTSkgZm9yIHRoaXMgY2hpcHNldCBub3QgKHlldCkgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGFjdGl2YXRlIHNwZWVkc3RlcCBzdXBwb3J0ICovCisJaWYgKHNwZWVkc3RlcF9hY3RpdmF0ZSgpKSB7CisJCXBjaV9kZXZfcHV0KHNwZWVkc3RlcF9jaGlwc2V0X2Rldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmc3BlZWRzdGVwX2RyaXZlcik7Cit9CisKKworLyoqCisgKiBzcGVlZHN0ZXBfZXhpdCAtIHVucmVnaXN0ZXJzIFNwZWVkU3RlcCBzdXBwb3J0CisgKgorICogICBVbnJlZ2lzdGVycyBTcGVlZFN0ZXAgc3VwcG9ydC4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IHNwZWVkc3RlcF9leGl0KHZvaWQpCit7CisJcGNpX2Rldl9wdXQoc3BlZWRzdGVwX2NoaXBzZXRfZGV2KTsKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZzcGVlZHN0ZXBfZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SICgiRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+LCBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJTcGVlZHN0ZXAgZHJpdmVyIGZvciBJbnRlbCBtb2JpbGUgcHJvY2Vzc29ycyBvbiBjaGlwc2V0cyB3aXRoIElDSC1NIHNvdXRoYnJpZGdlcy4iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK21vZHVsZV9pbml0KHNwZWVkc3RlcF9pbml0KTsKK21vZHVsZV9leGl0KHNwZWVkc3RlcF9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhNDMwYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogKEMpIDIwMDIgLSAyMDAzIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBMaWJyYXJ5IGZvciBjb21tb24gZnVuY3Rpb25zIGZvciBJbnRlbCBTcGVlZFN0ZXAgdi4xIGFuZCB2LjIgc3VwcG9ydAorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSAic3BlZWRzdGVwLWxpYi5oIgorCisjZGVmaW5lIGRwcmludGsobXNnLi4uKSBjcHVmcmVxX2RlYnVnX3ByaW50ayhDUFVGUkVRX0RFQlVHX0RSSVZFUiwgInNwZWVkc3RlcC1saWIiLCBtc2cpCisKKyNpZmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9SRUxBWEVEX0NBUF9DSEVDSworc3RhdGljIGludCByZWxheGVkX2NoZWNrID0gMDsKKyNlbHNlCisjZGVmaW5lIHJlbGF4ZWRfY2hlY2sgMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgIEdFVCBQUk9DRVNTT1IgQ09SRSBTUEVFRCBJTiBLSFogICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGVudGl1bTNfZ2V0X2ZyZXF1ZW5jeSAodW5zaWduZWQgaW50IHByb2Nlc3NvcikKK3sKKyAgICAgICAgLyogU2VlIHRhYmxlIDE0IG9mIHAzX2RzLnBkZiBhbmQgdGFibGUgMjIgb2YgMjk4MzQwMDMucGRmICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IHJhdGlvOwkvKiBGcmVxdWVuY3kgTXVsdGlwbGllciAoeDEwKSAqLworCQl1OCBiaXRtYXA7CSAgICAgICAgLyogcG93ZXIgb24gY29uZmlndXJhdGlvbiBiaXRzCisJCQkJCSAgIFsyNywgMjU6MjJdIChpbiBNU1IgMHgyYSkgKi8KKwl9IG1zcl9kZWNvZGVfbXVsdCBbXSA9IHsKKwkJeyAzMCwgMHgwMSB9LAorCQl7IDM1LCAweDA1IH0sCisJCXsgNDAsIDB4MDIgfSwKKwkJeyA0NSwgMHgwNiB9LAorCQl7IDUwLCAweDAwIH0sCisJCXsgNTUsIDB4MDQgfSwKKwkJeyA2MCwgMHgwYiB9LAorCQl7IDY1LCAweDBmIH0sCisJCXsgNzAsIDB4MDkgfSwKKwkJeyA3NSwgMHgwZCB9LAorCQl7IDgwLCAweDBhIH0sCisJCXsgODUsIDB4MjYgfSwKKwkJeyA5MCwgMHgyMCB9LAorCQl7IDEwMCwgMHgyYiB9LAorCQl7IDAsIDB4ZmYgfSAgICAgLyogZXJyb3Igb3IgdW5rbm93biB2YWx1ZSAqLworCX07CisKKwkvKiBQSUlJKC1NKSBGU0Igc2V0dGluZ3M6IHNlZSB0YWJsZSBiMS1iIG9mIDI0NTQ3MjA2LnBkZiAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludCB2YWx1ZTsgICAgIC8qIEZyb250IFNpZGUgQnVzIHNwZWVkIGluIE1IeiAqLworCQl1OCBiaXRtYXA7ICAgICAgICAgICAgICAvKiBwb3dlciBvbiBjb25maWd1cmF0aW9uIGJpdHMgWzE4OiAxOV0KKwkJCQkJICAgKGluIE1TUiAweDJhKSAqLworCX0gbXNyX2RlY29kZV9mc2IgW10gPSB7CisJCXsgIDY2LCAweDAgfSwKKwkJeyAxMDAsIDB4MiB9LAorCQl7IDEzMywgMHgxIH0sCisJCXsgICAwLCAweGZmfQorCX07CisKKwl1MzIgICAgIG1zcl9sbywgbXNyX3RtcDsKKwlpbnQgICAgIGkgPSAwLCBqID0gMDsKKworCS8qIHJlYWQgTVNSIDB4MmEgLSB3ZSBvbmx5IG5lZWQgdGhlIGxvdyAzMiBiaXRzICovCisJcmRtc3IoTVNSX0lBMzJfRUJMX0NSX1BPV0VST04sIG1zcl9sbywgbXNyX3RtcCk7CisJZHByaW50aygiUDMgLSBNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTjogMHgleCAweCV4XG4iLCBtc3JfbG8sIG1zcl90bXApOworCW1zcl90bXAgPSBtc3JfbG87CisKKwkvKiBkZWNvZGUgdGhlIEZTQiAqLworCW1zcl90bXAgJj0gMHgwMGMwMDAwOworCW1zcl90bXAgPj49IDE4OworCXdoaWxlIChtc3JfdG1wICE9IG1zcl9kZWNvZGVfZnNiW2ldLmJpdG1hcCkgeworCQlpZiAobXNyX2RlY29kZV9mc2JbaV0uYml0bWFwID09IDB4ZmYpCisJCQlyZXR1cm4gMDsKKwkJaSsrOworCX0KKworCS8qIGRlY29kZSB0aGUgbXVsdGlwbGllciAqLworCWlmIChwcm9jZXNzb3IgPT0gU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX0NfRUFSTFkpIHsKKwkJZHByaW50aygid29ya2Fyb3VuZCBmb3IgZWFybHkgUElJSXNcbiIpOworCQltc3JfbG8gJj0gMHgwM2MwMDAwMDsKKwl9IGVsc2UKKwkJbXNyX2xvICY9IDB4MGJjMDAwMDA7CisJbXNyX2xvID4+PSAyMjsKKwl3aGlsZSAobXNyX2xvICE9IG1zcl9kZWNvZGVfbXVsdFtqXS5iaXRtYXApIHsKKwkJaWYgKG1zcl9kZWNvZGVfbXVsdFtqXS5iaXRtYXAgPT0gMHhmZikKKwkJCXJldHVybiAwOworCQlqKys7CisJfQorCisJZHByaW50aygic3BlZWQgaXMgJXVcbiIsIChtc3JfZGVjb2RlX211bHRbal0ucmF0aW8gKiBtc3JfZGVjb2RlX2ZzYltpXS52YWx1ZSAqIDEwMCkpOworCisJcmV0dXJuIChtc3JfZGVjb2RlX211bHRbal0ucmF0aW8gKiBtc3JfZGVjb2RlX2ZzYltpXS52YWx1ZSAqIDEwMCk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBwZW50aXVtTV9nZXRfZnJlcXVlbmN5KHZvaWQpCit7CisJdTMyICAgICBtc3JfbG8sIG1zcl90bXA7CisKKwlyZG1zcihNU1JfSUEzMl9FQkxfQ1JfUE9XRVJPTiwgbXNyX2xvLCBtc3JfdG1wKTsKKwlkcHJpbnRrKCJQTSAtIE1TUl9JQTMyX0VCTF9DUl9QT1dFUk9OOiAweCV4IDB4JXhcbiIsIG1zcl9sbywgbXNyX3RtcCk7CisKKwkvKiBzZWUgdGFibGUgQi0yIG9mIDI0NTQ3MjEyLnBkZiAqLworCWlmIChtc3JfbG8gJiAweDAwMDQwMDAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJzcGVlZHN0ZXAtbGliOiBQTSAtIGludmFsaWQgRlNCOiAweCV4IDB4JXhcbiIsIG1zcl9sbywgbXNyX3RtcCk7CisJCXJldHVybiAwOworCX0KKworCW1zcl90bXAgPSAobXNyX2xvID4+IDIyKSAmIDB4MWY7CisJZHByaW50aygiYml0cyAyMi0yNiBhcmUgMHgleCwgc3BlZWQgaXMgJXVcbiIsIG1zcl90bXAsIChtc3JfdG1wICogMTAwICogMTAwMCkpOworCisJcmV0dXJuIChtc3JfdG1wICogMTAwICogMTAwMCk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBwZW50aXVtNF9nZXRfZnJlcXVlbmN5KHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmJvb3RfY3B1X2RhdGE7CisJdTMyIG1zcl9sbywgbXNyX2hpLCBtdWx0OworCXVuc2lnbmVkIGludCBmc2IgPSAwOworCisJcmRtc3IoMHgyYywgbXNyX2xvLCBtc3JfaGkpOworCisJZHByaW50aygiUDQgLSBNU1JfRUJDX0ZSRVFVRU5DWV9JRDogMHgleCAweCV4XG4iLCBtc3JfbG8sIG1zcl9oaSk7CisKKwkvKiBkZWNvZGUgdGhlIEZTQjogc2VlIElBLTMyIEludGVsIChDKSBBcmNoaXRlY3R1cmUgU29mdHdhcmUgCisJICogRGV2ZWxvcGVyJ3MgTWFudWFsLCBWb2x1bWUgMzogU3lzdGVtIFByZ3JhbW1pbmcgR3VpZGUsCisJICogcmV2aXNpb24gIzEyIGluIFRhYmxlIEItMTogTVNScyBpbiB0aGUgUGVudGl1bSA0IGFuZAorCSAqIEludGVsIFhlb24gUHJvY2Vzc29ycywgb24gcGFnZSBCLTQgYW5kIEItNS4KKwkgKi8KKwlpZiAoYy0+eDg2X21vZGVsIDwgMikKKwkJZnNiID0gMTAwICogMTAwMDsKKwllbHNlIHsKKwkJdTggZnNiX2NvZGUgPSAobXNyX2xvID4+IDE2KSAmIDB4NzsKKwkJc3dpdGNoIChmc2JfY29kZSkgeworCQljYXNlIDA6CisJCQlmc2IgPSAxMDAgKiAxMDAwOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWZzYiA9IDEzMzMzICogMTA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZnNiID0gMjAwICogMTAwMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmc2IpCisJCXByaW50ayhLRVJOX0RFQlVHICJzcGVlZHN0ZXAtbGliOiBjb3VsZG4ndCBkZXRlY3QgRlNCIHNwZWVkLiBQbGVhc2Ugc2VuZCBhbiBlLW1haWwgdG8gPGxpbnV4QGJyb2RvLmRlPlxuIik7CisKKwkvKiBNdWx0aXBsaWVyLiAqLworCWlmIChjLT54ODZfbW9kZWwgPCAyKQorCQltdWx0ID0gbXNyX2xvID4+IDI3OworCWVsc2UKKwkJbXVsdCA9IG1zcl9sbyA+PiAyNDsKKworCWRwcmludGsoIlA0IC0gRlNCICV1IGtIejsgTXVsdGlwbGllciAldTsgU3BlZWQgJXUga0h6XG4iLCBmc2IsIG11bHQsIChmc2IgKiBtdWx0KSk7CisKKwlyZXR1cm4gKGZzYiAqIG11bHQpOworfQorCisgCit1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBwcm9jZXNzb3IpCit7CisJc3dpdGNoIChwcm9jZXNzb3IpIHsKKwljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUE06CisJCXJldHVybiBwZW50aXVtTV9nZXRfZnJlcXVlbmN5KCk7CisJY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0RDoKKwljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUDRNOgorCQlyZXR1cm4gcGVudGl1bTRfZ2V0X2ZyZXF1ZW5jeSgpOworCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX1Q6CisJY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQzoKKwljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9DX0VBUkxZOgorCQlyZXR1cm4gcGVudGl1bTNfZ2V0X2ZyZXF1ZW5jeShwcm9jZXNzb3IpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX07CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3kpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICBERVRFQ1QgU1BFRURTVEVQLUNBUEFCTEUgUFJPQ0VTU09SICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Vuc2lnbmVkIGludCBzcGVlZHN0ZXBfZGV0ZWN0X3Byb2Nlc3NvciAodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKKwl1MzIJCQllYngsIG1zcl9sbywgbXNyX2hpOworCisJZHByaW50aygieDg2OiAleCwgbW9kZWw6ICV4XG4iLCBjLT54ODYsIGMtPng4Nl9tb2RlbCk7CisKKwlpZiAoKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkgfHwgCisJICAgICgoYy0+eDg2ICE9IDYpICYmIChjLT54ODYgIT0gMHhGKSkpCisJCXJldHVybiAwOworCisJaWYgKGMtPng4NiA9PSAweEYpIHsKKwkJLyogSW50ZWwgTW9iaWxlIFBlbnRpdW0gNC1NCisJCSAqIG9yIEludGVsIE1vYmlsZSBQZW50aXVtIDQgd2l0aCA1MzMgTUh6IEZTQiAqLworCQlpZiAoYy0+eDg2X21vZGVsICE9IDIpCisJCQlyZXR1cm4gMDsKKworCQllYnggPSBjcHVpZF9lYngoMHgwMDAwMDAwMSk7CisJCWVieCAmPSAweDAwMDAwMEZGOworCisJCWRwcmludGsoImVieCB2YWx1ZSBpcyAleCwgeDg2X21hc2sgaXMgJXhcbiIsIGVieCwgYy0+eDg2X21hc2spOworCisJCXN3aXRjaCAoYy0+eDg2X21hc2spIHsKKwkJY2FzZSA0OiAKKwkJCS8qCisJCQkgKiBCLXN0ZXBwaW5nIFtNLVA0LU1dIAorCQkJICogc2FtcGxlIGhhcyBlYnggPSAweDBmLCBwcm9kdWN0aW9uIGhhcyAweDBlLgorCQkJICovCisJCQlpZiAoKGVieCA9PSAweDBlKSB8fCAoZWJ4ID09IDB4MGYpKQorCQkJCXJldHVybiBTUEVFRFNURVBfUFJPQ0VTU09SX1A0TTsKKwkJCWJyZWFrOworCQljYXNlIDc6IAorCQkJLyoKKwkJCSAqIEMtc3RlcHBpbmcgW00tUDQtTV0KKwkJCSAqIG5lZWRzIHRvIGhhdmUgZWJ4PTB4MGUsIGVsc2UgaXQncyBhIGNlbGVyb246CisJCQkgKiBjZi4gMjUxMzA5MTcucGRmIC8gcGFnZSA3LCBmb290bm90ZSA1IGV2ZW4KKwkJCSAqIHRob3VnaCAyNTA3MjEyMC5wZGYgLyBwYWdlIDcgZG9lc24ndCBzYXkKKwkJCSAqIHNhbXBsZXMgYXJlIG9ubHkgb2YgQi1zdGVwcGluZy4uLgorCQkJICovCisJCQlpZiAoZWJ4ID09IDB4MGUpCisJCQkJcmV0dXJuIFNQRUVEU1RFUF9QUk9DRVNTT1JfUDRNOworCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJCS8qCisJCQkgKiBELXN0ZXBwaW5nIFtNLVA0LU0gb3IgTS1QNC81MzNdCisJCQkgKgorCQkJICogdGhpcyBpcyB0b3RhbGx5IHN0cmFuZ2U6IENQVUlEIDB4MEYyOSBpcworCQkJICogdXNlZCBieSBNLVA0LU0sIE0tUDQvNTMzIGFuZCghKSBDZWxlcm9uIENQVXMuCisJCQkgKiBUaGUgbGF0dGVyIG5lZWQgdG8gYmUgc29ydGVkIG91dCBhcyB0aGV5IGRvbid0CisJCQkgKiBzdXBwb3J0IHNwZWVkc3RlcC4KKwkJCSAqIENlbGVyb25zIHdpdGggQ1BVSUQgMHgwRjI5IG1heSBoYXZlIGVpdGhlcgorCQkJICogZWJ4PTB4OCBvciAweGYgLS0gMjUxMzA5MTcucGRmIGRvZXNuJ3Qgc2F5IGFueXRoaW5nCisJCQkgKiBzcGVjaWZpYy4KKwkJCSAqIE0tUDQtTXMgbWF5IGhhdmUgZWl0aGVyIGVieD0weGUgb3IgMHhmIFtzZWUgYWJvdmVdCisJCQkgKiBNLVA0LzUzMyBoYXZlIGVpdGhlciBlYng9MHhlIG9yIDB4Zi4gWzI1MzE3NjA3LnBkZl0KKwkJCSAqIGFsc28sIE0tUDRNIEhUcyBoYXZlIGVieD0weDgsIHRvbworCQkJICogRm9yIG5vdywgdGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgbW9kZWxfaWQgc3RyaW5nCisJCQkgKi8KKwkJICAgICAgICBpZiAoKGVieCA9PSAweDBlKSB8fCAoc3Ryc3RyKGMtPng4Nl9tb2RlbF9pZCwiTW9iaWxlIEludGVsKFIpIFBlbnRpdW0oUikgNCIpICE9IE5VTEwpKSAKKwkJCQlyZXR1cm4gU1BFRURTVEVQX1BST0NFU1NPUl9QNE07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoYy0+eDg2X21vZGVsKSB7CisJY2FzZSAweDBCOiAvKiBJbnRlbCBQSUlJIFtUdWFsYXRpbl0gKi8KKwkJLyogY3B1aWRfZWJ4KDEpIGlzIDB4MDQgZm9yIGRlc2t0b3AgUElJSSwgCisJCSAgICAgICAgICAgICAgICAgICAweDA2IGZvciBtb2JpbGUgUElJSS1NICovCisJCWVieCA9IGNwdWlkX2VieCgweDAwMDAwMDAxKTsKKwkJZHByaW50aygiZWJ4IGlzICV4XG4iLCBlYngpOworCisJCWVieCAmPSAweDAwMDAwMEZGOworCisJCWlmIChlYnggIT0gMHgwNikKKwkJCXJldHVybiAwOworCisJCS8qIFNvIGZhciBhbGwgUElJSS1NIHByb2Nlc3NvcnMgc3VwcG9ydCBTcGVlZFN0ZXAuIFNlZQorCQkgKiBJbnRlbCdzIDI0NTQwNjQwLnBkZiBvZiBKdW5lIDIwMDMgCisJCSAqLworCisJCXJldHVybiBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfVDsKKworCWNhc2UgMHgwODogLyogSW50ZWwgUElJSSBbQ29wcGVybWluZV0gKi8KKworCQkvKiBhbGwgbW9iaWxlIFBJSUkgQ29wcGVybWluZXMgaGF2ZSBGU0IgMTAwIE1IegorCQkgKiA9PT4gc29ydCBvdXQgYSBmZXcgZGVza3RvcCBQSUlJcy4gKi8KKwkJcmRtc3IoTVNSX0lBMzJfRUJMX0NSX1BPV0VST04sIG1zcl9sbywgbXNyX2hpKTsKKwkJZHByaW50aygiQ29wcGVybWluZTogTVNSX0lBMzJfRUJMX0NSX1BPV0VST04gaXMgMHgleCwgMHgleFxuIiwgbXNyX2xvLCBtc3JfaGkpOworCQltc3JfbG8gJj0gMHgwMGMwMDAwOworCQlpZiAobXNyX2xvICE9IDB4MDA4MDAwMCkKKwkJCXJldHVybiAwOworCisJCS8qCisJCSAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYSBtb2JpbGUgdmVyc2lvbiwKKwkJICogcGxhdGZvcm0gSUQgaGFzIGJpdCA1MCBzZXQKKwkJICogaXQgaGFzIFNwZWVkU3RlcCB0ZWNobm9sb2d5IGlmIGVpdGhlcgorCQkgKiBiaXQgNTYgb3IgNTcgaXMgc2V0CisJCSAqLworCQlyZG1zcihNU1JfSUEzMl9QTEFURk9STV9JRCwgbXNyX2xvLCBtc3JfaGkpOworCQlkcHJpbnRrKCJDb3BwZXJtaW5lOiBNU1JfSUEzMl9QTEFURk9STSBJRCBpcyAweCV4LCAweCV4XG4iLCBtc3JfbG8sIG1zcl9oaSk7CisJCWlmICgobXNyX2hpICYgKDE8PDE4KSkgJiYgKHJlbGF4ZWRfY2hlY2sgPyAxIDogKG1zcl9oaSAmICgzPDwyNCkpKSkgeworCQkJaWYgKGMtPng4Nl9tYXNrID09IDB4MDEpIHsKKwkJCQlkcHJpbnRrKCJlYXJseSBQSUlJIHZlcnNpb25cbiIpOworCQkJCXJldHVybiBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQ19FQVJMWTsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQzsKKwkJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgREVURUNUIFNQRUVEU1RFUCBTUEVFRFMgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Vuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X2ZyZXFzKHVuc2lnbmVkIGludCBwcm9jZXNzb3IsCisJCQkJICB1bnNpZ25lZCBpbnQgKmxvd19zcGVlZCwKKwkJCQkgIHVuc2lnbmVkIGludCAqaGlnaF9zcGVlZCwKKwkJCQkgIHZvaWQgKCpzZXRfc3RhdGUpICh1bnNpZ25lZCBpbnQgc3RhdGUpKQoreworCXVuc2lnbmVkIGludCBwcmV2X3NwZWVkOworCXVuc2lnbmVkIGludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKCFwcm9jZXNzb3IpIHx8ICghbG93X3NwZWVkKSB8fCAoIWhpZ2hfc3BlZWQpIHx8ICghc2V0X3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkcHJpbnRrKCJ0cnlpbmcgdG8gZGV0ZXJtaW5lIGJvdGggc3BlZWRzXG4iKTsKKworCS8qIGdldCBjdXJyZW50IHNwZWVkICovCisJcHJldl9zcGVlZCA9IHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShwcm9jZXNzb3IpOworCWlmICghcHJldl9zcGVlZCkKKwkJcmV0dXJuIC1FSU87CisKKwlkcHJpbnRrKCJwcmV2aW91cyBzZXBlZCBpcyAldVxuIiwgcHJldl9zcGVlZCk7CisJCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogc3dpdGNoIHRvIGxvdyBzdGF0ZSAqLworCXNldF9zdGF0ZShTUEVFRFNURVBfTE9XKTsKKwkqbG93X3NwZWVkID0gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KHByb2Nlc3Nvcik7CisJaWYgKCEqbG93X3NwZWVkKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWRwcmludGsoImxvdyBzZXBlZCBpcyAldVxuIiwgKmxvd19zcGVlZCk7CisKKwkvKiBzd2l0Y2ggdG8gaGlnaCBzdGF0ZSAqLworCXNldF9zdGF0ZShTUEVFRFNURVBfSElHSCk7CisJKmhpZ2hfc3BlZWQgPSBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3kocHJvY2Vzc29yKTsKKwlpZiAoISpoaWdoX3NwZWVkKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWRwcmludGsoImhpZ2ggc2VwZWQgaXMgJXVcbiIsICpoaWdoX3NwZWVkKTsKKworCWlmICgqbG93X3NwZWVkID09ICpoaWdoX3NwZWVkKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHN3aXRjaCB0byBwcmV2aW91cyBzdGF0ZSwgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCpoaWdoX3NwZWVkICE9IHByZXZfc3BlZWQpCisJCXNldF9zdGF0ZShTUEVFRFNURVBfTE9XKTsKKworIG91dDoKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIChyZXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3BlZWRzdGVwX2dldF9mcmVxcyk7CisKKyNpZmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9SRUxBWEVEX0NBUF9DSEVDSworbW9kdWxlX3BhcmFtKHJlbGF4ZWRfY2hlY2ssIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlbGF4ZWRfY2hlY2ssICJEb24ndCBkbyBhbGwgY2hlY2tzIGZvciBzcGVlZHN0ZXAgY2FwYWJpbGl0eS4iKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SICgiRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiTGlicmFyeSBmb3IgSW50ZWwgU3BlZWRTdGVwIDEgb3IgMiBjcHVmcmVxIGRyaXZlcnMuIik7CitNT0RVTEVfTElDRU5TRSAoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjFhMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIChDKSAyMDAyIC0gMjAwMyBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAgTGlicmFyeSBmb3IgY29tbW9uIGZ1bmN0aW9ucyBmb3IgSW50ZWwgU3BlZWRTdGVwIHYuMSBhbmQgdi4yIHN1cHBvcnQKKyAqCisgKiAgQklHIEZBVCBESVNDTEFJTUVSOiBXb3JrIGluIHByb2dyZXNzIGNvZGUuIFBvc3NpYmx5ICpkYW5nZXJvdXMqCisgKi8KKworCisKKy8qIHByb2Nlc3NvcnMgKi8KKworI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQ19FQVJMWQkweDAwMDAwMDAxICAvKiBDb3BwZXJtaW5lIGNvcmUgKi8KKyNkZWZpbmUgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX0MJCTB4MDAwMDAwMDIgIC8qIENvcHBlcm1pbmUgY29yZSAqLworI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfVCAJCTB4MDAwMDAwMDMgIC8qIFR1YWxhdGluIGNvcmUgKi8KKyNkZWZpbmUgU1BFRURTVEVQX1BST0NFU1NPUl9QNE0JCQkweDAwMDAwMDA0ICAvKiBQNC1NICAqLworCisvKiB0aGUgZm9sbG93aW5nIHByb2Nlc3NvcnMgYXJlIG5vdCBzcGVlZHN0ZXAtY2FwYWJsZSBhbmQgYXJlIG5vdCBhdXRvLWRldGVjdGVkCisgKiBpbiBzcGVlZHN0ZXBfZGV0ZWN0X3Byb2Nlc3NvcigpLiBIb3dldmVyLCB0aGVpciBzcGVlZCBjYW4gYmUgZGV0ZWN0ZWQgdXNpbmcKKyAqIHRoZSBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3koKSBjYWxsLiAqLworI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BNCQkJMHhGRkZGRkYwMyAgLyogUGVudGl1bSBNICAqLworI2RlZmluZSBTUEVFRFNURVBfUFJPQ0VTU09SX1A0RAkJCTB4RkZGRkZGMDQgIC8qIGRlc2t0b3AgUDQgICovCisKKy8qIHNwZWVkc3RlcCBzdGF0ZXMgLS0gb25seSB0d28gb2YgdGhlbSAqLworCisjZGVmaW5lIFNQRUVEU1RFUF9ISUdIICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBTUEVFRFNURVBfTE9XICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworCisvKiBkZXRlY3QgYSBzcGVlZHN0ZXAtY2FwYWJsZSBwcm9jZXNzb3IgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IgKHZvaWQpOworCisvKiBkZXRlY3QgdGhlIGN1cnJlbnQgc3BlZWQgKGluIGtoeikgb2YgdGhlIHByb2Nlc3NvciAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X3Byb2Nlc3Nvcl9mcmVxdWVuY3kodW5zaWduZWQgaW50IHByb2Nlc3Nvcik7CisKKworLyogZGV0ZWN0IHRoZSBsb3cgYW5kIGhpZ2ggc3BlZWRzIG9mIHRoZSBwcm9jZXNzb3IuIFRoZSBjYWxsYmFjayAKKyAqIHNldF9zdGF0ZSIncyBmaXJzdCBhcmd1bWVudCBpcyBlaXRoZXIgU1BFRURTVEVQX0hJR0ggb3IgCisgKiBTUEVFRFNURVBfTE9XOyB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHplcm8gc28gdGhhdCBubyAKKyAqIGNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24gY2FsbHMgYXJlIGluaXRpYXRlZC4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBzcGVlZHN0ZXBfZ2V0X2ZyZXFzKHVuc2lnbmVkIGludCBwcm9jZXNzb3IsCisJICB1bnNpZ25lZCBpbnQgKmxvd19zcGVlZCwKKwkgIHVuc2lnbmVkIGludCAqaGlnaF9zcGVlZCwKKwkgIHZvaWQgKCpzZXRfc3RhdGUpICh1bnNpZ25lZCBpbnQgc3RhdGUpKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtc21pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0NDBiMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLXNtaS5jCkBAIC0wLDAgKzEsNDI0IEBACisvKgorICogSW50ZWwgU3BlZWRTdGVwIFNNSSBkcml2ZXIuCisgKgorICogKEMpIDIwMDMgIEhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFNQRUVEU1RFUCAtIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+IAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lzdC5oPgorCisjaW5jbHVkZSAic3BlZWRzdGVwLWxpYi5oIgorCisvKiBzcGVlZHN0ZXAgc3lzdGVtIG1hbmFnZW1lbnQgaW50ZXJmYWNlIHBvcnQvY29tbWFuZC4KKyAqCisgKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBnb3QgZnJvbSBJU1QtU01JIEJJT1MgY2FsbC4KKyAqIElmIHVzZXIgZ2l2ZXMgaXQsIHRoZXNlIGFyZSB1c2VkLgorICogCisgKi8KK3N0YXRpYyBpbnQJCXNtaV9wb3J0CT0gMDsKK3N0YXRpYyBpbnQJCXNtaV9jbWQJCT0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJc21pX3NpZwkJPSAwOworCisvKiBpbmZvIGFib3V0IHRoZSBwcm9jZXNzb3IgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJc3BlZWRzdGVwX3Byb2Nlc3NvciA9IDA7CisKKy8qIAorICogICBUaGVyZSBhcmUgb25seSB0d28gZnJlcXVlbmN5IHN0YXRlcyBmb3IgZWFjaCBwcm9jZXNzb3IuIFZhbHVlcworICogYXJlIGluIGtIeiBmb3IgdGhlIHRpbWUgYmVpbmcuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgc3BlZWRzdGVwX2ZyZXFzW10gPSB7CisJe1NQRUVEU1RFUF9ISUdILCAJMH0sCisJe1NQRUVEU1RFUF9MT1csCQkwfSwKKwl7MCwJCQlDUFVGUkVRX1RBQkxFX0VORH0sCit9OworCisjZGVmaW5lIEdFVF9TUEVFRFNURVBfT1dORVIgMAorI2RlZmluZSBHRVRfU1BFRURTVEVQX1NUQVRFIDEKKyNkZWZpbmUgU0VUX1NQRUVEU1RFUF9TVEFURSAyCisjZGVmaW5lIEdFVF9TUEVFRFNURVBfRlJFUVMgNAorCisvKiBob3cgb2Z0ZW4gc2hhbGwgdGhlIFNNSSBjYWxsIGJlIHRyaWVkIGlmIGl0IGZhaWxlZCwgZS5nLiBiZWNhdXNlCisgKiBvZiBETUEgYWN0aXZpdHkgZ29pbmcgb24/ICovCisjZGVmaW5lIFNNSV9UUklFUyA1CisKKyNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAic3BlZWRzdGVwLXNtaSIsIG1zZykKKworLyoqCisgKiBzcGVlZHN0ZXBfc21pX293bmVyc2hpcAorICovCitzdGF0aWMgaW50IHNwZWVkc3RlcF9zbWlfb3duZXJzaGlwICh2b2lkKQoreworCXUzMiBjb21tYW5kLCByZXN1bHQsIG1hZ2ljOworCXUzMiBmdW5jdGlvbiA9IEdFVF9TUEVFRFNURVBfT1dORVI7CisJdW5zaWduZWQgY2hhciBtYWdpY19kYXRhW10gPSAiQ29weXJpZ2h0IChjKSAxOTk5IEludGVsIENvcnBvcmF0aW9uIjsKKworCWNvbW1hbmQgPSAoc21pX3NpZyAmIDB4ZmZmZmZmMDApIHwgKHNtaV9jbWQgJiAweGZmKTsKKwltYWdpYyA9IHZpcnRfdG9fcGh5cyhtYWdpY19kYXRhKTsKKworCWRwcmludGsoInRyeWluZyB0byBvYnRhaW4gb3duZXJzaGlwIHdpdGggY29tbWFuZCAleCBhdCBwb3J0ICV4XG4iLCBjb21tYW5kLCBzbWlfcG9ydCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIm91dCAlJWFsLCAoJSVkeClcbiIKKwkJOiAiPUQiIChyZXN1bHQpCisJCTogImEiIChjb21tYW5kKSwgImIiIChmdW5jdGlvbiksICJjIiAoMCksICJkIiAoc21pX3BvcnQpLCAiRCIgKDApLCAiUyIgKG1hZ2ljKQorCSk7CisKKwlkcHJpbnRrKCJyZXN1bHQgaXMgJXhcbiIsIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIHNwZWVkc3RlcF9zbWlfZ2V0X2ZyZXFzIC0gZ2V0IFNwZWVkU3RlcCBwcmVmZXJyZWQgJiBjdXJyZW50IGZyZXEuCisgKiBAbG93OiB0aGUgbG93IGZyZXF1ZW5jeSB2YWx1ZSBpcyBwbGFjZWQgaGVyZQorICogQGhpZ2g6IHRoZSBoaWdoIGZyZXF1ZW5jeSB2YWx1ZSBpcyBwbGFjZWQgaGVyZQorICoKKyAqIE9ubHkgYXZhaWxhYmxlIG9uIGxhdGVyIFNwZWVkU3RlcC1lbmFibGVkIHN5c3RlbXMsIHJldHVybnMgZmFsc2UgcmVzdWx0cyBvcgorICogZXZlbiBoYW5ncyBbY2YuIGJ1Z21lLm9zZGwub3JnICMgMTQyMl0gb24gZWFybGllciBzeXN0ZW1zLiBFbXBpcmljYWwgdGVzdGluZworICogc2hvd3MgdGhhdCB0aGUgbGF0dGVyIG9jY3VycyBpZiAhKGlzdF9pbmZvLmV2ZW50ICYgMHhGRkZGKS4KKyAqLworc3RhdGljIGludCBzcGVlZHN0ZXBfc21pX2dldF9mcmVxcyAodW5zaWduZWQgaW50ICpsb3csIHVuc2lnbmVkIGludCAqaGlnaCkKK3sKKwl1MzIgY29tbWFuZCwgcmVzdWx0ID0gMCwgZWRpLCBoaWdoX21oeiwgbG93X21oejsKKwl1MzIgc3RhdGU9MDsKKwl1MzIgZnVuY3Rpb24gPSBHRVRfU1BFRURTVEVQX0ZSRVFTOworCisJaWYgKCEoaXN0X2luZm8uZXZlbnQgJiAweEZGRkYpKSB7CisJCWRwcmludGsoImJ1ZyAjMTQyMiAtLSBjYW4ndCByZWFkIGZyZXFzIGZyb20gQklPU1xuIiwgcmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY29tbWFuZCA9IChzbWlfc2lnICYgMHhmZmZmZmYwMCkgfCAoc21pX2NtZCAmIDB4ZmYpOworCisJZHByaW50aygidHJ5aW5nIHRvIGRldGVybWluZSBmcmVxdWVuY2llcyB3aXRoIGNvbW1hbmQgJXggYXQgcG9ydCAleFxuIiwgY29tbWFuZCwgc21pX3BvcnQpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJDAsICUlZWRpXG4iCisJCSJvdXQgJSVhbCwgKCUlZHgpXG4iCisJCTogIj1hIiAocmVzdWx0KSwgIj1iIiAoaGlnaF9taHopLCAiPWMiIChsb3dfbWh6KSwgIj1kIiAoc3RhdGUpLCAiPUQiIChlZGkpCisJCTogImEiIChjb21tYW5kKSwgImIiIChmdW5jdGlvbiksICJjIiAoc3RhdGUpLCAiZCIgKHNtaV9wb3J0KSwgIlMiICgwKQorCSk7CisKKwlkcHJpbnRrKCJyZXN1bHQgJXgsIGxvd19mcmVxICV1LCBoaWdoX2ZyZXEgJXVcbiIsIHJlc3VsdCwgbG93X21oeiwgaGlnaF9taHopOworCisJLyogYWJvcnQgaWYgcmVzdWx0cyBhcmUgb2J2aW91c2x5IGluY29ycmVjdC4uLiAqLworCWlmICgoaGlnaF9taHogKyBsb3dfbWh6KSA8IDYwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqaGlnaCA9IGhpZ2hfbWh6ICogMTAwMDsKKwkqbG93ICA9IGxvd19taHogICogMTAwMDsKKworCXJldHVybiByZXN1bHQ7Cit9IAorCisvKioKKyAqIHNwZWVkc3RlcF9nZXRfc3RhdGUgLSBzZXQgdGhlIFNwZWVkU3RlcCBzdGF0ZQorICogQHN0YXRlOiBwcm9jZXNzb3IgZnJlcXVlbmN5IHN0YXRlIChTUEVFRFNURVBfTE9XIG9yIFNQRUVEU1RFUF9ISUdIKQorICoKKyAqLworc3RhdGljIGludCBzcGVlZHN0ZXBfZ2V0X3N0YXRlICh2b2lkKQoreworCXUzMiBmdW5jdGlvbj1HRVRfU1BFRURTVEVQX1NUQVRFOworCXUzMiByZXN1bHQsIHN0YXRlLCBlZGksIGNvbW1hbmQ7CisKKwljb21tYW5kID0gKHNtaV9zaWcgJiAweGZmZmZmZjAwKSB8IChzbWlfY21kICYgMHhmZik7CisKKwlkcHJpbnRrKCJ0cnlpbmcgdG8gZGV0ZXJtaW5lIGN1cnJlbnQgc2V0dGluZyB3aXRoIGNvbW1hbmQgJXggYXQgcG9ydCAleFxuIiwgY29tbWFuZCwgc21pX3BvcnQpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJDAsICUlZWRpXG4iCisJCSJvdXQgJSVhbCwgKCUlZHgpXG4iCisJCTogIj1hIiAocmVzdWx0KSwgIj1iIiAoc3RhdGUpLCAiPUQiIChlZGkpCisJCTogImEiIChjb21tYW5kKSwgImIiIChmdW5jdGlvbiksICJjIiAoMCksICJkIiAoc21pX3BvcnQpLCAiUyIgKDApCisJKTsKKworCWRwcmludGsoInN0YXRlIGlzICV4LCByZXN1bHQgaXMgJXhcbiIsIHN0YXRlLCByZXN1bHQpOworCisJcmV0dXJuIChzdGF0ZSAmIDEpOworfQorCisKKy8qKgorICogc3BlZWRzdGVwX3NldF9zdGF0ZSAtIHNldCB0aGUgU3BlZWRTdGVwIHN0YXRlCisgKiBAc3RhdGU6IG5ldyBwcm9jZXNzb3IgZnJlcXVlbmN5IHN0YXRlIChTUEVFRFNURVBfTE9XIG9yIFNQRUVEU1RFUF9ISUdIKQorICoKKyAqLworc3RhdGljIHZvaWQgc3BlZWRzdGVwX3NldF9zdGF0ZSAodW5zaWduZWQgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGludCByZXN1bHQgPSAwLCBjb21tYW5kLCBuZXdfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZnVuY3Rpb249U0VUX1NQRUVEU1RFUF9TVEFURTsKKwl1bnNpZ25lZCBpbnQgcmV0cnkgPSAwOworCisJaWYgKHN0YXRlID4gMHgxKQorCQlyZXR1cm47CisKKwkvKiBEaXNhYmxlIElSUXMgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljb21tYW5kID0gKHNtaV9zaWcgJiAweGZmZmZmZjAwKSB8IChzbWlfY21kICYgMHhmZik7CisKKwlkcHJpbnRrKCJ0cnlpbmcgdG8gc2V0IGZyZXF1ZW5jeSB0byBzdGF0ZSAldSB3aXRoIGNvbW1hbmQgJXggYXQgcG9ydCAleFxuIiwgc3RhdGUsIGNvbW1hbmQsIHNtaV9wb3J0KTsKKworCWRvIHsKKwkJaWYgKHJldHJ5KSB7CisJCQlkcHJpbnRrKCJyZXRyeSAldSwgcHJldmlvdXMgcmVzdWx0ICV1LCB3YWl0aW5nLi4uXG4iLCByZXRyeSwgcmVzdWx0KTsKKwkJCW1kZWxheShyZXRyeSAqIDUwKTsKKwkJfQorCQlyZXRyeSsrOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSJtb3ZsICQwLCAlJWVkaVxuIgorCQkJIm91dCAlJWFsLCAoJSVkeClcbiIKKwkJCTogIj1iIiAobmV3X3N0YXRlKSwgIj1EIiAocmVzdWx0KQorCQkJOiAiYSIgKGNvbW1hbmQpLCAiYiIgKGZ1bmN0aW9uKSwgImMiIChzdGF0ZSksICJkIiAoc21pX3BvcnQpLCAiUyIgKDApCisJCQkpOworCX0gd2hpbGUgKChuZXdfc3RhdGUgIT0gc3RhdGUpICYmIChyZXRyeSA8PSBTTUlfVFJJRVMpKTsKKworCS8qIGVuYWJsZSBJUlFzICovCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaWYgKG5ld19zdGF0ZSA9PSBzdGF0ZSkgeworCQlkcHJpbnRrKCJjaGFuZ2UgdG8gJXUgTUh6IHN1Y2NlZWRlZCBhZnRlciAldSB0cmllcyB3aXRoIHJlc3VsdCAldVxuIiwgKHNwZWVkc3RlcF9mcmVxc1tuZXdfc3RhdGVdLmZyZXF1ZW5jeSAvIDEwMDApLCByZXRyeSwgcmVzdWx0KTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IGNoYW5nZSBmYWlsZWQgd2l0aCBuZXdfc3RhdGUgJXUgYW5kIHJlc3VsdCAldVxuIiwgbmV3X3N0YXRlLCByZXN1bHQpOworCX0KKworCXJldHVybjsKK30KKworCisvKioKKyAqIHNwZWVkc3RlcF90YXJnZXQgLSBzZXQgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqIEB0YXJnZXRfZnJlcTogbmV3IGZyZXEKKyAqIEByZWxhdGlvbjogCisgKgorICogU2V0cyBhIG5ldyBDUFVGcmVxIHBvbGljeS9mcmVxLgorICovCitzdGF0aWMgaW50IHNwZWVkc3RlcF90YXJnZXQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLCB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJdW5zaWduZWQgaW50IG5ld3N0YXRlID0gMDsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKworCWlmIChjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LCAmc3BlZWRzdGVwX2ZyZXFzWzBdLCB0YXJnZXRfZnJlcSwgcmVsYXRpb24sICZuZXdzdGF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZnJlcXMub2xkID0gc3BlZWRzdGVwX2ZyZXFzW3NwZWVkc3RlcF9nZXRfc3RhdGUoKV0uZnJlcXVlbmN5OworCWZyZXFzLm5ldyA9IHNwZWVkc3RlcF9mcmVxc1tuZXdzdGF0ZV0uZnJlcXVlbmN5OworCWZyZXFzLmNwdSA9IDA7IC8qIHNwZWVkc3RlcC5jIGlzIFVQIG9ubHkgZHJpdmVyICovCisKKwlpZiAoZnJlcXMub2xkID09IGZyZXFzLm5ldykKKwkJcmV0dXJuIDA7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCXNwZWVkc3RlcF9zZXRfc3RhdGUobmV3c3RhdGUpOworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBzcGVlZHN0ZXBfdmVyaWZ5IC0gdmVyaWZpZXMgYSBuZXcgQ1BVRnJlcSBwb2xpY3kKKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kKKyAqCisgKiBMaW1pdCBtdXN0IGJlIHdpdGhpbiBzcGVlZHN0ZXBfbG93X2ZyZXEgYW5kIHNwZWVkc3RlcF9oaWdoX2ZyZXEsIHdpdGgKKyAqIGF0IGxlYXN0IG9uZSBib3JkZXIgaW5jbHVkZWQuCisgKi8KK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3ZlcmlmeSAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZzcGVlZHN0ZXBfZnJlcXNbMF0pOworfQorCisKK3N0YXRpYyBpbnQgc3BlZWRzdGVwX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgaW50IHNwZWVkLHN0YXRlOworCisJLyogY2FwYWJpbGl0eSBjaGVjayAqLworCWlmIChwb2xpY3ktPmNwdSAhPSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJlc3VsdCA9IHNwZWVkc3RlcF9zbWlfb3duZXJzaGlwKCk7CisJaWYgKHJlc3VsdCkgeworCQlkcHJpbnRrKCJmYWlscyBpbiBhcXVpcmluZyBvd25lcnNoaXAgb2YgYSBTTUkgaW50ZXJmYWNlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGRldGVjdCBsb3cgYW5kIGhpZ2ggZnJlcXVlbmN5ICovCisJcmVzdWx0ID0gc3BlZWRzdGVwX3NtaV9nZXRfZnJlcXMoJnNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfTE9XXS5mcmVxdWVuY3ksCisJCQkJJnNwZWVkc3RlcF9mcmVxc1tTUEVFRFNURVBfSElHSF0uZnJlcXVlbmN5KTsKKwlpZiAocmVzdWx0KSB7CisJCS8qIGZhbGwgYmFjayB0byBzcGVlZHN0ZXBfbGliLmMgZGVjdGlvbiBtZWNoYW5pc206IHRyeSBib3RoIHN0YXRlcyBvdXQgKi8KKwkJZHByaW50aygiY291bGQgbm90IGRldGVjdCBsb3cgYW5kIGhpZ2ggZnJlcXVlbmNpZXMgYnkgU01JIGNhbGwuXG4iKTsKKwkJcmVzdWx0ID0gc3BlZWRzdGVwX2dldF9mcmVxcyhzcGVlZHN0ZXBfcHJvY2Vzc29yLAorCQkJCSZzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0xPV10uZnJlcXVlbmN5LAorCQkJCSZzcGVlZHN0ZXBfZnJlcXNbU1BFRURTVEVQX0hJR0hdLmZyZXF1ZW5jeSwKKwkJCQkmc3BlZWRzdGVwX3NldF9zdGF0ZSk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJZHByaW50aygiY291bGQgbm90IGRldGVjdCB0d28gZGlmZmVyZW50IHNwZWVkcyAtLSBhYm9ydGluZy5cbiIpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBlbHNlCisJCQlkcHJpbnRrKCJ3b3JrYXJvdW5kIHdvcmtlZC5cbiIpOworCX0KKworCS8qIGdldCBjdXJyZW50IHNwZWVkIHNldHRpbmcgKi8KKwlzdGF0ZSA9IHNwZWVkc3RlcF9nZXRfc3RhdGUoKTsKKwlzcGVlZCA9IHNwZWVkc3RlcF9mcmVxc1tzdGF0ZV0uZnJlcXVlbmN5OworCisJZHByaW50aygiY3VycmVudGx5IGF0ICVzIHNwZWVkIHNldHRpbmcgLSAlaSBNSHpcbiIsIAorCQkoc3BlZWQgPT0gc3BlZWRzdGVwX2ZyZXFzW1NQRUVEU1RFUF9MT1ddLmZyZXF1ZW5jeSkgPyAibG93IiA6ICJoaWdoIiwKKwkJKHNwZWVkIC8gMTAwMCkpOworCisJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gQ1BVRlJFUV9FVEVSTkFMOworCXBvbGljeS0+Y3VyID0gc3BlZWQ7CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgc3BlZWRzdGVwX2ZyZXFzKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gKHJlc3VsdCk7CisKKyAgICAgICAgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoc3BlZWRzdGVwX2ZyZXFzLCBwb2xpY3ktPmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGVlZHN0ZXBfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkc3RlcF9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoY3B1KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gc3BlZWRzdGVwX2dldF9wcm9jZXNzb3JfZnJlcXVlbmN5KHNwZWVkc3RlcF9wcm9jZXNzb3IpOworfQorCisKK3N0YXRpYyBpbnQgc3BlZWRzdGVwX3Jlc3VtZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlpbnQgcmVzdWx0ID0gc3BlZWRzdGVwX3NtaV9vd25lcnNoaXAoKTsKKworCWlmIChyZXN1bHQpCisJCWRwcmludGsoImZhaWxzIGluIHJlLWFxdWlyaW5nIG93bmVyc2hpcCBvZiBhIFNNSSBpbnRlcmZhY2UuXG4iKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBzcGVlZHN0ZXBfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBzcGVlZHN0ZXBfZHJpdmVyID0geworCS5uYW1lCQk9ICJzcGVlZHN0ZXAtc21pIiwKKwkudmVyaWZ5IAk9IHNwZWVkc3RlcF92ZXJpZnksCisJLnRhcmdldCAJPSBzcGVlZHN0ZXBfdGFyZ2V0LAorCS5pbml0CQk9IHNwZWVkc3RlcF9jcHVfaW5pdCwKKwkuZXhpdAkJPSBzcGVlZHN0ZXBfY3B1X2V4aXQsCisJLmdldAkJPSBzcGVlZHN0ZXBfZ2V0LAorCS5yZXN1bWUJCT0gc3BlZWRzdGVwX3Jlc3VtZSwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJCT0gc3BlZWRzdGVwX2F0dHIsCit9OworCisvKioKKyAqIHNwZWVkc3RlcF9pbml0IC0gaW5pdGlhbGl6ZXMgdGhlIFNwZWVkU3RlcCBDUFVGcmVxIGRyaXZlcgorICoKKyAqICAgSW5pdGlhbGl6ZXMgdGhlIFNwZWVkU3RlcCBzdXBwb3J0LiBSZXR1cm5zIC1FTk9ERVYgb24gdW5zdXBwb3J0ZWQKKyAqIEJJT1MsIC1FSU5WQUwgb24gcHJvYmxlbXMgZHVyaW5nIGluaXRpYXRpemF0aW9uLCBhbmQgemVybyBvbgorICogc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgc3BlZWRzdGVwX2luaXQodm9pZCkKK3sKKwlzcGVlZHN0ZXBfcHJvY2Vzc29yID0gc3BlZWRzdGVwX2RldGVjdF9wcm9jZXNzb3IoKTsKKworCXN3aXRjaCAoc3BlZWRzdGVwX3Byb2Nlc3NvcikgeworCWNhc2UgU1BFRURTVEVQX1BST0NFU1NPUl9QSUlJX1Q6CisJY2FzZSBTUEVFRFNURVBfUFJPQ0VTU09SX1BJSUlfQzoKKwljYXNlIFNQRUVEU1RFUF9QUk9DRVNTT1JfUElJSV9DX0VBUkxZOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcGVlZHN0ZXBfcHJvY2Vzc29yID0gMDsKKwl9CisKKwlpZiAoIXNwZWVkc3RlcF9wcm9jZXNzb3IpIHsKKwkJZHByaW50ayAoIk5vIHN1cHBvcnRlZCBJbnRlbCBDUFUgZGV0ZWN0ZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZHByaW50aygic2lnbmF0dXJlOjB4JS44bHgsIGNvbW1hbmQ6MHglLjhseCwgZXZlbnQ6MHglLjhseCwgcGVyZl9sZXZlbDoweCUuOGx4LlxuIiwgCisJCWlzdF9pbmZvLnNpZ25hdHVyZSwgaXN0X2luZm8uY29tbWFuZCwgaXN0X2luZm8uZXZlbnQsIGlzdF9pbmZvLnBlcmZfbGV2ZWwpOworCisKKwkvKiBFcnJvciBpZiBubyBJU1QtU01JIEJJT1Mgb3Igbm8gUEFSTSAKKwkJIHNpZz0gJ0lTR0UnIGFrYSAnSW50ZWwgU3BlZWRzdGVwIEdhdGUgRScgKi8KKwlpZiAoKGlzdF9pbmZvLnNpZ25hdHVyZSAhPSAgMHg0NzUzNDk0MykgJiYgKCAKKwkgICAgKHNtaV9wb3J0ID09IDApIHx8IChzbWlfY21kID09IDApKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc21pX3NpZyA9PSAxKQorCQlzbWlfc2lnID0gMHg0NzUzNDk0MzsKKwllbHNlCisJCXNtaV9zaWcgPSBpc3RfaW5mby5zaWduYXR1cmU7CisKKwkvKiBzZXR1cCBzbWlfcG9ydCBmcm9tIE1PRExVTEVfUEFSTSBvciBCSU9TICovCisJaWYgKChzbWlfcG9ydCA+IDB4ZmYpIHx8IChzbWlfcG9ydCA8IDApKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoc21pX3BvcnQgPT0gMCkgeworCQlzbWlfcG9ydCA9IGlzdF9pbmZvLmNvbW1hbmQgJiAweGZmOworCX0KKworCWlmICgoc21pX2NtZCA+IDB4ZmYpIHx8IChzbWlfY21kIDwgMCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChzbWlfY21kID09IDApIHsKKwkJc21pX2NtZCA9IChpc3RfaW5mby5jb21tYW5kID4+IDE2KSAmIDB4ZmY7CisJfQorCisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZzcGVlZHN0ZXBfZHJpdmVyKTsKK30KKworCisvKioKKyAqIHNwZWVkc3RlcF9leGl0IC0gdW5yZWdpc3RlcnMgU3BlZWRTdGVwIHN1cHBvcnQKKyAqCisgKiAgIFVucmVnaXN0ZXJzIFNwZWVkU3RlcCBzdXBwb3J0LgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BlZWRzdGVwX2V4aXQodm9pZCkKK3sKKwljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZzcGVlZHN0ZXBfZHJpdmVyKTsKK30KKworbW9kdWxlX3BhcmFtKHNtaV9wb3J0LCAgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShzbWlfY21kLCAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oc21pX3NpZywgIHVpbnQsIDA0NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKHNtaV9wb3J0LCAiT3ZlcnJpZGUgdGhlIEJJT1MtZ2l2ZW4gSVNUIHBvcnQgd2l0aCB0aGlzIHZhbHVlIC0tIEludGVsJ3MgZGVmYXVsdCBzZXR0aW5nIGlzIDB4YjIiKTsKK01PRFVMRV9QQVJNX0RFU0Moc21pX2NtZCwgIk92ZXJyaWRlIHRoZSBCSU9TLWdpdmVuIElTVCBjb21tYW5kIHdpdGggdGhpcyB2YWx1ZSAtLSBJbnRlbCdzIGRlZmF1bHQgc2V0dGluZyBpcyAweDgyIik7CitNT0RVTEVfUEFSTV9ERVNDKHNtaV9zaWcsICJTZXQgdG8gMSB0byBmYWtlIHRoZSBJU1Qgc2lnbmF0dXJlIHdoZW4gdXNpbmcgdGhlIFNNSSBpbnRlcmZhY2UuIik7CisKK01PRFVMRV9BVVRIT1IgKCJIaXJvc2hpIE1pdXJhIik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJTcGVlZHN0ZXAgZHJpdmVyIGZvciBJU1QgYXBwbGV0IFNNSSBpbnRlcmZhY2UuIik7CitNT0RVTEVfTElDRU5TRSAoIkdQTCIpOworCittb2R1bGVfaW5pdChzcGVlZHN0ZXBfaW5pdCk7Cittb2R1bGVfZXhpdChzcGVlZHN0ZXBfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jeXJpeC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3lyaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTRiMDExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3lyaXguYwpAQCAtMCwwICsxLDQzOSBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKworLyoKKyAqIFJlYWQgTlNDL0N5cml4IERFVklEIHJlZ2lzdGVycyAoRElSKSB0byBnZXQgbW9yZSBkZXRhaWxlZCBpbmZvLiBhYm91dCB0aGUgQ1BVCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBkb19jeXJpeF9kZXZpZCh1bnNpZ25lZCBjaGFyICpkaXIwLCB1bnNpZ25lZCBjaGFyICpkaXIxKQoreworCXVuc2lnbmVkIGNoYXIgY2NyMiwgY2NyMzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCS8qIHdlIHRlc3QgZm9yIERFVklEIGJ5IGNoZWNraW5nIHdoZXRoZXIgQ0NSMyBpcyB3cml0YWJsZSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzIF4gMHg4MCk7CisJZ2V0Q3g4NigweGMwKTsgICAvKiBkdW1teSB0byBjaGFuZ2UgYnVzICovCisKKwlpZiAoZ2V0Q3g4NihDWDg2X0NDUjMpID09IGNjcjMpIHsgICAgICAgLyogbm8gREVWSUQgcmVncy4gKi8KKwkJY2NyMiA9IGdldEN4ODYoQ1g4Nl9DQ1IyKTsKKwkJc2V0Q3g4NihDWDg2X0NDUjIsIGNjcjIgXiAweDA0KTsKKwkJZ2V0Q3g4NigweGMwKTsgIC8qIGR1bW15ICovCisKKwkJaWYgKGdldEN4ODYoQ1g4Nl9DQ1IyKSA9PSBjY3IyKSAvKiBvbGQgQ3g0ODZTTEMvRExDICovCisJCQkqZGlyMCA9IDB4ZmQ7CisJCWVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3g0ODZTIEEgc3RlcCAqLworCQkJc2V0Q3g4NihDWDg2X0NDUjIsIGNjcjIpOworCQkJKmRpcjAgPSAweGZlOworCQl9CisJfQorCWVsc2UgeworCQlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7ICAvKiByZXN0b3JlIENDUjMgKi8KKworCQkvKiByZWFkIERJUjAgYW5kIERJUjEgQ1BVIHJlZ2lzdGVycyAqLworCQkqZGlyMCA9IGdldEN4ODYoQ1g4Nl9ESVIwKTsKKwkJKmRpcjEgPSBnZXRDeDg2KENYODZfRElSMSk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIEN4ODZfZGlyMF9tc2IgaXMgYSBIQUNLIG5lZWRlZCBieSBjaGVja19jeDY4Nl9jcHVpZC9zbG9wIGluIGJ1Z3MuaCBpbgorICogb3JkZXIgdG8gaWRlbnRpZnkgdGhlIEN5cml4IENQVSBtb2RlbCBhZnRlciB3ZSdyZSBvdXQgb2Ygc2V0dXAuYworICoKKyAqIEFjdHVhbGx5IHNpbmNlIGJ1Z3MuaCBkb2Vzbid0IGV2ZW4gcmVmZXJlbmNlIHRoaXMgcGVyaGFwcyBzb21lb25lIHNob3VsZAorICogZml4IHRoZSBkb2N1bWVudGF0aW9uID8/PworICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBDeDg2X2RpcjBfbXNiIF9faW5pdGRhdGEgPSAwOworCitzdGF0aWMgY2hhciBDeDg2X21vZGVsW11bOV0gX19pbml0ZGF0YSA9IHsKKwkiQ3g0ODYiLCAiQ3g0ODYiLCAiNXg4NiAiLCAiNng4NiIsICJNZWRpYUdYICIsICI2eDg2TVggIiwKKwkiTSBJSSAiLCAiVW5rbm93biIKK307CitzdGF0aWMgY2hhciBDeDQ4Nl9uYW1lW11bNV0gX19pbml0ZGF0YSA9IHsKKwkiU0xDIiwgIkRMQyIsICJTTEMyIiwgIkRMQzIiLCAiU1J4IiwgIkRSeCIsCisJIlNSeDIiLCAiRFJ4MiIKK307CitzdGF0aWMgY2hhciBDeDQ4NlNfbmFtZVtdWzRdIF9faW5pdGRhdGEgPSB7CisJIlMiLCAiUzIiLCAiU2UiLCAiUzJlIgorfTsKK3N0YXRpYyBjaGFyIEN4NDg2RF9uYW1lW11bNF0gX19pbml0ZGF0YSA9IHsKKwkiRFgiLCAiRFgyIiwgIj8iLCAiPyIsICI/IiwgIkRYNCIKK307CitzdGF0aWMgY2hhciBDeDg2X2NiW10gX19pbml0ZGF0YSA9ICI/LjV4IENvcmUvQnVzIENsb2NrIjsKK3N0YXRpYyBjaGFyIGN5cml4X21vZGVsX211bHQxW10gX19pbml0ZGF0YSA9ICIxMj8/NDMiOworc3RhdGljIGNoYXIgY3lyaXhfbW9kZWxfbXVsdDJbXSBfX2luaXRkYXRhID0gIjEyMjMzNDQ1IjsKKworLyoKKyAqIFJlc2V0IHRoZSBzbG93LWxvb3AgKFNMT1ApIGJpdCBvbiB0aGUgNjg2KEwpIHdoaWNoIGlzIHNldCBieSBzb21lIG9sZAorICogQklPU2VzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggRE9TIGdhbWVzLiAgVGhpcyBtYWtlcyB0aGUgdWRlbGF5IGxvb3AKKyAqIHdvcmsgY29ycmVjdGx5LCBhbmQgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCisgKgorICogRklYTUU6IG91ciBuZXdlciB1ZGVsYXkgdXNlcyB0aGUgdHNjLiBXZSBkb24ndCBuZWVkIHRvIGZyb2Igd2l0aCBTTE9QCisgKi8KKworZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpIF9faW5pdDsKKworc3RhdGljIHZvaWQgX19pbml0IGNoZWNrX2N4Njg2X3Nsb3Aoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKEN4ODZfZGlyMF9tc2IgPT0gMykgeworCQl1bnNpZ25lZCBjaGFyIGNjcjMsIGNjcjU7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCQlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAvKiBlbmFibGUgTUFQRU4gICovCisJCWNjcjUgPSBnZXRDeDg2KENYODZfQ0NSNSk7CisJCWlmIChjY3I1ICYgMikKKwkJCXNldEN4ODYoQ1g4Nl9DQ1I1LCBjY3I1ICYgMHhmZCk7ICAvKiByZXNldCBTTE9QICovCisJCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsgICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgTUFQRU4gKi8KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCWlmIChjY3I1ICYgMikgeyAvKiBwb3NzaWJsZSB3cm9uZyBjYWxpYnJhdGlvbiBkb25lICovCisJCQlwcmludGsoS0VSTl9JTkZPICJSZWNhbGlicmF0aW5nIGRlbGF5IGxvb3Agd2l0aCBTTE9QIGJpdCByZXNldFxuIik7CisJCQljYWxpYnJhdGVfZGVsYXkoKTsKKwkJCWMtPmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X2N4ODZfcmVvcmRlcih2b2lkKQoreworCXU4IGNjcjM7CisKKwlwcmludGsoS0VSTl9JTkZPICJFbmFibGUgTWVtb3J5IGFjY2VzcyByZW9yZGVyIG9uIEN5cml4L05TQyBwcm9jZXNzb3IuXG4iKTsKKwljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7IC8qIGVuYWJsZSBNQVBFTqAgKi8KKworCS8qIExvYWQvU3RvcmUgU2VyaWFsaXplIHRvIG1lbSBhY2Nlc3MgZGlzYWJsZSAoPXJlb3JkZXIgaXQpoCAqLworCXNldEN4ODYoQ1g4Nl9QQ1IwLCBnZXRDeDg2KENYODZfUENSMCkgJiB+MHg4MCk7CisJLyogc2V0IGxvYWQvc3RvcmUgc2VyaWFsaXplIGZyb20gMUdCIHRvIDRHQiAqLworCWNjcjMgfD0gMHhlMDsKKwlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfY3g4Nl9tZW13Yih2b2lkKQoreworCXUzMiBjcjA7CisKKwlwcmludGsoS0VSTl9JTkZPICJFbmFibGUgTWVtb3J5LVdyaXRlLWJhY2sgbW9kZSBvbiBDeXJpeC9OU0MgcHJvY2Vzc29yLlxuIik7CisKKwkvKiBDQ1IyIGJpdCAyOiB1bmxvY2sgTlcgYml0ICovCisJc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSAmIH4weDA0KTsKKwkvKiBzZXQgJ05vdCBXcml0ZS10aHJvdWdoJyAqLworCWNyMCA9IDB4MjAwMDAwMDA7CisJX19hc21fXygibW92bCAlJWNyMCwlJWVheFxuXHQiCisJCSJvcmwgJTAsJSVlYXhcblx0IgorCQkibW92bCAlJWVheCwlJWNyMFxuIgorCQk6IDogInIiIChjcjApCisJCToiYXgiKTsKKwkvKiBDQ1IyIGJpdCAyOiBsb2NrIE5XIGJpdCBhbmQgc2V0IFdUMSAqLworCXNldEN4ODYoQ1g4Nl9DQ1IyLCBnZXRDeDg2KENYODZfQ0NSMikgfCAweDE0ICk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfY3g4Nl9pbmModm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNjcjM7CisKKwlwcmludGsoS0VSTl9JTkZPICJFbmFibGUgSW5jcmVtZW50b3Igb24gQ3lyaXgvTlNDIHByb2Nlc3Nvci5cbiIpOworCisJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKKwlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAvKiBlbmFibGUgTUFQRU6gICovCisJLyogUENSMSAtLSBQZXJmb3JtYW5jZSBDb250cm9sICovCisJLyogSW5jcmVtZW50b3Igb24sIHdoYXRldmVyIHRoYXQgaXMgKi8KKwlzZXRDeDg2KENYODZfUENSMSwgZ2V0Q3g4NihDWDg2X1BDUjEpIHwgMHgwMik7CisJLyogUENSMCAtLSBQZXJmb3JtYW5jZSBDb250cm9sICovCisJLyogSW5jcmVtZW50b3IgTWFyZ2luIDEwICovCisJc2V0Q3g4NihDWDg2X1BDUjAsIGdldEN4ODYoQ1g4Nl9QQ1IwKSB8IDB4MDQpOyAKKwlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CS8qIGRpc2FibGUgTUFQRU4gKi8KK30KKworLyoKKyAqCUNvbmZpZ3VyZSBsYXRlciBNZWRpYUdYIGFuZC9vciBHZW9kZSBwcm9jZXNzb3IuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IGdlb2RlX2NvbmZpZ3VyZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggY2NyMywgY2NyNDsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBTdXNwZW5kIG9uIGhhbHQgcG93ZXIgc2F2aW5nIGFuZCBlbmFibGUgI1NVU1AgcGluICovCisJc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSB8IDB4ODgpOworCisJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKKwlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOwkvKiBFbmFibGUgKi8KKwkKKwljY3I0ID0gZ2V0Q3g4NihDWDg2X0NDUjQpOworCWNjcjQgfD0gMHgzODsJCS8qIEZQVSBmYXN0LCBEVEUgY2FjaGUsIE1lbSBieXBhc3MgKi8KKwkKKwlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CisJCisJc2V0X2N4ODZfbWVtd2IoKTsKKwlzZXRfY3g4Nl9yZW9yZGVyKCk7CQorCXNldF9jeDg2X2luYygpOworCQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGN5cml4XzU1eDBbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTEwKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MjApIH0sCisJeyB9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9jeXJpeChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdW5zaWduZWQgY2hhciBkaXIwLCBkaXIwX21zbiwgZGlyMF9sc24sIGRpcjEgPSAwOworCWNoYXIgKmJ1ZiA9IGMtPng4Nl9tb2RlbF9pZDsKKwljb25zdCBjaGFyICpwID0gTlVMTDsKKworCS8qIEJpdCAzMSBpbiBub3JtYWwgQ1BVSUQgdXNlZCBmb3Igbm9uc3RhbmRhcmQgM0ROb3cgSUQ7CisJICAgM0ROb3cgaXMgSURkIGJ5IGJpdCAzMSBpbiBleHRlbmRlZCBDUFVJRCAoMSozMiszMSkgYW55d2F5ICovCisJY2xlYXJfYml0KDAqMzIrMzEsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKworCS8qIEN5cml4IHVzZWQgYml0IDI0IGluIGV4dGVuZGVkIChBTUQpIENQVUlEIGZvciBDeXJpeCBNTVggZXh0ZW5zaW9ucyAqLworCWlmICggdGVzdF9iaXQoMSozMisyNCwgYy0+eDg2X2NhcGFiaWxpdHkpICkgeworCQljbGVhcl9iaXQoMSozMisyNCwgYy0+eDg2X2NhcGFiaWxpdHkpOworCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NYTU1YLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJfQorCisJZG9fY3lyaXhfZGV2aWQoJmRpcjAsICZkaXIxKTsKKworCWNoZWNrX2N4Njg2X3Nsb3AoYyk7CisKKwlDeDg2X2RpcjBfbXNiID0gZGlyMF9tc24gPSBkaXIwID4+IDQ7IC8qIGlkZW50aWZpZXMgQ1BVICJmYW1pbHkiICAgKi8KKwlkaXIwX2xzbiA9IGRpcjAgJiAweGY7ICAgICAgICAgICAgICAgIC8qIG1vZGVsIG9yIGNsb2NrIG11bHRpcGxpZXIgKi8KKworCS8qIGNvbW1vbiBjYXNlIHN0ZXAgbnVtYmVyL3JldiAtLSBleGNlcHRpb25zIGhhbmRsZWQgYmVsb3cgKi8KKwljLT54ODZfbW9kZWwgPSAoZGlyMSA+PiA0KSArIDE7CisJYy0+eDg2X21hc2sgPSBkaXIxICYgMHhmOworCisJLyogTm93IGNvb2s7IHRoZSBvcmlnaW5hbCByZWNpcGUgaXMgYnkgQ2hhbm5pbmcgQ29ybiwgZnJvbSBDeXJpeC4KKwkgKiBXZSBkbyB0aGUgc2FtZSB0aGluZyBmb3IgZWFjaCBnZW5lcmF0aW9uOiB3ZSB3b3JrIG91dAorCSAqIHRoZSBtb2RlbCwgbXVsdGlwbGllciBhbmQgc3RlcHBpbmcuICBCbGFjayBtYWdpYyBpbmNsdWRlZCwKKwkgKiB0byBtYWtlIHRoZSBzaWxpY29uIHN0ZXAvcmV2IG51bWJlcnMgbWF0Y2ggdGhlIHByaW50ZWQgb25lcy4KKwkgKi8KKwkgCisJc3dpdGNoIChkaXIwX21zbikgeworCQl1bnNpZ25lZCBjaGFyIHRtcDsKKworCWNhc2UgMDogLyogQ3g0ODZTTEMvRExDL1NSeC9EUnggKi8KKwkJcCA9IEN4NDg2X25hbWVbZGlyMF9sc24gJiA3XTsKKwkJYnJlYWs7CisKKwljYXNlIDE6IC8qIEN4NDg2Uy9EWC9EWDIvRFg0ICovCisJCXAgPSAoZGlyMF9sc24gJiA4KSA/IEN4NDg2RF9uYW1lW2RpcjBfbHNuICYgNV0KKwkJCTogQ3g0ODZTX25hbWVbZGlyMF9sc24gJiAzXTsKKwkJYnJlYWs7CisKKwljYXNlIDI6IC8qIDV4ODYgKi8KKwkJQ3g4Nl9jYlsyXSA9IGN5cml4X21vZGVsX211bHQxW2RpcjBfbHNuICYgNV07CisJCXAgPSBDeDg2X2NiKzI7CisJCWJyZWFrOworCisJY2FzZSAzOiAvKiA2eDg2LzZ4ODZMICovCisJCUN4ODZfY2JbMV0gPSAnICc7CisJCUN4ODZfY2JbMl0gPSBjeXJpeF9tb2RlbF9tdWx0MVtkaXIwX2xzbiAmIDVdOworCQlpZiAoZGlyMSA+IDB4MjEpIHsgLyogNjg2TCAqLworCQkJQ3g4Nl9jYlswXSA9ICdMJzsKKwkJCXAgPSBDeDg2X2NiOworCQkJKGMtPng4Nl9tb2RlbCkrKzsKKwkJfSBlbHNlICAgICAgICAgICAgIC8qIDY4NiAqLworCQkJcCA9IEN4ODZfY2IrMTsKKwkJLyogRW11bGF0ZSBNVFJScyB1c2luZyBDeXJpeCdzIEFSUnMuICovCisJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCS8qIDZ4ODYncyBjb250YWluIHRoaXMgYnVnICovCisJCWMtPmNvbWFfYnVnID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIDQ6IC8qIE1lZGlhR1gvR1htIG9yIEdlb2RlIEdYTS9HWExWL0dYMSAqLworI2lmZGVmIENPTkZJR19QQ0kKKwkJLyogSXQgaXNuJ3QgcmVhbGx5IGEgUENJIHF1aXJrIGRpcmVjdGx5LCBidXQgdGhlIGN1cmUgaXMgdGhlCisJCSAgIHNhbWUuIFRoZSBNZWRpYUdYIGhhcyBkZWVwIG1hZ2ljIFNNTSBzdHVmZiB0aGF0IGhhbmRsZXMgdGhlCisJCSAgIFNCIGVtdWxhdGlvbi4gSXQgdGhvd3MgYXdheSB0aGUgZmlmbyBvbiBkaXNhYmxlX2RtYSgpIHdoaWNoCisJCSAgIGlzIHdyb25nIGFuZCBydWlucyB0aGUgYXVkaW8uIAorCisJCSAgIEJ1ZzI6IFZTQTEgaGFzIGEgd3JhcCBidWcgc28gdGhhdCB1c2luZyBtYXhpbXVtIHNpemVkIERNQSAKKwkJICAgY2F1c2VzIGJhZCB0aGluZ3MuIEFjY29yZGluZyB0byBOYXRTZW1pIFZTQTIgaGFzIGFub3RoZXIKKwkJICAgYnVnIHRvIGRvIHdpdGggJ2hsdCcuIEkndmUgbm90IHNlZW4gYW55IGJvYXJkcyB1c2luZyBWU0EyCisJCSAgIGFuZCBYIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IGl0IGVpdGhlciBzbyB3aG8gY2FyZXMgOCkuCisJCSAgIFZTQTEgd2Ugd29yayBhcm91bmQgaG93ZXZlci4KKwkJKi8KKworCQlwcmludGsoS0VSTl9JTkZPICJXb3JraW5nIGFyb3VuZCBDeXJpeCBNZWRpYUdYIHZpcnR1YWwgRE1BIGJ1Z3MuXG4iKTsKKwkJaXNhX2RtYV9icmlkZ2VfYnVnZ3kgPSAyOworI2VuZGlmCQkKKwkJYy0+eDg2X2NhY2hlX3NpemU9MTY7CS8qIFllcCAxNksgaW50ZWdyYXRlZCBjYWNoZSB0aGF0cyBpdCAqLworIAorCQkvKgorCQkgKiAgVGhlIDU1MTAvNTUyMCBjb21wYW5pb24gY2hpcHMgaGF2ZSBhIGZ1bmt5IFBJVC4KKwkJICovICAKKwkJaWYgKHBjaV9kZXZfcHJlc2VudChjeXJpeF81NXgwKSkKKwkJCXBpdF9sYXRjaF9idWdneSA9IDE7CisKKwkJLyogR1htIHN1cHBvcnRzIGV4dGVuZGVkIGNwdWlkIGxldmVscyAnYWxhJyBBTUQgKi8KKwkJaWYgKGMtPmNwdWlkX2xldmVsID09IDIpIHsKKwkJCS8qIEVuYWJsZSBjeE1NWCBleHRlbnNpb25zIChHWDEgRGF0YXNoZWV0IDU0KSAqLworCQkJc2V0Q3g4NihDWDg2X0NDUjcsIGdldEN4ODYoQ1g4Nl9DQ1I3KXwxKTsKKwkJCQorCQkJLyogR1hsdi9HWG0vR1gxICovCisJCQlpZigoZGlyMSA+PSAweDUwICYmIGRpcjEgPD0gMHg1NCkgfHwgZGlyMSA+PSAweDYzKQorCQkJCWdlb2RlX2NvbmZpZ3VyZSgpOworCQkJZ2V0X21vZGVsX25hbWUoYyk7ICAvKiBnZXQgQ1BVIG1hcmtldGluZyBuYW1lICovCisJCQlyZXR1cm47CisJCX0KKwkJZWxzZSB7ICAvKiBNZWRpYUdYICovCisJCQlDeDg2X2NiWzJdID0gKGRpcjBfbHNuICYgMSkgPyAnMycgOiAnNCc7CisJCQlwID0gQ3g4Nl9jYisyOworCQkJYy0+eDg2X21vZGVsID0gKGRpcjEgJiAweDIwKSA/IDEgOiAyOworCQl9CisJCWJyZWFrOworCisgICAgICAgIGNhc2UgNTogLyogNng4Nk1YL00gSUkgKi8KKwkJaWYgKGRpcjEgPiA3KQorCQl7CisJCQlkaXIwX21zbisrOyAgLyogTSBJSSAqLworCQkJLyogRW5hYmxlIE1NWCBleHRlbnNpb25zIChBcHAgbm90ZSAxMDgpICovCisJCQlzZXRDeDg2KENYODZfQ0NSNywgZ2V0Q3g4NihDWDg2X0NDUjcpfDEpOworCQl9CisJCWVsc2UKKwkJeworCQkJYy0+Y29tYV9idWcgPSAxOyAgICAgIC8qIDZ4ODZNWCwgaXQgaGFzIHRoZSBidWcuICovCisJCX0KKwkJdG1wID0gKCEoZGlyMF9sc24gJiA3KSB8fCBkaXIwX2xzbiAmIDEpID8gMiA6IDA7CisJCUN4ODZfY2JbdG1wXSA9IGN5cml4X21vZGVsX211bHQyW2RpcjBfbHNuICYgN107CisJCXAgPSBDeDg2X2NiK3RtcDsKKyAgICAgICAgCWlmICgoKGRpcjEgJiAweDBmKSA+IDQpIHx8ICgoZGlyMSAmIDB4ZjApID09IDB4MjApKQorCQkJKGMtPng4Nl9tb2RlbCkrKzsKKwkJLyogRW11bGF0ZSBNVFJScyB1c2luZyBDeXJpeCdzIEFSUnMuICovCisJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSLCBjLT54ODZfY2FwYWJpbGl0eSk7CisJCWJyZWFrOworCisJY2FzZSAweGY6ICAvKiBDeXJpeCA0ODYgd2l0aG91dCBERVZJRCByZWdpc3RlcnMgKi8KKwkJc3dpdGNoIChkaXIwX2xzbikgeworCQljYXNlIDB4ZDogIC8qIGVpdGhlciBhIDQ4NlNMQyBvciBETEMgdy9vIERFVklEICovCisJCQlkaXIwX21zbiA9IDA7CisJCQlwID0gQ3g0ODZfbmFtZVsoYy0+aGFyZF9tYXRoKSA/IDEgOiAwXTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHhlOiAgLyogYSA0ODZTIEEgc3RlcCAqLworCQkJZGlyMF9tc24gPSAwOworCQkJcCA9IEN4NDg2U19uYW1lWzBdOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OiAgLyogdW5rbm93biAoc2hvdWxkbid0IGhhcHBlbiwgd2Uga25vdyBldmVyeW9uZSA7LSkgKi8KKwkJZGlyMF9tc24gPSA3OworCQlicmVhazsKKwl9CisJc3RyY3B5KGJ1ZiwgQ3g4Nl9tb2RlbFtkaXIwX21zbiAmIDddKTsKKwlpZiAocCkgc3RyY2F0KGJ1ZiwgcCk7CisJcmV0dXJuOworfQorCisvKgorICogQ3lyaXggQ1BVcyB3aXRob3V0IGNwdWlkIG9yIHdpdGggY3B1aWQgbm90IHlldCBlbmFibGVkIGNhbiBiZSBkZXRlY3RlZAorICogYnkgdGhlIGZhY3QgdGhhdCB0aGV5IHByZXNlcnZlIHRoZSBmbGFncyBhY3Jvc3MgdGhlIGRpdmlzaW9uIG9mIDUvMi4KKyAqIFBJSSBhbmQgUFBybyBleGhpYml0IHRoaXMgYmVoYXZpb3IgdG9vLCBidXQgdGhleSBoYXZlIGNwdWlkIGF2YWlsYWJsZS4KKyAqLworIAorLyoKKyAqIFBlcmZvcm0gdGhlIEN5cml4IDUvMiB0ZXN0LiBBIEN5cml4IHdvbid0IGNoYW5nZQorICogdGhlIGZsYWdzLCB3aGlsZSBvdGhlciA0ODYgY2hpcHMgd2lsbC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGVzdF9jeXJpeF81MmRpdih2b2lkKQoreworCXVuc2lnbmVkIGludCB0ZXN0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJICAgICAic2FoZlxuXHQiCQkvKiBjbGVhciBmbGFncyAoJWVheCA9IDB4MDAwNSkgKi8KKwkgICAgICJkaXYgJWIyXG5cdCIJLyogZGl2aWRlIDUgYnkgMiAqLworCSAgICAgImxhaGYiCQkvKiBzdG9yZSBmbGFncyBpbnRvICVhaCAqLworCSAgICAgOiAiPWEiICh0ZXN0KQorCSAgICAgOiAiMCIgKDUpLCAicSIgKDIpCisJICAgICA6ICJjYyIpOworCisJLyogQUggaXMgMHgwMiBvbiBDeXJpeCBhZnRlciB0aGUgZGl2aWRlLi4gKi8KKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpICh0ZXN0ID4+IDgpID09IDB4MDI7Cit9CisKK3N0YXRpYyB2b2lkIGN5cml4X2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCit7CisJLyogRGV0ZWN0IEN5cml4IHdpdGggZGlzYWJsZWQgQ1BVSUQgKi8KKwlpZiAoIGMtPng4NiA9PSA0ICYmIHRlc3RfY3lyaXhfNTJkaXYoKSApIHsKKwkJdW5zaWduZWQgY2hhciBkaXIwLCBkaXIxOworCQkKKwkJc3RyY3B5KGMtPng4Nl92ZW5kb3JfaWQsICJDeXJpeEluc3RlYWQiKTsKKwkgICAgICAgIGMtPng4Nl92ZW5kb3IgPSBYODZfVkVORE9SX0NZUklYOworCSAgICAgICAgCisJICAgICAgICAvKiBBY3R1YWxseSBlbmFibGUgY3B1aWQgb24gdGhlIG9sZGVyIGN5cml4ICovCisJICAgIAorCSAgICAJLyogUmV0cmlldmUgQ1BVIHJldmlzaW9ucyAqLworCSAgICAJCisJCWRvX2N5cml4X2RldmlkKCZkaXIwLCAmZGlyMSk7CisKKwkJZGlyMD4+PTQ7CQkKKwkJCisJCS8qIENoZWNrIGl0IGlzIGFuIGFmZmVjdGVkIG1vZGVsICovCisJCQorICAgCSAgICAgICAgaWYgKGRpcjAgPT0gNSB8fCBkaXIwID09IDMpCisgICAJICAgICAgICB7CisJCQl1bnNpZ25lZCBjaGFyIGNjcjMsIGNjcjQ7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxpbmcgQ1BVSUQgb24gQ3lyaXggcHJvY2Vzc29yLlxuIik7CisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCQkJc2V0Q3g4NihDWDg2X0NDUjMsIChjY3IzICYgMHgwZikgfCAweDEwKTsgLyogZW5hYmxlIE1BUEVOICAqLworCQkJY2NyNCA9IGdldEN4ODYoQ1g4Nl9DQ1I0KTsKKwkJCXNldEN4ODYoQ1g4Nl9DQ1I0LCBjY3I0IHwgMHg4MCk7ICAgICAgICAgIC8qIGVuYWJsZSBjcHVpZCAgKi8KKwkJCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjY3IzKTsgICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgTUFQRU4gKi8KKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJfQorCX0KKwlnZW5lcmljX2lkZW50aWZ5KGMpOworfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgY3lyaXhfY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJDeXJpeCIsCisJLmNfaWRlbnQgCT0geyAiQ3lyaXhJbnN0ZWFkIiB9LAorCS5jX2luaXQJCT0gaW5pdF9jeXJpeCwKKwkuY19pZGVudGlmeQk9IGN5cml4X2lkZW50aWZ5LAorfTsKKworaW50IF9faW5pdCBjeXJpeF9pbml0X2NwdSh2b2lkKQoreworCWNwdV9kZXZzW1g4Nl9WRU5ET1JfQ1lSSVhdID0gJmN5cml4X2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbChjeXJpeF9pbml0X2NwdSk7CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBuc2NfY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJOU0MiLAorCS5jX2lkZW50IAk9IHsgIkdlb2RlIGJ5IE5TQyIgfSwKKwkuY19pbml0CQk9IGluaXRfY3lyaXgsCisJLmNfaWRlbnRpZnkJPSBnZW5lcmljX2lkZW50aWZ5LAorfTsKKworaW50IF9faW5pdCBuc2NfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX05TQ10gPSAmbnNjX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbChuc2NfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkODQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKQEAgLTAsMCArMSwyNDggQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiY3B1LmgiCisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKyNlbmRpZgorCitleHRlcm4gaW50IHRyYXBfaW5pdF9mMDBmX2J1Zyh2b2lkKTsKKworI2lmZGVmIENPTkZJR19YODZfSU5URUxfVVNFUkNPUFkKKy8qCisgKiBBbGlnbm1lbnQgYXQgd2hpY2ggbW92c2wgaXMgcHJlZmVycmVkIGZvciBidWxrIG1lbW9yeSBjb3BpZXMuCisgKi8KK3N0cnVjdCBtb3ZzbF9tYXNrIG1vdnNsX21hc2s7CisjZW5kaWYKKwordm9pZCBfX2luaXQgZWFybHlfaW50ZWxfd29ya2Fyb3VuZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkKKwkJcmV0dXJuOworCS8qIE5ldGJ1cnN0IHJlcG9ydHMgNjQgYnl0ZXMgY2xmbHVzaCBzaXplLCBidXQgZG9lcyBJTyBpbiAxMjggYnl0ZXMgKi8KKwlpZiAoYy0+eDg2ID09IDE1ICYmIGMtPng4Nl9jYWNoZV9hbGlnbm1lbnQgPT0gNjQpCisJCWMtPng4Nl9jYWNoZV9hbGlnbm1lbnQgPSAxMjg7Cit9CisKKy8qCisgKglFYXJseSBwcm9iZSBzdXBwb3J0IGxvZ2ljIGZvciBwcHJvIG1lbW9yeSBlcnJhdHVtICM1MAorICoKKyAqCVRoaXMgaXMgY2FsbGVkIGJlZm9yZSB3ZSBkbyBjcHUgaWRlbnQgd29yaworICovCisgCitpbnQgX19pbml0IHBwcm9fd2l0aF9yYW1fYnVnKHZvaWQpCit7CisJLyogVXNlcyBkYXRhIGZyb20gZWFybHlfY3B1X2RldGVjdCBub3cgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwgJiYKKwkgICAgYm9vdF9jcHVfZGF0YS54ODYgPT0gNiAmJgorCSAgICBib290X2NwdV9kYXRhLng4Nl9tb2RlbCA9PSAxICYmCisJICAgIGJvb3RfY3B1X2RhdGEueDg2X21hc2sgPCA4KSB7CisJCXByaW50ayhLRVJOX0lORk8gIlBlbnRpdW0gUHJvIHdpdGggRXJyYXRhIzUwIGRldGVjdGVkLiBUYWtpbmcgZXZhc2l2ZSBhY3Rpb24uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCQorCisvKgorICogUDQgWGVvbiBlcnJhdGEgMDM3IHdvcmthcm91bmQuCisgKiBIYXJkd2FyZSBwcmVmZXRjaGVyIG1heSBjYXVzZSBzdGFsZSBkYXRhIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBjYWNoZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IEludGVsX2VycmF0YV93b3JrYXJvdW5kcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdW5zaWduZWQgbG9uZyBsbywgaGk7CisKKwlpZiAoKGMtPng4NiA9PSAxNSkgJiYgKGMtPng4Nl9tb2RlbCA9PSAxKSAmJiAoYy0+eDg2X21hc2sgPT0gMSkpIHsKKwkJcmRtc3IgKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsbywgaGkpOworCQlpZiAoKGxvICYgKDE8PDkpKSA9PSAwKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiQ1BVOiBDMCBzdGVwcGluZyBQNCBYZW9uIGRldGVjdGVkLlxuIik7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiQ1BVOiBEaXNhYmxpbmcgaGFyZHdhcmUgcHJlZmV0Y2hpbmcgKEVycmF0YSAwMzcpXG4iKTsKKwkJCWxvIHw9ICgxPDw5KTsJLyogRGlzYWJsZSBodyBwcmVmZXRjaGluZyAqLworCQkJd3Jtc3IgKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsbywgaGkpOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X2ludGVsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBpbnQgbDIgPSAwOworCWNoYXIgKnAgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX1g4Nl9GMDBGX0JVRworCS8qCisJICogQWxsIGN1cnJlbnQgbW9kZWxzIG9mIFBlbnRpdW0gYW5kIFBlbnRpdW0gd2l0aCBNTVggdGVjaG5vbG9neSBDUFVzCisJICogaGF2ZSB0aGUgRjAgMEYgYnVnLCB3aGljaCBsZXRzIG5vbnByaXZpbGVnZWQgdXNlcnMgbG9jayB1cCB0aGUgc3lzdGVtLgorCSAqIE5vdGUgdGhhdCB0aGUgd29ya2Fyb3VuZCBvbmx5IHNob3VsZCBiZSBpbml0aWFsaXplZCBvbmNlLi4uCisJICovCisJYy0+ZjAwZl9idWcgPSAwOworCWlmICggYy0+eDg2ID09IDUgKSB7CisJCXN0YXRpYyBpbnQgZjAwZl93b3JrYXJvdW5kX2VuYWJsZWQgPSAwOworCisJCWMtPmYwMGZfYnVnID0gMTsKKwkJaWYgKCAhZjAwZl93b3JrYXJvdW5kX2VuYWJsZWQgKSB7CisJCQl0cmFwX2luaXRfZjAwZl9idWcoKTsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiSW50ZWwgUGVudGl1bSB3aXRoIEYwIDBGIGJ1ZyAtIHdvcmthcm91bmQgZW5hYmxlZC5cbiIpOworCQkJZjAwZl93b3JrYXJvdW5kX2VuYWJsZWQgPSAxOworCQl9CisJfQorI2VuZGlmCisKKwlzZWxlY3RfaWRsZV9yb3V0aW5lKGMpOworCWwyID0gaW5pdF9pbnRlbF9jYWNoZWluZm8oYyk7CisKKwkvKiBTRVAgQ1BVSUQgYnVnOiBQZW50aXVtIFBybyByZXBvcnRzIFNFUCBidXQgZG9lc24ndCBoYXZlIGl0IHVudGlsIG1vZGVsIDMgbWFzayAzICovCisJaWYgKChjLT54ODY8PDggfCBjLT54ODZfbW9kZWw8PDQgfCBjLT54ODZfbWFzaykgPCAweDYzMykKKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1NFUCwgYy0+eDg2X2NhcGFiaWxpdHkpOworCisJLyogTmFtZXMgZm9yIHRoZSBQZW50aXVtIElJL0NlbGVyb24gcHJvY2Vzc29ycyAKKwkgICBkZXRlY3RhYmxlIG9ubHkgYnkgYWxzbyBjaGVja2luZyB0aGUgY2FjaGUgc2l6ZS4KKwkgICBEaXhvbiBpcyBOT1QgYSBDZWxlcm9uLiAqLworCWlmIChjLT54ODYgPT0gNikgeworCQlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgeworCQljYXNlIDU6CisJCQlpZiAoYy0+eDg2X21hc2sgPT0gMCkgeworCQkJCWlmIChsMiA9PSAwKQorCQkJCQlwID0gIkNlbGVyb24gKENvdmluZ3RvbikiOworCQkJCWVsc2UgaWYgKGwyID09IDI1NikKKwkJCQkJcCA9ICJNb2JpbGUgUGVudGl1bSBJSSAoRGl4b24pIjsKKwkJCX0KKwkJCWJyZWFrOworCQkJCisJCWNhc2UgNjoKKwkJCWlmIChsMiA9PSAxMjgpCisJCQkJcCA9ICJDZWxlcm9uIChNZW5kb2Npbm8pIjsKKwkJCWVsc2UgaWYgKGMtPng4Nl9tYXNrID09IDAgfHwgYy0+eDg2X21hc2sgPT0gNSkKKwkJCQlwID0gIkNlbGVyb24tQSI7CisJCQlicmVhazsKKwkJCQorCQljYXNlIDg6CisJCQlpZiAobDIgPT0gMTI4KQorCQkJCXAgPSAiQ2VsZXJvbiAoQ29wcGVybWluZSkiOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIHAgKQorCQlzdHJjcHkoYy0+eDg2X21vZGVsX2lkLCBwKTsKKwkKKwlkZXRlY3RfaHQoYyk7CisKKwkvKiBXb3JrIGFyb3VuZCBlcnJhdGEgKi8KKwlJbnRlbF9lcnJhdGFfd29ya2Fyb3VuZHMoYyk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZCisJLyoKKwkgKiBTZXQgdXAgdGhlIHByZWZlcnJlZCBhbGlnbm1lbnQgZm9yIG1vdnNsIGJ1bGsgbWVtb3J5IG1vdmVzCisJICovCisJc3dpdGNoIChjLT54ODYpIHsKKwljYXNlIDQ6CQkvKiA0ODY6IHVudGVzdGVkICovCisJCWJyZWFrOworCWNhc2UgNToJCS8qIE9sZCBQZW50aWE6IHVudGVzdGVkICovCisJCWJyZWFrOworCWNhc2UgNjoJCS8qIFBJSS9QSUlJIG9ubHkgbGlrZSBtb3ZzbCB3aXRoIDgtYnl0ZSBhbGlnbm1lbnQgKi8KKwkJbW92c2xfbWFzay5tYXNrID0gNzsKKwkJYnJlYWs7CisJY2FzZSAxNToJLyogUDQgaXMgT0sgZG93biB0byA4LWJ5dGUgYWxpZ25tZW50ICovCisJCW1vdnNsX21hc2subWFzayA9IDc7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisJaWYgKGMtPng4NiA9PSAxNSkgCisJCXNldF9iaXQoWDg2X0ZFQVRVUkVfUDQsIGMtPng4Nl9jYXBhYmlsaXR5KTsKKwlpZiAoYy0+eDg2ID09IDYpIAorCQlzZXRfYml0KFg4Nl9GRUFUVVJFX1AzLCBjLT54ODZfY2FwYWJpbGl0eSk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBpbnRlbF9zaXplX2NhY2hlKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMsIHVuc2lnbmVkIGludCBzaXplKQoreworCS8qIEludGVsIFBJSUkgVHVhbGF0aW4uIFRoaXMgY29tZXMgaW4gdHdvIGZsYXZvdXJzLgorCSAqIE9uZSBoYXMgMjU2a2Igb2YgY2FjaGUsIHRoZSBvdGhlciA1MTIuIFdlIGhhdmUgbm8gd2F5CisJICogdG8gZGV0ZXJtaW5lIHdoaWNoLCBzbyB3ZSB1c2UgYSBib290dGltZSBvdmVycmlkZQorCSAqIGZvciB0aGUgNTEya2IgbW9kZWwsIGFuZCBhc3N1bWUgMjU2IG90aGVyd2lzZS4KKwkgKi8KKwlpZiAoKGMtPng4NiA9PSA2KSAmJiAoYy0+eDg2X21vZGVsID09IDExKSAmJiAoc2l6ZSA9PSAwKSkKKwkJc2l6ZSA9IDI1NjsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBjcHVfZGV2IGludGVsX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKKwkuY192ZW5kb3IJPSAiSW50ZWwiLAorCS5jX2lkZW50IAk9IHsgIkdlbnVpbmVJbnRlbCIgfSwKKwkuY19tb2RlbHMgPSB7CisJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfSU5URUwsIC5mYW1pbHkgPSA0LCAubW9kZWxfbmFtZXMgPSAKKwkJICB7IAorCQkJICBbMF0gPSAiNDg2IERYLTI1LzMzIiwgCisJCQkgIFsxXSA9ICI0ODYgRFgtNTAiLCAKKwkJCSAgWzJdID0gIjQ4NiBTWCIsIAorCQkJICBbM10gPSAiNDg2IERYLzIiLCAKKwkJCSAgWzRdID0gIjQ4NiBTTCIsIAorCQkJICBbNV0gPSAiNDg2IFNYLzIiLCAKKwkJCSAgWzddID0gIjQ4NiBEWC8yLVdCIiwgCisJCQkgIFs4XSA9ICI0ODYgRFgvNCIsIAorCQkJICBbOV0gPSAiNDg2IERYLzQtV0IiCisJCSAgfQorCQl9LAorCQl7IC52ZW5kb3IgPSBYODZfVkVORE9SX0lOVEVMLCAuZmFtaWx5ID0gNSwgLm1vZGVsX25hbWVzID0KKwkJICB7IAorCQkJICBbMF0gPSAiUGVudGl1bSA2MC82NiBBLXN0ZXAiLCAKKwkJCSAgWzFdID0gIlBlbnRpdW0gNjAvNjYiLCAKKwkJCSAgWzJdID0gIlBlbnRpdW0gNzUgLSAyMDAiLAorCQkJICBbM10gPSAiT3ZlckRyaXZlIFBPRFA1VjgzIiwgCisJCQkgIFs0XSA9ICJQZW50aXVtIE1NWCIsCisJCQkgIFs3XSA9ICJNb2JpbGUgUGVudGl1bSA3NSAtIDIwMCIsIAorCQkJICBbOF0gPSAiTW9iaWxlIFBlbnRpdW0gTU1YIgorCQkgIH0KKwkJfSwKKwkJeyAudmVuZG9yID0gWDg2X1ZFTkRPUl9JTlRFTCwgLmZhbWlseSA9IDYsIC5tb2RlbF9uYW1lcyA9CisJCSAgeyAKKwkJCSAgWzBdID0gIlBlbnRpdW0gUHJvIEEtc3RlcCIsCisJCQkgIFsxXSA9ICJQZW50aXVtIFBybyIsIAorCQkJICBbM10gPSAiUGVudGl1bSBJSSAoS2xhbWF0aCkiLCAKKwkJCSAgWzRdID0gIlBlbnRpdW0gSUkgKERlc2NodXRlcykiLCAKKwkJCSAgWzVdID0gIlBlbnRpdW0gSUkgKERlc2NodXRlcykiLCAKKwkJCSAgWzZdID0gIk1vYmlsZSBQZW50aXVtIElJIiwKKwkJCSAgWzddID0gIlBlbnRpdW0gSUlJIChLYXRtYWkpIiwgCisJCQkgIFs4XSA9ICJQZW50aXVtIElJSSAoQ29wcGVybWluZSkiLCAKKwkJCSAgWzEwXSA9ICJQZW50aXVtIElJSSAoQ2FzY2FkZXMpIiwKKwkJCSAgWzExXSA9ICJQZW50aXVtIElJSSAoVHVhbGF0aW4pIiwKKwkJICB9CisJCX0sCisJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfSU5URUwsIC5mYW1pbHkgPSAxNSwgLm1vZGVsX25hbWVzID0KKwkJICB7CisJCQkgIFswXSA9ICJQZW50aXVtIDQgKFVua25vd24pIiwKKwkJCSAgWzFdID0gIlBlbnRpdW0gNCAoV2lsbGFtZXR0ZSkiLAorCQkJICBbMl0gPSAiUGVudGl1bSA0IChOb3J0aHdvb2QpIiwKKwkJCSAgWzRdID0gIlBlbnRpdW0gNCAoRm9zdGVyKSIsCisJCQkgIFs1XSA9ICJQZW50aXVtIDQgKEZvc3RlcikiLAorCQkgIH0KKwkJfSwKKwl9LAorCS5jX2luaXQJCT0gaW5pdF9pbnRlbCwKKwkuY19pZGVudGlmeQk9IGdlbmVyaWNfaWRlbnRpZnksCisJLmNfc2l6ZV9jYWNoZQk9IGludGVsX3NpemVfY2FjaGUsCit9OworCitfX2luaXQgaW50IGludGVsX2NwdV9pbml0KHZvaWQpCit7CisJY3B1X2RldnNbWDg2X1ZFTkRPUl9JTlRFTF0gPSAmaW50ZWxfY3B1X2RldjsKKwlyZXR1cm4gMDsKK30KKworLy8gYXJjaF9pbml0Y2FsbChpbnRlbF9jcHVfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViNWI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCkBAIC0wLDAgKzEsNTk4IEBACisvKgorICogICAgICBSb3V0aW5lcyB0byBpbmRlbnRpZnkgY2FjaGVzIG9uIEludGVsIENQVS4KKyAqCisgKiAgICAgIENoYW5nZXM6CisgKiAgICAgIFZlbmthdGVzaCBQYWxsaXBhZGkJOiBBZGRpbmcgY2FjaGUgaWRlbnRpZmljYXRpb24gdGhyb3VnaCBjcHVpZCg0KQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorCisjZGVmaW5lIExWTF8xX0lOU1QJMQorI2RlZmluZSBMVkxfMV9EQVRBCTIKKyNkZWZpbmUgTFZMXzIJCTMKKyNkZWZpbmUgTFZMXzMJCTQKKyNkZWZpbmUgTFZMX1RSQUNFCTUKKworc3RydWN0IF9jYWNoZV90YWJsZQoreworCXVuc2lnbmVkIGNoYXIgZGVzY3JpcHRvcjsKKwljaGFyIGNhY2hlX3R5cGU7CisJc2hvcnQgc2l6ZTsKK307CisKKy8qIGFsbCB0aGUgY2FjaGUgZGVzY3JpcHRvciB0eXBlcyB3ZSBjYXJlIGFib3V0IChubyBUTEIgb3IgdHJhY2UgY2FjaGUgZW50cmllcykgKi8KK3N0YXRpYyBzdHJ1Y3QgX2NhY2hlX3RhYmxlIGNhY2hlX3RhYmxlW10gX19pbml0ZGF0YSA9Cit7CisJeyAweDA2LCBMVkxfMV9JTlNULCA4IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MDgsIExWTF8xX0lOU1QsIDE2IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MGEsIExWTF8xX0RBVEEsIDggfSwJLyogMiB3YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHgwYywgTFZMXzFfREFUQSwgMTYgfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHgyMiwgTFZMXzMsICAgICAgNTEyIH0sCS8qIDQtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDIzLCBMVkxfMywgICAgICAxMDI0IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDI1LCBMVkxfMywgICAgICAyMDQ4IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDI5LCBMVkxfMywgICAgICA0MDk2IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDJjLCBMVkxfMV9EQVRBLCAzMiB9LAkvKiA4LXdheSBzZXQgYXNzb2MsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDMwLCBMVkxfMV9JTlNULCAzMiB9LAkvKiA4LXdheSBzZXQgYXNzb2MsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDM5LCBMVkxfMiwgICAgICAxMjggfSwJLyogNC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4M2IsIExWTF8yLCAgICAgIDEyOCB9LAkvKiAyLXdheSBzZXQgYXNzb2MsIHNlY3RvcmVkIGNhY2hlLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHgzYywgTFZMXzIsICAgICAgMjU2IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDQxLCBMVkxfMiwgICAgICAxMjggfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg0MiwgTFZMXzIsICAgICAgMjU2IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4NDMsIExWTF8yLCAgICAgIDUxMiB9LAkvKiA0LXdheSBzZXQgYXNzb2MsIDMyIGJ5dGUgbGluZSBzaXplICovCisJeyAweDQ0LCBMVkxfMiwgICAgICAxMDI0IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4NDUsIExWTF8yLCAgICAgIDIwNDggfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg2MCwgTFZMXzFfREFUQSwgMTYgfSwJLyogOC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4NjYsIExWTF8xX0RBVEEsIDggfSwJLyogNC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4NjcsIExWTF8xX0RBVEEsIDE2IH0sCS8qIDQtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDY4LCBMVkxfMV9EQVRBLCAzMiB9LAkvKiA0LXdheSBzZXQgYXNzb2MsIHNlY3RvcmVkIGNhY2hlLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg3MCwgTFZMX1RSQUNFLCAgMTIgfSwJLyogOC13YXkgc2V0IGFzc29jICovCisJeyAweDcxLCBMVkxfVFJBQ0UsICAxNiB9LAkvKiA4LXdheSBzZXQgYXNzb2MgKi8KKwl7IDB4NzIsIExWTF9UUkFDRSwgIDMyIH0sCS8qIDgtd2F5IHNldCBhc3NvYyAqLworCXsgMHg3OCwgTFZMXzIsICAgIDEwMjQgfSwJLyogNC13YXkgc2V0IGFzc29jLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg3OSwgTFZMXzIsICAgICAxMjggfSwJLyogOC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4N2EsIExWTF8yLCAgICAgMjU2IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgc2VjdG9yZWQgY2FjaGUsIDY0IGJ5dGUgbGluZSBzaXplICovCisJeyAweDdiLCBMVkxfMiwgICAgIDUxMiB9LAkvKiA4LXdheSBzZXQgYXNzb2MsIHNlY3RvcmVkIGNhY2hlLCA2NCBieXRlIGxpbmUgc2l6ZSAqLworCXsgMHg3YywgTFZMXzIsICAgIDEwMjQgfSwJLyogOC13YXkgc2V0IGFzc29jLCBzZWN0b3JlZCBjYWNoZSwgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4N2QsIExWTF8yLCAgICAyMDQ4IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4N2YsIExWTF8yLCAgICAgNTEyIH0sCS8qIDItd2F5IHNldCBhc3NvYywgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODIsIExWTF8yLCAgICAgMjU2IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODMsIExWTF8yLCAgICAgNTEyIH0sCS8qIDgtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODQsIExWTF8yLCAgICAxMDI0IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODUsIExWTF8yLCAgICAyMDQ4IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgMzIgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODYsIExWTF8yLCAgICAgNTEyIH0sCS8qIDQtd2F5IHNldCBhc3NvYywgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4ODcsIExWTF8yLCAgICAxMDI0IH0sCS8qIDgtd2F5IHNldCBhc3NvYywgNjQgYnl0ZSBsaW5lIHNpemUgKi8KKwl7IDB4MDAsIDAsIDB9Cit9OworCisKK2VudW0gX2NhY2hlX3R5cGUKK3sKKwlDQUNIRV9UWVBFX05VTEwJPSAwLAorCUNBQ0hFX1RZUEVfREFUQSA9IDEsCisJQ0FDSEVfVFlQRV9JTlNUID0gMiwKKwlDQUNIRV9UWVBFX1VOSUZJRUQgPSAzCit9OworCit1bmlvbiBfY3B1aWQ0X2xlYWZfZWF4IHsKKwlzdHJ1Y3QgeworCQllbnVtIF9jYWNoZV90eXBlCXR5cGU6NTsKKwkJdW5zaWduZWQgaW50CQlsZXZlbDozOworCQl1bnNpZ25lZCBpbnQJCWlzX3NlbGZfaW5pdGlhbGl6aW5nOjE7CisJCXVuc2lnbmVkIGludAkJaXNfZnVsbHlfYXNzb2NpYXRpdmU6MTsKKwkJdW5zaWduZWQgaW50CQlyZXNlcnZlZDo0OworCQl1bnNpZ25lZCBpbnQJCW51bV90aHJlYWRzX3NoYXJpbmc6MTI7CisJCXVuc2lnbmVkIGludAkJbnVtX2NvcmVzX29uX2RpZTo2OworCX0gc3BsaXQ7CisJdTMyIGZ1bGw7Cit9OworCit1bmlvbiBfY3B1aWQ0X2xlYWZfZWJ4IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQJCWNvaGVyZW5jeV9saW5lX3NpemU6MTI7CisJCXVuc2lnbmVkIGludAkJcGh5c2ljYWxfbGluZV9wYXJ0aXRpb246MTA7CisJCXVuc2lnbmVkIGludAkJd2F5c19vZl9hc3NvY2lhdGl2aXR5OjEwOworCX0gc3BsaXQ7CisJdTMyIGZ1bGw7Cit9OworCit1bmlvbiBfY3B1aWQ0X2xlYWZfZWN4IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQJCW51bWJlcl9vZl9zZXRzOjMyOworCX0gc3BsaXQ7CisJdTMyIGZ1bGw7Cit9OworCitzdHJ1Y3QgX2NwdWlkNF9pbmZvIHsKKwl1bmlvbiBfY3B1aWQ0X2xlYWZfZWF4IGVheDsKKwl1bmlvbiBfY3B1aWQ0X2xlYWZfZWJ4IGVieDsKKwl1bmlvbiBfY3B1aWQ0X2xlYWZfZWN4IGVjeDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJY3B1bWFza190IHNoYXJlZF9jcHVfbWFwOworfTsKKworI2RlZmluZSBNQVhfQ0FDSEVfTEVBVkVTCQk0CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgX19kZXZpbml0ZGF0YQludW1fY2FjaGVfbGVhdmVzOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjcHVpZDRfY2FjaGVfbG9va3VwKGludCBpbmRleCwgc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmKQoreworCXVuc2lnbmVkIGludAkJZWF4LCBlYngsIGVjeCwgZWR4OworCXVuaW9uIF9jcHVpZDRfbGVhZl9lYXgJY2FjaGVfZWF4OworCisJY3B1aWRfY291bnQoNCwgaW5kZXgsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCWNhY2hlX2VheC5mdWxsID0gZWF4OworCWlmIChjYWNoZV9lYXguc3BsaXQudHlwZSA9PSBDQUNIRV9UWVBFX05VTEwpCisJCXJldHVybiAtMTsKKworCXRoaXNfbGVhZi0+ZWF4LmZ1bGwgPSBlYXg7CisJdGhpc19sZWFmLT5lYnguZnVsbCA9IGVieDsKKwl0aGlzX2xlYWYtPmVjeC5mdWxsID0gZWN4OworCXRoaXNfbGVhZi0+c2l6ZSA9ICh0aGlzX2xlYWYtPmVjeC5zcGxpdC5udW1iZXJfb2Zfc2V0cyArIDEpICoKKwkJKHRoaXNfbGVhZi0+ZWJ4LnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUgKyAxKSAqCisJCSh0aGlzX2xlYWYtPmVieC5zcGxpdC5waHlzaWNhbF9saW5lX3BhcnRpdGlvbiArIDEpICoKKwkJKHRoaXNfbGVhZi0+ZWJ4LnNwbGl0LndheXNfb2ZfYXNzb2NpYXRpdml0eSArIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBmaW5kX251bV9jYWNoZV9sZWF2ZXModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQJCWVheCwgZWJ4LCBlY3gsIGVkeDsKKwl1bmlvbiBfY3B1aWQ0X2xlYWZfZWF4CWNhY2hlX2VheDsKKwlpbnQgCQkJaTsKKwlpbnQgCQkJcmV0dmFsOworCisJcmV0dmFsID0gTUFYX0NBQ0hFX0xFQVZFUzsKKwkvKiBEbyBjcHVpZCg0KSBsb29wIHRvIGZpbmQgb3V0IG51bV9jYWNoZV9sZWF2ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NBQ0hFX0xFQVZFUzsgaSsrKSB7CisJCWNwdWlkX2NvdW50KDQsIGksICZlYXgsICZlYngsICZlY3gsICZlZHgpOworCQljYWNoZV9lYXguZnVsbCA9IGVheDsKKwkJaWYgKGNhY2hlX2VheC5zcGxpdC50eXBlID09IENBQ0hFX1RZUEVfTlVMTCkgeworCQkJcmV0dmFsID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3Vuc2lnbmVkIGludCBfX2luaXQgaW5pdF9pbnRlbF9jYWNoZWluZm8oc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXVuc2lnbmVkIGludCB0cmFjZSA9IDAsIGwxaSA9IDAsIGwxZCA9IDAsIGwyID0gMCwgbDMgPSAwOyAvKiBDYWNoZSBzaXplcyAqLworCXVuc2lnbmVkIGludCBuZXdfbDFkID0gMCwgbmV3X2wxaSA9IDA7IC8qIENhY2hlIHNpemVzIGZyb20gY3B1aWQoNCkgKi8KKwl1bnNpZ25lZCBpbnQgbmV3X2wyID0gMCwgbmV3X2wzID0gMCwgaTsgLyogQ2FjaGUgc2l6ZXMgZnJvbSBjcHVpZCg0KSAqLworCisJaWYgKGMtPmNwdWlkX2xldmVsID4gNCkgeworCQlzdGF0aWMgaW50IGlzX2luaXRpYWxpemVkOworCisJCWlmIChpc19pbml0aWFsaXplZCA9PSAwKSB7CisJCQkvKiBJbml0IG51bV9jYWNoZV9sZWF2ZXMgZnJvbSBib290IENQVSAqLworCQkJbnVtX2NhY2hlX2xlYXZlcyA9IGZpbmRfbnVtX2NhY2hlX2xlYXZlcygpOworCQkJaXNfaW5pdGlhbGl6ZWQrKzsKKwkJfQorCisJCS8qCisJCSAqIFdoZW5ldmVyIHBvc3NpYmxlIHVzZSBjcHVpZCg0KSwgZGV0ZXJtaW5pc3RpYyBjYWNoZQorCQkgKiBwYXJhbWV0ZXJzIGNwdWlkIGxlYWYgdG8gZmluZCB0aGUgY2FjaGUgZGV0YWlscworCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bV9jYWNoZV9sZWF2ZXM7IGkrKykgeworCQkJc3RydWN0IF9jcHVpZDRfaW5mbyB0aGlzX2xlYWY7CisKKwkJCWludCByZXR2YWw7CisKKwkJCXJldHZhbCA9IGNwdWlkNF9jYWNoZV9sb29rdXAoaSwgJnRoaXNfbGVhZik7CisJCQlpZiAocmV0dmFsID49IDApIHsKKwkJCQlzd2l0Y2godGhpc19sZWFmLmVheC5zcGxpdC5sZXZlbCkgeworCQkJCSAgICBjYXNlIDE6CisJCQkJCWlmICh0aGlzX2xlYWYuZWF4LnNwbGl0LnR5cGUgPT0KKwkJCQkJCQlDQUNIRV9UWVBFX0RBVEEpCisJCQkJCQluZXdfbDFkID0gdGhpc19sZWFmLnNpemUvMTAyNDsKKwkJCQkJZWxzZSBpZiAodGhpc19sZWFmLmVheC5zcGxpdC50eXBlID09CisJCQkJCQkJQ0FDSEVfVFlQRV9JTlNUKQorCQkJCQkJbmV3X2wxaSA9IHRoaXNfbGVhZi5zaXplLzEwMjQ7CisJCQkJCWJyZWFrOworCQkJCSAgICBjYXNlIDI6CisJCQkJCW5ld19sMiA9IHRoaXNfbGVhZi5zaXplLzEwMjQ7CisJCQkJCWJyZWFrOworCQkJCSAgICBjYXNlIDM6CisJCQkJCW5ld19sMyA9IHRoaXNfbGVhZi5zaXplLzEwMjQ7CisJCQkJCWJyZWFrOworCQkJCSAgICBkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKGMtPmNwdWlkX2xldmVsID4gMSkgeworCQkvKiBzdXBwb3J0cyBlYXg9MiAgY2FsbCAqLworCQlpbnQgaSwgaiwgbjsKKwkJaW50IHJlZ3NbNF07CisJCXVuc2lnbmVkIGNoYXIgKmRwID0gKHVuc2lnbmVkIGNoYXIgKilyZWdzOworCisJCS8qIE51bWJlciBvZiB0aW1lcyB0byBpdGVyYXRlICovCisJCW4gPSBjcHVpZF9lYXgoMikgJiAweEZGOworCisJCWZvciAoIGkgPSAwIDsgaSA8IG4gOyBpKysgKSB7CisJCQljcHVpZCgyLCAmcmVnc1swXSwgJnJlZ3NbMV0sICZyZWdzWzJdLCAmcmVnc1szXSk7CisKKwkJCS8qIElmIGJpdCAzMSBpcyBzZXQsIHRoaXMgaXMgYW4gdW5rbm93biBmb3JtYXQgKi8KKwkJCWZvciAoIGogPSAwIDsgaiA8IDMgOyBqKysgKSB7CisJCQkJaWYgKCByZWdzW2pdIDwgMCApIHJlZ3Nbal0gPSAwOworCQkJfQorCisJCQkvKiBCeXRlIDAgaXMgbGV2ZWwgY291bnQsIG5vdCBhIGRlc2NyaXB0b3IgKi8KKwkJCWZvciAoIGogPSAxIDsgaiA8IDE2IDsgaisrICkgeworCQkJCXVuc2lnbmVkIGNoYXIgZGVzID0gZHBbal07CisJCQkJdW5zaWduZWQgY2hhciBrID0gMDsKKworCQkJCS8qIGxvb2sgdXAgdGhpcyBkZXNjcmlwdG9yIGluIHRoZSB0YWJsZSAqLworCQkJCXdoaWxlIChjYWNoZV90YWJsZVtrXS5kZXNjcmlwdG9yICE9IDApCisJCQkJeworCQkJCQlpZiAoY2FjaGVfdGFibGVba10uZGVzY3JpcHRvciA9PSBkZXMpIHsKKwkJCQkJCXN3aXRjaCAoY2FjaGVfdGFibGVba10uY2FjaGVfdHlwZSkgeworCQkJCQkJY2FzZSBMVkxfMV9JTlNUOgorCQkJCQkJCWwxaSArPSBjYWNoZV90YWJsZVtrXS5zaXplOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBMVkxfMV9EQVRBOgorCQkJCQkJCWwxZCArPSBjYWNoZV90YWJsZVtrXS5zaXplOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBMVkxfMjoKKwkJCQkJCQlsMiArPSBjYWNoZV90YWJsZVtrXS5zaXplOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBMVkxfMzoKKwkJCQkJCQlsMyArPSBjYWNoZV90YWJsZVtrXS5zaXplOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBMVkxfVFJBQ0U6CisJCQkJCQkJdHJhY2UgKz0gY2FjaGVfdGFibGVba10uc2l6ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlrKys7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG5ld19sMWQpCisJCQlsMWQgPSBuZXdfbDFkOworCisJCWlmIChuZXdfbDFpKQorCQkJbDFpID0gbmV3X2wxaTsKKworCQlpZiAobmV3X2wyKQorCQkJbDIgPSBuZXdfbDI7CisKKwkJaWYgKG5ld19sMykKKwkJCWwzID0gbmV3X2wzOworCisJCWlmICggdHJhY2UgKQorCQkJcHJpbnRrIChLRVJOX0lORk8gIkNQVTogVHJhY2UgY2FjaGU6ICVkSyB1b3BzIiwgdHJhY2UpOworCQllbHNlIGlmICggbDFpICkKKwkJCXByaW50ayAoS0VSTl9JTkZPICJDUFU6IEwxIEkgY2FjaGU6ICVkSyIsIGwxaSk7CisJCWlmICggbDFkICkKKwkJCXByaW50aygiLCBMMSBEIGNhY2hlOiAlZEtcbiIsIGwxZCk7CisJCWVsc2UKKwkJCXByaW50aygiXG4iKTsKKwkJaWYgKCBsMiApCisJCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IEwyIGNhY2hlOiAlZEtcbiIsIGwyKTsKKwkJaWYgKCBsMyApCisJCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IEwzIGNhY2hlOiAlZEtcbiIsIGwzKTsKKworCQkvKgorCQkgKiBUaGlzIGFzc3VtZXMgdGhlIEwzIGNhY2hlIGlzIHNoYXJlZDsgaXQgdHlwaWNhbGx5IGxpdmVzIGluCisJCSAqIHRoZSBub3J0aGJyaWRnZS4gIFRoZSBMMSBjYWNoZXMgYXJlIGluY2x1ZGVkIGJ5IHRoZSBMMgorCQkgKiBjYWNoZSwgYW5kIHNvIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgZm9yIHRoZSBwdXJwb3NlIG9mCisJCSAqIFNNUCBzd2l0Y2hpbmcgd2VpZ2h0cy4KKwkJICovCisJCWMtPng4Nl9jYWNoZV9zaXplID0gbDIgPyBsMiA6IChsMWkrbDFkKTsKKwl9CisKKwlyZXR1cm4gbDI7Cit9CisKKy8qIHBvaW50ZXIgdG8gX2NwdWlkNF9pbmZvIGFycmF5IChmb3IgZWFjaCBjYWNoZSBsZWFmKSAqLworc3RhdGljIHN0cnVjdCBfY3B1aWQ0X2luZm8gKmNwdWlkNF9pbmZvW05SX0NQVVNdOworI2RlZmluZSBDUFVJRDRfSU5GT19JRFgoeCx5KSAgICAoJigoY3B1aWQ0X2luZm9beF0pW3ldKSkKKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBjYWNoZV9zaGFyZWRfY3B1X21hcF9zZXR1cCh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgaW5kZXgpCit7CisJc3RydWN0IF9jcHVpZDRfaW5mbwkqdGhpc19sZWFmOworCXVuc2lnbmVkIGxvbmcgbnVtX3RocmVhZHNfc2hhcmluZzsKKworCXRoaXNfbGVhZiA9IENQVUlENF9JTkZPX0lEWChjcHUsIGluZGV4KTsKKwludW1fdGhyZWFkc19zaGFyaW5nID0gMSArIHRoaXNfbGVhZi0+ZWF4LnNwbGl0Lm51bV90aHJlYWRzX3NoYXJpbmc7CisKKwlpZiAobnVtX3RocmVhZHNfc2hhcmluZyA9PSAxKQorCQljcHVfc2V0KGNwdSwgdGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCk7CisjaWZkZWYgQ09ORklHX1g4Nl9IVAorCWVsc2UgaWYgKG51bV90aHJlYWRzX3NoYXJpbmcgPT0gc21wX251bV9zaWJsaW5ncykKKwkJdGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCA9IGNwdV9zaWJsaW5nX21hcFtjcHVdOworI2VuZGlmCisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJOdW1iZXIgb2YgQ1BVcyBzaGFyaW5nIGNhY2hlIGRpZG4ndCBtYXRjaCAiCisJCQkJImFueSBrbm93biBzZXQgb2YgQ1BVc1xuIik7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IGNhY2hlX3NoYXJlZF9jcHVfbWFwX3NldHVwKHVuc2lnbmVkIGludCBjcHUsIGludCBpbmRleCkge30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBmcmVlX2NhY2hlX2F0dHJpYnV0ZXModW5zaWduZWQgaW50IGNwdSkKK3sKKwlrZnJlZShjcHVpZDRfaW5mb1tjcHVdKTsKKwljcHVpZDRfaW5mb1tjcHVdID0gTlVMTDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZGV0ZWN0X2NhY2hlX2F0dHJpYnV0ZXModW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgX2NwdWlkNF9pbmZvCSp0aGlzX2xlYWY7CisJdW5zaWduZWQgbG9uZyAJCWo7CisJaW50IAkJCXJldHZhbDsKKworCWlmIChudW1fY2FjaGVfbGVhdmVzID09IDApCisJCXJldHVybiAtRU5PRU5UOworCisJY3B1aWQ0X2luZm9bY3B1XSA9IGttYWxsb2MoCisJICAgIHNpemVvZihzdHJ1Y3QgX2NwdWlkNF9pbmZvKSAqIG51bV9jYWNoZV9sZWF2ZXMsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShjcHVpZDRfaW5mb1tjcHVdID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoY3B1aWQ0X2luZm9bY3B1XSwgMCwKKwkgICAgc2l6ZW9mKHN0cnVjdCBfY3B1aWQ0X2luZm8pICogbnVtX2NhY2hlX2xlYXZlcyk7CisKKwkvKiBEbyBjcHVpZCBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgKi8KKwlmb3IgKGogPSAwOyBqIDwgbnVtX2NhY2hlX2xlYXZlczsgaisrKSB7CisJCXRoaXNfbGVhZiA9IENQVUlENF9JTkZPX0lEWChjcHUsIGopOworCQlyZXR2YWwgPSBjcHVpZDRfY2FjaGVfbG9va3VwKGosIHRoaXNfbGVhZik7CisJCWlmICh1bmxpa2VseShyZXR2YWwgPCAwKSkKKwkJCWdvdG8gZXJyX291dDsKKwkJY2FjaGVfc2hhcmVkX2NwdV9tYXBfc2V0dXAoY3B1LCBqKTsKKwl9CisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJZnJlZV9jYWNoZV9hdHRyaWJ1dGVzKGNwdSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKyNpZmRlZiBDT05GSUdfU1lTRlMKKworI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCitleHRlcm4gc3RydWN0IHN5c2Rldl9jbGFzcyBjcHVfc3lzZGV2X2NsYXNzOyAvKiBmcm9tIGRyaXZlcnMvYmFzZS9jcHUuYyAqLworCisvKiBwb2ludGVyIHRvIGtvYmplY3QgZm9yIGNwdVgvY2FjaGUgKi8KK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqIGNhY2hlX2tvYmplY3RbTlJfQ1BVU107CisKK3N0cnVjdCBfaW5kZXhfa29iamVjdCB7CisJc3RydWN0IGtvYmplY3Qga29iajsKKwl1bnNpZ25lZCBpbnQgY3B1OworCXVuc2lnbmVkIHNob3J0IGluZGV4OworfTsKKworLyogcG9pbnRlciB0byBhcnJheSBvZiBrb2JqZWN0cyBmb3IgY3B1WC9jYWNoZS9pbmRleFkgKi8KK3N0YXRpYyBzdHJ1Y3QgX2luZGV4X2tvYmplY3QgKmluZGV4X2tvYmplY3RbTlJfQ1BVU107CisjZGVmaW5lIElOREVYX0tPQkpFQ1RfUFRSKHgseSkgICAgKCYoKGluZGV4X2tvYmplY3RbeF0pW3ldKSkKKworI2RlZmluZSBzaG93X29uZV9wbHVzKGZpbGVfbmFtZSwgb2JqZWN0LCB2YWwpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNmaWxlX25hbWUJCQkJCQlcCisJCQkoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpdGhpc19sZWFmLT5vYmplY3QgKyB2YWwpOyBcCit9CisKK3Nob3dfb25lX3BsdXMobGV2ZWwsIGVheC5zcGxpdC5sZXZlbCwgMCk7CitzaG93X29uZV9wbHVzKGNvaGVyZW5jeV9saW5lX3NpemUsIGVieC5zcGxpdC5jb2hlcmVuY3lfbGluZV9zaXplLCAxKTsKK3Nob3dfb25lX3BsdXMocGh5c2ljYWxfbGluZV9wYXJ0aXRpb24sIGVieC5zcGxpdC5waHlzaWNhbF9saW5lX3BhcnRpdGlvbiwgMSk7CitzaG93X29uZV9wbHVzKHdheXNfb2ZfYXNzb2NpYXRpdml0eSwgZWJ4LnNwbGl0LndheXNfb2ZfYXNzb2NpYXRpdml0eSwgMSk7CitzaG93X29uZV9wbHVzKG51bWJlcl9vZl9zZXRzLCBlY3guc3BsaXQubnVtYmVyX29mX3NldHMsIDEpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3NpemUoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVsdUtcbiIsIHRoaXNfbGVhZi0+c2l6ZSAvIDEwMjQpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3NoYXJlZF9jcHVfbWFwKHN0cnVjdCBfY3B1aWQ0X2luZm8gKnRoaXNfbGVhZiwgY2hhciAqYnVmKQoreworCWNoYXIgbWFza19zdHJbTlJfQ1BVU107CisJY3B1bWFza19zY25wcmludGYobWFza19zdHIsIE5SX0NQVVMsIHRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBtYXNrX3N0cik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZikgeworCXN3aXRjaCh0aGlzX2xlYWYtPmVheC5zcGxpdC50eXBlKSB7CisJICAgIGNhc2UgQ0FDSEVfVFlQRV9EQVRBOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJEYXRhXG4iKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgQ0FDSEVfVFlQRV9JTlNUOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJJbnN0cnVjdGlvblxuIik7CisJCWJyZWFrOworCSAgICBjYXNlIENBQ0hFX1RZUEVfVU5JRklFRDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiVW5pZmllZFxuIik7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJVbmtub3duXG4iKTsKKwkJYnJlYWs7CisJfQorfQorCitzdHJ1Y3QgX2NhY2hlX2F0dHIgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IF9jcHVpZDRfaW5mbyAqLCBjaGFyICopOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IF9jcHVpZDRfaW5mbyAqLCBjb25zdCBjaGFyICosIHNpemVfdCBjb3VudCk7Cit9OworCisjZGVmaW5lIGRlZmluZV9vbmVfcm8oX25hbWUpIFwKK3N0YXRpYyBzdHJ1Y3QgX2NhY2hlX2F0dHIgX25hbWUgPSBcCisJX19BVFRSKF9uYW1lLCAwNDQ0LCBzaG93XyMjX25hbWUsIE5VTEwpCisKK2RlZmluZV9vbmVfcm8obGV2ZWwpOworZGVmaW5lX29uZV9ybyh0eXBlKTsKK2RlZmluZV9vbmVfcm8oY29oZXJlbmN5X2xpbmVfc2l6ZSk7CitkZWZpbmVfb25lX3JvKHBoeXNpY2FsX2xpbmVfcGFydGl0aW9uKTsKK2RlZmluZV9vbmVfcm8od2F5c19vZl9hc3NvY2lhdGl2aXR5KTsKK2RlZmluZV9vbmVfcm8obnVtYmVyX29mX3NldHMpOworZGVmaW5lX29uZV9ybyhzaXplKTsKK2RlZmluZV9vbmVfcm8oc2hhcmVkX2NwdV9tYXApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGRlZmF1bHRfYXR0cnNbXSA9IHsKKwkmdHlwZS5hdHRyLAorCSZsZXZlbC5hdHRyLAorCSZjb2hlcmVuY3lfbGluZV9zaXplLmF0dHIsCisJJnBoeXNpY2FsX2xpbmVfcGFydGl0aW9uLmF0dHIsCisJJndheXNfb2ZfYXNzb2NpYXRpdml0eS5hdHRyLAorCSZudW1iZXJfb2Zfc2V0cy5hdHRyLAorCSZzaXplLmF0dHIsCisJJnNoYXJlZF9jcHVfbWFwLmF0dHIsCisJTlVMTAorfTsKKworI2RlZmluZSB0b19vYmplY3QoaykgY29udGFpbmVyX29mKGssIHN0cnVjdCBfaW5kZXhfa29iamVjdCwga29iaikKKyNkZWZpbmUgdG9fYXR0cihhKSBjb250YWluZXJfb2YoYSwgc3RydWN0IF9jYWNoZV9hdHRyLCBhdHRyKQorCitzdGF0aWMgc3NpemVfdCBzaG93KHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIsIGNoYXIgKiBidWYpCit7CisJc3RydWN0IF9jYWNoZV9hdHRyICpmYXR0ciA9IHRvX2F0dHIoYXR0cik7CisJc3RydWN0IF9pbmRleF9rb2JqZWN0ICp0aGlzX2xlYWYgPSB0b19vYmplY3Qoa29iaik7CisJc3NpemVfdCByZXQ7CisKKwlyZXQgPSBmYXR0ci0+c2hvdyA/CisJCWZhdHRyLT5zaG93KENQVUlENF9JTkZPX0lEWCh0aGlzX2xlYWYtPmNwdSwgdGhpc19sZWFmLT5pbmRleCksCisJCQlidWYpIDoKKwkgICAgICAgCTA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmUoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciwKKwkJICAgICBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIHN5c2ZzX29wcyA9IHsKKwkuc2hvdyAgID0gc2hvdywKKwkuc3RvcmUgID0gc3RvcmUsCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9jYWNoZSA9IHsKKwkuc3lzZnNfb3BzCT0gJnN5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycwk9IGRlZmF1bHRfYXR0cnMsCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9wZXJjcHVfZW50cnkgPSB7CisJLnN5c2ZzX29wcwk9ICZzeXNmc19vcHMsCit9OworCitzdGF0aWMgdm9pZCBjcHVpZDRfY2FjaGVfc3lzZnNfZXhpdCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWtmcmVlKGNhY2hlX2tvYmplY3RbY3B1XSk7CisJa2ZyZWUoaW5kZXhfa29iamVjdFtjcHVdKTsKKwljYWNoZV9rb2JqZWN0W2NwdV0gPSBOVUxMOworCWluZGV4X2tvYmplY3RbY3B1XSA9IE5VTEw7CisJZnJlZV9jYWNoZV9hdHRyaWJ1dGVzKGNwdSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNwdWlkNF9jYWNoZV9zeXNmc19pbml0KHVuc2lnbmVkIGludCBjcHUpCit7CisKKwlpZiAobnVtX2NhY2hlX2xlYXZlcyA9PSAwKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWRldGVjdF9jYWNoZV9hdHRyaWJ1dGVzKGNwdSk7CisJaWYgKGNwdWlkNF9pbmZvW2NwdV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwkvKiBBbGxvY2F0ZSBhbGwgcmVxdWlyZWQgbWVtb3J5ICovCisJY2FjaGVfa29iamVjdFtjcHVdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGtvYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoY2FjaGVfa29iamVjdFtjcHVdID09IE5VTEwpKQorCQlnb3RvIGVycl9vdXQ7CisJbWVtc2V0KGNhY2hlX2tvYmplY3RbY3B1XSwgMCwgc2l6ZW9mKHN0cnVjdCBrb2JqZWN0KSk7CisKKwlpbmRleF9rb2JqZWN0W2NwdV0gPSBrbWFsbG9jKAorCSAgICBzaXplb2Yoc3RydWN0IF9pbmRleF9rb2JqZWN0ICkgKiBudW1fY2FjaGVfbGVhdmVzLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoaW5kZXhfa29iamVjdFtjcHVdID09IE5VTEwpKQorCQlnb3RvIGVycl9vdXQ7CisJbWVtc2V0KGluZGV4X2tvYmplY3RbY3B1XSwgMCwKKwkgICAgc2l6ZW9mKHN0cnVjdCBfaW5kZXhfa29iamVjdCkgKiBudW1fY2FjaGVfbGVhdmVzKTsKKworCXJldHVybiAwOworCitlcnJfb3V0OgorCWNwdWlkNF9jYWNoZV9zeXNmc19leGl0KGNwdSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIEFkZC9SZW1vdmUgY2FjaGUgaW50ZXJmYWNlIGZvciBDUFUgZGV2aWNlICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjYWNoZV9hZGRfZGV2KHN0cnVjdCBzeXNfZGV2aWNlICogc3lzX2RldikKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc3lzX2Rldi0+aWQ7CisJdW5zaWduZWQgbG9uZyBpLCBqOworCXN0cnVjdCBfaW5kZXhfa29iamVjdCAqdGhpc19vYmplY3Q7CisJaW50IHJldHZhbCA9IDA7CisKKwlyZXR2YWwgPSBjcHVpZDRfY2FjaGVfc3lzZnNfaW5pdChjcHUpOworCWlmICh1bmxpa2VseShyZXR2YWwgPCAwKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCWNhY2hlX2tvYmplY3RbY3B1XS0+cGFyZW50ID0gJnN5c19kZXYtPmtvYmo7CisJa29iamVjdF9zZXRfbmFtZShjYWNoZV9rb2JqZWN0W2NwdV0sICIlcyIsICJjYWNoZSIpOworCWNhY2hlX2tvYmplY3RbY3B1XS0+a3R5cGUgPSAma3R5cGVfcGVyY3B1X2VudHJ5OworCXJldHZhbCA9IGtvYmplY3RfcmVnaXN0ZXIoY2FjaGVfa29iamVjdFtjcHVdKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY2FjaGVfbGVhdmVzOyBpKyspIHsKKwkJdGhpc19vYmplY3QgPSBJTkRFWF9LT0JKRUNUX1BUUihjcHUsaSk7CisJCXRoaXNfb2JqZWN0LT5jcHUgPSBjcHU7CisJCXRoaXNfb2JqZWN0LT5pbmRleCA9IGk7CisJCXRoaXNfb2JqZWN0LT5rb2JqLnBhcmVudCA9IGNhY2hlX2tvYmplY3RbY3B1XTsKKwkJa29iamVjdF9zZXRfbmFtZSgmKHRoaXNfb2JqZWN0LT5rb2JqKSwgImluZGV4JTFsdSIsIGkpOworCQl0aGlzX29iamVjdC0+a29iai5rdHlwZSA9ICZrdHlwZV9jYWNoZTsKKwkJcmV0dmFsID0ga29iamVjdF9yZWdpc3RlcigmKHRoaXNfb2JqZWN0LT5rb2JqKSk7CisJCWlmICh1bmxpa2VseShyZXR2YWwpKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQkJa29iamVjdF91bnJlZ2lzdGVyKAorCQkJCQkmKElOREVYX0tPQkpFQ1RfUFRSKGNwdSxqKS0+a29iaikpOworCQkJfQorCQkJa29iamVjdF91bnJlZ2lzdGVyKGNhY2hlX2tvYmplY3RbY3B1XSk7CisJCQljcHVpZDRfY2FjaGVfc3lzZnNfZXhpdChjcHUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgY2FjaGVfcmVtb3ZlX2RldihzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c19kZXYpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHN5c19kZXYtPmlkOworCXVuc2lnbmVkIGxvbmcgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY2FjaGVfbGVhdmVzOyBpKyspCisJCWtvYmplY3RfdW5yZWdpc3RlcigmKElOREVYX0tPQkpFQ1RfUFRSKGNwdSxpKS0+a29iaikpOworCWtvYmplY3RfdW5yZWdpc3RlcihjYWNoZV9rb2JqZWN0W2NwdV0pOworCWNwdWlkNF9jYWNoZV9zeXNmc19leGl0KGNwdSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2RyaXZlciBjYWNoZV9zeXNkZXZfZHJpdmVyID0geworCS5hZGQgPSBjYWNoZV9hZGRfZGV2LAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChjYWNoZV9yZW1vdmVfZGV2KSwKK307CisKKy8qIFJlZ2lzdGVyL1VucmVnaXN0ZXIgdGhlIGNwdV9jYWNoZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGNhY2hlX3JlZ2lzdGVyX2RyaXZlcih2b2lkKQoreworCWlmIChudW1fY2FjaGVfbGVhdmVzID09IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsJmNhY2hlX3N5c2Rldl9kcml2ZXIpOworfQorCitkZXZpY2VfaW5pdGNhbGwoY2FjaGVfcmVnaXN0ZXJfZHJpdmVyKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDgwOGYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLXkJPQltY2UubyBrNy5vIHA0Lm8gcDUubyBwNi5vIHdpbmNoaXAubworb2JqLSQoQ09ORklHX1g4Nl9NQ0VfTk9ORkFUQUwpCSs9CW5vbi1mYXRhbC5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svazcuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9rNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjUyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svazcuYwpAQCAtMCwwICsxLDk3IEBACisvKgorICogQXRobG9uL0hhbW1lciBzcGVjaWZpYyBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbiBSZXBvcnRpbmcKKyAqIChDKSBDb3B5cmlnaHQgMjAwMiBEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+IAorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisKKyNpbmNsdWRlICJtY2UuaCIKKworLyogTWFjaGluZSBDaGVjayBIYW5kbGVyIEZvciBBTUQgQXRobG9uL0R1cm9uICovCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBrN19tYWNoaW5lX2NoZWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCWludCByZWNvdmVyPTE7CisJdTMyIGFsb3csIGFoaWdoLCBoaWdoLCBsb3c7CisJdTMyIG1jZ3N0bCwgbWNnc3RoOworCWludCBpOworCisJcmRtc3IgKE1TUl9JQTMyX01DR19TVEFUVVMsIG1jZ3N0bCwgbWNnc3RoKTsKKwlpZiAobWNnc3RsICYgKDE8PDApKQkvKiBSZWNvdmVyYWJsZSA/ICovCisJCXJlY292ZXI9MDsKKworCXByaW50ayAoS0VSTl9FTUVSRyAiQ1BVICVkOiBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbjogJTA4eCUwOHhcbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSwgbWNnc3RoLCBtY2dzdGwpOworCisJZm9yIChpPTE7IGk8bnJfbWNlX2JhbmtzOyBpKyspIHsKKwkJcmRtc3IgKE1TUl9JQTMyX01DMF9TVEFUVVMraSo0LGxvdywgaGlnaCk7CisJCWlmIChoaWdoJigxPDwzMSkpIHsKKwkJCWlmIChoaWdoICYgKDE8PDI5KSkKKwkJCQlyZWNvdmVyIHw9IDE7CisJCQlpZiAoaGlnaCAmICgxPDwyNSkpCisJCQkJcmVjb3ZlciB8PSAyOworCQkJcHJpbnRrIChLRVJOX0VNRVJHICJCYW5rICVkOiAlMDh4JTA4eCIsIGksIGhpZ2gsIGxvdyk7CisJCQloaWdoICY9IH4oMTw8MzEpOworCQkJaWYgKGhpZ2ggJiAoMTw8MjcpKSB7CisJCQkJcmRtc3IgKE1TUl9JQTMyX01DMF9NSVNDK2kqNCwgYWxvdywgYWhpZ2gpOworCQkJCXByaW50ayAoIlslMDh4JTA4eF0iLCBhaGlnaCwgYWxvdyk7CisJCQl9CisJCQlpZiAoaGlnaCAmICgxPDwyNikpIHsKKwkJCQlyZG1zciAoTVNSX0lBMzJfTUMwX0FERFIraSo0LCBhbG93LCBhaGlnaCk7CisJCQkJcHJpbnRrICgiIGF0ICUwOHglMDh4IiwgYWhpZ2gsIGFsb3cpOworCQkJfQorCQkJcHJpbnRrICgiXG4iKTsKKwkJCS8qIENsZWFyIGl0ICovCisJCQl3cm1zciAoTVNSX0lBMzJfTUMwX1NUQVRVUytpKjQsIDBVTCwgMFVMKTsKKwkJCS8qIFNlcmlhbGl6ZSAqLworCQkJd21iKCk7CisJCQlhZGRfdGFpbnQoVEFJTlRfTUFDSElORV9DSEVDSyk7CisJCX0KKwl9CisKKwlpZiAocmVjb3ZlciYyKQorCQlwYW5pYyAoIkNQVSBjb250ZXh0IGNvcnJ1cHQiKTsKKwlpZiAocmVjb3ZlciYxKQorCQlwYW5pYyAoIlVuYWJsZSB0byBjb250aW51ZSIpOworCXByaW50ayAoS0VSTl9FTUVSRyAiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOworCW1jZ3N0bCAmPSB+KDE8PDIpOworCXdybXNyIChNU1JfSUEzMl9NQ0dfU1RBVFVTLG1jZ3N0bCwgbWNnc3RoKTsKK30KKworCisvKiBBTUQgSzcgbWFjaGluZSBjaGVjayBpcyBJbnRlbCBsaWtlICovCit2b2lkIF9faW5pdCBhbWRfbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiBsLCBoOworCWludCBpOworCisJbWFjaGluZV9jaGVja192ZWN0b3IgPSBrN19tYWNoaW5lX2NoZWNrOworCXdtYigpOworCisJcHJpbnRrIChLRVJOX0lORk8gIkludGVsIG1hY2hpbmUgY2hlY2sgYXJjaGl0ZWN0dXJlIHN1cHBvcnRlZC5cbiIpOworCXJkbXNyIChNU1JfSUEzMl9NQ0dfQ0FQLCBsLCBoKTsKKwlpZiAobCAmICgxPDw4KSkJLyogQ29udHJvbCByZWdpc3RlciBwcmVzZW50ID8gKi8KKwkJd3Jtc3IgKE1TUl9JQTMyX01DR19DVEwsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYpOworCW5yX21jZV9iYW5rcyA9IGwgJiAweGZmOworCisJLyogQ2xlYXIgc3RhdHVzIGZvciBNQyBpbmRleCAwIHNlcGFyYXRlbHksIHdlIGRvbid0IHRvdWNoIENUTCwKKwkgKiBhcyBzb21lIEF0aGxvbnMgY2F1c2Ugc3B1cmlvdXMgTUNFcyB3aGVuIGl0cyBlbmFibGVkLiAqLworCXdybXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTLCAweDAsIDB4MCk7CisJZm9yIChpPTE7IGk8bnJfbWNlX2JhbmtzOyBpKyspIHsKKwkJd3Jtc3IgKE1TUl9JQTMyX01DMF9DVEwrNCppLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKTsKKwkJd3Jtc3IgKE1TUl9JQTMyX01DMF9TVEFUVVMrNCppLCAweDAsIDB4MCk7CisJfQorCisJc2V0X2luX2NyNCAoWDg2X0NSNF9NQ0UpOworCXByaW50ayAoS0VSTl9JTkZPICJJbnRlbCBtYWNoaW5lIGNoZWNrIHJlcG9ydGluZyBlbmFibGVkIG9uIENQVSMlZC5cbiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2ZDFhZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogbWNlLmMgLSB4ODYgTWFjaGluZSBDaGVjayBFeGNlcHRpb24gUmVwb3J0aW5nCisgKiAoYykgMjAwMiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiwgRGF2ZSBKb25lcyA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+IAorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIm1jZS5oIgorCitpbnQgbWNlX2Rpc2FibGVkIF9faW5pdGRhdGEgPSAwOworaW50IG5yX21jZV9iYW5rczsKKworRVhQT1JUX1NZTUJPTF9HUEwobnJfbWNlX2JhbmtzKTsJLyogbm9uLWZhdGFsLm8gKi8KKworLyogSGFuZGxlIHVuY29uZmlndXJlZCBpbnQxOCAoc2hvdWxkIG5ldmVyIGhhcHBlbikgKi8KK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIHVuZXhwZWN0ZWRfbWFjaGluZV9jaGVjayhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sJCisJcHJpbnRrKEtFUk5fRVJSICJDUFUjJWQ6IFVuZXhwZWN0ZWQgaW50MTggKE1hY2hpbmUgQ2hlY2spLlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKworLyogQ2FsbCB0aGUgaW5zdGFsbGVkIG1hY2hpbmUgY2hlY2sgaGFuZGxlciBmb3IgdGhpcyBDUFUgc2V0dXAuICovCit2b2lkIGZhc3RjYWxsICgqbWFjaGluZV9jaGVja192ZWN0b3IpKHN0cnVjdCBwdF9yZWdzICosIGxvbmcgZXJyb3JfY29kZSkgPSB1bmV4cGVjdGVkX21hY2hpbmVfY2hlY2s7CisKKy8qIFRoaXMgaGFzIHRvIGJlIHJ1biBmb3IgZWFjaCBwcm9jZXNzb3IgKi8KK3ZvaWQgX19pbml0IG1jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlpZiAobWNlX2Rpc2FibGVkPT0xKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGMtPng4Nl92ZW5kb3IpIHsKKwkJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJCWlmIChjLT54ODY9PTYgfHwgYy0+eDg2PT0xNSkKKwkJCQlhbWRfbWNoZWNrX2luaXQoYyk7CisJCQlicmVhazsKKworCQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCQlpZiAoYy0+eDg2PT01KQorCQkJCWludGVsX3A1X21jaGVja19pbml0KGMpOworCQkJaWYgKGMtPng4Nj09NikKKwkJCQlpbnRlbF9wNl9tY2hlY2tfaW5pdChjKTsKKwkJCWlmIChjLT54ODY9PTE1KQorCQkJCWludGVsX3A0X21jaGVja19pbml0KGMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBYODZfVkVORE9SX0NFTlRBVVI6CisJCQlpZiAoYy0+eDg2PT01KQorCQkJCXdpbmNoaXBfbWNoZWNrX2luaXQoYyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBtY2hlY2tfZGlzYWJsZShjaGFyICpzdHIpCit7CisJbWNlX2Rpc2FibGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbWNoZWNrX2VuYWJsZShjaGFyICpzdHIpCit7CisJbWNlX2Rpc2FibGVkID0gLTE7CisJcmV0dXJuIDA7Cit9CisKK19fc2V0dXAoIm5vbWNlIiwgbWNoZWNrX2Rpc2FibGUpOworX19zZXR1cCgibWNlIiwgbWNoZWNrX2VuYWJsZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyNDE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuaApAQCAtMCwwICsxLDE0IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCit2b2lkIGFtZF9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwordm9pZCBpbnRlbF9wNF9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwordm9pZCBpbnRlbF9wNV9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwordm9pZCBpbnRlbF9wNl9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwordm9pZCB3aW5jaGlwX21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CisKKy8qIENhbGwgdGhlIGluc3RhbGxlZCBtYWNoaW5lIGNoZWNrIGhhbmRsZXIgZm9yIHRoaXMgQ1BVIHNldHVwLiAqLworZXh0ZXJuIGZhc3RjYWxsIHZvaWQgKCptYWNoaW5lX2NoZWNrX3ZlY3Rvcikoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyBlcnJvcl9jb2RlKTsKKworZXh0ZXJuIGludCBtY2VfZGlzYWJsZWQgX19pbml0ZGF0YTsKK2V4dGVybiBpbnQgbnJfbWNlX2JhbmtzOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbm9uLWZhdGFsLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbm9uLWZhdGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2NGRkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9ub24tZmF0YWwuYwpAQCAtMCwwICsxLDkzIEBACisvKgorICogTm9uIEZhdGFsIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIFJlcG9ydGluZworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMiBEYXZlIEpvbmVzLiA8ZGF2ZWpAY29kZW1vbmtleS5vcmcudWs+CisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIGNoZWNrIGZvciBub24tZmF0YWwgTUNFcyBldmVyeSAxNXMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKworI2luY2x1ZGUgIm1jZS5oIgorCitzdGF0aWMgaW50IGZpcnN0YmFuazsKKworI2RlZmluZSBNQ0VfUkFURQkxNSpIWgkvKiB0aW1lciByYXRlIGlzIDE1cyAqLworCitzdGF0aWMgdm9pZCBtY2VfY2hlY2tyZWdzICh2b2lkICppbmZvKQoreworCXUzMiBsb3csIGhpZ2g7CisJaW50IGk7CisKKwlmb3IgKGk9Zmlyc3RiYW5rOyBpPG5yX21jZV9iYW5rczsgaSsrKSB7CisJCXJkbXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTK2kqNCwgbG93LCBoaWdoKTsKKworCQlpZiAoaGlnaCAmICgxPDwzMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIk1DRTogVGhlIGhhcmR3YXJlIHJlcG9ydHMgYSBub24gIgorCQkJCSJmYXRhbCwgY29ycmVjdGFibGUgaW5jaWRlbnQgb2NjdXJyZWQgb24gIgorCQkJCSJDUFUgJWQuXG4iLAorCQkJCXNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiQmFuayAlZDogJTA4eCUwOHhcbiIsIGksIGhpZ2gsIGxvdyk7CisKKwkJCS8qIFNjcnViIHRoZSBlcnJvciBzbyB3ZSBkb24ndCBwaWNrIGl0IHVwIGluIE1DRV9SQVRFIHNlY29uZHMgdGltZS4gKi8KKwkJCXdybXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTK2kqNCwgMFVMLCAwVUwpOworCisJCQkvKiBTZXJpYWxpemUgKi8KKwkJCXdtYigpOworCQkJYWRkX3RhaW50KFRBSU5UX01BQ0hJTkVfQ0hFQ0spOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBtY2Vfd29ya19mbih2b2lkICpkYXRhKTsKK3N0YXRpYyBERUNMQVJFX1dPUksobWNlX3dvcmssIG1jZV93b3JrX2ZuLCBOVUxMKTsKKworc3RhdGljIHZvaWQgbWNlX3dvcmtfZm4odm9pZCAqZGF0YSkKK3sgCisJb25fZWFjaF9jcHUobWNlX2NoZWNrcmVncywgTlVMTCwgMSwgMSk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZtY2Vfd29yaywgTUNFX1JBVEUpOworfSAKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ub25mYXRhbF9tY2VfY2hlY2tlcih2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOworCisJLyogQ2hlY2sgZm9yIE1DRSBzdXBwb3J0ICovCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01DRSkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ2hlY2sgZm9yIFBQcm8gc3R5bGUgTUNBICovCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01DQSkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogU29tZSBBdGhsb25zIG1pc2JlaGF2ZSB3aGVuIHdlIGZyb2IgYmFuayAwICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCAmJgorCQlib290X2NwdV9kYXRhLng4NiA9PSA2KQorCQkJZmlyc3RiYW5rID0gMTsKKwllbHNlCisJCQlmaXJzdGJhbmsgPSAwOworCisJLyoKKwkgKiBDaGVjayBmb3Igbm9uLWZhdGFsIGVycm9ycyBldmVyeSBNQ0VfUkFURSBzCisJICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZtY2Vfd29yaywgTUNFX1JBVEUpOworCXByaW50ayhLRVJOX0lORk8gIk1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIHBvbGxpbmcgdGltZXIgc3RhcnRlZC5cbiIpOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoaW5pdF9ub25mYXRhbF9tY2VfY2hlY2tlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3A0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxNmNlYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNC5jCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogUDQgc3BlY2lmaWMgTWFjaGluZSBDaGVjayBFeGNlcHRpb24gUmVwb3J0aW5nCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9hcGljLmg+CisKKyNpbmNsdWRlICJtY2UuaCIKKworLyogYXMgc3VwcG9ydGVkIGJ5IHRoZSBQNC9YZW9uIGZhbWlseSAqLworc3RydWN0IGludGVsX21jZV9leHRlbmRlZF9tc3JzIHsKKwl1MzIgZWF4OworCXUzMiBlYng7CisJdTMyIGVjeDsKKwl1MzIgZWR4OworCXUzMiBlc2k7CisJdTMyIGVkaTsKKwl1MzIgZWJwOworCXUzMiBlc3A7CisJdTMyIGVmbGFnczsKKwl1MzIgZWlwOworCS8qIHUzMiAqcmVzZXJ2ZWRbXTsgKi8KK307CisKK3N0YXRpYyBpbnQgbWNlX251bV9leHRlbmRlZF9tc3JzID0gMDsKKworCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCitzdGF0aWMgdm9pZCB1bmV4cGVjdGVkX3RoZXJtYWxfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQorewkKKwlwcmludGsoS0VSTl9FUlIgIkNQVSVkOiBVbmV4cGVjdGVkIExWVCBUTVIgaW50ZXJydXB0IVxuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSk7CisJYWRkX3RhaW50KFRBSU5UX01BQ0hJTkVfQ0hFQ0spOworfQorCisvKiBQNC9YZW9uIFRoZXJtYWwgdHJhbnNpdGlvbiBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIHZvaWQgaW50ZWxfdGhlcm1hbF9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyIGwsIGg7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0W05SX0NQVVNdOworCisJYWNrX0FQSUNfaXJxKCk7CisKKwlpZiAodGltZV9hZnRlcihuZXh0W2NwdV0sIGppZmZpZXMpKQorCQlyZXR1cm47CisKKwluZXh0W2NwdV0gPSBqaWZmaWVzICsgSFoqNTsKKwlyZG1zcihNU1JfSUEzMl9USEVSTV9TVEFUVVMsIGwsIGgpOworCWlmIChsICYgMHgxKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJDUFUlZDogVGVtcGVyYXR1cmUgYWJvdmUgdGhyZXNob2xkXG4iLCBjcHUpOworCQlwcmludGsoS0VSTl9FTUVSRyAiQ1BVJWQ6IFJ1bm5pbmcgaW4gbW9kdWxhdGVkIGNsb2NrIG1vZGVcbiIsCisJCQkJY3B1KTsKKwkJYWRkX3RhaW50KFRBSU5UX01BQ0hJTkVfQ0hFQ0spOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIkNQVSVkOiBUZW1wZXJhdHVyZS9zcGVlZCBub3JtYWxcbiIsIGNwdSk7CisJfQorfQorCisvKiBUaGVybWFsIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGlzIENQVSBzZXR1cCAqLworc3RhdGljIHZvaWQgKCp2ZW5kb3JfdGhlcm1hbF9pbnRlcnJ1cHQpKHN0cnVjdCBwdF9yZWdzICpyZWdzKSA9IHVuZXhwZWN0ZWRfdGhlcm1hbF9pbnRlcnJ1cHQ7CisKK2Zhc3RjYWxsIHZvaWQgc21wX3RoZXJtYWxfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlycV9lbnRlcigpOworCXZlbmRvcl90aGVybWFsX2ludGVycnVwdChyZWdzKTsKKwlpcnFfZXhpdCgpOworfQorCisvKiBQNC9YZW9uIFRoZXJtYWwgcmVndWxhdGlvbiBkZXRlY3QgYW5kIGluaXQgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBpbnRlbF9pbml0X3RoZXJtYWwoc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCXUzMiBsLCBoOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKiBUaGVybWFsIG1vbml0b3JpbmcgKi8KKwlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQUNQSSkpCisJCXJldHVybjsJLyogLUVOT0RFViAqLworCisJLyogQ2xvY2sgbW9kdWxhdGlvbiAqLworCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9BQ0MpKQorCQlyZXR1cm47CS8qIC1FTk9ERVYgKi8KKworCS8qIGZpcnN0IGNoZWNrIGlmIGl0cyBlbmFibGVkIGFscmVhZHksIGluIHdoaWNoIGNhc2UgdGhlcmUgbWlnaHQKKwkgKiBiZSBzb21lIFNNTSBnb28gd2hpY2ggaGFuZGxlcyBpdCwgc28gd2UgY2FuJ3QgZXZlbiBwdXQgYSBoYW5kbGVyCisJICogc2luY2UgaXQgbWlnaHQgYmUgZGVsaXZlcmVkIHZpYSBTTUkgYWxyZWFkeSAtendhbmVtLgorCSAqLworCXJkbXNyIChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbCwgaCk7CisJaCA9IGFwaWNfcmVhZChBUElDX0xWVFRITVIpOworCWlmICgobCAmICgxPDwzKSkgJiYgKGggJiBBUElDX0RNX1NNSSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNQVSVkOiBUaGVybWFsIG1vbml0b3JpbmcgaGFuZGxlZCBieSBTTUlcbiIsCisJCQkJY3B1KTsKKwkJcmV0dXJuOyAvKiAtRUJVU1kgKi8KKwl9CisKKwkvKiBjaGVjayB3aGV0aGVyIGEgdmVjdG9yIGFscmVhZHkgZXhpc3RzLCB0ZW1wb3JhcmlseSBtYXNrZWQ/ICovCQorCWlmIChoICYgQVBJQ19WRUNUT1JfTUFTSykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ1BVJWQ6IFRoZXJtYWwgTFZUIHZlY3RvciAoJSN4KSBhbHJlYWR5ICIKKwkJCQkiaW5zdGFsbGVkXG4iLAorCQkJY3B1LCAoaCAmIEFQSUNfVkVDVE9SX01BU0spKTsKKwkJcmV0dXJuOyAvKiAtRUJVU1kgKi8KKwl9CisKKwkvKiBUaGUgdGVtcGVyYXR1cmUgdHJhbnNpdGlvbiBpbnRlcnJ1cHQgaGFuZGxlciBzZXR1cCAqLworCWggPSBUSEVSTUFMX0FQSUNfVkVDVE9SOwkJLyogb3VyIGRlbGl2ZXJ5IHZlY3RvciAqLworCWggfD0gKEFQSUNfRE1fRklYRUQgfCBBUElDX0xWVF9NQVNLRUQpOwkvKiB3ZSdsbCBtYXNrIHRpbGwgd2UncmUgcmVhZHkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFRITVIsIGgpOworCisJcmRtc3IgKE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVCwgbCwgaCk7CisJd3Jtc3IgKE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVCwgbCB8IDB4MDMgLCBoKTsKKworCS8qIG9rIHdlJ3JlIGdvb2QgdG8gZ28uLi4gKi8KKwl2ZW5kb3JfdGhlcm1hbF9pbnRlcnJ1cHQgPSBpbnRlbF90aGVybWFsX2ludGVycnVwdDsKKwkKKwlyZG1zciAoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGwsIGgpOworCXdybXNyIChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbCB8ICgxPDwzKSwgaCk7CisJCisJbCA9IGFwaWNfcmVhZCAoQVBJQ19MVlRUSE1SKTsKKwlhcGljX3dyaXRlX2Fyb3VuZCAoQVBJQ19MVlRUSE1SLCBsICYgfkFQSUNfTFZUX01BU0tFRCk7CisJcHJpbnRrIChLRVJOX0lORk8gIkNQVSVkOiBUaGVybWFsIG1vbml0b3JpbmcgZW5hYmxlZFxuIiwgY3B1KTsKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMICovCisKKworLyogUDQvWGVvbiBFeHRlbmRlZCBNQ0UgTVNSIHJldHJpZXZhbCwgcmV0dXJuIDAgaWYgdW5zdXBwb3J0ZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGludGVsX2dldF9leHRlbmRlZF9tc3JzKHN0cnVjdCBpbnRlbF9tY2VfZXh0ZW5kZWRfbXNycyAqcikKK3sKKwl1MzIgaDsKKworCWlmIChtY2VfbnVtX2V4dGVuZGVkX21zcnMgPT0gMCkKKwkJZ290byBkb25lOworCisJcmRtc3IgKE1TUl9JQTMyX01DR19FQVgsIHItPmVheCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FQlgsIHItPmVieCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FQ1gsIHItPmVjeCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FRFgsIHItPmVkeCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FU0ksIHItPmVzaSwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FREksIHItPmVkaSwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FQlAsIHItPmVicCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FU1AsIHItPmVzcCwgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FRkxBR1MsIHItPmVmbGFncywgaCk7CisJcmRtc3IgKE1TUl9JQTMyX01DR19FSVAsIHItPmVpcCwgaCk7CisKKwkvKiBjYW4gd2UgcmVseSBvbiBrbWFsbG9jIHRvIGRvIGEgZHluYW1pYworCSAqIGFsbG9jYXRpb24gZm9yIHRoZSByZXNlcnZlZCByZWdpc3RlcnM/CisJICovCitkb25lOgorCXJldHVybiBtY2VfbnVtX2V4dGVuZGVkX21zcnM7Cit9CisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIGludGVsX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJaW50IHJlY292ZXI9MTsKKwl1MzIgYWxvdywgYWhpZ2gsIGhpZ2gsIGxvdzsKKwl1MzIgbWNnc3RsLCBtY2dzdGg7CisJaW50IGk7CisJc3RydWN0IGludGVsX21jZV9leHRlbmRlZF9tc3JzIGRiZzsKKworCXJkbXNyIChNU1JfSUEzMl9NQ0dfU1RBVFVTLCBtY2dzdGwsIG1jZ3N0aCk7CisJaWYgKG1jZ3N0bCAmICgxPDwwKSkJLyogUmVjb3ZlcmFibGUgPyAqLworCQlyZWNvdmVyPTA7CisKKwlwcmludGsgKEtFUk5fRU1FUkcgIkNQVSAlZDogTWFjaGluZSBDaGVjayBFeGNlcHRpb246ICUwOHglMDh4XG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIG1jZ3N0aCwgbWNnc3RsKTsKKworCWlmIChpbnRlbF9nZXRfZXh0ZW5kZWRfbXNycygmZGJnKSkgeworCQlwcmludGsgKEtFUk5fREVCVUcgIkNQVSAlZDogRUlQOiAlMDh4IEVGTEFHUzogJTA4eFxuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgZGJnLmVpcCwgZGJnLmVmbGFncyk7CisJCXByaW50ayAoS0VSTl9ERUJVRyAiXHRlYXg6ICUwOHggZWJ4OiAlMDh4IGVjeDogJTA4eCBlZHg6ICUwOHhcbiIsCisJCQlkYmcuZWF4LCBkYmcuZWJ4LCBkYmcuZWN4LCBkYmcuZWR4KTsKKwkJcHJpbnRrIChLRVJOX0RFQlVHICJcdGVzaTogJTA4eCBlZGk6ICUwOHggZWJwOiAlMDh4IGVzcDogJTA4eFxuIiwKKwkJCWRiZy5lc2ksIGRiZy5lZGksIGRiZy5lYnAsIGRiZy5lc3ApOworCX0KKworCWZvciAoaT0wOyBpPG5yX21jZV9iYW5rczsgaSsrKSB7CisJCXJkbXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTK2kqNCxsb3csIGhpZ2gpOworCQlpZiAoaGlnaCAmICgxPDwzMSkpIHsKKwkJCWlmIChoaWdoICYgKDE8PDI5KSkKKwkJCQlyZWNvdmVyIHw9IDE7CisJCQlpZiAoaGlnaCAmICgxPDwyNSkpCisJCQkJcmVjb3ZlciB8PSAyOworCQkJcHJpbnRrIChLRVJOX0VNRVJHICJCYW5rICVkOiAlMDh4JTA4eCIsIGksIGhpZ2gsIGxvdyk7CisJCQloaWdoICY9IH4oMTw8MzEpOworCQkJaWYgKGhpZ2ggJiAoMTw8MjcpKSB7CisJCQkJcmRtc3IgKE1TUl9JQTMyX01DMF9NSVNDK2kqNCwgYWxvdywgYWhpZ2gpOworCQkJCXByaW50ayAoIlslMDh4JTA4eF0iLCBhaGlnaCwgYWxvdyk7CisJCQl9CisJCQlpZiAoaGlnaCAmICgxPDwyNikpIHsKKwkJCQlyZG1zciAoTVNSX0lBMzJfTUMwX0FERFIraSo0LCBhbG93LCBhaGlnaCk7CisJCQkJcHJpbnRrICgiIGF0ICUwOHglMDh4IiwgYWhpZ2gsIGFsb3cpOworCQkJfQorCQkJcHJpbnRrICgiXG4iKTsKKwkJfQorCX0KKworCWlmIChyZWNvdmVyICYgMikKKwkJcGFuaWMgKCJDUFUgY29udGV4dCBjb3JydXB0Iik7CisJaWYgKHJlY292ZXIgJiAxKQorCQlwYW5pYyAoIlVuYWJsZSB0byBjb250aW51ZSIpOworCisJcHJpbnRrKEtFUk5fRU1FUkcgIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKKwkvKiAKKwkgKiBEbyBub3QgY2xlYXIgdGhlIE1TUl9JQTMyX01DaV9TVEFUVVMgaWYgdGhlIGVycm9yIGlzIG5vdCAKKwkgKiByZWNvdmVyYWJsZS9jb250aW51YWJsZS5UaGlzIHdpbGwgYWxsb3cgQklPUyB0byBsb29rIGF0IHRoZSBNU1JzCisJICogZm9yIGVycm9ycyBpZiB0aGUgT1MgY291bGQgbm90IGxvZyB0aGUgZXJyb3IuCisJICovCisJZm9yIChpPTA7IGk8bnJfbWNlX2JhbmtzOyBpKyspIHsKKwkJdTMyIG1zcjsKKwkJbXNyID0gTVNSX0lBMzJfTUMwX1NUQVRVUytpKjQ7CisJCXJkbXNyIChtc3IsIGxvdywgaGlnaCk7CisJCWlmIChoaWdoJigxPDwzMSkpIHsKKwkJCS8qIENsZWFyIGl0ICovCisJCQl3cm1zcihtc3IsIDBVTCwgMFVMKTsKKwkJCS8qIFNlcmlhbGl6ZSAqLworCQkJd21iKCk7CisJCQlhZGRfdGFpbnQoVEFJTlRfTUFDSElORV9DSEVDSyk7CisJCX0KKwl9CisJbWNnc3RsICY9IH4oMTw8Mik7CisJd3Jtc3IgKE1TUl9JQTMyX01DR19TVEFUVVMsbWNnc3RsLCBtY2dzdGgpOworfQorCisKK3ZvaWQgX19pbml0IGludGVsX3A0X21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1MzIgbCwgaDsKKwlpbnQgaTsKKwkKKwltYWNoaW5lX2NoZWNrX3ZlY3RvciA9IGludGVsX21hY2hpbmVfY2hlY2s7CisJd21iKCk7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiSW50ZWwgbWFjaGluZSBjaGVjayBhcmNoaXRlY3R1cmUgc3VwcG9ydGVkLlxuIik7CisJcmRtc3IgKE1TUl9JQTMyX01DR19DQVAsIGwsIGgpOworCWlmIChsICYgKDE8PDgpKQkvKiBDb250cm9sIHJlZ2lzdGVyIHByZXNlbnQgPyAqLworCQl3cm1zciAoTVNSX0lBMzJfTUNHX0NUTCwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZik7CisJbnJfbWNlX2JhbmtzID0gbCAmIDB4ZmY7CisKKwlmb3IgKGk9MDsgaTxucl9tY2VfYmFua3M7IGkrKykgeworCQl3cm1zciAoTVNSX0lBMzJfTUMwX0NUTCs0KmksIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYpOworCQl3cm1zciAoTVNSX0lBMzJfTUMwX1NUQVRVUys0KmksIDB4MCwgMHgwKTsKKwl9CisKKwlzZXRfaW5fY3I0IChYODZfQ1I0X01DRSk7CisJcHJpbnRrIChLRVJOX0lORk8gIkludGVsIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIGVuYWJsZWQgb24gQ1BVIyVkLlxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCS8qIENoZWNrIGZvciBQNC9YZW9uIGV4dGVuZGVkIE1DRSBNU1JzICovCisJcmRtc3IgKE1TUl9JQTMyX01DR19DQVAsIGwsIGgpOworCWlmIChsICYgKDE8PDkpKQl7LyogTUNHX0VYVF9QICovCisJCW1jZV9udW1fZXh0ZW5kZWRfbXNycyA9IChsID4+IDE2KSAmIDB4ZmY7CisJCXByaW50ayAoS0VSTl9JTkZPICJDUFUlZDogSW50ZWwgUDQvWGVvbiBFeHRlbmRlZCBNQ0UgTVNScyAoJWQpIgorCQkJCSIgYXZhaWxhYmxlXG4iLAorCQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBtY2VfbnVtX2V4dGVuZGVkX21zcnMpOworCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCisJCS8qIENoZWNrIGZvciBQNC9YZW9uIFRoZXJtYWwgbW9uaXRvciAqLworCQlpbnRlbF9pbml0X3RoZXJtYWwoYyk7CisjZW5kaWYKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWExYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDUuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogUDUgc3BlY2lmaWMgTWFjaGluZSBDaGVjayBFeGNlcHRpb24gUmVwb3J0aW5nCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+IAorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisKKyNpbmNsdWRlICJtY2UuaCIKKworLyogTWFjaGluZSBjaGVjayBoYW5kbGVyIGZvciBQZW50aXVtIGNsYXNzIEludGVsICovCitzdGF0aWMgZmFzdGNhbGwgdm9pZCBwZW50aXVtX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJdTMyIGxvYWRkciwgaGksIGxvdHlwZTsKKwlyZG1zcihNU1JfSUEzMl9QNV9NQ19BRERSLCBsb2FkZHIsIGhpKTsKKwlyZG1zcihNU1JfSUEzMl9QNV9NQ19UWVBFLCBsb3R5cGUsIGhpKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiQ1BVIyVkOiBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbjogIDB4JThYICh0eXBlIDB4JThYKS5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgbG9hZGRyLCBsb3R5cGUpOworCWlmKGxvdHlwZSYoMTw8NSkpCisJCXByaW50ayhLRVJOX0VNRVJHICJDUFUjJWQ6IFBvc3NpYmxlIHRoZXJtYWwgZmFpbHVyZSAoQ1BVIG9uIGZpcmUgPykuXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKK30KKworLyogU2V0IHVwIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIGZvciBwcm9jZXNzb3JzIHdpdGggSW50ZWwgc3R5bGUgTUNFICovCit2b2lkIF9faW5pdCBpbnRlbF9wNV9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdTMyIGwsIGg7CisJCisJLypDaGVjayBmb3IgTUNFIHN1cHBvcnQgKi8KKwlpZiggIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTUNFKSApCisJCXJldHVybjsJCisKKwkvKiBEZWZhdWx0IFA1IHRvIG9mZiBhcyBpdHMgb2Z0ZW4gbWlzY29ubmVjdGVkICovCisJaWYobWNlX2Rpc2FibGVkICE9IC0xKQorCQlyZXR1cm47CisJbWFjaGluZV9jaGVja192ZWN0b3IgPSBwZW50aXVtX21hY2hpbmVfY2hlY2s7CisJd21iKCk7CisKKwkvKiBSZWFkIHJlZ2lzdGVycyBiZWZvcmUgZW5hYmxpbmcgKi8KKwlyZG1zcihNU1JfSUEzMl9QNV9NQ19BRERSLCBsLCBoKTsKKwlyZG1zcihNU1JfSUEzMl9QNV9NQ19UWVBFLCBsLCBoKTsKKwlwcmludGsoS0VSTl9JTkZPICJJbnRlbCBvbGQgc3R5bGUgbWFjaGluZSBjaGVjayBhcmNoaXRlY3R1cmUgc3VwcG9ydGVkLlxuIik7CisKKyAJLyogRW5hYmxlIE1DRSAqLworCXNldF9pbl9jcjQoWDg2X0NSNF9NQ0UpOworCXByaW50ayhLRVJOX0lORk8gIkludGVsIG9sZCBzdHlsZSBtYWNoaW5lIGNoZWNrIHJlcG9ydGluZyBlbmFibGVkIG9uIENQVSMlZC5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NjQwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDYuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIFA2IHNwZWNpZmljIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIFJlcG9ydGluZworICogKEMpIENvcHlyaWdodCAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorCisjaW5jbHVkZSAibWNlLmgiCisKKy8qIE1hY2hpbmUgQ2hlY2sgSGFuZGxlciBGb3IgUElJL1BJSUkgKi8KK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIGludGVsX21hY2hpbmVfY2hlY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJaW50IHJlY292ZXI9MTsKKwl1MzIgYWxvdywgYWhpZ2gsIGhpZ2gsIGxvdzsKKwl1MzIgbWNnc3RsLCBtY2dzdGg7CisJaW50IGk7CisKKwlyZG1zciAoTVNSX0lBMzJfTUNHX1NUQVRVUywgbWNnc3RsLCBtY2dzdGgpOworCWlmIChtY2dzdGwgJiAoMTw8MCkpCS8qIFJlY292ZXJhYmxlID8gKi8KKwkJcmVjb3Zlcj0wOworCisJcHJpbnRrIChLRVJOX0VNRVJHICJDUFUgJWQ6IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uOiAlMDh4JTA4eFxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBtY2dzdGgsIG1jZ3N0bCk7CisKKwlmb3IgKGk9MDsgaTxucl9tY2VfYmFua3M7IGkrKykgeworCQlyZG1zciAoTVNSX0lBMzJfTUMwX1NUQVRVUytpKjQsbG93LCBoaWdoKTsKKwkJaWYgKGhpZ2ggJiAoMTw8MzEpKSB7CisJCQlpZiAoaGlnaCAmICgxPDwyOSkpCisJCQkJcmVjb3ZlciB8PSAxOworCQkJaWYgKGhpZ2ggJiAoMTw8MjUpKQorCQkJCXJlY292ZXIgfD0gMjsKKwkJCXByaW50ayAoS0VSTl9FTUVSRyAiQmFuayAlZDogJTA4eCUwOHgiLCBpLCBoaWdoLCBsb3cpOworCQkJaGlnaCAmPSB+KDE8PDMxKTsKKwkJCWlmIChoaWdoICYgKDE8PDI3KSkgeworCQkJCXJkbXNyIChNU1JfSUEzMl9NQzBfTUlTQytpKjQsIGFsb3csIGFoaWdoKTsKKwkJCQlwcmludGsgKCJbJTA4eCUwOHhdIiwgYWhpZ2gsIGFsb3cpOworCQkJfQorCQkJaWYgKGhpZ2ggJiAoMTw8MjYpKSB7CisJCQkJcmRtc3IgKE1TUl9JQTMyX01DMF9BRERSK2kqNCwgYWxvdywgYWhpZ2gpOworCQkJCXByaW50ayAoIiBhdCAlMDh4JTA4eCIsIGFoaWdoLCBhbG93KTsKKwkJCX0KKwkJCXByaW50ayAoIlxuIik7CisJCX0KKwl9CisKKwlpZiAocmVjb3ZlciAmIDIpCisJCXBhbmljICgiQ1BVIGNvbnRleHQgY29ycnVwdCIpOworCWlmIChyZWNvdmVyICYgMSkKKwkJcGFuaWMgKCJVbmFibGUgdG8gY29udGludWUiKTsKKworCXByaW50ayAoS0VSTl9FTUVSRyAiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOworCS8qIAorCSAqIERvIG5vdCBjbGVhciB0aGUgTVNSX0lBMzJfTUNpX1NUQVRVUyBpZiB0aGUgZXJyb3IgaXMgbm90IAorCSAqIHJlY292ZXJhYmxlL2NvbnRpbnVhYmxlLlRoaXMgd2lsbCBhbGxvdyBCSU9TIHRvIGxvb2sgYXQgdGhlIE1TUnMKKwkgKiBmb3IgZXJyb3JzIGlmIHRoZSBPUyBjb3VsZCBub3QgbG9nIHRoZSBlcnJvci4KKwkgKi8KKwlmb3IgKGk9MDsgaTxucl9tY2VfYmFua3M7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgbXNyOworCQltc3IgPSBNU1JfSUEzMl9NQzBfU1RBVFVTK2kqNDsKKwkJcmRtc3IgKG1zcixsb3csIGhpZ2gpOworCQlpZiAoaGlnaCAmICgxPDwzMSkpIHsKKwkJCS8qIENsZWFyIGl0ICovCisJCQl3cm1zciAobXNyLCAwVUwsIDBVTCk7CisJCQkvKiBTZXJpYWxpemUgKi8KKwkJCXdtYigpOworCQkJYWRkX3RhaW50KFRBSU5UX01BQ0hJTkVfQ0hFQ0spOworCQl9CisJfQorCW1jZ3N0bCAmPSB+KDE8PDIpOworCXdybXNyIChNU1JfSUEzMl9NQ0dfU1RBVFVTLG1jZ3N0bCwgbWNnc3RoKTsKK30KKworLyogU2V0IHVwIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIGZvciBwcm9jZXNzb3JzIHdpdGggSW50ZWwgc3R5bGUgTUNFICovCit2b2lkIF9faW5pdCBpbnRlbF9wNl9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdTMyIGwsIGg7CisJaW50IGk7CisJCisJLyogQ2hlY2sgZm9yIE1DRSBzdXBwb3J0ICovCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01DRSkpCisJCXJldHVybjsKKworCS8qIENoZWNrIGZvciBQUHJvIHN0eWxlIE1DQSAqLworIAlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTUNBKSkKKwkJcmV0dXJuOworCisJLyogT2sgbWFjaGluZSBjaGVjayBpcyBhdmFpbGFibGUgKi8KKwltYWNoaW5lX2NoZWNrX3ZlY3RvciA9IGludGVsX21hY2hpbmVfY2hlY2s7CisJd21iKCk7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiSW50ZWwgbWFjaGluZSBjaGVjayBhcmNoaXRlY3R1cmUgc3VwcG9ydGVkLlxuIik7CisJcmRtc3IgKE1TUl9JQTMyX01DR19DQVAsIGwsIGgpOworCWlmIChsICYgKDE8PDgpKQkvKiBDb250cm9sIHJlZ2lzdGVyIHByZXNlbnQgPyAqLworCQl3cm1zcihNU1JfSUEzMl9NQ0dfQ1RMLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKTsKKwlucl9tY2VfYmFua3MgPSBsICYgMHhmZjsKKworCS8qIERvbid0IGVuYWJsZSBiYW5rIDAgb24gaW50ZWwgUDYgY29yZXMsIGl0IGdvZXMgYmFuZyBxdWlja2x5LiAqLworCWZvciAoaT0xOyBpPG5yX21jZV9iYW5rczsgaSsrKSB7CisJCXdybXNyIChNU1JfSUEzMl9NQzBfQ1RMKzQqaSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZik7CisJCXdybXNyIChNU1JfSUEzMl9NQzBfU1RBVFVTKzQqaSwgMHgwLCAweDApOworCX0KKworCXNldF9pbl9jcjQgKFg4Nl9DUjRfTUNFKTsKKwlwcmludGsgKEtFUk5fSU5GTyAiSW50ZWwgbWFjaGluZSBjaGVjayByZXBvcnRpbmcgZW5hYmxlZCBvbiBDUFUjJWQuXG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3dpbmNoaXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay93aW5jaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzZmE3YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay93aW5jaGlwLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIElEVCBXaW5jaGlwIHNwZWNpZmljIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIFJlcG9ydGluZworICogKEMpIENvcHlyaWdodCAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorCisjaW5jbHVkZSAibWNlLmgiCisKKy8qIE1hY2hpbmUgY2hlY2sgaGFuZGxlciBmb3IgV2luQ2hpcCBDNiAqLworc3RhdGljIGZhc3RjYWxsIHZvaWQgd2luY2hpcF9tYWNoaW5lX2NoZWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCXByaW50ayhLRVJOX0VNRVJHICJDUFUwOiBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbi5cbiIpOworCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKK30KKworLyogU2V0IHVwIG1hY2hpbmUgY2hlY2sgcmVwb3J0aW5nIG9uIHRoZSBXaW5jaGlwIEM2IHNlcmllcyAqLwordm9pZCBfX2luaXQgd2luY2hpcF9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJdTMyIGxvLCBoaTsKKwltYWNoaW5lX2NoZWNrX3ZlY3RvciA9IHdpbmNoaXBfbWFjaGluZV9jaGVjazsKKwl3bWIoKTsKKwlyZG1zcihNU1JfSURUX0ZDUjEsIGxvLCBoaSk7CisJbG98PSAoMTw8Mik7CS8qIEVuYWJsZSBFSUVSUklOVCAoaW50IDE4IE1DRSkgKi8KKwlsbyY9IH4oMTw8NCk7CS8qIEVuYWJsZSBNQ0UgKi8KKwl3cm1zcihNU1JfSURUX0ZDUjEsIGxvLCBoaSk7CisJc2V0X2luX2NyNChYODZfQ1I0X01DRSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiV2luY2hpcCBtYWNoaW5lIGNoZWNrIHJlcG9ydGluZyBlbmFibGVkIG9uIENQVSMwLlxuIik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjViNzAxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai15CQk6PSBtYWluLm8gaWYubyBnZW5lcmljLm8gc3RhdGUubworb2JqLXkJCSs9IGFtZC5vCitvYmoteQkJKz0gY3lyaXgubworb2JqLXkJCSs9IGNlbnRhdXIubworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2FtZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9hbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTFlMDRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9hbWQuYwpAQCAtMCwwICsxLDEyMSBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorCisjaW5jbHVkZSAibXRyci5oIgorCitzdGF0aWMgdm9pZAorYW1kX2dldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgKmJhc2UsCisJICAgICB1bnNpZ25lZCBpbnQgKnNpemUsIG10cnJfdHlwZSAqIHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBsb3csIGhpZ2g7CisKKwlyZG1zcihNU1JfSzZfVVdDQ1IsIGxvdywgaGlnaCk7CisJLyogIFVwcGVyIGR3b3JkIGlzIHJlZ2lvbiAxLCBsb3dlciBpcyByZWdpb24gMCAgKi8KKwlpZiAocmVnID09IDEpCisJCWxvdyA9IGhpZ2g7CisJLyogIFRoZSBiYXNlIG1hc2tzIG9mZiBvbiB0aGUgcmlnaHQgYWxpZ25tZW50ICAqLworCSpiYXNlID0gKGxvdyAmIDB4RkZGRTAwMDApID4+IFBBR0VfU0hJRlQ7CisJKnR5cGUgPSAwOworCWlmIChsb3cgJiAxKQorCQkqdHlwZSA9IE1UUlJfVFlQRV9VTkNBQ0hBQkxFOworCWlmIChsb3cgJiAyKQorCQkqdHlwZSA9IE1UUlJfVFlQRV9XUkNPTUI7CisJaWYgKCEobG93ICYgMykpIHsKKwkJKnNpemUgPSAwOworCQlyZXR1cm47CisJfQorCS8qCisJICogIFRoaXMgbmVlZHMgYSBsaXR0bGUgZXhwbGFpbmluZy4gVGhlIHNpemUgaXMgc3RvcmVkIGFzIGFuCisJICogIGludmVydGVkIG1hc2sgb2YgYml0cyBvZiAxMjhLIGdyYW51bGFyaXR5IDE1IGJpdHMgbG9uZyBvZmZzZXQKKwkgKiAgMiBiaXRzCisJICoKKwkgKiAgU28gdG8gZ2V0IGEgc2l6ZSB3ZSBkbyBpbnZlcnQgdGhlIG1hc2sgYW5kIGFkZCAxIHRvIHRoZSBsb3dlc3QKKwkgKiAgbWFzayBiaXQgKDQgYXMgaXRzIDIgYml0cyBpbikuIFRoaXMgZ2l2ZXMgdXMgYSBzaXplIHdlIHRoZW4gc2hpZnQKKwkgKiAgdG8gdHVybiBpbnRvIDEyOEsgYmxvY2tzCisJICoKKwkgKiAgZWcgICAgICAgICAgICAgIDExMSAxMTExIDExMTEgMTEwMCAgICAgIGlzIDUxMksKKwkgKgorCSAqICBpbnZlcnQgICAgICAgICAgMDAwIDAwMDAgMDAwMCAwMDExCisJICogICsxICAgICAgICAgICAgICAwMDAgMDAwMCAwMDAwIDAxMDAKKwkgKiAgKjEyOEsgICAuLi4KKwkgKi8KKwlsb3cgPSAofmxvdykgJiAweDFGRkZDOworCSpzaXplID0gKGxvdyArIDQpIDw8ICgxNSAtIFBBR0VfU0hJRlQpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgYW1kX3NldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCSB1bnNpZ25lZCBsb25nIHNpemUsIG10cnJfdHlwZSB0eXBlKQorLyogIFtTVU1NQVJZXSBTZXQgdmFyaWFibGUgTVRSUiByZWdpc3RlciBvbiB0aGUgbG9jYWwgQ1BVLgorICAgIDxyZWc+IFRoZSByZWdpc3RlciB0byBzZXQuCisgICAgPGJhc2U+IFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbi4KKyAgICA8c2l6ZT4gVGhlIHNpemUgb2YgdGhlIHJlZ2lvbi4gSWYgdGhpcyBpcyAwIHRoZSByZWdpb24gaXMgZGlzYWJsZWQuCisgICAgPHR5cGU+IFRoZSB0eXBlIG9mIHRoZSByZWdpb24uCisgICAgPGRvX3NhZmU+IElmIFRSVUUsIGRvIHRoZSBjaGFuZ2Ugc2FmZWx5LiBJZiBGQUxTRSwgc2FmZXR5IG1lYXN1cmVzIHNob3VsZAorICAgIGJlIGRvbmUgZXh0ZXJuYWxseS4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJdTMyIHJlZ3NbMl07CisKKwkvKgorCSAqICBMb3cgaXMgTVRSUjAgLCBIaWdoIE1UUlIgMQorCSAqLworCXJkbXNyKE1TUl9LNl9VV0NDUiwgcmVnc1swXSwgcmVnc1sxXSk7CisJLyoKKwkgKiAgQmxhbmsgdG8gZGlzYWJsZQorCSAqLworCWlmIChzaXplID09IDApCisJCXJlZ3NbcmVnXSA9IDA7CisJZWxzZQorCQkvKiBTZXQgdGhlIHJlZ2lzdGVyIHRvIHRoZSBiYXNlLCB0aGUgdHlwZSAob2ZmIGJ5IG9uZSkgYW5kIGFuCisJCSAgIGludmVydGVkIGJpdG1hc2sgb2YgdGhlIHNpemUgVGhlIHNpemUgaXMgdGhlIG9ubHkgb2RkCisJCSAgIGJpdC4gV2UgYXJlIGZlZCBzYXkgNTEySyBXZSBpbnZlcnQgdGhpcyBhbmQgd2UgZ2V0IDExMSAxMTExCisJCSAgIDExMTEgMTAxMSBidXQgaWYgeW91IHN1YnRyYWN0IG9uZSBhbmQgaW52ZXJ0IHlvdSBnZXQgdGhlICAgCisJCSAgIGRlc2lyZWQgMTExIDExMTEgMTExMSAxMTAwIG1hc2sKKworCQkgICBCdXQgfih4IC0gMSkgPT0gfnggKyAxID09IC14LiBUd28ncyBjb21wbGVtZW50IHJvY2tzISAgKi8KKwkJcmVnc1tyZWddID0gKC1zaXplID4+ICgxNSAtIFBBR0VfU0hJRlQpICYgMHgwMDAxRkZGQykKKwkJICAgIHwgKGJhc2UgPDwgUEFHRV9TSElGVCkgfCAodHlwZSArIDEpOworCisJLyoKKwkgKiAgVGhlIHdyaXRlYmFjayBydWxlIGlzIHF1aXRlIHNwZWNpZmljLiBTZWUgdGhlIG1hbnVhbC4gSXRzCisJICogIGRpc2FibGUgbG9jYWwgaW50ZXJydXB0cywgd3JpdGUgYmFjayB0aGUgY2FjaGUsIHNldCB0aGUgbXRycgorCSAqLworCXdiaW52ZCgpOworCXdybXNyKE1TUl9LNl9VV0NDUiwgcmVnc1swXSwgcmVnc1sxXSk7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3ZhbGlkYXRlX2FkZF9wYWdlKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwkvKiBBcHBseSB0aGUgSzYgYmxvY2sgYWxpZ25tZW50IGFuZCBzaXplIHJ1bGVzCisJICAgSW4gb3JkZXIKKwkgICBvIFVuY2FjaGVkIG9yIGdhdGhlcmluZyBvbmx5CisJICAgbyAxMjhLIG9yIGJpZ2dlciBibG9jaworCSAgIG8gUG93ZXIgb2YgMiBibG9jaworCSAgIG8gYmFzZSBzdWl0YWJseSBhbGlnbmVkIHRvIHRoZSBwb3dlcgorCSovCisJaWYgKHR5cGUgPiBNVFJSX1RZUEVfV1JDT01CIHx8IHNpemUgPCAoMSA8PCAoMTcgLSBQQUdFX1NISUZUKSkKKwkgICAgfHwgKHNpemUgJiB+KHNpemUgLSAxKSkgLSBzaXplIHx8IChiYXNlICYgKHNpemUgLSAxKSkpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG10cnJfb3BzIGFtZF9tdHJyX29wcyA9IHsKKwkudmVuZG9yICAgICAgICAgICAgPSBYODZfVkVORE9SX0FNRCwKKwkuc2V0ICAgICAgICAgICAgICAgPSBhbWRfc2V0X210cnIsCisJLmdldCAgICAgICAgICAgICAgID0gYW1kX2dldF9tdHJyLAorCS5nZXRfZnJlZV9yZWdpb24gICA9IGdlbmVyaWNfZ2V0X2ZyZWVfcmVnaW9uLAorCS52YWxpZGF0ZV9hZGRfcGFnZSA9IGFtZF92YWxpZGF0ZV9hZGRfcGFnZSwKKwkuaGF2ZV93cmNvbWIgICAgICAgPSBwb3NpdGl2ZV9oYXZlX3dyY29tYiwKK307CisKK2ludCBfX2luaXQgYW1kX2luaXRfbXRycih2b2lkKQoreworCXNldF9tdHJyX29wcygmYW1kX210cnJfb3BzKTsKKwlyZXR1cm4gMDsKK30KKworLy9hcmNoX2luaXRjYWxsKGFtZF9tdHJyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jZW50YXVyLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2NlbnRhdXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2YwMGFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jZW50YXVyLmMKQEAgLTAsMCArMSwyMjMgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlICJtdHJyLmgiCisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaGlnaDsKKwl1bnNpZ25lZCBsb25nIGxvdzsKK30gY2VudGF1cl9tY3JbOF07CisKK3N0YXRpYyB1OCBjZW50YXVyX21jcl9yZXNlcnZlZDsKK3N0YXRpYyB1OCBjZW50YXVyX21jcl90eXBlOwkvKiAwIGZvciB3aW5jaGlwLCAxIGZvciB3aW5jaGlwMiAqLworCisvKgorICoJUmVwb3J0IGJvb3QgdGltZSBNQ1Igc2V0dXBzIAorICovCisKK3N0YXRpYyBpbnQKK2NlbnRhdXJfZ2V0X2ZyZWVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKQorLyogIFtTVU1NQVJZXSBHZXQgYSBmcmVlIE1UUlIuCisgICAgPGJhc2U+IFRoZSBzdGFydGluZyAoYmFzZSkgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgorICAgIDxzaXplPiBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSByZWdpb24uCisgICAgW1JFVFVSTlNdIFRoZSBpbmRleCBvZiB0aGUgcmVnaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgLTEgb24gZXJyb3IuCisqLworeworCWludCBpLCBtYXg7CisJbXRycl90eXBlIGx0eXBlOworCXVuc2lnbmVkIGxvbmcgbGJhc2U7CisJdW5zaWduZWQgaW50IGxzaXplOworCisJbWF4ID0gbnVtX3Zhcl9yYW5nZXM7CisJZm9yIChpID0gMDsgaSA8IG1heDsgKytpKSB7CisJCWlmIChjZW50YXVyX21jcl9yZXNlcnZlZCAmICgxIDw8IGkpKQorCQkJY29udGludWU7CisJCW10cnJfaWYtPmdldChpLCAmbGJhc2UsICZsc2l6ZSwgJmx0eXBlKTsKKwkJaWYgKGxzaXplID09IDApCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3ZvaWQKK210cnJfY2VudGF1cl9yZXBvcnRfbWNyKGludCBtY3IsIHUzMiBsbywgdTMyIGhpKQoreworCWNlbnRhdXJfbWNyW21jcl0ubG93ID0gbG87CisJY2VudGF1cl9tY3JbbWNyXS5oaWdoID0gaGk7Cit9CisKK3N0YXRpYyB2b2lkCitjZW50YXVyX2dldF9tY3IodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyAqYmFzZSwKKwkJdW5zaWduZWQgaW50ICpzaXplLCBtdHJyX3R5cGUgKiB0eXBlKQoreworCSpiYXNlID0gY2VudGF1cl9tY3JbcmVnXS5oaWdoID4+IFBBR0VfU0hJRlQ7CisJKnNpemUgPSAtKGNlbnRhdXJfbWNyW3JlZ10ubG93ICYgMHhmZmZmZjAwMCkgPj4gUEFHRV9TSElGVDsKKwkqdHlwZSA9IE1UUlJfVFlQRV9XUkNPTUI7CS8qICBJZiBpdCBpcyB0aGVyZSwgaXQgaXMgd3JpdGUtY29tYmluaW5nICAqLworCWlmIChjZW50YXVyX21jcl90eXBlID09IDEgJiYgKChjZW50YXVyX21jcltyZWddLmxvdyAmIDMxKSAmIDIpKQorCQkqdHlwZSA9IE1UUlJfVFlQRV9VTkNBQ0hBQkxFOworCWlmIChjZW50YXVyX21jcl90eXBlID09IDEgJiYgKGNlbnRhdXJfbWNyW3JlZ10ubG93ICYgMzEpID09IDI1KQorCQkqdHlwZSA9IE1UUlJfVFlQRV9XUkJBQ0s7CisJaWYgKGNlbnRhdXJfbWNyX3R5cGUgPT0gMCAmJiAoY2VudGF1cl9tY3JbcmVnXS5sb3cgJiAzMSkgPT0gMzEpCisJCSp0eXBlID0gTVRSUl9UWVBFX1dSQkFDSzsKKworfQorCitzdGF0aWMgdm9pZCBjZW50YXVyX3NldF9tY3IodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyBiYXNlLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgbXRycl90eXBlIHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBsb3csIGhpZ2g7CisKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCS8qICBEaXNhYmxlICAqLworCQloaWdoID0gbG93ID0gMDsKKwl9IGVsc2UgeworCQloaWdoID0gYmFzZSA8PCBQQUdFX1NISUZUOworCQlpZiAoY2VudGF1cl9tY3JfdHlwZSA9PSAwKQorCQkJbG93ID0gLXNpemUgPDwgUEFHRV9TSElGVCB8IDB4MWY7CS8qIG9ubHkgc3VwcG9ydCB3cml0ZS1jb21iaW5pbmcuLi4gKi8KKwkJZWxzZSB7CisJCQlpZiAodHlwZSA9PSBNVFJSX1RZUEVfVU5DQUNIQUJMRSkKKwkJCQlsb3cgPSAtc2l6ZSA8PCBQQUdFX1NISUZUIHwgMHgwMjsJLyogTkMgKi8KKwkJCWVsc2UKKwkJCQlsb3cgPSAtc2l6ZSA8PCBQQUdFX1NISUZUIHwgMHgwOTsJLyogV1dPLFdDICovCisJCX0KKwl9CisJY2VudGF1cl9tY3JbcmVnXS5oaWdoID0gaGlnaDsKKwljZW50YXVyX21jcltyZWddLmxvdyA9IGxvdzsKKwl3cm1zcihNU1JfSURUX01DUjAgKyByZWcsIGxvdywgaGlnaCk7Cit9CisKKyNpZiAwCisvKgorICoJSW5pdGlhbGlzZSB0aGUgbGF0ZXIgKHNhbmVyKSBXaW5jaGlwIE1DUiB2YXJpYW50LiBJbiB0aGlzIHZlcnNpb24KKyAqCXRoZSBCSU9TIGNhbiBwYXNzIHVzIHRoZSByZWdpc3RlcnMgaXQgaGFzIHVzZWQgKGJ1dCBub3QgdGhlaXIgdmFsdWVzKQorICoJYW5kIHRoZSBjb250cm9sIHJlZ2lzdGVyIGlzIHJlYWQvd3JpdGUKKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQKK2NlbnRhdXJfbWNyMV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaTsKKwl1MzIgbG8sIGhpOworCisJLyogVW5mb3J0dW5hdGVseSwgTUNSJ3MgYXJlIHJlYWQtb25seSwgc28gdGhlcmUgaXMgbm8gd2F5IHRvCisJICogZmluZCBvdXQgd2hhdCB0aGUgYmlvcyBtaWdodCBoYXZlIGRvbmUuCisJICovCisKKwlyZG1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworCWlmICgoKGxvID4+IDE3KSAmIDcpID09IDEpIHsJLyogVHlwZSAxIFdpbmNoaXAyIE1DUiAqLworCQlsbyAmPSB+MHgxQzA7CS8qIGNsZWFyIGtleSAqLworCQlsbyB8PSAweDA0MDsJLyogc2V0IGtleSB0byAxICovCisJCXdybXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CS8qIHVubG9jayBNQ1IgKi8KKwl9CisKKwljZW50YXVyX21jcl90eXBlID0gMTsKKworCS8qCisJICogIENsZWFyIGFueSB1bmNvbmZpZ3VyZWQgTUNSJ3MuCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisJCWlmIChjZW50YXVyX21jcltpXS5oaWdoID09IDAgJiYgY2VudGF1cl9tY3JbaV0ubG93ID09IDApIHsKKwkJCWlmICghKGxvICYgKDEgPDwgKDkgKyBpKSkpKQorCQkJCXdybXNyKE1TUl9JRFRfTUNSMCArIGksIDAsIDApOworCQkJZWxzZQorCQkJCS8qCisJCQkJICogICAgICBJZiB0aGUgQklPUyBzZXQgdXAgYW4gTUNSIHdlIGNhbm5vdCBzZWUgaXQKKwkJCQkgKiAgICAgIGJ1dCB3ZSBkb24ndCB3aXNoIHRvIG9ibGl0ZXJhdGUgaXQKKwkJCQkgKi8KKwkJCQljZW50YXVyX21jcl9yZXNlcnZlZCB8PSAoMSA8PCBpKTsKKwkJfQorCX0KKwkvKiAgCisJICogIFRocm93IHRoZSBtYWluIHdyaXRlLWNvbWJpbmluZyBzd2l0Y2guLi4gCisJICogIEhvd2V2ZXIgaWYgT09TVE9SRSBpcyBlbmFibGVkIHRoZW4gcGVvcGxlIGhhdmUgYWxyZWFkeSBkb25lIGZhcgorCSAqICBjbGV2ZXJlciB0aGluZ3MgYW5kIHdlIHNob3VsZCBiZWhhdmUuIAorCSAqLworCisJbG8gfD0gMTU7CQkvKiBXcml0ZSBjb21iaW5lIGVuYWJsZXMgKi8KKwl3cm1zcihNU1JfSURUX01DUl9DVFJMLCBsbywgaGkpOworfQorCisvKgorICoJSW5pdGlhbGlzZSB0aGUgb3JpZ2luYWwgd2luY2hpcCB3aXRoIHJlYWQgb25seSBNQ1IgcmVnaXN0ZXJzCisgKglubyB1c2VkIGJpdG1hc2sgZm9yIHRoZSBCSU9TIHRvIHBhc3Mgb24gYW5kIHdyaXRlIG9ubHkgY29udHJvbAorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdAorY2VudGF1cl9tY3IwX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpOworCisJLyogVW5mb3J0dW5hdGVseSwgTUNSJ3MgYXJlIHJlYWQtb25seSwgc28gdGhlcmUgaXMgbm8gd2F5IHRvCisJICogZmluZCBvdXQgd2hhdCB0aGUgYmlvcyBtaWdodCBoYXZlIGRvbmUuCisJICovCisKKwkvKiBDbGVhciBhbnkgdW5jb25maWd1cmVkIE1DUidzLgorCSAqIFRoaXMgd2F5IHdlIGFyZSBzdXJlIHRoYXQgdGhlIGNlbnRhdXJfbWNyIGFycmF5IGNvbnRhaW5zIHRoZSBhY3R1YWwKKwkgKiB2YWx1ZXMuIFRoZSBkaXNhZHZhbnRhZ2UgaXMgdGhhdCBhbnkgQklPUyB0d2Vha3MgYXJlIHRodXMgdW5kb25lLgorCSAqCisJICovCisJZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworCQlpZiAoY2VudGF1cl9tY3JbaV0uaGlnaCA9PSAwICYmIGNlbnRhdXJfbWNyW2ldLmxvdyA9PSAwKQorCQkJd3Jtc3IoTVNSX0lEVF9NQ1IwICsgaSwgMCwgMCk7CisJfQorCisJd3Jtc3IoTVNSX0lEVF9NQ1JfQ1RSTCwgMHgwMUYwMDAxRiwgMCk7CS8qIFdyaXRlIG9ubHkgKi8KK30KKworLyoKKyAqCUluaXRpYWxpc2UgV2luY2hpcCBzZXJpZXMgTUNSIHJlZ2lzdGVycworICovCisKK3N0YXRpYyB2b2lkIF9faW5pdAorY2VudGF1cl9tY3JfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzZXRfbXRycl9jb250ZXh0IGN0eHQ7CisKKwlzZXRfbXRycl9wcmVwYXJlX3NhdmUoJmN0eHQpOworCXNldF9tdHJyX2NhY2hlX2Rpc2FibGUoJmN0eHQpOworCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID09IDQpCisJCWNlbnRhdXJfbWNyMF9pbml0KCk7CisJZWxzZSBpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPT0gOCB8fCBib290X2NwdV9kYXRhLng4Nl9tb2RlbCA9PSA5KQorCQljZW50YXVyX21jcjFfaW5pdCgpOworCisJc2V0X210cnJfZG9uZSgmY3R4dCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBjZW50YXVyX3ZhbGlkYXRlX2FkZF9wYWdlKHVuc2lnbmVkIGxvbmcgYmFzZSwgCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCB0eXBlKQoreworCS8qCisJICogIEZJWE1FOiBXaW5jaGlwMiBzdXBwb3J0cyB1bmNhY2hlZAorCSAqLworCWlmICh0eXBlICE9IE1UUlJfVFlQRV9XUkNPTUIgJiYgCisJICAgIChjZW50YXVyX21jcl90eXBlID09IDAgfHwgdHlwZSAhPSBNVFJSX1RZUEVfVU5DQUNIQUJMRSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIm10cnI6IG9ubHkgd3JpdGUtY29tYmluaW5nJXMgc3VwcG9ydGVkXG4iLAorCQkgICAgICAgY2VudGF1cl9tY3JfdHlwZSA/ICIgYW5kIHVuY2FjaGVhYmxlIGFyZSIKKwkJICAgICAgIDogIiBpcyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXRycl9vcHMgY2VudGF1cl9tdHJyX29wcyA9IHsKKwkudmVuZG9yICAgICAgICAgICAgPSBYODZfVkVORE9SX0NFTlRBVVIsCisvLwkuaW5pdCAgICAgICAgICAgICAgPSBjZW50YXVyX21jcl9pbml0LAorCS5zZXQgICAgICAgICAgICAgICA9IGNlbnRhdXJfc2V0X21jciwKKwkuZ2V0ICAgICAgICAgICAgICAgPSBjZW50YXVyX2dldF9tY3IsCisJLmdldF9mcmVlX3JlZ2lvbiAgID0gY2VudGF1cl9nZXRfZnJlZV9yZWdpb24sCisJLnZhbGlkYXRlX2FkZF9wYWdlID0gY2VudGF1cl92YWxpZGF0ZV9hZGRfcGFnZSwKKwkuaGF2ZV93cmNvbWIgICAgICAgPSBwb3NpdGl2ZV9oYXZlX3dyY29tYiwKK307CisKK2ludCBfX2luaXQgY2VudGF1cl9pbml0X210cnIodm9pZCkKK3sKKwlzZXRfbXRycl9vcHMoJmNlbnRhdXJfbXRycl9vcHMpOworCXJldHVybiAwOworfQorCisvL2FyY2hfaW5pdGNhbGwoY2VudGF1cl9pbml0X210cnIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jaGFuZ2Vsb2cgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2NoYW5nZWxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjEzNjg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jaGFuZ2Vsb2cKQEAgLTAsMCArMSwyMjkgQEAKKyAgICBDaGFuZ2VMb2cKKworICAgIFByZWhpc3RvcnkgTWFydGluIFRpc2NoaOR1c2VyIDxtYXJ0aW5AaWtjYmFya2EuZnprLmRlPgorCSAgICAgICBJbml0aWFsIHJlZ2lzdGVyLXNldHRpbmcgY29kZSAoZnJvbSBwcm9mb3JtLTEuMCkuCisgICAgMTk5NzEyMTYgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIE9yaWdpbmFsIHZlcnNpb24gZm9yIC9wcm9jL210cnIgaW50ZXJmYWNlLCBTTVAtc2FmZS4KKyAgdjEuMAorICAgIDE5OTcxMjE3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBCdWcgZml4IGZvciBpb2N0bHMoKSdzLgorCSAgICAgICBBZGRlZCBzYW1wbGUgY29kZSBpbiBEb2N1bWVudGF0aW9uL210cnIudHh0CisgIHYxLjEKKyAgICAxOTk3MTIxOCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRGlzYWxsb3cgb3ZlcmxhcHBpbmcgcmVnaW9ucy4KKyAgICAxOTk3MTIxOSAgIEplbnMgTWF1cmVyIDxqbWF1cmVyQG1lbnVldHQucmhlaW4tbWFpbi5kZT4KKyAgICAgICAgICAgICAgIFJlZ2lzdGVyLXNldHRpbmcgZml4dXBzLgorICB2MS4yCisgICAgMTk5NzEyMjIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeHVwcyBmb3Iga2VybmVsIDIuMS43NS4KKyAgdjEuMworICAgIDE5OTcxMjI5ICAgRGF2aWQgV3JhZ2cgPGRwd0Bkb2MuaWMuYWMudWs+CisgICAgICAgICAgICAgICBSZWdpc3Rlci1zZXR0aW5nIGZpeHVwcyBhbmQgY29uZm9ybWl0eSB3aXRoIEludGVsIGNvbnZlbnRpb25zLgorICAgIDE5OTcxMjI5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBDb3NtZXRpYyBjaGFuZ2VzIGFuZCB3cm90ZSB0aGlzIENoYW5nZUxvZyA7LSkKKyAgICAxOTk4MDEwNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRml4dXBzIGZvciBrZXJuZWwgMi4xLjc4LgorICB2MS40CisgICAgMTk5ODAxMTkgICBEYXZpZCBXcmFnZyA8ZHB3QGRvYy5pYy5hYy51az4KKyAgICAgICAgICAgICAgIEluY2x1ZGVkIHBhc3NpdmUtcmVsZWFzZSBlbmFibGUgY29kZSAoZWxzZXdoZXJlIGluIFBDSSBzZXR1cCkuCisgIHYxLjUKKyAgICAxOTk4MDEzMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgUmVwbGFjZWQgZ2xvYmFsIGtlcm5lbCBsb2NrIHdpdGggcHJpdmF0ZSBzcGlubG9jay4KKyAgdjEuNgorICAgIDE5OTgwMjAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBBZGRlZCB3YWl0IGZvciBvdGhlciBDUFVzIHRvIGNvbXBsZXRlIGNoYW5nZXMuCisgIHYxLjcKKyAgICAxOTk4MDIwMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQnVnIGZpeCBpbiBkZWZpbml0aW9uIG9mIDxzZXRfbXRycj4gZm9yIFVQLgorICB2MS44CisgICAgMTk5ODAzMTkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeHVwcyBmb3Iga2VybmVsIDIuMS45MC4KKyAgICAxOTk4MDMyMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgTW92ZSBTTVAgQklPUyBmaXh1cCBiZWZvcmUgc2Vjb25kYXJ5IENQVXMgY2FsbCA8Y2FsaWJyYXRlX2RlbGF5PgorICB2MS45CisgICAgMTk5ODAzMjUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeGVkIHRlc3QgZm9yIG92ZXJsYXBwaW5nIHJlZ2lvbnM6IGNvbmZ1c2VkIGJ5IGFkamFjZW50IHJlZ2lvbnMKKyAgICAxOTk4MDMyNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQWRkZWQgd2JpbnZkIGluIDxzZXRfbXRycl9wcmVwYXJlPi4KKyAgICAxOTk4MDQwMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQnVnIGZpeCBmb3Igbm9uLVNNUCBjb21waWxhdGlvbi4KKyAgICAxOTk4MDQxOCAgIERhdmlkIFdyYWdnIDxkcHdAZG9jLmljLmFjLnVrPgorICAgICAgICAgICAgICAgRml4ZWQtTVRSUiBzeW5jaHJvbmlzYXRpb24gZm9yIFNNUCBhbmQgdXNlIGF0b21pYyBvcGVyYXRpb25zCisJICAgICAgIGluc3RlYWQgb2Ygc3BpbmxvY2tzLgorICAgIDE5OTgwNDE4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIERpZmZlcmVudGlhdGUgZGlmZmVyZW50IE1UUlIgcmVnaXN0ZXIgY2xhc3NlcyBmb3IgQklPUyBmaXh1cC4KKyAgdjEuMTAKKyAgICAxOTk4MDQxOSAgIERhdmlkIFdyYWdnIDxkcHdAZG9jLmljLmFjLnVrPgorCSAgICAgICBCdWcgZml4IGluIHZhcmlhYmxlIE1UUlIgc3luY2hyb25pc2F0aW9uLgorICB2MS4xMQorICAgIDE5OTgwNDE5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeHVwcyBmb3Iga2VybmVsIDIuMS45Ny4KKyAgdjEuMTIKKyAgICAxOTk4MDQyMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBTYWZlciBzeW5jaHJvbmlzYXRpb24gYWNyb3NzIENQVXMgd2hlbiBjaGFuZ2luZyBNVFJScy4KKyAgdjEuMTMKKyAgICAxOTk4MDQyMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBCdWdmaXggZm9yIFNNUCBzeXN0ZW1zIHdpdGhvdXQgTVRSUiBzdXBwb3J0LgorICB2MS4xNAorICAgIDE5OTgwNDI3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFRyYXAgY2FsbHMgdG8gPG10cnJfYWRkPiBhbmQgPG10cnJfZGVsPiBvbiBub24tTVRSUiBtYWNoaW5lcy4KKyAgdjEuMTUKKyAgICAxOTk4MDQyNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBVc2UgYXRvbWljIGJpdG9wcyBmb3Igc2V0dGluZyBTTVAgY2hhbmdlIG1hc2suCisgIHYxLjE2CisgICAgMTk5ODA0MjggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCBzcHVyaW91cyBkaWFnbm9zdGljIG1lc3NhZ2UuCisgIHYxLjE3CisgICAgMTk5ODA0MjkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTW92ZWQgcmVnaXN0ZXItc2V0dGluZyBtYWNyb3MgaW50byB0aGlzIGZpbGUuCisJICAgICAgIE1vdmVkIHNldHVwIGNvZGUgZnJvbSBpbml0L21haW4uYyB0byBpMzg2LXNwZWNpZmljIGFyZWFzLgorICB2MS4xOAorICAgIDE5OTgwNTAyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE1vdmVkIE1UUlIgZGV0ZWN0aW9uIG91dHNpZGUgY29uZGl0aW9uYWxzIGluIDxtdHJyX2luaXQ+LgorICB2MS4xOQorICAgIDE5OTgwNTAyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIERvY3VtZW50YXRpb24gaW1wcm92ZW1lbnQ6IG1lbnRpb24gUGVudGl1bSBJSSBhbmQgQUdQLgorICB2MS4yMAorICAgIDE5OTgwNTIxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE9ubHkgbWFuaXB1bGF0ZSBpbnRlcnJ1cHQgZW5hYmxlIGZsYWcgb24gbG9jYWwgQ1BVLgorCSAgICAgICBBbGxvdyBlbmNsb3NlZCB1bmNhY2hhYmxlIHJlZ2lvbnMuCisgIHYxLjIxCisgICAgMTk5ODA2MTEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWx3YXlzIGRlZmluZSA8bWFpbl9sb2NrPi4KKyAgdjEuMjIKKyAgICAxOTk4MDkwMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZW1vdmVkIG1vZHVsZSBzdXBwb3J0IGluIG9yZGVyIHRvIHRpZHkgdXAgY29kZS4KKwkgICAgICAgQWRkZWQgc2FuaXR5IGNoZWNrIGZvciA8bXRycl9hZGQ+LzxtdHJyX2RlbD4gYmVmb3JlIDxtdHJyX2luaXQ+LgorCSAgICAgICBDcmVhdGVkIGFkZGl0aW9uIHF1ZXVlIGZvciBwcmlvciB0byBTTVAgY29tbWVuY2UuCisgIHYxLjIzCisgICAgMTk5ODA5MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUG9ydGVkIHBhdGNoIHRvIGtlcm5lbCAyLjEuMTIwLXByZTMuCisgIHYxLjI0CisgICAgMTk5ODA5MTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCBzYW5pdHkgY2hlY2tzIGFuZCBhZGRpdGlvbiBxdWV1ZTogTGludXMgcHJlZmVycyBhbiBPT1BTLgorICB2MS4yNQorICAgIDE5OTgxMDAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGhhcm1sZXNzIGNvbXBpbGVyIHdhcm5pbmcgaW4gaW5jbHVkZS9hc20taTM4Ni9tdHJyLmgKKwkgICAgICAgRml4ZWQgdmVyc2lvbiBudW1iZXJpbmcgYW5kIGhpc3RvcnkgZm9yIHYxLjIzIC0+IHYxLjI0LgorICB2MS4yNgorICAgIDE5OTkwMTE4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIGRldmZzIHN1cHBvcnQuCisgIHYxLjI3CisgICAgMTk5OTAxMjMgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2hhbmdlZCBsb2NraW5nIHRvIHNwaW4gd2l0aCByZXNjaGVkdWxlLgorCSAgICAgICBNYWRlIHVzZSBvZiBuZXcgPHNtcF9jYWxsX2Z1bmN0aW9uPi4KKyAgdjEuMjgKKyAgICAxOTk5MDIwMSAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgorCSAgICAgICBFeHRlbmRlZCB0aGUgZHJpdmVyIHRvIGJlIGFibGUgdG8gdXNlIEN5cml4IHN0eWxlIEFSUnMuCisgICAgMTk5OTAyMDQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVzdHJ1Y3R1cmVkIEN5cml4IHN1cHBvcnQuCisgIHYxLjI5CisgICAgMTk5OTAyMDQgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKwkgICAgICAgUmVmaW5lZCBBUlIgc3VwcG9ydDogZW5hYmxlIE1BUEVOIGluIHNldF9tdHJyX3ByZXBhcmUoKQorCSAgICAgICBhbmQgZGlzYWJsZSBNQVBFTiBpbiBzZXRfbXRycl9kb25lKCkuCisgICAgMTk5OTAyMDUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTWlub3IgY2xlYW51cHMuCisgIHYxLjMwCisgICAgMTk5OTAyMDggICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKyAgICAgICAgICAgICAgIFByb3RlY3QgcGxhaW4gNng4NnMgKGFuZCBvdGhlciBwcm9jZXNzb3JzIHdpdGhvdXQgdGhlCisgICAgICAgICAgICAgICBQYWdlIEdsb2JhbCBFbmFibGUgZmVhdHVyZSkgYWdhaW5zdCBhY2Nlc3NpbmcgQ1I0IGluCisgICAgICAgICAgICAgICBzZXRfbXRycl9wcmVwYXJlKCkgYW5kIHNldF9tdHJyX2RvbmUoKS4KKyAgICAxOTk5MDIxMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBUdXJuZWQgPHNldF9tdHJyX3VwPiBhbmQgPGdldF9tdHJyPiBpbnRvIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB2MS4zMQorICAgIDE5OTkwMjEyICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisgICAgICAgICAgICAgICBNYWpvciByZXdyaXRlIG9mIGN5cml4X2Fycl9pbml0KCk6IGRvIG5vdCB0b3VjaCBBUlJzLAorICAgICAgICAgICAgICAgbGVhdmUgdGhlbSBhcyB0aGUgQklPUyBoYXZlIHNldCB0aGVtIHVwLgorICAgICAgICAgICAgICAgRW5hYmxlIHVzYWdlIG9mIGFsbCA4IEFSUnMuCisgICAgICAgICAgICAgICBBdm9pZCBtdWx0aXBsaWNhdGlvbnMgYnkgMyBldmVyeXdoZXJlIGFuZCBvdGhlcgorICAgICAgICAgICAgICAgY29kZSBjbGVhbiB1cHMvc3BlZWQgdXBzLgorICAgIDE5OTkwMjEzICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisgICAgICAgICAgICAgICBTZXQgdXAgb3RoZXIgQ3lyaXggcHJvY2Vzc29ycyBpZGVudGljYWwgdG8gdGhlIGJvb3QgY3B1LgorICAgICAgICAgICAgICAgU2luY2UgQ3lyaXggZG9uJ3Qgc3VwcG9ydCBJbnRlbCBBUElDLCB0aGlzIGlzIGwnYXJ0IHBvdXIgbCdhcnQuCisgICAgICAgICAgICAgICBXZWlnaCBBUlJzIGJ5IHNpemU6CisgICAgICAgICAgICAgICBJZiBzaXplIDw9IDMyTSBpcyBnaXZlbiwgc2V0IHVwIEFSUiMgd2Ugd2VyZSBnaXZlbi4KKyAgICAgICAgICAgICAgIElmIHNpemUgPiAgMzJNIGlzIGdpdmVuLCBzZXQgdXAgQVJSNyBvbmx5IGlmIGl0IGlzIGZyZWUsCisgICAgICAgICAgICAgICBmYWlsIG90aGVyd2lzZS4KKyAgICAxOTk5MDIxNCAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgorICAgICAgICAgICAgICAgQWxzbyBjaGVjayBmb3Igc2l6ZSA+PSAyNTZLIGlmIHdlIGFyZSB0byBzZXQgdXAgQVJSNywKKyAgICAgICAgICAgICAgIG10cnJfYWRkKCkgcmV0dXJucyB0aGUgdmFsdWUgaXQgZ2V0cyBmcm9tIHNldF9tdHJyKCkKKyAgICAxOTk5MDIxOCAgIFpvbHThbiBC9nN69nJt6W55aSA8emJvc3pvckBtYWlsLmV4dGVybmV0Lmh1PgorICAgICAgICAgICAgICAgUmVtb3ZlIEN5cml4ICJjb21hIGJ1ZyIgd29ya2Fyb3VuZCBmcm9tIGhlcmUuCisgICAgICAgICAgICAgICBNb3ZlZCB0byBsaW51eC9hcmNoL2kzODYva2VybmVsL3NldHVwLmMgYW5kCisgICAgICAgICAgICAgICBsaW51eC9pbmNsdWRlL2FzbS1pMzg2L2J1Z3MuaAorICAgIDE5OTkwMjI4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIE1UUlJJT0NfS0lMTF9FTlRSWSBpb2N0bCgyKQorCSAgICAgICBUcmFwIGZvciBjb3VudGVyIHVuZGVyZmxvdyBpbiA8bXRycl9maWxlX2RlbD4uCisJICAgICAgIFRyYXAgZm9yIDQgTWlCIGFsaWduZWQgcmVnaW9ucyBmb3IgUFBybywgc3RlcHBpbmcgPD0gNy4KKyAgICAxOTk5MDMwMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxnZXRfZnJlZV9yZWdpb24+IGhvb2suCisgICAgMTk5OTAzMDUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgVGVtcG9yYXJpbHkgZGlzYWJsZSBBTUQgc3VwcG9ydCBub3cgTVRSUiBjYXBhYmlsaXR5IGZsYWcgaXMgc2V0LgorICB2MS4zMgorICAgIDE5OTkwMzA4ICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisJICAgICAgIEFkanVzdCBteSBjaGFuZ2VzICgxOTk5MDIxMi0xOTk5MDIxOCkgdG8gUmljaGFyZCBHb29jaCdzCisJICAgICAgIGxhdGVzdCBjaGFuZ2VzLiAoMTk5OTAyMjgtMTk5OTAzMDUpCisgIHYxLjMzCisgICAgMTk5OTAzMDkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgdHlwbyBpbiA8cHJpbnRrPiBtZXNzYWdlLgorICAgIDE5OTkwMzEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFN1cHBvcnQgSzYtSUkvSUlJIGJhc2VkIG9uIEFsYW4gQ294J3MgPGFsYW5AcmVkaGF0LmNvbT4gcGF0Y2hlcy4KKyAgdjEuMzQKKyAgICAxOTk5MDUxMSAgIEJhcnQgSGFydGdlcnMgPGJhcnRAZXRwbW9kLnBoeXMudHVlLm5sPgorCSAgICAgICBTdXBwb3J0IENlbnRhdXIgQzYgTUNSJ3MuCisgICAgMTk5OTA1MTIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTWlub3IgY2xlYW51cHMuCisgIHYxLjM1CisgICAgMTk5OTA3MDcgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKyAgICAgICAgICAgICAgIENoZWNrIHdoZXRoZXIgQVJSMyBpcyBwcm90ZWN0ZWQgaW4gY3lyaXhfZ2V0X2ZyZWVfcmVnaW9uKCkKKyAgICAgICAgICAgICAgIGFuZCBtdHJyX2RlbCgpLiBUaGUgY29kZSB3b24ndCBhdHRlbXB0IHRvIGRlbGV0ZSBvciBjaGFuZ2UgaXQKKyAgICAgICAgICAgICAgIGZyb20gbm93IG9uIGlmIHRoZSBCSU9TIHByb3RlY3RlZCBBUlIzLiBJdCBzaWxlbnRseSBza2lwcyBBUlIzCisgICAgICAgICAgICAgICBpbiBjeXJpeF9nZXRfZnJlZV9yZWdpb24oKSBvciByZXR1cm5zIHdpdGggYW4gZXJyb3IgY29kZSBmcm9tCisgICAgICAgICAgICAgICBtdHJyX2RlbCgpLgorICAgIDE5OTkwNzExICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisgICAgICAgICAgICAgICBSZXNldCBzb21lIGJpdHMgaW4gdGhlIENDUnMgaW4gY3lyaXhfYXJyX2luaXQoKSB0byBkaXNhYmxlIFNNTQorICAgICAgICAgICAgICAgaWYgQVJSMyBpc24ndCBwcm90ZWN0ZWQuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaWYgU01NIGlzIGFjdGl2ZQorICAgICAgICAgICAgICAgYW5kIEFSUjMgaXNuJ3QgcHJvdGVjdGVkIHRoZW4gZGVsZXRpbmcgYW5kIHNldHRpbmcgQVJSMyBhZ2FpbgorICAgICAgICAgICAgICAgbWF5IGxvY2sgdXAgdGhlIHByb2Nlc3Nvci4gV2l0aCBTTU0gZW50aXJlbHkgZGlzYWJsZWQsIGl0IGRvZXMKKyAgICAgICAgICAgICAgIG5vdCBoYXBwZW4uCisgICAgMTk5OTA4MTIgICBab2x04W4gQvZzevZybelueWkgPHpib3N6b3JAbWFpbC5leHRlcm5ldC5odT4KKyAgICAgICAgICAgICAgIFJlYXJyYW5nZSBzd2l0Y2goKSBzdGF0ZW1lbnRzIHNvIHRoZSBkcml2ZXIgYWNjb21vZGF0ZXMgdG8KKyAgICAgICAgICAgICAgIHRoZSBmYWN0IHRoYXQgdGhlIEFNRCBBdGhsb24gaGFuZGxlcyBpdHMgTVRSUnMgdGhlIHNhbWUgd2F5CisgICAgICAgICAgICAgICBhcyBJbnRlbCBkb2VzLgorICAgIDE5OTkwODE0ICAgWm9sdOFuIEL2c3r2cm3pbnlpIDx6Ym9zem9yQG1haWwuZXh0ZXJuZXQuaHU+CisJICAgICAgIERvdWJsZSBjaGVjayBmb3IgSW50ZWwgaW4gbXRycl9hZGQoKSdzIGJpZyBzd2l0Y2goKSBiZWNhdXNlCisJICAgICAgIHRoYXQgcmV2aXNpb24gY2hlY2sgaXMgb25seSB2YWxpZCBmb3IgSW50ZWwgQ1BVcy4KKyAgICAxOTk5MDgxOSAgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgICAgICAgICAgICAgICBUZXN0ZWQgWm9sdGFuJ3MgY2hhbmdlcyBvbiBhIHByZSBwcm9kdWN0aW9uIEF0aGxvbiAtIDEwMCUKKyAgICAgICAgICAgICAgIHN1Y2Nlc3MuCisgICAgMTk5OTEwMDggICBNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZHNAY29sb3JmdWxsaWZlLmNvbT4KKyAgICAJICAgICAgIHJlcGxhY2VkIHNwaW5fbG9ja19yZXNjaGVkdWxlKCkgd2l0aCBhIG5vcm1hbCBzZW1hcGhvcmUuCisgIHYxLjM2CisgICAgMjAwMDAyMjEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENvbXBpbGUgZml4IGlmIHByb2NmcyBhbmQgZGV2ZnMgbm90IGVuYWJsZWQuCisJICAgICAgIEZvcm1hdHRpbmcgY2hhbmdlcy4KKyAgdjEuMzcKKyAgICAyMDAwMTEwOSAgIEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPgorCSAgICAgICBVc2UgdGhlIG5ldyBjZW50cmFsaXplZCBDUFUgZmVhdHVyZSBkZXRlY3RzLgorCisgIHYxLjM4CisgICAgMjAwMTAzMDkgICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPgorCSAgICAgICBBZGQgc3VwcG9ydCBmb3IgQ3lyaXggSUlJLgorCisgIHYxLjM5CisgICAgMjAwMTAzMTIgICBEYXZlIEpvbmVzIDxkYXZlakBzdXNlLmRlPgorICAgICAgICAgICAgICAgVWdoLCBJIGJyb2tlIEFNRCBzdXBwb3J0LgorCSAgICAgICBSZXdvcmtlZCBmaXggYnkgVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIDx0cm9lbHNAdGh1bGUubm8+CisKKyAgdjEuNDAKKyAgICAyMDAxMDMyNyAgIERhdmUgSm9uZXMgPGRhdmVqQHN1c2UuZGU+CisJICAgICAgIEFkYXB0ZWQgQ3lyaXggSUlJIHN1cHBvcnQgdG8gaW5jbHVkZSBWSUEgQzMuCisKKyAgdjIuMAorICAgIDIwMDIwMzA2ICAgUGF0cmljayBNb2NoZWwgPG1vY2hlbEBvc2RsLm9yZz4KKyAgICAgICAgICAgICAgIFNwbGl0IG10cnIuYyAtPiBtdHJyLyouYworICAgICAgICAgICAgICAgQ29udmVydGVkIHRvIExpbnV4IEtlcm5lbCBDb2RpbmcgU3R5bGUKKyAgICAgICAgICAgICAgIEZpeGVkIHNldmVyYWwgbWlub3Igbml0cyBpbiBmb3JtCisgICAgICAgICAgICAgICBNb3ZlZCBzb21lIFNNUC1vbmx5IGZ1bmN0aW9ucyBvdXQsIHNvIHRoZXkgY2FuIGJlIHVzZWQKKyAgICAgICAgICAgICAgICBmb3IgcG93ZXIgbWFuYWdlbWVudCBpbiB0aGUgZnV0dXJlLgorICAgICAgICAgICAgICAgVE9ETzogRml4IHVzZXIgaW50ZXJmYWNlIGNydWZ0LgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jeXJpeC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9jeXJpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzM2IwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2N5cml4LmMKQEAgLTAsMCArMSwzNjQgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJtdHJyLmgiCisKK2ludCBhcnIzX3Byb3RlY3RlZDsKKworc3RhdGljIHZvaWQKK2N5cml4X2dldF9hcnIodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyAqYmFzZSwKKwkgICAgICB1bnNpZ25lZCBpbnQgKnNpemUsIG10cnJfdHlwZSAqIHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGFyciwgY2NyMywgcmNyLCBzaGlmdDsKKworCWFyciA9IENYODZfQVJSX0JBU0UgKyAocmVnIDw8IDEpICsgcmVnOwkvKiBhdm9pZCBtdWx0aXBsaWNhdGlvbiBieSAzICovCisKKwkvKiBTYXZlIGZsYWdzIGFuZCBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7CS8qIGVuYWJsZSBNQVBFTiAqLworCSgodW5zaWduZWQgY2hhciAqKSBiYXNlKVszXSA9IGdldEN4ODYoYXJyKTsKKwkoKHVuc2lnbmVkIGNoYXIgKikgYmFzZSlbMl0gPSBnZXRDeDg2KGFyciArIDEpOworCSgodW5zaWduZWQgY2hhciAqKSBiYXNlKVsxXSA9IGdldEN4ODYoYXJyICsgMik7CisJcmNyID0gZ2V0Q3g4NihDWDg2X1JDUl9CQVNFICsgcmVnKTsKKwlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CS8qIGRpc2FibGUgTUFQRU4gKi8KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGlmIGl0IHdhcyBlbmFibGVkIHByZXZpb3VzbHkgKi8KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJc2hpZnQgPSAoKHVuc2lnbmVkIGNoYXIgKikgYmFzZSlbMV0gJiAweDBmOworCSpiYXNlID4+PSBQQUdFX1NISUZUOworCisJLyogUG93ZXIgb2YgdHdvLCBhdCBsZWFzdCA0SyBvbiBBUlIwLUFSUjYsIDI1Nksgb24gQVJSNworCSAqIE5vdGU6IHNoaWZ0PT0weGYgbWVhbnMgNEcsIHRoaXMgaXMgdW5zdXBwb3J0ZWQuCisJICovCisJaWYgKHNoaWZ0KQorCQkqc2l6ZSA9IChyZWcgPCA3ID8gMHgxVUwgOiAweDQwVUwpIDw8IChzaGlmdCAtIDEpOworCWVsc2UKKwkJKnNpemUgPSAwOworCisJLyogQml0IDAgaXMgQ2FjaGUgRW5hYmxlIG9uIEFSUjcsIENhY2hlIERpc2FibGUgb24gQVJSMC1BUlI2ICovCisJaWYgKHJlZyA8IDcpIHsKKwkJc3dpdGNoIChyY3IpIHsKKwkJY2FzZSAxOgorCQkJKnR5cGUgPSBNVFJSX1RZUEVfVU5DQUNIQUJMRTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQkqdHlwZSA9IE1UUlJfVFlQRV9XUkJBQ0s7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJKnR5cGUgPSBNVFJSX1RZUEVfV1JDT01COworCQkJYnJlYWs7CisJCWNhc2UgMjQ6CisJCWRlZmF1bHQ6CisJCQkqdHlwZSA9IE1UUlJfVFlQRV9XUlRIUk9VR0g7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAocmNyKSB7CisJCWNhc2UgMDoKKwkJCSp0eXBlID0gTVRSUl9UWVBFX1VOQ0FDSEFCTEU7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJKnR5cGUgPSBNVFJSX1RZUEVfV1JDT01COworCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJCSp0eXBlID0gTVRSUl9UWVBFX1dSQkFDSzsKKwkJCWJyZWFrOworCQljYXNlIDI1OgorCQlkZWZhdWx0OgorCQkJKnR5cGUgPSBNVFJSX1RZUEVfV1JUSFJPVUdIOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK2N5cml4X2dldF9mcmVlX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKKy8qICBbU1VNTUFSWV0gR2V0IGEgZnJlZSBBUlIuCisgICAgPGJhc2U+IFRoZSBzdGFydGluZyAoYmFzZSkgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgorICAgIDxzaXplPiBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSByZWdpb24uCisgICAgW1JFVFVSTlNdIFRoZSBpbmRleCBvZiB0aGUgcmVnaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgLTEgb24gZXJyb3IuCisqLworeworCWludCBpOworCW10cnJfdHlwZSBsdHlwZTsKKwl1bnNpZ25lZCBsb25nIGxiYXNlOworCXVuc2lnbmVkIGludCAgbHNpemU7CisKKwkvKiBJZiB3ZSBhcmUgdG8gc2V0IHVwIGEgcmVnaW9uID4zMk0gdGhlbiBsb29rIGF0IEFSUjcgaW1tZWRpYXRlbHkgKi8KKwlpZiAoc2l6ZSA+IDB4MjAwMCkgeworCQljeXJpeF9nZXRfYXJyKDcsICZsYmFzZSwgJmxzaXplLCAmbHR5cGUpOworCQlpZiAobHNpemUgPT0gMCkKKwkJCXJldHVybiA3OworCQkvKiAgRWxzZSB0cnkgQVJSMC1BUlI2IGZpcnN0ICAqLworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJCWN5cml4X2dldF9hcnIoaSwgJmxiYXNlLCAmbHNpemUsICZsdHlwZSk7CisJCQlpZiAoKGkgPT0gMykgJiYgYXJyM19wcm90ZWN0ZWQpCisJCQkJY29udGludWU7CisJCQlpZiAobHNpemUgPT0gMCkKKwkJCQlyZXR1cm4gaTsKKwkJfQorCQkvKiBBUlIwLUFSUjYgaXNuJ3QgZnJlZSwgdHJ5IEFSUjcgYnV0IGl0cyBzaXplIG11c3QgYmUgYXQgbGVhc3QgMjU2SyAqLworCQljeXJpeF9nZXRfYXJyKGksICZsYmFzZSwgJmxzaXplLCAmbHR5cGUpOworCQlpZiAoKGxzaXplID09IDApICYmIChzaXplID49IDB4NDApKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtRU5PU1BDOworfQorCitzdGF0aWMgdTMyIGNyNCA9IDA7CitzdGF0aWMgdTMyIGNjcjM7CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfc2V0KHZvaWQpCit7CisJdTMyIGNyMDsKKworCS8qICBTYXZlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykgICovCisJaWYgKCBjcHVfaGFzX3BnZSApIHsKKwkJY3I0ID0gcmVhZF9jcjQoKTsKKwkJd3JpdGVfY3I0KGNyNCAmICh1bnNpZ25lZCBjaGFyKSB+KDEgPDwgNykpOworCX0KKworCS8qICBEaXNhYmxlIGFuZCBmbHVzaCBjYWNoZXMuIE5vdGUgdGhhdCB3YmludmQgZmx1c2hlcyB0aGUgVExCcyBhcworCSAgICBhIHNpZGUtZWZmZWN0ICAqLworCWNyMCA9IHJlYWRfY3IwKCkgfCAweDQwMDAwMDAwOworCXdiaW52ZCgpOworCXdyaXRlX2NyMChjcjApOworCXdiaW52ZCgpOworCisJLyogQ3lyaXggQVJScyAtIGV2ZXJ5dGhpbmcgZWxzZSB3ZXJlIGV4Y2x1ZGVkIGF0IHRoZSB0b3AgKi8KKwljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCisJLyogQ3lyaXggQVJScyAtIGV2ZXJ5dGhpbmcgZWxzZSB3ZXJlIGV4Y2x1ZGVkIGF0IHRoZSB0b3AgKi8KKwlzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOworCit9CisKK3N0YXRpYyB2b2lkIHBvc3Rfc2V0KHZvaWQpCit7CisJLyogIEZsdXNoIGNhY2hlcyBhbmQgVExCcyAgKi8KKwl3YmludmQoKTsKKworCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2FzIGV4Y2x1ZGVkIGF0IHRoZSB0b3AgKi8KKwlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CisJCQorCS8qICBFbmFibGUgY2FjaGVzICAqLworCXdyaXRlX2NyMChyZWFkX2NyMCgpICYgMHhiZmZmZmZmZik7CisKKwkvKiAgUmVzdG9yZSB2YWx1ZSBvZiBDUjQgICovCisJaWYgKCBjcHVfaGFzX3BnZSApCisJCXdyaXRlX2NyNChjcjQpOworfQorCitzdGF0aWMgdm9pZCBjeXJpeF9zZXRfYXJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCSAgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGFyciwgYXJyX3R5cGUsIGFycl9zaXplOworCisJYXJyID0gQ1g4Nl9BUlJfQkFTRSArIChyZWcgPDwgMSkgKyByZWc7CS8qIGF2b2lkIG11bHRpcGxpY2F0aW9uIGJ5IDMgKi8KKworCS8qIGNvdW50IGRvd24gZnJvbSAzMk0gKEFSUjAtQVJSNikgb3IgZnJvbSAyRyAoQVJSNykgKi8KKwlpZiAocmVnID49IDcpCisJCXNpemUgPj49IDY7CisKKwlzaXplICY9IDB4N2ZmZjsJCS8qIG1ha2Ugc3VyZSBhcnJfc2l6ZSA8PSAxNCAqLworCWZvciAoYXJyX3NpemUgPSAwOyBzaXplOyBhcnJfc2l6ZSsrLCBzaXplID4+PSAxKSA7CisKKwlpZiAocmVnIDwgNykgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBNVFJSX1RZUEVfVU5DQUNIQUJMRToKKwkJCWFycl90eXBlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE1UUlJfVFlQRV9XUkNPTUI6CisJCQlhcnJfdHlwZSA9IDk7CisJCQlicmVhazsKKwkJY2FzZSBNVFJSX1RZUEVfV1JUSFJPVUdIOgorCQkJYXJyX3R5cGUgPSAyNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYXJyX3R5cGUgPSA4OworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBNVFJSX1RZUEVfVU5DQUNIQUJMRToKKwkJCWFycl90eXBlID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE1UUlJfVFlQRV9XUkNPTUI6CisJCQlhcnJfdHlwZSA9IDg7CisJCQlicmVhazsKKwkJY2FzZSBNVFJSX1RZUEVfV1JUSFJPVUdIOgorCQkJYXJyX3R5cGUgPSAyNTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYXJyX3R5cGUgPSA5OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwcmVwYXJlX3NldCgpOworCisJYmFzZSA8PD0gUEFHRV9TSElGVDsKKwlzZXRDeDg2KGFyciwgKCh1bnNpZ25lZCBjaGFyICopICZiYXNlKVszXSk7CisJc2V0Q3g4NihhcnIgKyAxLCAoKHVuc2lnbmVkIGNoYXIgKikgJmJhc2UpWzJdKTsKKwlzZXRDeDg2KGFyciArIDIsICgoKHVuc2lnbmVkIGNoYXIgKikgJmJhc2UpWzFdKSB8IGFycl9zaXplKTsKKwlzZXRDeDg2KENYODZfUkNSX0JBU0UgKyByZWcsIGFycl90eXBlKTsKKworCXBvc3Rfc2V0KCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdW5zaWduZWQgaW50IHNpemU7CisJbXRycl90eXBlIHR5cGU7Cit9IGFycl9zdGF0ZV90OworCitzdGF0aWMgYXJyX3N0YXRlX3QgYXJyX3N0YXRlWzhdIF9faW5pdGRhdGEgPSB7CisJezBVTCwgMFVMLCAwVUx9LCB7MFVMLCAwVUwsIDBVTH0sIHswVUwsIDBVTCwgMFVMfSwgezBVTCwgMFVMLCAwVUx9LAorCXswVUwsIDBVTCwgMFVMfSwgezBVTCwgMFVMLCAwVUx9LCB7MFVMLCAwVUwsIDBVTH0sIHswVUwsIDBVTCwgMFVMfQorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2NyX3N0YXRlWzddIF9faW5pdGRhdGEgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKworc3RhdGljIHZvaWQgY3lyaXhfc2V0X2FsbCh2b2lkKQoreworCWludCBpOworCisJcHJlcGFyZV9zZXQoKTsKKworCS8qIHRoZSBDQ1JzIGFyZSBub3QgY29udGlndW91cyAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXNldEN4ODYoQ1g4Nl9DQ1IwICsgaSwgY2NyX3N0YXRlW2ldKTsKKwlmb3IgKDsgaSA8IDc7IGkrKykKKwkJc2V0Q3g4NihDWDg2X0NDUjQgKyBpLCBjY3Jfc3RhdGVbaV0pOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWN5cml4X3NldF9hcnIoaSwgYXJyX3N0YXRlW2ldLmJhc2UsIAorCQkJICAgICAgYXJyX3N0YXRlW2ldLnNpemUsIGFycl9zdGF0ZVtpXS50eXBlKTsKKworCXBvc3Rfc2V0KCk7Cit9CisKKyNpZiAwCisvKgorICogT24gQ3lyaXggNng4NihNWCkgYW5kIE0gSUkgdGhlIEFSUjMgaXMgc3BlY2lhbDogaXQgaGFzIGNvbm5lY3Rpb24KKyAqIHdpdGggdGhlIFNNTSAoU3lzdGVtIE1hbmFnZW1lbnQgTW9kZSkgbW9kZS4gU28gd2UgbmVlZCB0aGUgZm9sbG93aW5nOgorICogQ2hlY2sgd2hldGhlciBTTUlfTE9DSyAoQ0NSMyBiaXQgMCkgaXMgc2V0CisgKiAgIGlmIGl0IGlzIHNldCwgd3JpdGUgYSB3YXJuaW5nIG1lc3NhZ2U6IEFSUjMgY2Fubm90IGJlIGNoYW5nZWQhCisgKiAgICAgKGl0IGNhbm5vdCBiZSBjaGFuZ2VkIHVudGlsIHRoZSBuZXh0IHByb2Nlc3NvciByZXNldCkKKyAqICAgaWYgaXQgaXMgcmVzZXQsIHRoZW4gd2UgY2FuIGNoYW5nZSBpdCwgc2V0IGFsbCB0aGUgbmVlZGVkIGJpdHM6CisgKiAgIC0gZGlzYWJsZSBhY2Nlc3MgdG8gU01NIG1lbW9yeSB0aHJvdWdoIEFSUjMgcmFuZ2UgKENDUjEgYml0IDcgcmVzZXQpCisgKiAgIC0gZGlzYWJsZSBhY2Nlc3MgdG8gU01NIG1lbW9yeSAoQ0NSMSBiaXQgMiByZXNldCkKKyAqICAgLSBkaXNhYmxlIFNNTSBtb2RlIChDQ1IxIGJpdCAxIHJlc2V0KQorICogICAtIGRpc2FibGUgd3JpdGUgcHJvdGVjdGlvbiBvZiBBUlIzIChDQ1I2IGJpdCAxIHJlc2V0KQorICogICAtIChtYXliZSkgZGlzYWJsZSBBUlIzCisgKiBKdXN0IHRvIGJlIHN1cmUsIHdlIGVuYWJsZSBBUlIgdXNhZ2UgYnkgdGhlIHByb2Nlc3NvciAoQ0NSNSBiaXQgNSBzZXQpCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdAorY3lyaXhfYXJyX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCBjdHh0OworCXVuc2lnbmVkIGNoYXIgY2NyWzddOworCWludCBjY3JjWzddID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisjaWZkZWYgQ09ORklHX1NNUAorCWludCBpOworI2VuZGlmCisKKwkvKiBmbHVzaCBjYWNoZSBhbmQgZW5hYmxlIE1BUEVOICovCisJc2V0X210cnJfcHJlcGFyZV9zYXZlKCZjdHh0KTsKKwlzZXRfbXRycl9jYWNoZV9kaXNhYmxlKCZjdHh0KTsKKworCS8qIFNhdmUgYWxsIENDUnMgbG9jYWxseSAqLworCWNjclswXSA9IGdldEN4ODYoQ1g4Nl9DQ1IwKTsKKwljY3JbMV0gPSBnZXRDeDg2KENYODZfQ0NSMSk7CisJY2NyWzJdID0gZ2V0Q3g4NihDWDg2X0NDUjIpOworCWNjclszXSA9IGN0eHQuY2NyMzsKKwljY3JbNF0gPSBnZXRDeDg2KENYODZfQ0NSNCk7CisJY2NyWzVdID0gZ2V0Q3g4NihDWDg2X0NDUjUpOworCWNjcls2XSA9IGdldEN4ODYoQ1g4Nl9DQ1I2KTsKKworCWlmIChjY3JbM10gJiAxKSB7CisJCWNjcmNbM10gPSAxOworCQlhcnIzX3Byb3RlY3RlZCA9IDE7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBTTU0gbW9kZSAoYml0IDEpLCBhY2Nlc3MgdG8gU01NIG1lbW9yeSAoYml0IDIpIGFuZAorCQkgKiBhY2Nlc3MgdG8gU01NIG1lbW9yeSB0aHJvdWdoIEFSUjMgKGJpdCA3KS4KKwkJICovCisJCWlmIChjY3JbMV0gJiAweDgwKSB7CisJCQljY3JbMV0gJj0gMHg3ZjsKKwkJCWNjcmNbMV0gfD0gMHg4MDsKKwkJfQorCQlpZiAoY2NyWzFdICYgMHgwNCkgeworCQkJY2NyWzFdICY9IDB4ZmI7CisJCQljY3JjWzFdIHw9IDB4MDQ7CisJCX0KKwkJaWYgKGNjclsxXSAmIDB4MDIpIHsKKwkJCWNjclsxXSAmPSAweGZkOworCQkJY2NyY1sxXSB8PSAweDAyOworCQl9CisJCWFycjNfcHJvdGVjdGVkID0gMDsKKwkJaWYgKGNjcls2XSAmIDB4MDIpIHsKKwkJCWNjcls2XSAmPSAweGZkOworCQkJY2NyY1s2XSA9IDE7CS8qIERpc2FibGUgd3JpdGUgcHJvdGVjdGlvbiBvZiBBUlIzICovCisJCQlzZXRDeDg2KENYODZfQ0NSNiwgY2NyWzZdKTsKKwkJfQorCQkvKiBEaXNhYmxlIEFSUjMuIFRoaXMgaXMgc2FmZSBub3cgdGhhdCB3ZSBkaXNhYmxlZCBTTU0uICovCisJCS8qIGN5cml4X3NldF9hcnJfdXAgKDMsIDAsIDAsIDAsIEZBTFNFKTsgKi8KKwl9CisJLyogSWYgd2UgY2hhbmdlZCBDQ1IxIGluIG1lbW9yeSwgY2hhbmdlIGl0IGluIHRoZSBwcm9jZXNzb3IsIHRvby4gKi8KKwlpZiAoY2NyY1sxXSkKKwkJc2V0Q3g4NihDWDg2X0NDUjEsIGNjclsxXSk7CisKKwkvKiBFbmFibGUgQVJSIHVzYWdlIGJ5IHRoZSBwcm9jZXNzb3IgKi8KKwlpZiAoIShjY3JbNV0gJiAweDIwKSkgeworCQljY3JbNV0gfD0gMHgyMDsKKwkJY2NyY1s1XSA9IDE7CisJCXNldEN4ODYoQ1g4Nl9DQ1I1LCBjY3JbNV0pOworCX0KKyNpZmRlZiBDT05GSUdfU01QCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwkJY2NyX3N0YXRlW2ldID0gY2NyW2ldOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWN5cml4X2dldF9hcnIoaSwKKwkJCSAgICAgICZhcnJfc3RhdGVbaV0uYmFzZSwgJmFycl9zdGF0ZVtpXS5zaXplLAorCQkJICAgICAgJmFycl9zdGF0ZVtpXS50eXBlKTsKKyNlbmRpZgorCisJc2V0X210cnJfZG9uZSgmY3R4dCk7CS8qIGZsdXNoIGNhY2hlIGFuZCBkaXNhYmxlIE1BUEVOICovCisKKwlpZiAoY2NyY1s1XSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibXRycjogQVJSIHVzYWdlIHdhcyBub3QgZW5hYmxlZCwgZW5hYmxlZCBtYW51YWxseVxuIik7CisJaWYgKGNjcmNbM10pCisJCXByaW50ayhLRVJOX0lORk8gIm10cnI6IEFSUjMgY2Fubm90IGJlIGNoYW5nZWRcbiIpOworLyoKKyAgICBpZiAoIGNjcmNbMV0gJiAweDgwKSBwcmludGsgKCJtdHJyOiBTTU0gbWVtb3J5IGFjY2VzcyB0aHJvdWdoIEFSUjMgZGlzYWJsZWRcbiIpOworICAgIGlmICggY2NyY1sxXSAmIDB4MDQpIHByaW50ayAoIm10cnI6IFNNTSBtZW1vcnkgYWNjZXNzIGRpc2FibGVkXG4iKTsKKyAgICBpZiAoIGNjcmNbMV0gJiAweDAyKSBwcmludGsgKCJtdHJyOiBTTU0gbW9kZSBkaXNhYmxlZFxuIik7CisqLworCWlmIChjY3JjWzZdKQorCQlwcmludGsoS0VSTl9JTkZPICJtdHJyOiBBUlIzIHdhcyB3cml0ZSBwcm90ZWN0ZWQsIHVucHJvdGVjdGVkXG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG10cnJfb3BzIGN5cml4X210cnJfb3BzID0geworCS52ZW5kb3IgICAgICAgICAgICA9IFg4Nl9WRU5ET1JfQ1lSSVgsCisvLwkuaW5pdCAgICAgICAgICAgICAgPSBjeXJpeF9hcnJfaW5pdCwKKwkuc2V0X2FsbAkgICA9IGN5cml4X3NldF9hbGwsCisJLnNldCAgICAgICAgICAgICAgID0gY3lyaXhfc2V0X2FyciwKKwkuZ2V0ICAgICAgICAgICAgICAgPSBjeXJpeF9nZXRfYXJyLAorCS5nZXRfZnJlZV9yZWdpb24gICA9IGN5cml4X2dldF9mcmVlX3JlZ2lvbiwKKwkudmFsaWRhdGVfYWRkX3BhZ2UgPSBnZW5lcmljX3ZhbGlkYXRlX2FkZF9wYWdlLAorCS5oYXZlX3dyY29tYiAgICAgICA9IHBvc2l0aXZlX2hhdmVfd3Jjb21iLAorfTsKKworaW50IF9faW5pdCBjeXJpeF9pbml0X210cnIodm9pZCkKK3sKKwlzZXRfbXRycl9vcHMoJmN5cml4X210cnJfb3BzKTsKKwlyZXR1cm4gMDsKK30KKworLy9hcmNoX2luaXRjYWxsKGN5cml4X2luaXRfbXRycik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Y2NlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYwpAQCAtMCwwICsxLDQxNyBAQAorLyogVGhpcyBvbmx5IGhhbmRsZXMgMzJiaXQgTVRSUiBvbiAzMmJpdCBob3N0cy4gVGhpcyBpcyBzdHJpY3RseSB3cm9uZworICAgYmVjYXVzZSBNVFJScyBjYW4gc3BhbiB1cHRvIDQwIGJpdHMgKDM2Yml0cyBvbiBtb3N0IG1vZGVybiB4ODYpICovIAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlICJtdHJyLmgiCisKK3N0cnVjdCBtdHJyX3N0YXRlIHsKKwlzdHJ1Y3QgbXRycl92YXJfcmFuZ2UgKnZhcl9yYW5nZXM7CisJbXRycl90eXBlIGZpeGVkX3Jhbmdlc1tOVU1fRklYRURfUkFOR0VTXTsKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZWQ7CisJbXRycl90eXBlIGRlZl90eXBlOworfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21wX2NoYW5nZXNfbWFzazsKK3N0YXRpYyBzdHJ1Y3QgbXRycl9zdGF0ZSBtdHJyX3N0YXRlID0ge307CisKKy8qICBHZXQgdGhlIE1TUiBwYWlyIHJlbGF0aW5nIHRvIGEgdmFyIHJhbmdlICAqLworc3RhdGljIHZvaWQgX19pbml0CitnZXRfbXRycl92YXJfcmFuZ2UodW5zaWduZWQgaW50IGluZGV4LCBzdHJ1Y3QgbXRycl92YXJfcmFuZ2UgKnZyKQoreworCXJkbXNyKE1UUlJwaHlzQmFzZV9NU1IoaW5kZXgpLCB2ci0+YmFzZV9sbywgdnItPmJhc2VfaGkpOworCXJkbXNyKE1UUlJwaHlzTWFza19NU1IoaW5kZXgpLCB2ci0+bWFza19sbywgdnItPm1hc2tfaGkpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK2dldF9maXhlZF9yYW5nZXMobXRycl90eXBlICogZnJzKQoreworCXVuc2lnbmVkIGludCAqcCA9ICh1bnNpZ25lZCBpbnQgKikgZnJzOworCWludCBpOworCisJcmRtc3IoTVRSUmZpeDY0S18wMDAwMF9NU1IsIHBbMF0sIHBbMV0pOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJcmRtc3IoTVRSUmZpeDE2S184MDAwMF9NU1IgKyBpLCBwWzIgKyBpICogMl0sIHBbMyArIGkgKiAyXSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcmRtc3IoTVRSUmZpeDRLX0MwMDAwX01TUiArIGksIHBbNiArIGkgKiAyXSwgcFs3ICsgaSAqIDJdKTsKK30KKworLyogIEdyYWIgYWxsIG9mIHRoZSBNVFJSIHN0YXRlIGZvciB0aGlzIENQVSBpbnRvICpzdGF0ZSAgKi8KK3ZvaWQgX19pbml0IGdldF9tdHJyX3N0YXRlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IG10cnJfdmFyX3JhbmdlICp2cnM7CisJdW5zaWduZWQgbG8sIGR1bW15OworCisJaWYgKCFtdHJyX3N0YXRlLnZhcl9yYW5nZXMpIHsKKwkJbXRycl9zdGF0ZS52YXJfcmFuZ2VzID0ga21hbGxvYyhudW1fdmFyX3JhbmdlcyAqIHNpemVvZiAoc3RydWN0IG10cnJfdmFyX3JhbmdlKSwgCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFtdHJyX3N0YXRlLnZhcl9yYW5nZXMpCisJCQlyZXR1cm47CisJfSAKKwl2cnMgPSBtdHJyX3N0YXRlLnZhcl9yYW5nZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Zhcl9yYW5nZXM7IGkrKykKKwkJZ2V0X210cnJfdmFyX3JhbmdlKGksICZ2cnNbaV0pOworCWdldF9maXhlZF9yYW5nZXMobXRycl9zdGF0ZS5maXhlZF9yYW5nZXMpOworCisJcmRtc3IoTVRSUmRlZlR5cGVfTVNSLCBsbywgZHVtbXkpOworCW10cnJfc3RhdGUuZGVmX3R5cGUgPSAobG8gJiAweGZmKTsKKwltdHJyX3N0YXRlLmVuYWJsZWQgPSAobG8gJiAweGMwMCkgPj4gMTA7Cit9CisKKy8qICBGcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBzdHJ1Y3QgbXRycl9zdGF0ZSAgKi8KK3ZvaWQgX19pbml0IGZpbmFsaXplX210cnJfc3RhdGUodm9pZCkKK3sKKwlpZiAobXRycl9zdGF0ZS52YXJfcmFuZ2VzKQorCQlrZnJlZShtdHJyX3N0YXRlLnZhcl9yYW5nZXMpOworCW10cnJfc3RhdGUudmFyX3JhbmdlcyA9IE5VTEw7Cit9CisKKy8qICBTb21lIEJJT1MncyBhcmUgZnVja2VkIGFuZCBkb24ndCBzZXQgYWxsIE1UUlJzIHRoZSBzYW1lISAgKi8KK3ZvaWQgX19pbml0IG10cnJfc3RhdGVfd2Fybih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9IHNtcF9jaGFuZ2VzX21hc2s7CisKKwlpZiAoIW1hc2spCisJCXJldHVybjsKKwlpZiAobWFzayAmIE1UUlJfQ0hBTkdFX01BU0tfRklYRUQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IHlvdXIgQ1BVcyBoYWQgaW5jb25zaXN0ZW50IGZpeGVkIE1UUlIgc2V0dGluZ3NcbiIpOworCWlmIChtYXNrICYgTVRSUl9DSEFOR0VfTUFTS19WQVJJQUJMRSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogeW91ciBDUFVzIGhhZCBpbmNvbnNpc3RlbnQgdmFyaWFibGUgTVRSUiBzZXR0aW5nc1xuIik7CisJaWYgKG1hc2sgJiBNVFJSX0NIQU5HRV9NQVNLX0RFRlRZUEUpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IHlvdXIgQ1BVcyBoYWQgaW5jb25zaXN0ZW50IE1UUlJkZWZUeXBlIHNldHRpbmdzXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJtdHJyOiBwcm9iYWJseSB5b3VyIEJJT1MgZG9lcyBub3Qgc2V0dXAgYWxsIENQVXMuXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJtdHJyOiBjb3JyZWN0ZWQgY29uZmlndXJhdGlvbi5cbiIpOworfQorCisvKiBEb2Vzbid0IGF0dGVtcHQgdG8gcGFzcyBhbiBlcnJvciBvdXQgdG8gTVRSUiB1c2VycworICAgYmVjYXVzZSBpdCdzIHF1aXRlIGNvbXBsaWNhdGVkIGluIHNvbWUgY2FzZXMgYW5kIHByb2JhYmx5IG5vdAorICAgd29ydGggaXQgYmVjYXVzZSB0aGUgYmVzdCBlcnJvciBoYW5kbGluZyBpcyB0byBpZ25vcmUgaXQuICovCit2b2lkIG10cnJfd3Jtc3IodW5zaWduZWQgbXNyLCB1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKQoreworCWlmICh3cm1zcl9zYWZlKG1zciwgYSwgYikgPCAwKQorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJNVFJSOiBDUFUgJXU6IFdyaXRpbmcgTVNSICV4IHRvICV4OiV4IGZhaWxlZFxuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgbXNyLCBhLCBiKTsKK30KKworaW50IGdlbmVyaWNfZ2V0X2ZyZWVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKQorLyogIFtTVU1NQVJZXSBHZXQgYSBmcmVlIE1UUlIuCisgICAgPGJhc2U+IFRoZSBzdGFydGluZyAoYmFzZSkgYWRkcmVzcyBvZiB0aGUgcmVnaW9uLgorICAgIDxzaXplPiBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSByZWdpb24uCisgICAgW1JFVFVSTlNdIFRoZSBpbmRleCBvZiB0aGUgcmVnaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgLTEgb24gZXJyb3IuCisqLworeworCWludCBpLCBtYXg7CisJbXRycl90eXBlIGx0eXBlOworCXVuc2lnbmVkIGxvbmcgbGJhc2U7CisJdW5zaWduZWQgbHNpemU7CisKKwltYXggPSBudW1fdmFyX3JhbmdlczsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKwkJbXRycl9pZi0+Z2V0KGksICZsYmFzZSwgJmxzaXplLCAmbHR5cGUpOworCQlpZiAobHNpemUgPT0gMCkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gLUVOT1NQQzsKK30KKwordm9pZCBnZW5lcmljX2dldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgKmJhc2UsCisJCSAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSwgbXRycl90eXBlICogdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFza19sbywgbWFza19oaSwgYmFzZV9sbywgYmFzZV9oaTsKKworCXJkbXNyKE1UUlJwaHlzTWFza19NU1IocmVnKSwgbWFza19sbywgbWFza19oaSk7CisJaWYgKChtYXNrX2xvICYgMHg4MDApID09IDApIHsKKwkJLyogIEludmFsaWQgKGkuZS4gZnJlZSkgcmFuZ2UgICovCisJCSpiYXNlID0gMDsKKwkJKnNpemUgPSAwOworCQkqdHlwZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlyZG1zcihNVFJScGh5c0Jhc2VfTVNSKHJlZyksIGJhc2VfbG8sIGJhc2VfaGkpOworCisJLyogV29yayBvdXQgdGhlIHNoaWZ0ZWQgYWRkcmVzcyBtYXNrLiAqLworCW1hc2tfbG8gPSBzaXplX29yX21hc2sgfCBtYXNrX2hpIDw8ICgzMiAtIFBBR0VfU0hJRlQpCisJICAgIHwgbWFza19sbyA+PiBQQUdFX1NISUZUOworCisJLyogVGhpcyB3b3JrcyBjb3JyZWN0bHkgaWYgc2l6ZSBpcyBhIHBvd2VyIG9mIHR3bywgaS5lLiBhCisJICAgY29udGlndW91cyByYW5nZS4gKi8KKwkqc2l6ZSA9IC1tYXNrX2xvOworCSpiYXNlID0gYmFzZV9oaSA8PCAoMzIgLSBQQUdFX1NISUZUKSB8IGJhc2VfbG8gPj4gUEFHRV9TSElGVDsKKwkqdHlwZSA9IGJhc2VfbG8gJiAweGZmOworfQorCitzdGF0aWMgaW50IHNldF9maXhlZF9yYW5nZXMobXRycl90eXBlICogZnJzKQoreworCXVuc2lnbmVkIGludCAqcCA9ICh1bnNpZ25lZCBpbnQgKikgZnJzOworCWludCBjaGFuZ2VkID0gRkFMU0U7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGxvLCBoaTsKKworCXJkbXNyKE1UUlJmaXg2NEtfMDAwMDBfTVNSLCBsbywgaGkpOworCWlmIChwWzBdICE9IGxvIHx8IHBbMV0gIT0gaGkpIHsKKwkJbXRycl93cm1zcihNVFJSZml4NjRLXzAwMDAwX01TUiwgcFswXSwgcFsxXSk7CisJCWNoYW5nZWQgPSBUUlVFOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJcmRtc3IoTVRSUmZpeDE2S184MDAwMF9NU1IgKyBpLCBsbywgaGkpOworCQlpZiAocFsyICsgaSAqIDJdICE9IGxvIHx8IHBbMyArIGkgKiAyXSAhPSBoaSkgeworCQkJbXRycl93cm1zcihNVFJSZml4MTZLXzgwMDAwX01TUiArIGksIHBbMiArIGkgKiAyXSwKKwkJCSAgICAgIHBbMyArIGkgKiAyXSk7CisJCQljaGFuZ2VkID0gVFJVRTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJcmRtc3IoTVRSUmZpeDRLX0MwMDAwX01TUiArIGksIGxvLCBoaSk7CisJCWlmIChwWzYgKyBpICogMl0gIT0gbG8gfHwgcFs3ICsgaSAqIDJdICE9IGhpKSB7CisJCQltdHJyX3dybXNyKE1UUlJmaXg0S19DMDAwMF9NU1IgKyBpLCBwWzYgKyBpICogMl0sCisJCQkgICAgICBwWzcgKyBpICogMl0pOworCQkJY2hhbmdlZCA9IFRSVUU7CisJCX0KKwl9CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8qICBTZXQgdGhlIE1TUiBwYWlyIHJlbGF0aW5nIHRvIGEgdmFyIHJhbmdlLiBSZXR1cm5zIFRSVUUgaWYKKyAgICBjaGFuZ2VzIGFyZSBtYWRlICAqLworc3RhdGljIGludCBzZXRfbXRycl92YXJfcmFuZ2VzKHVuc2lnbmVkIGludCBpbmRleCwgc3RydWN0IG10cnJfdmFyX3JhbmdlICp2cikKK3sKKwl1bnNpZ25lZCBpbnQgbG8sIGhpOworCWludCBjaGFuZ2VkID0gRkFMU0U7CisKKwlyZG1zcihNVFJScGh5c0Jhc2VfTVNSKGluZGV4KSwgbG8sIGhpKTsKKwlpZiAoKHZyLT5iYXNlX2xvICYgMHhmZmZmZjBmZlVMKSAhPSAobG8gJiAweGZmZmZmMGZmVUwpCisJICAgIHx8ICh2ci0+YmFzZV9oaSAmIDB4ZlVMKSAhPSAoaGkgJiAweGZVTCkpIHsKKwkJbXRycl93cm1zcihNVFJScGh5c0Jhc2VfTVNSKGluZGV4KSwgdnItPmJhc2VfbG8sIHZyLT5iYXNlX2hpKTsKKwkJY2hhbmdlZCA9IFRSVUU7CisJfQorCisJcmRtc3IoTVRSUnBoeXNNYXNrX01TUihpbmRleCksIGxvLCBoaSk7CisKKwlpZiAoKHZyLT5tYXNrX2xvICYgMHhmZmZmZjgwMFVMKSAhPSAobG8gJiAweGZmZmZmODAwVUwpCisJICAgIHx8ICh2ci0+bWFza19oaSAmIDB4ZlVMKSAhPSAoaGkgJiAweGZVTCkpIHsKKwkJbXRycl93cm1zcihNVFJScGh5c01hc2tfTVNSKGluZGV4KSwgdnItPm1hc2tfbG8sIHZyLT5tYXNrX2hpKTsKKwkJY2hhbmdlZCA9IFRSVUU7CisJfQorCXJldHVybiBjaGFuZ2VkOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfbXRycl9zdGF0ZSh1MzIgZGVmdHlwZV9sbywgdTMyIGRlZnR5cGVfaGkpCisvKiAgW1NVTU1BUlldIFNldCB0aGUgTVRSUiBzdGF0ZSBmb3IgdGhpcyBDUFUuCisgICAgPHN0YXRlPiBUaGUgTVRSUiBzdGF0ZSBpbmZvcm1hdGlvbiB0byByZWFkLgorICAgIDxjdHh0PiBTb21lIHJlbGV2YW50IENQVSBjb250ZXh0LgorICAgIFtOT1RFXSBUaGUgQ1BVIG11c3QgYWxyZWFkeSBiZSBpbiBhIHNhZmUgc3RhdGUgZm9yIE1UUlIgY2hhbmdlcy4KKyAgICBbUkVUVVJOU10gMCBpZiBubyBjaGFuZ2VzIG1hZGUsIGVsc2UgYSBtYXNrIGluZGljYXRpb24gd2hhdCB3YXMgY2hhbmdlZC4KKyovCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBjaGFuZ2VfbWFzayA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Zhcl9yYW5nZXM7IGkrKykKKwkJaWYgKHNldF9tdHJyX3Zhcl9yYW5nZXMoaSwgJm10cnJfc3RhdGUudmFyX3Jhbmdlc1tpXSkpCisJCQljaGFuZ2VfbWFzayB8PSBNVFJSX0NIQU5HRV9NQVNLX1ZBUklBQkxFOworCisJaWYgKHNldF9maXhlZF9yYW5nZXMobXRycl9zdGF0ZS5maXhlZF9yYW5nZXMpKQorCQljaGFuZ2VfbWFzayB8PSBNVFJSX0NIQU5HRV9NQVNLX0ZJWEVEOworCisJLyogIFNldF9tdHJyX3Jlc3RvcmUgcmVzdG9yZXMgdGhlIG9sZCB2YWx1ZSBvZiBNVFJSZGVmVHlwZSwKKwkgICBzbyB0byBzZXQgaXQgd2UgZmlkZGxlIHdpdGggdGhlIHNhdmVkIHZhbHVlICAqLworCWlmICgoZGVmdHlwZV9sbyAmIDB4ZmYpICE9IG10cnJfc3RhdGUuZGVmX3R5cGUKKwkgICAgfHwgKChkZWZ0eXBlX2xvICYgMHhjMDApID4+IDEwKSAhPSBtdHJyX3N0YXRlLmVuYWJsZWQpIHsKKwkJZGVmdHlwZV9sbyB8PSAobXRycl9zdGF0ZS5kZWZfdHlwZSB8IG10cnJfc3RhdGUuZW5hYmxlZCA8PCAxMCk7CisJCWNoYW5nZV9tYXNrIHw9IE1UUlJfQ0hBTkdFX01BU0tfREVGVFlQRTsKKwl9CisKKwlyZXR1cm4gY2hhbmdlX21hc2s7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3I0ID0gMDsKK3N0YXRpYyB1MzIgZGVmdHlwZV9sbywgZGVmdHlwZV9oaTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2V0X2F0b21pY2l0eV9sb2NrKTsKKworLyoKKyAqIFNpbmNlIHdlIGFyZSBkaXNhYmxpbmcgdGhlIGNhY2hlIGRvbid0IGFsbG93IGFueSBpbnRlcnJ1cHRzIC0gdGhleQorICogd291bGQgcnVuIGV4dHJlbWVseSBzbG93IGFuZCB3b3VsZCBvbmx5IGluY3JlYXNlIHRoZSBwYWluLiAgVGhlIGNhbGxlciBtdXN0CisgKiBlbnN1cmUgdGhhdCBsb2NhbCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhbmQgYXJlIHJlZW5hYmxlZCBhZnRlciBwb3N0X3NldCgpCisgKiBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKworc3RhdGljIHZvaWQgcHJlcGFyZV9zZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNyMDsKKworCS8qICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgaWRlYWwsIHNpbmNlIHRoZSBjYWNoZSBpcyBvbmx5IGZsdXNoZWQvZGlzYWJsZWQKKwkgICBmb3IgdGhpcyBDUFUgd2hpbGUgdGhlIE1UUlJzIGFyZSBjaGFuZ2VkLCBidXQgY2hhbmdpbmcgdGhpcyByZXF1aXJlcworCSAgIG1vcmUgaW52YXNpdmUgY2hhbmdlcyB0byB0aGUgd2F5IHRoZSBrZXJuZWwgYm9vdHMgICovCisKKwlzcGluX2xvY2soJnNldF9hdG9taWNpdHlfbG9jayk7CisKKwkvKiAgRW50ZXIgdGhlIG5vLWZpbGwgKENEPTEsIE5XPTApIGNhY2hlIG1vZGUgYW5kIGZsdXNoIGNhY2hlcy4gKi8KKwljcjAgPSByZWFkX2NyMCgpIHwgMHg0MDAwMDAwMDsJLyogc2V0IENEIGZsYWcgKi8KKwl3cml0ZV9jcjAoY3IwKTsKKwl3YmludmQoKTsKKworCS8qICBTYXZlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykgICovCisJaWYgKCBjcHVfaGFzX3BnZSApIHsKKwkJY3I0ID0gcmVhZF9jcjQoKTsKKwkJd3JpdGVfY3I0KGNyNCAmIH5YODZfQ1I0X1BHRSk7CisJfQorCisJLyogRmx1c2ggYWxsIFRMQnMgdmlhIGEgbW92ICVjcjMsICVyZWc7IG1vdiAlcmVnLCAlY3IzICovCisJX19mbHVzaF90bGIoKTsKKworCS8qICBTYXZlIE1UUlIgc3RhdGUgKi8KKwlyZG1zcihNVFJSZGVmVHlwZV9NU1IsIGRlZnR5cGVfbG8sIGRlZnR5cGVfaGkpOworCisJLyogIERpc2FibGUgTVRSUnMsIGFuZCBzZXQgdGhlIGRlZmF1bHQgdHlwZSB0byB1bmNhY2hlZCAgKi8KKwltdHJyX3dybXNyKE1UUlJkZWZUeXBlX01TUiwgZGVmdHlwZV9sbyAmIDB4ZjMwMFVMLCBkZWZ0eXBlX2hpKTsKK30KKworc3RhdGljIHZvaWQgcG9zdF9zZXQodm9pZCkKK3sKKwkvKiAgRmx1c2ggVExCcyAobm8gbmVlZCB0byBmbHVzaCBjYWNoZXMgLSB0aGV5IGFyZSBkaXNhYmxlZCkgICovCisJX19mbHVzaF90bGIoKTsKKworCS8qIEludGVsIChQNikgc3RhbmRhcmQgTVRSUnMgKi8KKwltdHJyX3dybXNyKE1UUlJkZWZUeXBlX01TUiwgZGVmdHlwZV9sbywgZGVmdHlwZV9oaSk7CisJCQorCS8qICBFbmFibGUgY2FjaGVzICAqLworCXdyaXRlX2NyMChyZWFkX2NyMCgpICYgMHhiZmZmZmZmZik7CisKKwkvKiAgUmVzdG9yZSB2YWx1ZSBvZiBDUjQgICovCisJaWYgKCBjcHVfaGFzX3BnZSApCisJCXdyaXRlX2NyNChjcjQpOworCXNwaW5fdW5sb2NrKCZzZXRfYXRvbWljaXR5X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX3NldF9hbGwodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2ssIGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcHJlcGFyZV9zZXQoKTsKKworCS8qIEFjdHVhbGx5IHNldCB0aGUgc3RhdGUgKi8KKwltYXNrID0gc2V0X210cnJfc3RhdGUoZGVmdHlwZV9sbyxkZWZ0eXBlX2hpKTsKKworCXBvc3Rfc2V0KCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyogIFVzZSB0aGUgYXRvbWljIGJpdG9wcyB0byB1cGRhdGUgdGhlIGdsb2JhbCBtYXNrICAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHNpemVvZiBtYXNrICogODsgKytjb3VudCkgeworCQlpZiAobWFzayAmIDB4MDEpCisJCQlzZXRfYml0KGNvdW50LCAmc21wX2NoYW5nZXNfbWFzayk7CisJCW1hc2sgPj49IDE7CisJfQorCQorfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX3NldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSkKKy8qICBbU1VNTUFSWV0gU2V0IHZhcmlhYmxlIE1UUlIgcmVnaXN0ZXIgb24gdGhlIGxvY2FsIENQVS4KKyAgICA8cmVnPiBUaGUgcmVnaXN0ZXIgdG8gc2V0LgorICAgIDxiYXNlPiBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24uCisgICAgPHNpemU+IFRoZSBzaXplIG9mIHRoZSByZWdpb24uIElmIHRoaXMgaXMgMCB0aGUgcmVnaW9uIGlzIGRpc2FibGVkLgorICAgIDx0eXBlPiBUaGUgdHlwZSBvZiB0aGUgcmVnaW9uLgorICAgIDxkb19zYWZlPiBJZiBUUlVFLCBkbyB0aGUgY2hhbmdlIHNhZmVseS4gSWYgRkFMU0UsIHNhZmV0eSBtZWFzdXJlcyBzaG91bGQKKyAgICBiZSBkb25lIGV4dGVybmFsbHkuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcHJlcGFyZV9zZXQoKTsKKworCWlmIChzaXplID09IDApIHsKKwkJLyogVGhlIGludmFsaWQgYml0IGlzIGtlcHQgaW4gdGhlIG1hc2ssIHNvIHdlIHNpbXBseSBjbGVhciB0aGUKKwkJICAgcmVsZXZhbnQgbWFzayByZWdpc3RlciB0byBkaXNhYmxlIGEgcmFuZ2UuICovCisJCW10cnJfd3Jtc3IoTVRSUnBoeXNNYXNrX01TUihyZWcpLCAwLCAwKTsKKwl9IGVsc2UgeworCQltdHJyX3dybXNyKE1UUlJwaHlzQmFzZV9NU1IocmVnKSwgYmFzZSA8PCBQQUdFX1NISUZUIHwgdHlwZSwKKwkJICAgICAgKGJhc2UgJiBzaXplX2FuZF9tYXNrKSA+PiAoMzIgLSBQQUdFX1NISUZUKSk7CisJCW10cnJfd3Jtc3IoTVRSUnBoeXNNYXNrX01TUihyZWcpLCAtc2l6ZSA8PCBQQUdFX1NISUZUIHwgMHg4MDAsCisJCSAgICAgICgtc2l6ZSAmIHNpemVfYW5kX21hc2spID4+ICgzMiAtIFBBR0VfU0hJRlQpKTsKKwl9CisKKwlwb3N0X3NldCgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworaW50IGdlbmVyaWNfdmFsaWRhdGVfYWRkX3BhZ2UodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXVuc2lnbmVkIGxvbmcgbGJhc2UsIGxhc3Q7CisKKwkvKiAgRm9yIEludGVsIFBQcm8gc3RlcHBpbmcgPD0gNywgbXVzdCBiZSA0IE1pQiBhbGlnbmVkIAorCSAgICBhbmQgbm90IHRvdWNoIDB4NzAwMDAwMDAtPjB4NzAwM0ZGRkYgKi8KKwlpZiAoaXNfY3B1KElOVEVMKSAmJiBib290X2NwdV9kYXRhLng4NiA9PSA2ICYmCisJICAgIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID09IDEgJiYKKwkgICAgYm9vdF9jcHVfZGF0YS54ODZfbWFzayA8PSA3KSB7CisJCWlmIChiYXNlICYgKCgxIDw8ICgyMiAtIFBBR0VfU0hJRlQpKSAtIDEpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiBiYXNlKDB4JWx4MDAwKSBpcyBub3QgNCBNaUIgYWxpZ25lZFxuIiwgYmFzZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoIShiYXNlICsgc2l6ZSA8IDB4NzAwMDAwMDAgfHwgYmFzZSA+IDB4NzAwM0ZGRkYpICYmCisJCSAgICAodHlwZSA9PSBNVFJSX1RZUEVfV1JDT01CCisJCSAgICAgfHwgdHlwZSA9PSBNVFJSX1RZUEVfV1JCQUNLKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogd3JpdGFibGUgbXRyciBiZXR3ZWVuIDB4NzAwMDAwMDAgYW5kIDB4NzAwM0ZGRkYgbWF5IGhhbmcgdGhlIENQVS5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoYmFzZSArIHNpemUgPCAweDEwMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiBjYW5ub3Qgc2V0IHJlZ2lvbiBiZWxvdyAxIE1pQiAoMHglbHgwMDAsMHglbHgwMDApXG4iLAorCQkgICAgICAgYmFzZSwgc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiAgQ2hlY2sgdXBwZXIgYml0cyBvZiBiYXNlIGFuZCBsYXN0IGFyZSBlcXVhbCBhbmQgbG93ZXIgYml0cyBhcmUgMAorCSAgICBmb3IgYmFzZSBhbmQgMSBmb3IgbGFzdCAgKi8KKwlsYXN0ID0gYmFzZSArIHNpemUgLSAxOworCWZvciAobGJhc2UgPSBiYXNlOyAhKGxiYXNlICYgMSkgJiYgKGxhc3QgJiAxKTsKKwkgICAgIGxiYXNlID0gbGJhc2UgPj4gMSwgbGFzdCA9IGxhc3QgPj4gMSkgOworCWlmIChsYmFzZSAhPSBsYXN0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IGJhc2UoMHglbHgwMDApIGlzIG5vdCBhbGlnbmVkIG9uIGEgc2l6ZSgweCVseDAwMCkgYm91bmRhcnlcbiIsCisJCSAgICAgICBiYXNlLCBzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZ2VuZXJpY19oYXZlX3dyY29tYih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY29uZmlnLCBkdW1teTsKKwlyZG1zcihNVFJSY2FwX01TUiwgY29uZmlnLCBkdW1teSk7CisJcmV0dXJuIChjb25maWcgJiAoMSA8PCAxMCkpOworfQorCitpbnQgcG9zaXRpdmVfaGF2ZV93cmNvbWIodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworLyogZ2VuZXJpYyBzdHJ1Y3R1cmUuLi4KKyAqLworc3RydWN0IG10cnJfb3BzIGdlbmVyaWNfbXRycl9vcHMgPSB7CisJLnVzZV9pbnRlbF9pZiAgICAgID0gMSwKKwkuc2V0X2FsbAkgICA9IGdlbmVyaWNfc2V0X2FsbCwKKwkuZ2V0ICAgICAgICAgICAgICAgPSBnZW5lcmljX2dldF9tdHJyLAorCS5nZXRfZnJlZV9yZWdpb24gICA9IGdlbmVyaWNfZ2V0X2ZyZWVfcmVnaW9uLAorCS5zZXQgICAgICAgICAgICAgICA9IGdlbmVyaWNfc2V0X210cnIsCisJLnZhbGlkYXRlX2FkZF9wYWdlID0gZ2VuZXJpY192YWxpZGF0ZV9hZGRfcGFnZSwKKwkuaGF2ZV93cmNvbWIgICAgICAgPSBnZW5lcmljX2hhdmVfd3Jjb21iLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvaWYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTIzZTBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9pZi5jCkBAIC0wLDAgKzEsMzc0IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBMSU5FX1NJWkUgODAKKworI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSAibXRyci5oIgorCisvKiBSRUQtUEVOOiB0aGlzIGlzIGFjY2Vzc2VkIHdpdGhvdXQgYW55IGxvY2tpbmcgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgKnVzYWdlX3RhYmxlOworCisKKyNkZWZpbmUgRklMRV9GQ09VTlQoZikgKCgoc3RydWN0IHNlcV9maWxlICopKChmKS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGUpCisKK3N0YXRpYyBjaGFyICptdHJyX3N0cmluZ3NbTVRSUl9OVU1fVFlQRVNdID0KK3sKKyAgICAidW5jYWNoYWJsZSIsICAgICAgICAgICAgICAgLyogMCAqLworICAgICJ3cml0ZS1jb21iaW5pbmciLCAgICAgICAgICAvKiAxICovCisgICAgIj8iLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgKi8KKyAgICAiPyIsICAgICAgICAgICAgICAgICAgICAgICAgLyogMyAqLworICAgICJ3cml0ZS10aHJvdWdoIiwgICAgICAgICAgICAvKiA0ICovCisgICAgIndyaXRlLXByb3RlY3QiLCAgICAgICAgICAgIC8qIDUgKi8KKyAgICAid3JpdGUtYmFjayIsICAgICAgICAgICAgICAgLyogNiAqLworfTsKKworY2hhciAqbXRycl9hdHRyaWJfdG9fc3RyKGludCB4KQoreworCXJldHVybiAoeCA8PSA2KSA/IG10cnJfc3RyaW5nc1t4XSA6ICI/IjsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyBpbnQKK210cnJfZmlsZV9hZGQodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUsCisJICAgICAgdW5zaWduZWQgaW50IHR5cGUsIGNoYXIgaW5jcmVtZW50LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IHBhZ2UpCit7CisJaW50IHJlZywgbWF4OworCXVuc2lnbmVkIGludCAqZmNvdW50ID0gRklMRV9GQ09VTlQoZmlsZSk7IAorCisJbWF4ID0gbnVtX3Zhcl9yYW5nZXM7CisJaWYgKGZjb3VudCA9PSBOVUxMKSB7CisJCWZjb3VudCA9IGttYWxsb2MobWF4ICogc2l6ZW9mICpmY291bnQsIEdGUF9LRVJORUwpOworCQlpZiAoIWZjb3VudCkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1zZXQoZmNvdW50LCAwLCBtYXggKiBzaXplb2YgKmZjb3VudCk7CisJCUZJTEVfRkNPVU5UKGZpbGUpID0gZmNvdW50OworCX0KKwlpZiAoIXBhZ2UpIHsKKwkJaWYgKChiYXNlICYgKFBBR0VfU0laRSAtIDEpKSB8fCAoc2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYmFzZSA+Pj0gUEFHRV9TSElGVDsKKwkJc2l6ZSA+Pj0gUEFHRV9TSElGVDsKKwl9CisJcmVnID0gbXRycl9hZGRfcGFnZShiYXNlLCBzaXplLCB0eXBlLCAxKTsKKwlpZiAocmVnID49IDApCisJCSsrZmNvdW50W3JlZ107CisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIGludAorbXRycl9maWxlX2RlbCh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IHBhZ2UpCit7CisJaW50IHJlZzsKKwl1bnNpZ25lZCBpbnQgKmZjb3VudCA9IEZJTEVfRkNPVU5UKGZpbGUpOworCisJaWYgKCFwYWdlKSB7CisJCWlmICgoYmFzZSAmIChQQUdFX1NJWkUgLSAxKSkgfHwgKHNpemUgJiAoUEFHRV9TSVpFIC0gMSkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJhc2UgPj49IFBBR0VfU0hJRlQ7CisJCXNpemUgPj49IFBBR0VfU0hJRlQ7CisJfQorCXJlZyA9IG10cnJfZGVsX3BhZ2UoLTEsIGJhc2UsIHNpemUpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCWlmIChmY291bnQgPT0gTlVMTCkKKwkJcmV0dXJuIHJlZzsKKwlpZiAoZmNvdW50W3JlZ10gPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwktLWZjb3VudFtyZWddOworCXJldHVybiByZWc7Cit9CisKKy8qIFJFRC1QRU46IHNlcV9maWxlIGNhbiBzZWVrIG5vdy4gdGhpcyBpcyBpZ25vcmVkLiAqLworc3RhdGljIHNzaXplX3QKK210cnJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqIHBwb3MpCisvKiAgRm9ybWF0IG9mIGNvbnRyb2wgbGluZToKKyAgICAiYmFzZT0lTHggc2l6ZT0lTHggdHlwZT0lcyIgICAgIE9SOgorICAgICJkaXNhYmxlPSVkIgorKi8KK3sKKwlpbnQgaSwgZXJyOworCXVuc2lnbmVkIGxvbmcgcmVnOworCXVuc2lnbmVkIGxvbmcgbG9uZyBiYXNlLCBzaXplOworCWNoYXIgKnB0cjsKKwljaGFyIGxpbmVbTElORV9TSVpFXTsKKwlzaXplX3QgbGluZWxlbjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtc2V0KGxpbmUsIDAsIExJTkVfU0laRSk7CisJaWYgKGxlbiA+IExJTkVfU0laRSkKKwkJbGVuID0gTElORV9TSVpFOworCWlmIChjb3B5X2Zyb21fdXNlcihsaW5lLCBidWYsIGxlbiAtIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlsaW5lbGVuID0gc3RybGVuKGxpbmUpOworCXB0ciA9IGxpbmUgKyBsaW5lbGVuIC0gMTsKKwlpZiAobGluZWxlbiAmJiAqcHRyID09ICdcbicpCisJCSpwdHIgPSAnXDAnOworCWlmICghc3RybmNtcChsaW5lLCAiZGlzYWJsZT0iLCA4KSkgeworCQlyZWcgPSBzaW1wbGVfc3RydG91bChsaW5lICsgOCwgJnB0ciwgMCk7CisJCWVyciA9IG10cnJfZGVsX3BhZ2UocmVnLCAwLCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlyZXR1cm4gbGVuOworCX0KKwlpZiAoc3RybmNtcChsaW5lLCAiYmFzZT0iLCA1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYmFzZSA9IHNpbXBsZV9zdHJ0b3VsbChsaW5lICsgNSwgJnB0ciwgMCk7CisJZm9yICg7IGlzc3BhY2UoKnB0cik7ICsrcHRyKSA7CisJaWYgKHN0cm5jbXAocHRyLCAic2l6ZT0iLCA1KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbChwdHIgKyA1LCAmcHRyLCAwKTsKKwlpZiAoKGJhc2UgJiAweGZmZikgfHwgKHNpemUgJiAweGZmZikpCisJCXJldHVybiAtRUlOVkFMOworCWZvciAoOyBpc3NwYWNlKCpwdHIpOyArK3B0cikgOworCWlmIChzdHJuY21wKHB0ciwgInR5cGU9IiwgNSkpCisJCXJldHVybiAtRUlOVkFMOworCXB0ciArPSA1OworCWZvciAoOyBpc3NwYWNlKCpwdHIpOyArK3B0cikgOworCWZvciAoaSA9IDA7IGkgPCBNVFJSX05VTV9UWVBFUzsgKytpKSB7CisJCWlmIChzdHJjbXAocHRyLCBtdHJyX3N0cmluZ3NbaV0pKQorCQkJY29udGludWU7CisJCWJhc2UgPj49IFBBR0VfU0hJRlQ7CisJCXNpemUgPj49IFBBR0VfU0hJRlQ7CisJCWVyciA9CisJCSAgICBtdHJyX2FkZF9wYWdlKCh1bnNpZ25lZCBsb25nKSBiYXNlLCAodW5zaWduZWQgbG9uZykgc2l6ZSwgaSwKKwkJCQkgIDEpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCXJldHVybiBsZW47CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50CittdHJyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgX19hcmcpCit7CisJaW50IGVycjsKKwltdHJyX3R5cGUgdHlwZTsKKwlzdHJ1Y3QgbXRycl9zZW50cnkgc2VudHJ5OworCXN0cnVjdCBtdHJyX2dlbnRyeSBnZW50cnk7CisJdm9pZCBfX3VzZXIgKmFyZyA9ICh2b2lkIF9fdXNlciAqKSBfX2FyZzsKKworCXN3aXRjaCAoY21kKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJY2FzZSBNVFJSSU9DX0FERF9FTlRSWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZW50cnksIGFyZywgc2l6ZW9mIHNlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZXJyID0KKwkJICAgIG10cnJfZmlsZV9hZGQoc2VudHJ5LmJhc2UsIHNlbnRyeS5zaXplLCBzZW50cnkudHlwZSwgMSwKKwkJCQkgIGZpbGUsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19TRVRfRU5UUlk6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2VudHJ5LCBhcmcsIHNpemVvZiBzZW50cnkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVyciA9IG10cnJfYWRkKHNlbnRyeS5iYXNlLCBzZW50cnkuc2l6ZSwgc2VudHJ5LnR5cGUsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19ERUxfRU5UUlk6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2VudHJ5LCBhcmcsIHNpemVvZiBzZW50cnkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVyciA9IG10cnJfZmlsZV9kZWwoc2VudHJ5LmJhc2UsIHNlbnRyeS5zaXplLCBmaWxlLCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIE1UUlJJT0NfS0lMTF9FTlRSWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZW50cnksIGFyZywgc2l6ZW9mIHNlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZXJyID0gbXRycl9kZWwoLTEsIHNlbnRyeS5iYXNlLCBzZW50cnkuc2l6ZSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBNVFJSSU9DX0dFVF9FTlRSWToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZnZW50cnksIGFyZywgc2l6ZW9mIGdlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGdlbnRyeS5yZWdudW0gPj0gbnVtX3Zhcl9yYW5nZXMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbXRycl9pZi0+Z2V0KGdlbnRyeS5yZWdudW0sICZnZW50cnkuYmFzZSwgJmdlbnRyeS5zaXplLCAmdHlwZSk7CisKKwkJLyogSGlkZSBlbnRyaWVzIHRoYXQgZ28gYWJvdmUgNEdCICovCisJCWlmIChnZW50cnkuYmFzZSArIGdlbnRyeS5zaXplID4gMHgxMDAwMDAKKwkJICAgIHx8IGdlbnRyeS5zaXplID09IDB4MTAwMDAwKQorCQkJZ2VudHJ5LmJhc2UgPSBnZW50cnkuc2l6ZSA9IGdlbnRyeS50eXBlID0gMDsKKwkJZWxzZSB7CisJCQlnZW50cnkuYmFzZSA8PD0gUEFHRV9TSElGVDsKKwkJCWdlbnRyeS5zaXplIDw8PSBQQUdFX1NISUZUOworCQkJZ2VudHJ5LnR5cGUgPSB0eXBlOworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZnZW50cnksIHNpemVvZiBnZW50cnkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19BRERfUEFHRV9FTlRSWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZW50cnksIGFyZywgc2l6ZW9mIHNlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZXJyID0KKwkJICAgIG10cnJfZmlsZV9hZGQoc2VudHJ5LmJhc2UsIHNlbnRyeS5zaXplLCBzZW50cnkudHlwZSwgMSwKKwkJCQkgIGZpbGUsIDEpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19TRVRfUEFHRV9FTlRSWToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZW50cnksIGFyZywgc2l6ZW9mIHNlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZXJyID0gbXRycl9hZGRfcGFnZShzZW50cnkuYmFzZSwgc2VudHJ5LnNpemUsIHNlbnRyeS50eXBlLCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIE1UUlJJT0NfREVMX1BBR0VfRU5UUlk6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2VudHJ5LCBhcmcsIHNpemVvZiBzZW50cnkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVyciA9IG10cnJfZmlsZV9kZWwoc2VudHJ5LmJhc2UsIHNlbnRyeS5zaXplLCBmaWxlLCAxKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwljYXNlIE1UUlJJT0NfS0lMTF9QQUdFX0VOVFJZOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNlbnRyeSwgYXJnLCBzaXplb2Ygc2VudHJ5KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQllcnIgPSBtdHJyX2RlbF9wYWdlKC0xLCBzZW50cnkuYmFzZSwgc2VudHJ5LnNpemUpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgTVRSUklPQ19HRVRfUEFHRV9FTlRSWToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZnZW50cnksIGFyZywgc2l6ZW9mIGdlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGdlbnRyeS5yZWdudW0gPj0gbnVtX3Zhcl9yYW5nZXMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbXRycl9pZi0+Z2V0KGdlbnRyeS5yZWdudW0sICZnZW50cnkuYmFzZSwgJmdlbnRyeS5zaXplLCAmdHlwZSk7CisJCWdlbnRyeS50eXBlID0gdHlwZTsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJmdlbnRyeSwgc2l6ZW9mIGdlbnRyeSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittdHJyX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgaSwgbWF4OworCXVuc2lnbmVkIGludCAqZmNvdW50ID0gRklMRV9GQ09VTlQoZmlsZSk7CisKKwlpZiAoZmNvdW50ICE9IE5VTEwpIHsKKwkJbWF4ID0gbnVtX3Zhcl9yYW5nZXM7CisJCWZvciAoaSA9IDA7IGkgPCBtYXg7ICsraSkgeworCQkJd2hpbGUgKGZjb3VudFtpXSA+IDApIHsKKwkJCQltdHJyX2RlbChpLCAwLCAwKTsKKwkJCQktLWZjb3VudFtpXTsKKwkJCX0KKwkJfQorCQlrZnJlZShmY291bnQpOworCQlGSUxFX0ZDT1VOVChmaWxlKSA9IE5VTEw7CisJfQorCXJldHVybiBzaW5nbGVfcmVsZWFzZShpbm8sIGZpbGUpOworfQorCitzdGF0aWMgaW50IG10cnJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CisKK3N0YXRpYyBpbnQgbXRycl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghbXRycl9pZikgCisJCXJldHVybiAtRUlPOworCWlmICghbXRycl9pZi0+Z2V0KSAKKwkJcmV0dXJuIC1FTlhJTzsgCisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIG10cnJfc2VxX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtdHJyX2ZvcHMgPSB7CisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSBtdHJyX29wZW4sIAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLndyaXRlICAgPSBtdHJyX3dyaXRlLAorCS5pb2N0bCAgID0gbXRycl9pb2N0bCwKKwkucmVsZWFzZSA9IG10cnJfY2xvc2UsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2Nfcm9vdF9tdHJyOworCisKK3N0YXRpYyBpbnQgbXRycl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCWNoYXIgZmFjdG9yOworCWludCBpLCBtYXgsIGxlbjsKKwltdHJyX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlsZW4gPSAwOworCW1heCA9IG51bV92YXJfcmFuZ2VzOworCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQltdHJyX2lmLT5nZXQoaSwgJmJhc2UsICZzaXplLCAmdHlwZSk7CisJCWlmIChzaXplID09IDApCisJCQl1c2FnZV90YWJsZVtpXSA9IDA7CisJCWVsc2UgeworCQkJaWYgKHNpemUgPCAoMHgxMDAwMDAgPj4gUEFHRV9TSElGVCkpIHsKKwkJCQkvKiBsZXNzIHRoYW4gMU1CICovCisJCQkJZmFjdG9yID0gJ0snOworCQkJCXNpemUgPDw9IFBBR0VfU0hJRlQgLSAxMDsKKwkJCX0gZWxzZSB7CisJCQkJZmFjdG9yID0gJ00nOworCQkJCXNpemUgPj49IDIwIC0gUEFHRV9TSElGVDsKKwkJCX0KKwkJCS8qIFJFRC1QRU46IGJhc2UgY2FuIGJlID4gMzJiaXQgKi8gCisJCQlsZW4gKz0gc2VxX3ByaW50ZihzZXEsIAorCQkJCSAgICJyZWclMDJpOiBiYXNlPTB4JTA1bHgwMDAgKCU0bGlNQiksIHNpemU9JTRpJWNCOiAlcywgY291bnQ9JWRcbiIsCisJCQkgICAgIGksIGJhc2UsIGJhc2UgPj4gKDIwIC0gUEFHRV9TSElGVCksIHNpemUsIGZhY3RvciwKKwkJCSAgICAgbXRycl9hdHRyaWJfdG9fc3RyKHR5cGUpLCB1c2FnZV90YWJsZVtpXSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG10cnJfaWZfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZib290X2NwdV9kYXRhOworCisJaWYgKCghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9NVFJSKSkgJiYKKwkgICAgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0s2X01UUlIpKSAmJgorCSAgICAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSKSkgJiYKKwkgICAgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0NFTlRBVVJfTUNSKSkpCisJCXJldHVybiAtRU5PREVWOworCisJcHJvY19yb290X210cnIgPQorCSAgICBjcmVhdGVfcHJvY19lbnRyeSgibXRyciIsIFNfSVdVU1IgfCBTX0lSVUdPLCAmcHJvY19yb290KTsKKwlpZiAocHJvY19yb290X210cnIpIHsKKwkJcHJvY19yb290X210cnItPm93bmVyID0gVEhJU19NT0RVTEU7CisJCXByb2Nfcm9vdF9tdHJyLT5wcm9jX2ZvcHMgPSAmbXRycl9mb3BzOworCX0KKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChtdHJyX2lmX2luaXQpOworI2VuZGlmCQkJLyogIENPTkZJR19QUk9DX0ZTICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjY3YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMKQEAgLTAsMCArMSw2OTMgQEAKKy8qICBHZW5lcmljIE1UUlIgKE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVyKSBkcml2ZXIuCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCAgUmljaGFyZCBHb29jaAorICAgIENvcHlyaWdodCAoYykgMjAwMgkgICAgIFBhdHJpY2sgTW9jaGVsCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICAgIFJpY2hhcmQgR29vY2ggbWF5IGJlIHJlYWNoZWQgYnkgZW1haWwgYXQgIHJnb29jaEBhdG5mLmNzaXJvLmF1CisgICAgVGhlIHBvc3RhbCBhZGRyZXNzIGlzOgorICAgICAgUmljaGFyZCBHb29jaCwgYy9vIEFUTkYsIFAuIE8uIEJveCA3NiwgRXBwaW5nLCBOLlMuVy4sIDIxMjEsIEF1c3RyYWxpYS4KKworICAgIFNvdXJjZTogIlBlbnRpdW0gUHJvIEZhbWlseSBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzOgorICAgIE9wZXJhdGluZyBTeXN0ZW0gV3JpdGVyJ3MgR3VpZGUiIChJbnRlbCBkb2N1bWVudCBudW1iZXIgMjQyNjkyKSwKKyAgICBzZWN0aW9uIDExLjExLjcKKworICAgIFRoaXMgd2FzIGNsZWFuZWQgYW5kIG1hZGUgcmVhZGFibGUgYnkgUGF0cmljayBNb2NoZWwgPG1vY2hlbEBvc2RsLm9yZz4gCisgICAgb24gNi03IE1hcmNoIDIwMDIuIAorICAgIFNvdXJjZTogSW50ZWwgQXJjaGl0ZWN0dXJlIFNvZnR3YXJlIERldmVsb3BlcnMgTWFudWFsLCBWb2x1bWUgMzogCisgICAgU3lzdGVtIFByb2dyYW1taW5nIEd1aWRlOyBTZWN0aW9uIDkuMTEuICgxOTk3IGVkaXRpb24gLSBQUHJvKS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisKKyNpbmNsdWRlIDxhc20vbXRyci5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgIm10cnIuaCIKKworI2RlZmluZSBNVFJSX1ZFUlNJT04gICAgICAgICAgICAiMi4wICgyMDAyMDUxOSkiCisKK3UzMiBudW1fdmFyX3JhbmdlcyA9IDA7CisKK3Vuc2lnbmVkIGludCAqdXNhZ2VfdGFibGU7CitzdGF0aWMgREVDTEFSRV9NVVRFWChtYWluX2xvY2spOworCit1MzIgc2l6ZV9vcl9tYXNrLCBzaXplX2FuZF9tYXNrOworCitzdGF0aWMgc3RydWN0IG10cnJfb3BzICogbXRycl9vcHNbWDg2X1ZFTkRPUl9OVU1dID0ge307CisKK3N0cnVjdCBtdHJyX29wcyAqIG10cnJfaWYgPSBOVUxMOworCitzdGF0aWMgdm9pZCBzZXRfbXRycih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSk7CisKK2V4dGVybiBpbnQgYXJyM19wcm90ZWN0ZWQ7CisKK3ZvaWQgc2V0X210cnJfb3BzKHN0cnVjdCBtdHJyX29wcyAqIG9wcykKK3sKKwlpZiAob3BzLT52ZW5kb3IgJiYgb3BzLT52ZW5kb3IgPCBYODZfVkVORE9SX05VTSkKKwkJbXRycl9vcHNbb3BzLT52ZW5kb3JdID0gb3BzOworfQorCisvKiAgUmV0dXJucyBub24temVybyBpZiB3ZSBoYXZlIHRoZSB3cml0ZS1jb21iaW5pbmcgbWVtb3J5IHR5cGUgICovCitzdGF0aWMgaW50IGhhdmVfd3Jjb21iKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwkKKwlpZiAoKGRldiA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgsIE5VTEwpKSAhPSBOVUxMKSB7CisJCS8qIFNlcnZlcldvcmtzIExFIGNoaXBzZXRzIGhhdmUgcHJvYmxlbXMgd2l0aCB3cml0ZS1jb21iaW5pbmcgCisJCSAgIERvbid0IGFsbG93IGl0IGFuZCBsZWF2ZSByb29tIGZvciBvdGhlciBjaGlwc2V0cyB0byBiZSB0YWdnZWQgKi8KKwkJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MgJiYKKwkJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfTEUpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIm10cnI6IFNlcnZlcndvcmtzIExFIGRldGVjdGVkLiBXcml0ZS1jb21iaW5pbmcgZGlzYWJsZWQuXG4iKTsKKwkJCXBjaV9kZXZfcHV0KGRldik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBJbnRlbCA0NTBOWCBlcnJhdGEgIyAyMy4gTm9uIGFzY2VuZGluZyBjYWNobGluZSBldmljdGlvbnMgdG8KKwkJICAgd3JpdGUgY29tYmluaW5nIG1lbW9yeSBtYXkgcmVzdWx0aW5nIGluIGRhdGEgY29ycnVwdGlvbiAqLworCQlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCAmJgorCQkgICAgZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjQ1MU5YKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJtdHJyOiBJbnRlbCA0NTBOWCBNTUMgZGV0ZWN0ZWQuIFdyaXRlLWNvbWJpbmluZyBkaXNhYmxlZC5cbiIpOworCQkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJCXBjaV9kZXZfcHV0KGRldik7CisJfQkJCisJcmV0dXJuIChtdHJyX2lmLT5oYXZlX3dyY29tYiA/IG10cnJfaWYtPmhhdmVfd3Jjb21iKCkgOiAwKTsKK30KKworLyogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlIE1UUlJzICAqLworc3RhdGljIHZvaWQgX19pbml0IHNldF9udW1fdmFyX3Jhbmdlcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY29uZmlnID0gMCwgZHVtbXk7CisKKwlpZiAodXNlX2ludGVsKCkpIHsKKwkJcmRtc3IoTVRSUmNhcF9NU1IsIGNvbmZpZywgZHVtbXkpOworCX0gZWxzZSBpZiAoaXNfY3B1KEFNRCkpCisJCWNvbmZpZyA9IDI7CisJZWxzZSBpZiAoaXNfY3B1KENZUklYKSB8fCBpc19jcHUoQ0VOVEFVUikpCisJCWNvbmZpZyA9IDg7CisJbnVtX3Zhcl9yYW5nZXMgPSBjb25maWcgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF90YWJsZSh2b2lkKQoreworCWludCBpLCBtYXg7CisKKwltYXggPSBudW1fdmFyX3JhbmdlczsKKwlpZiAoKHVzYWdlX3RhYmxlID0ga21hbGxvYyhtYXggKiBzaXplb2YgKnVzYWdlX3RhYmxlLCBHRlBfS0VSTkVMKSkKKwkgICAgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm10cnI6IGNvdWxkIG5vdCBhbGxvY2F0ZVxuIik7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKQorCQl1c2FnZV90YWJsZVtpXSA9IDE7Cit9CisKK3N0cnVjdCBzZXRfbXRycl9kYXRhIHsKKwlhdG9taWNfdAljb3VudDsKKwlhdG9taWNfdAlnYXRlOworCXVuc2lnbmVkIGxvbmcJc21wX2Jhc2U7CisJdW5zaWduZWQgbG9uZwlzbXBfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJc21wX3JlZzsKKwltdHJyX3R5cGUJc21wX3R5cGU7Cit9OworCisjaWZkZWYgQ09ORklHX1NNUAorCitzdGF0aWMgdm9pZCBpcGlfaGFuZGxlcih2b2lkICppbmZvKQorLyogIFtTVU1NQVJZXSBTeW5jaHJvbmlzYXRpb24gaGFuZGxlci4gRXhlY3V0ZWQgYnkgIm90aGVyIiBDUFVzLgorICAgIFtSRVRVUk5TXSBOb3RoaW5nLgorKi8KK3sKKwlzdHJ1Y3Qgc2V0X210cnJfZGF0YSAqZGF0YSA9IGluZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWF0b21pY19kZWMoJmRhdGEtPmNvdW50KTsKKwl3aGlsZSghYXRvbWljX3JlYWQoJmRhdGEtPmdhdGUpKQorCQljcHVfcmVsYXgoKTsKKworCS8qICBUaGUgbWFzdGVyIGhhcyBjbGVhcmVkIG1lIHRvIGV4ZWN1dGUgICovCisJaWYgKGRhdGEtPnNtcF9yZWcgIT0gfjBVKSAKKwkJbXRycl9pZi0+c2V0KGRhdGEtPnNtcF9yZWcsIGRhdGEtPnNtcF9iYXNlLCAKKwkJCSAgICAgZGF0YS0+c21wX3NpemUsIGRhdGEtPnNtcF90eXBlKTsKKwllbHNlCisJCW10cnJfaWYtPnNldF9hbGwoKTsKKworCWF0b21pY19kZWMoJmRhdGEtPmNvdW50KTsKKwl3aGlsZShhdG9taWNfcmVhZCgmZGF0YS0+Z2F0ZSkpCisJCWNwdV9yZWxheCgpOworCisJYXRvbWljX2RlYygmZGF0YS0+Y291bnQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworI2VuZGlmCisKKy8qKgorICogc2V0X210cnIgLSB1cGRhdGUgbXRycnMgb24gYWxsIHByb2Nlc3NvcnMKKyAqIEByZWc6CW10cnIgaW4gcXVlc3Rpb24KKyAqIEBiYXNlOgltdHJyIGJhc2UKKyAqIEBzaXplOgltdHJyIHNpemUKKyAqIEB0eXBlOgltdHJyIHR5cGUKKyAqCisgKiBUaGlzIGlzIGtpbmRhIHRyaWNreSwgYnV0IGZvcnR1bmF0ZWx5LCBJbnRlbCBzcGVsbGVkIGl0IG91dCBmb3IgdXMgY2xlYW5seToKKyAqIAorICogMS4gU2VuZCBJUEkgdG8gZG8gdGhlIGZvbGxvd2luZzoKKyAqIDIuIERpc2FibGUgSW50ZXJydXB0cworICogMy4gV2FpdCBmb3IgYWxsIHByb2NzIHRvIGRvIHNvIAorICogNC4gRW50ZXIgbm8tZmlsbCBjYWNoZSBtb2RlCisgKiA1LiBGbHVzaCBjYWNoZXMKKyAqIDYuIENsZWFyIFBHRSBiaXQKKyAqIDcuIEZsdXNoIGFsbCBUTEJzCisgKiA4LiBEaXNhYmxlIGFsbCByYW5nZSByZWdpc3RlcnMKKyAqIDkuIFVwZGF0ZSB0aGUgTVRSUnMKKyAqIDEwLiBFbmFibGUgYWxsIHJhbmdlIHJlZ2lzdGVycworICogMTEuIEZsdXNoIGFsbCBUTEJzIGFuZCBjYWNoZXMgYWdhaW4KKyAqIDEyLiBFbnRlciBub3JtYWwgY2FjaGUgbW9kZSBhbmQgcmVlbmFibGUgY2FjaGluZworICogMTMuIFNldCBQR0UgCisgKiAxNC4gV2FpdCBmb3IgYnVkZGllcyB0byBjYXRjaCB1cAorICogMTUuIEVuYWJsZSBpbnRlcnJ1cHRzLgorICogCisgKiBXaGF0IGRvZXMgdGhhdCBtZWFuIGZvciB1cz8gV2VsbCwgZmlyc3Qgd2Ugc2V0IGRhdGEuY291bnQgdG8gdGhlIG51bWJlcgorICogb2YgQ1BVcy4gQXMgZWFjaCBDUFUgZGlzYWJsZXMgaW50ZXJydXB0cywgaXQnbGwgZGVjcmVtZW50IGl0IG9uY2UuIFdlIHdhaXQKKyAqIHVudGlsIGl0IGhpdHMgMCBhbmQgcHJvY2VlZC4gV2Ugc2V0IHRoZSBkYXRhLmdhdGUgZmxhZyBhbmQgcmVzZXQgZGF0YS5jb3VudC4KKyAqIE1lYW53aGlsZSwgdGhleSBhcmUgd2FpdGluZyBmb3IgdGhhdCBmbGFnIHRvIGJlIHNldC4gT25jZSBpdCdzIHNldCwgZWFjaCAKKyAqIENQVSBnb2VzIHRocm91Z2ggdGhlIHRyYW5zaXRpb24gb2YgdXBkYXRpbmcgTVRSUnMuIFRoZSBDUFUgdmVuZG9ycyBtYXkgZWFjaCBkbyBpdCAKKyAqIGRpZmZlcmVudGx5LCBzbyB3ZSBjYWxsIG10cnJfaWYtPnNldCgpIGNhbGxiYWNrIGFuZCBsZXQgdGhlbSB0YWtlIGNhcmUgb2YgaXQuCisgKiBXaGVuIHRoZXkncmUgZG9uZSwgdGhleSBhZ2FpbiBkZWNyZW1lbnQgZGF0YS0+Y291bnQgYW5kIHdhaXQgZm9yIGRhdGEuZ2F0ZSB0byAKKyAqIGJlIHJlc2V0LiAKKyAqIFdoZW4gd2UgZmluaXNoLCB3ZSB3YWl0IGZvciBkYXRhLmNvdW50IHRvIGhpdCAwIGFuZCB0b2dnbGUgdGhlIGRhdGEuZ2F0ZSBmbGFnLgorICogRXZlcnlvbmUgdGhlbiBlbmFibGVzIGludGVycnVwdHMgYW5kIHdlIGFsbCBjb250aW51ZSBvbi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIG1lY2hhbmlzbSBpcyB0aGUgc2FtZSBmb3IgVVAgc3lzdGVtcywgdG9vOyBhbGwgdGhlIFNNUCBzdHVmZgorICogYmVjb21lcyBub3BzLgorICovCitzdGF0aWMgdm9pZCBzZXRfbXRycih1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBtdHJyX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3Qgc2V0X210cnJfZGF0YSBkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYXRhLnNtcF9yZWcgPSByZWc7CisJZGF0YS5zbXBfYmFzZSA9IGJhc2U7CisJZGF0YS5zbXBfc2l6ZSA9IHNpemU7CisJZGF0YS5zbXBfdHlwZSA9IHR5cGU7CisJYXRvbWljX3NldCgmZGF0YS5jb3VudCwgbnVtX2Jvb3RpbmdfY3B1cygpIC0gMSk7CisJYXRvbWljX3NldCgmZGF0YS5nYXRlLDApOworCisJLyogIFN0YXJ0IHRoZSBiYWxsIHJvbGxpbmcgb24gb3RoZXIgQ1BVcyAgKi8KKwlpZiAoc21wX2NhbGxfZnVuY3Rpb24oaXBpX2hhbmRsZXIsICZkYXRhLCAxLCAwKSAhPSAwKQorCQlwYW5pYygibXRycjogdGltZWQgb3V0IHdhaXRpbmcgZm9yIG90aGVyIENQVXNcbiIpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJd2hpbGUoYXRvbWljX3JlYWQoJmRhdGEuY291bnQpKQorCQljcHVfcmVsYXgoKTsKKworCS8qIG9rLCByZXNldCBjb3VudCBhbmQgdG9nZ2xlIGdhdGUgKi8KKwlhdG9taWNfc2V0KCZkYXRhLmNvdW50LCBudW1fYm9vdGluZ19jcHVzKCkgLSAxKTsKKwlhdG9taWNfc2V0KCZkYXRhLmdhdGUsMSk7CisKKwkvKiBkbyBvdXIgTVRSUiBidXNpbmVzcyAqLworCisJLyogSEFDSyEKKwkgKiBXZSB1c2UgdGhpcyBzYW1lIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIG10cnJzIG9uIGJvb3QuCisJICogVGhlIHN0YXRlIG9mIHRoZSBib290IGNwdSdzIG10cnJzIGhhcyBiZWVuIHNhdmVkLCBhbmQgd2Ugd2FudAorCSAqIHRvIHJlcGxpY2F0ZSBhY3Jvc3MgYWxsIHRoZSBBUHMuIAorCSAqIElmIHdlJ3JlIGRvaW5nIHRoYXQgQHJlZyBpcyBzZXQgdG8gc29tZXRoaW5nIHNwZWNpYWwuLi4KKwkgKi8KKwlpZiAocmVnICE9IH4wVSkgCisJCW10cnJfaWYtPnNldChyZWcsYmFzZSxzaXplLHR5cGUpOworCisJLyogd2FpdCBmb3IgdGhlIG90aGVycyAqLworCXdoaWxlKGF0b21pY19yZWFkKCZkYXRhLmNvdW50KSkKKwkJY3B1X3JlbGF4KCk7CisKKwlhdG9taWNfc2V0KCZkYXRhLmNvdW50LCBudW1fYm9vdGluZ19jcHVzKCkgLSAxKTsKKwlhdG9taWNfc2V0KCZkYXRhLmdhdGUsMCk7CisKKwkvKgorCSAqIFdhaXQgaGVyZSBmb3IgZXZlcnlvbmUgdG8gaGF2ZSBzZWVuIHRoZSBnYXRlIGNoYW5nZQorCSAqIFNvIHdlJ3JlIHRoZSBsYXN0IG9uZXMgdG8gdG91Y2ggJ2RhdGEnCisJICovCisJd2hpbGUoYXRvbWljX3JlYWQoJmRhdGEuY291bnQpKQorCQljcHVfcmVsYXgoKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoqCisgKgltdHJyX2FkZF9wYWdlIC0gQWRkIGEgbWVtb3J5IHR5cGUgcmVnaW9uCisgKglAYmFzZTogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHJlZ2lvbiBpbiBwYWdlcyAoNCBLQikKKyAqCUBzaXplOiBQaHlzaWNhbCBzaXplIG9mIHJlZ2lvbiBpbiBwYWdlcyAoNCBLQikKKyAqCUB0eXBlOiBUeXBlIG9mIE1UUlIgZGVzaXJlZAorICoJQGluY3JlbWVudDogSWYgdGhpcyBpcyB0cnVlIGRvIHVzYWdlIGNvdW50aW5nIG9uIHRoZSByZWdpb24KKyAqCisgKglNZW1vcnkgdHlwZSByZWdpb24gcmVnaXN0ZXJzIGNvbnRyb2wgdGhlIGNhY2hpbmcgb24gbmV3ZXIgSW50ZWwgYW5kCisgKglub24gSW50ZWwgcHJvY2Vzc29ycy4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgZHJpdmVycyB0byByZXF1ZXN0IGFuCisgKglNVFJSIGlzIGFkZGVkLiBUaGUgZGV0YWlscyBhbmQgaGFyZHdhcmUgc3BlY2lmaWNzIG9mIGVhY2ggcHJvY2Vzc29yJ3MKKyAqCWltcGxlbWVudGF0aW9uIGFyZSBoaWRkZW4gZnJvbSB0aGUgY2FsbGVyLCBidXQgbmV2ZXJ0aGVsZXNzIHRoZSAKKyAqCWNhbGxlciBzaG91bGQgZXhwZWN0IHRvIG5lZWQgdG8gcHJvdmlkZSBhIHBvd2VyIG9mIHR3byBzaXplIG9uIGFuCisgKgllcXVpdmFsZW50IHBvd2VyIG9mIHR3byBib3VuZGFyeS4KKyAqCisgKglJZiB0aGUgcmVnaW9uIGNhbm5vdCBiZSBhZGRlZCBlaXRoZXIgYmVjYXVzZSBhbGwgcmVnaW9ucyBhcmUgaW4gdXNlCisgKglvciB0aGUgQ1BVIGNhbm5vdCBzdXBwb3J0IGl0IGEgbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuIE9uIHN1Y2Nlc3MKKyAqCXRoZSByZWdpc3RlciBudW1iZXIgZm9yIHRoaXMgZW50cnkgaXMgcmV0dXJuZWQsIGJ1dCBzaG91bGQgYmUgdHJlYXRlZAorICoJYXMgYSBjb29raWUgb25seS4KKyAqCisgKglPbiBhIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUgdGhlIGNoYW5nZXMgYXJlIG1hZGUgdG8gYWxsIHByb2Nlc3NvcnMuCisgKglUaGlzIGlzIHJlcXVpcmVkIG9uIHg4NiBieSB0aGUgSW50ZWwgcHJvY2Vzc29ycy4KKyAqCisgKglUaGUgYXZhaWxhYmxlIHR5cGVzIGFyZQorICoKKyAqCSVNVFJSX1RZUEVfVU5DQUNIQUJMRQktCU5vIGNhY2hpbmcKKyAqCisgKgklTVRSUl9UWVBFX1dSQkFDSwktCVdyaXRlIGRhdGEgYmFjayBpbiBidXJzdHMgd2hlbmV2ZXIKKyAqCisgKgklTVRSUl9UWVBFX1dSQ09NQgktCVdyaXRlIGRhdGEgYmFjayBzb29uIGJ1dCBhbGxvdyBidXJzdHMKKyAqCisgKgklTVRSUl9UWVBFX1dSVEhST1VHSAktCUNhY2hlIHJlYWRzIGJ1dCBub3Qgd3JpdGVzCisgKgorICoJQlVHUzogTmVlZHMgYSBxdWlldCBmbGFnIGZvciB0aGUgY2FzZXMgd2hlcmUgZHJpdmVycyBkbyBub3QgbWluZAorICoJZmFpbHVyZXMgYW5kIGRvIG5vdCB3aXNoIHN5c3RlbSBsb2cgbWVzc2FnZXMgdG8gYmUgc2VudC4KKyAqLworCitpbnQgbXRycl9hZGRfcGFnZSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgCisJCSAgdW5zaWduZWQgaW50IHR5cGUsIGNoYXIgaW5jcmVtZW50KQoreworCWludCBpOworCW10cnJfdHlwZSBsdHlwZTsKKwl1bnNpZ25lZCBsb25nIGxiYXNlOworCXVuc2lnbmVkIGludCBsc2l6ZTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIW10cnJfaWYpCisJCXJldHVybiAtRU5YSU87CisJCQorCWlmICgoZXJyb3IgPSBtdHJyX2lmLT52YWxpZGF0ZV9hZGRfcGFnZShiYXNlLHNpemUsdHlwZSkpKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAodHlwZSA+PSBNVFJSX05VTV9UWVBFUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiB0eXBlOiAldSBpbnZhbGlkXG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogIElmIHRoZSB0eXBlIGlzIFdDLCBjaGVjayB0aGF0IHRoaXMgcHJvY2Vzc29yIHN1cHBvcnRzIGl0ICAqLworCWlmICgodHlwZSA9PSBNVFJSX1RZUEVfV1JDT01CKSAmJiAhaGF2ZV93cmNvbWIoKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAibXRycjogeW91ciBwcm9jZXNzb3IgZG9lc24ndCBzdXBwb3J0IHdyaXRlLWNvbWJpbmluZ1xuIik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCWlmIChiYXNlICYgc2l6ZV9vcl9tYXNrIHx8IHNpemUgJiBzaXplX29yX21hc2spIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogYmFzZSBvciBzaXplIGV4Y2VlZHMgdGhlIE1UUlIgd2lkdGhcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllcnJvciA9IC1FSU5WQUw7CisKKwkvKiAgU2VhcmNoIGZvciBleGlzdGluZyBNVFJSICAqLworCWRvd24oJm1haW5fbG9jayk7CisJZm9yIChpID0gMDsgaSA8IG51bV92YXJfcmFuZ2VzOyArK2kpIHsKKwkJbXRycl9pZi0+Z2V0KGksICZsYmFzZSwgJmxzaXplLCAmbHR5cGUpOworCQlpZiAoYmFzZSA+PSBsYmFzZSArIGxzaXplKQorCQkJY29udGludWU7CisJCWlmICgoYmFzZSA8IGxiYXNlKSAmJiAoYmFzZSArIHNpemUgPD0gbGJhc2UpKQorCQkJY29udGludWU7CisJCS8qICBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlcmUgaXMgc29tZSBraW5kIG9mIG92ZXJsYXAvZW5jbG9zdXJlICAqLworCQlpZiAoKGJhc2UgPCBsYmFzZSkgfHwgKGJhc2UgKyBzaXplID4gbGJhc2UgKyBsc2l6ZSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAibXRycjogMHglbHgwMDAsMHglbHgwMDAgb3ZlcmxhcHMgZXhpc3RpbmciCisJCQkgICAgICAgIiAweCVseDAwMCwweCV4MDAwXG4iLCBiYXNlLCBzaXplLCBsYmFzZSwKKwkJCSAgICAgICBsc2l6ZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQkvKiAgTmV3IHJlZ2lvbiBpcyBlbmNsb3NlZCBieSBhbiBleGlzdGluZyByZWdpb24gICovCisJCWlmIChsdHlwZSAhPSB0eXBlKSB7CisJCQlpZiAodHlwZSA9PSBNVFJSX1RZUEVfVU5DQUNIQUJMRSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJtdHJyOiB0eXBlIG1pc21hdGNoIGZvciAlbHgwMDAsJWx4MDAwIG9sZDogJXMgbmV3OiAlc1xuIiwKKwkJCSAgICAgYmFzZSwgc2l6ZSwgbXRycl9hdHRyaWJfdG9fc3RyKGx0eXBlKSwKKwkJCSAgICAgbXRycl9hdHRyaWJfdG9fc3RyKHR5cGUpKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChpbmNyZW1lbnQpCisJCQkrK3VzYWdlX3RhYmxlW2ldOworCQllcnJvciA9IGk7CisJCWdvdG8gb3V0OworCX0KKwkvKiAgU2VhcmNoIGZvciBhbiBlbXB0eSBNVFJSICAqLworCWkgPSBtdHJyX2lmLT5nZXRfZnJlZV9yZWdpb24oYmFzZSwgc2l6ZSk7CisJaWYgKGkgPj0gMCkgeworCQlzZXRfbXRycihpLCBiYXNlLCBzaXplLCB0eXBlKTsKKwkJdXNhZ2VfdGFibGVbaV0gPSAxOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJtdHJyOiBubyBtb3JlIE1UUlJzIGF2YWlsYWJsZVxuIik7CisJZXJyb3IgPSBpOworIG91dDoKKwl1cCgmbWFpbl9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJbXRycl9hZGQgLSBBZGQgYSBtZW1vcnkgdHlwZSByZWdpb24KKyAqCUBiYXNlOiBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgcmVnaW9uCisgKglAc2l6ZTogUGh5c2ljYWwgc2l6ZSBvZiByZWdpb24KKyAqCUB0eXBlOiBUeXBlIG9mIE1UUlIgZGVzaXJlZAorICoJQGluY3JlbWVudDogSWYgdGhpcyBpcyB0cnVlIGRvIHVzYWdlIGNvdW50aW5nIG9uIHRoZSByZWdpb24KKyAqCisgKglNZW1vcnkgdHlwZSByZWdpb24gcmVnaXN0ZXJzIGNvbnRyb2wgdGhlIGNhY2hpbmcgb24gbmV3ZXIgSW50ZWwgYW5kCisgKglub24gSW50ZWwgcHJvY2Vzc29ycy4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgZHJpdmVycyB0byByZXF1ZXN0IGFuCisgKglNVFJSIGlzIGFkZGVkLiBUaGUgZGV0YWlscyBhbmQgaGFyZHdhcmUgc3BlY2lmaWNzIG9mIGVhY2ggcHJvY2Vzc29yJ3MKKyAqCWltcGxlbWVudGF0aW9uIGFyZSBoaWRkZW4gZnJvbSB0aGUgY2FsbGVyLCBidXQgbmV2ZXJ0aGVsZXNzIHRoZSAKKyAqCWNhbGxlciBzaG91bGQgZXhwZWN0IHRvIG5lZWQgdG8gcHJvdmlkZSBhIHBvd2VyIG9mIHR3byBzaXplIG9uIGFuCisgKgllcXVpdmFsZW50IHBvd2VyIG9mIHR3byBib3VuZGFyeS4KKyAqCisgKglJZiB0aGUgcmVnaW9uIGNhbm5vdCBiZSBhZGRlZCBlaXRoZXIgYmVjYXVzZSBhbGwgcmVnaW9ucyBhcmUgaW4gdXNlCisgKglvciB0aGUgQ1BVIGNhbm5vdCBzdXBwb3J0IGl0IGEgbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuIE9uIHN1Y2Nlc3MKKyAqCXRoZSByZWdpc3RlciBudW1iZXIgZm9yIHRoaXMgZW50cnkgaXMgcmV0dXJuZWQsIGJ1dCBzaG91bGQgYmUgdHJlYXRlZAorICoJYXMgYSBjb29raWUgb25seS4KKyAqCisgKglPbiBhIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUgdGhlIGNoYW5nZXMgYXJlIG1hZGUgdG8gYWxsIHByb2Nlc3NvcnMuCisgKglUaGlzIGlzIHJlcXVpcmVkIG9uIHg4NiBieSB0aGUgSW50ZWwgcHJvY2Vzc29ycy4KKyAqCisgKglUaGUgYXZhaWxhYmxlIHR5cGVzIGFyZQorICoKKyAqCSVNVFJSX1RZUEVfVU5DQUNIQUJMRQktCU5vIGNhY2hpbmcKKyAqCisgKgklTVRSUl9UWVBFX1dSQkFDSwktCVdyaXRlIGRhdGEgYmFjayBpbiBidXJzdHMgd2hlbmV2ZXIKKyAqCisgKgklTVRSUl9UWVBFX1dSQ09NQgktCVdyaXRlIGRhdGEgYmFjayBzb29uIGJ1dCBhbGxvdyBidXJzdHMKKyAqCisgKgklTVRSUl9UWVBFX1dSVEhST1VHSAktCUNhY2hlIHJlYWRzIGJ1dCBub3Qgd3JpdGVzCisgKgorICoJQlVHUzogTmVlZHMgYSBxdWlldCBmbGFnIGZvciB0aGUgY2FzZXMgd2hlcmUgZHJpdmVycyBkbyBub3QgbWluZAorICoJZmFpbHVyZXMgYW5kIGRvIG5vdCB3aXNoIHN5c3RlbSBsb2cgbWVzc2FnZXMgdG8gYmUgc2VudC4KKyAqLworCitpbnQKK210cnJfYWRkKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkgY2hhciBpbmNyZW1lbnQpCit7CisJaWYgKChiYXNlICYgKFBBR0VfU0laRSAtIDEpKSB8fCAoc2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogc2l6ZSBhbmQgYmFzZSBtdXN0IGJlIG11bHRpcGxlcyBvZiA0IGtpQlxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHICJtdHJyOiBzaXplOiAweCVseCAgYmFzZTogMHglbHhcbiIsIHNpemUsIGJhc2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIG10cnJfYWRkX3BhZ2UoYmFzZSA+PiBQQUdFX1NISUZULCBzaXplID4+IFBBR0VfU0hJRlQsIHR5cGUsCisJCQkgICAgIGluY3JlbWVudCk7Cit9CisKKy8qKgorICoJbXRycl9kZWxfcGFnZSAtIGRlbGV0ZSBhIG1lbW9yeSB0eXBlIHJlZ2lvbgorICoJQHJlZzogUmVnaXN0ZXIgcmV0dXJuZWQgYnkgbXRycl9hZGQKKyAqCUBiYXNlOiBQaHlzaWNhbCBiYXNlIGFkZHJlc3MKKyAqCUBzaXplOiBTaXplIG9mIHJlZ2lvbgorICoKKyAqCUlmIHJlZ2lzdGVyIGlzIHN1cHBsaWVkIHRoZW4gYmFzZSBhbmQgc2l6ZSBhcmUgaWdub3JlZC4gVGhpcyBpcworICoJaG93IGRyaXZlcnMgc2hvdWxkIGNhbGwgaXQuCisgKgorICoJUmVsZWFzZXMgYW4gTVRSUiByZWdpb24uIElmIHRoZSB1c2FnZSBjb3VudCBkcm9wcyB0byB6ZXJvIHRoZSAKKyAqCXJlZ2lzdGVyIGlzIGZyZWVkIGFuZCB0aGUgcmVnaW9uIHJldHVybnMgdG8gZGVmYXVsdCBzdGF0ZS4KKyAqCU9uIHN1Y2Nlc3MgdGhlIHJlZ2lzdGVyIGlzIHJldHVybmVkLCBvbiBmYWlsdXJlIGEgbmVnYXRpdmUgZXJyb3IKKyAqCWNvZGUuCisgKi8KKworaW50IG10cnJfZGVsX3BhZ2UoaW50IHJlZywgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IGksIG1heDsKKwltdHJyX3R5cGUgbHR5cGU7CisJdW5zaWduZWQgbG9uZyBsYmFzZTsKKwl1bnNpZ25lZCBpbnQgbHNpemU7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCWlmICghbXRycl9pZikKKwkJcmV0dXJuIC1FTlhJTzsKKworCW1heCA9IG51bV92YXJfcmFuZ2VzOworCWRvd24oJm1haW5fbG9jayk7CisJaWYgKHJlZyA8IDApIHsKKwkJLyogIFNlYXJjaCBmb3IgZXhpc3RpbmcgTVRSUiAgKi8KKwkJZm9yIChpID0gMDsgaSA8IG1heDsgKytpKSB7CisJCQltdHJyX2lmLT5nZXQoaSwgJmxiYXNlLCAmbHNpemUsICZsdHlwZSk7CisJCQlpZiAobGJhc2UgPT0gYmFzZSAmJiBsc2l6ZSA9PSBzaXplKSB7CisJCQkJcmVnID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocmVnIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIm10cnI6IG5vIE1UUlIgZm9yICVseDAwMCwlbHgwMDAgZm91bmRcbiIsIGJhc2UsCisJCQkgICAgICAgc2l6ZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAocmVnID49IG1heCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtdHJyOiByZWdpc3RlcjogJWQgdG9vIGJpZ1xuIiwgcmVnKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChpc19jcHUoQ1lSSVgpICYmICF1c2VfaW50ZWwoKSkgeworCQlpZiAoKHJlZyA9PSAzKSAmJiBhcnIzX3Byb3RlY3RlZCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogQVJSMyBjYW5ub3QgYmUgY2hhbmdlZFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwltdHJyX2lmLT5nZXQocmVnLCAmbGJhc2UsICZsc2l6ZSwgJmx0eXBlKTsKKwlpZiAobHNpemUgPCAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10cnI6IE1UUlIgJWQgbm90IHVzZWRcbiIsIHJlZyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAodXNhZ2VfdGFibGVbcmVnXSA8IDEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogcmVnOiAlZCBoYXMgY291bnQ9MFxuIiwgcmVnKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICgtLXVzYWdlX3RhYmxlW3JlZ10gPCAxKQorCQlzZXRfbXRycihyZWcsIDAsIDAsIDApOworCWVycm9yID0gcmVnOworIG91dDoKKwl1cCgmbWFpbl9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisvKioKKyAqCW10cnJfZGVsIC0gZGVsZXRlIGEgbWVtb3J5IHR5cGUgcmVnaW9uCisgKglAcmVnOiBSZWdpc3RlciByZXR1cm5lZCBieSBtdHJyX2FkZAorICoJQGJhc2U6IFBoeXNpY2FsIGJhc2UgYWRkcmVzcworICoJQHNpemU6IFNpemUgb2YgcmVnaW9uCisgKgorICoJSWYgcmVnaXN0ZXIgaXMgc3VwcGxpZWQgdGhlbiBiYXNlIGFuZCBzaXplIGFyZSBpZ25vcmVkLiBUaGlzIGlzCisgKglob3cgZHJpdmVycyBzaG91bGQgY2FsbCBpdC4KKyAqCisgKglSZWxlYXNlcyBhbiBNVFJSIHJlZ2lvbi4gSWYgdGhlIHVzYWdlIGNvdW50IGRyb3BzIHRvIHplcm8gdGhlIAorICoJcmVnaXN0ZXIgaXMgZnJlZWQgYW5kIHRoZSByZWdpb24gcmV0dXJucyB0byBkZWZhdWx0IHN0YXRlLgorICoJT24gc3VjY2VzcyB0aGUgcmVnaXN0ZXIgaXMgcmV0dXJuZWQsIG9uIGZhaWx1cmUgYSBuZWdhdGl2ZSBlcnJvcgorICoJY29kZS4KKyAqLworCitpbnQKK210cnJfZGVsKGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmICgoYmFzZSAmIChQQUdFX1NJWkUgLSAxKSkgfHwgKHNpemUgJiAoUEFHRV9TSVpFIC0gMSkpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm10cnI6IHNpemUgYW5kIGJhc2UgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNCBraUJcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAibXRycjogc2l6ZTogMHglbHggIGJhc2U6IDB4JWx4XG4iLCBzaXplLCBiYXNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBtdHJyX2RlbF9wYWdlKHJlZywgYmFzZSA+PiBQQUdFX1NISUZULCBzaXplID4+IFBBR0VfU0hJRlQpOworfQorCitFWFBPUlRfU1lNQk9MKG10cnJfYWRkKTsKK0VYUE9SVF9TWU1CT0wobXRycl9kZWwpOworCisvKiBIQUNLIEFMRVJUIQorICogVGhlc2Ugc2hvdWxkIGJlIGNhbGxlZCBpbXBsaWNpdGx5LCBidXQgd2UgY2FuJ3QgeWV0IHVudGlsIGFsbCB0aGUgaW5pdGNhbGwKKyAqIHN0dWZmIGlzIGRvbmUuLi4KKyAqLworZXh0ZXJuIHZvaWQgYW1kX2luaXRfbXRycih2b2lkKTsKK2V4dGVybiB2b2lkIGN5cml4X2luaXRfbXRycih2b2lkKTsKK2V4dGVybiB2b2lkIGNlbnRhdXJfaW5pdF9tdHJyKHZvaWQpOworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9pZnModm9pZCkKK3sKKwlhbWRfaW5pdF9tdHJyKCk7CisJY3lyaXhfaW5pdF9tdHJyKCk7CisJY2VudGF1cl9pbml0X210cnIoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfb3RoZXJfY3B1cyh2b2lkKQoreworCWlmICh1c2VfaW50ZWwoKSkKKwkJZ2V0X210cnJfc3RhdGUoKTsKKworCS8qIGJyaW5nIHVwIHRoZSBvdGhlciBwcm9jZXNzb3JzICovCisJc2V0X210cnIofjBVLDAsMCwwKTsKKworCWlmICh1c2VfaW50ZWwoKSkgeworCQlmaW5hbGl6ZV9tdHJyX3N0YXRlKCk7CisJCW10cnJfc3RhdGVfd2FybigpOworCX0KK30KKworCitzdHJ1Y3QgbXRycl92YWx1ZSB7CisJbXRycl90eXBlCWx0eXBlOworCXVuc2lnbmVkIGxvbmcJbGJhc2U7CisJdW5zaWduZWQgaW50CWxzaXplOworfTsKKworc3RhdGljIHN0cnVjdCBtdHJyX3ZhbHVlICogbXRycl9zdGF0ZTsKKworc3RhdGljIGludCBtdHJyX3NhdmUoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNkZXYsIHUzMiBzdGF0ZSkKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZSA9IG51bV92YXJfcmFuZ2VzICogc2l6ZW9mKHN0cnVjdCBtdHJyX3ZhbHVlKTsKKworCW10cnJfc3RhdGUgPSBrbWFsbG9jKHNpemUsR0ZQX0FUT01JQyk7CisJaWYgKG10cnJfc3RhdGUpCisJCW1lbXNldChtdHJyX3N0YXRlLDAsc2l6ZSk7CisJZWxzZQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fdmFyX3JhbmdlczsgaSsrKSB7CisJCW10cnJfaWYtPmdldChpLAorCQkJICAgICAmbXRycl9zdGF0ZVtpXS5sYmFzZSwKKwkJCSAgICAgJm10cnJfc3RhdGVbaV0ubHNpemUsCisJCQkgICAgICZtdHJyX3N0YXRlW2ldLmx0eXBlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRycl9yZXN0b3JlKHN0cnVjdCBzeXNfZGV2aWNlICogc3lzZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV92YXJfcmFuZ2VzOyBpKyspIHsKKwkJaWYgKG10cnJfc3RhdGVbaV0ubHNpemUpIAorCQkJc2V0X210cnIoaSwKKwkJCQkgbXRycl9zdGF0ZVtpXS5sYmFzZSwKKwkJCQkgbXRycl9zdGF0ZVtpXS5sc2l6ZSwKKwkJCQkgbXRycl9zdGF0ZVtpXS5sdHlwZSk7CisJfQorCWtmcmVlKG10cnJfc3RhdGUpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHN0cnVjdCBzeXNkZXZfZHJpdmVyIG10cnJfc3lzZGV2X2RyaXZlciA9IHsKKwkuc3VzcGVuZAk9IG10cnJfc2F2ZSwKKwkucmVzdW1lCQk9IG10cnJfcmVzdG9yZSwKK307CisKKworLyoqCisgKiBtdHJyX2luaXQgLSBpbml0aWFsaXplIG10cnJzIG9uIHRoZSBib290IENQVQorICoKKyAqIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGVhcmx5OyBiZWZvcmUgYW55IG9mIHRoZSBvdGhlciBDUFVzIGFyZSAKKyAqIGluaXRpYWxpemVkIChpLmUuIGJlZm9yZSBzbXBfaW5pdCgpKS4KKyAqIAorICovCitzdGF0aWMgaW50IF9faW5pdCBtdHJyX2luaXQodm9pZCkKK3sKKwlpbml0X2lmcygpOworCisJaWYgKGNwdV9oYXNfbXRycikgeworCQltdHJyX2lmID0gJmdlbmVyaWNfbXRycl9vcHM7CisJCXNpemVfb3JfbWFzayA9IDB4ZmYwMDAwMDA7CS8qIDM2IGJpdHMgKi8KKwkJc2l6ZV9hbmRfbWFzayA9IDB4MDBmMDAwMDA7CisJCQkKKwkJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwkJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJCS8qIFRoZSBvcmlnaW5hbCBBdGhsb24gZG9jcyBzYWlkIHRoYXQKKwkJCSAgIHRvdGFsIGFkZHJlc3NhYmxlIG1lbW9yeSBpcyA0NCBiaXRzIHdpZGUuCisJCQkgICBJdCB3YXMgbm90IHJlYWxseSBjbGVhciB3aGV0aGVyIGl0cyBNVFJScworCQkJICAgZm9sbG93IHRoaXMgb3Igbm90LiAoUmVhZDogNDQgb3IgMzYgYml0cykuCisJCQkgICBIb3dldmVyLCAieDg2LTY0X292ZXJ2aWV3LnBkZiIgZXhwbGljaXRseQorCQkJICAgc3RhdGVzIHRoYXQgInByZXZpb3VzIGltcGxlbWVudGF0aW9ucyBzdXBwb3J0CisJCQkgICAzNiBiaXQgTVRSUnMiIGFuZCBhbHNvIHByb3ZpZGVzIGEgd2F5IHRvCisJCQkgICBxdWVyeSB0aGUgd2lkdGggKGluIGJpdHMpIG9mIHRoZSBwaHlzaWNhbAorCQkJICAgYWRkcmVzc2FibGUgbWVtb3J5IG9uIHRoZSBIYW1tZXIgZmFtaWx5LgorCQkJICovCisJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMTUKKwkJCSAgICAmJiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApID49IDB4ODAwMDAwMDgpKSB7CisJCQkJdTMyIHBoeXNfYWRkcjsKKwkJCQlwaHlzX2FkZHIgPSBjcHVpZF9lYXgoMHg4MDAwMDAwOCkgJiAweGZmOworCQkJCXNpemVfb3JfbWFzayA9CisJCQkJICAgIH4oKDEgPDwgKHBoeXNfYWRkciAtIFBBR0VfU0hJRlQpKSAtIDEpOworCQkJCXNpemVfYW5kX21hc2sgPSB+c2l6ZV9vcl9tYXNrICYgMHhmZmYwMDAwMDsKKwkJCX0KKwkJCS8qIEF0aGxvbiBNVFJScyB1c2UgYW4gSW50ZWwtY29tcGF0aWJsZSBpbnRlcmZhY2UgZm9yIAorCQkJICogZ2V0dGluZyBhbmQgc2V0dGluZyAqLworCQkJYnJlYWs7CisJCWNhc2UgWDg2X1ZFTkRPUl9DRU5UQVVSOgorCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDYpIHsKKwkJCQkvKiBWSUEgQ3lyaXggZmFtaWx5IGhhdmUgSW50ZWwgc3R5bGUgTVRSUnMsIGJ1dCBkb24ndCBzdXBwb3J0IFBBRSAqLworCQkJCXNpemVfb3JfbWFzayA9IDB4ZmZmMDAwMDA7CS8qIDMyIGJpdHMgKi8KKwkJCQlzaXplX2FuZF9tYXNrID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwkJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJCWlmIChjcHVfaGFzX2s2X210cnIpIHsKKwkJCQkvKiBQcmUtQXRobG9uIChLNikgQU1EIENQVSBNVFJScyAqLworCQkJCW10cnJfaWYgPSBtdHJyX29wc1tYODZfVkVORE9SX0FNRF07CisJCQkJc2l6ZV9vcl9tYXNrID0gMHhmZmYwMDAwMDsJLyogMzIgYml0cyAqLworCQkJCXNpemVfYW5kX21hc2sgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgWDg2X1ZFTkRPUl9DRU5UQVVSOgorCQkJaWYgKGNwdV9oYXNfY2VudGF1cl9tY3IpIHsKKwkJCQltdHJyX2lmID0gbXRycl9vcHNbWDg2X1ZFTkRPUl9DRU5UQVVSXTsKKwkJCQlzaXplX29yX21hc2sgPSAweGZmZjAwMDAwOwkvKiAzMiBiaXRzICovCisJCQkJc2l6ZV9hbmRfbWFzayA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBYODZfVkVORE9SX0NZUklYOgorCQkJaWYgKGNwdV9oYXNfY3lyaXhfYXJyKSB7CisJCQkJbXRycl9pZiA9IG10cnJfb3BzW1g4Nl9WRU5ET1JfQ1lSSVhdOworCQkJCXNpemVfb3JfbWFzayA9IDB4ZmZmMDAwMDA7CS8qIDMyIGJpdHMgKi8KKwkJCQlzaXplX2FuZF9tYXNrID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAibXRycjogdiVzXG4iLE1UUlJfVkVSU0lPTik7CisKKwlpZiAobXRycl9pZikgeworCQlzZXRfbnVtX3Zhcl9yYW5nZXMoKTsKKwkJaW5pdF90YWJsZSgpOworCQlpbml0X290aGVyX2NwdXMoKTsKKworCQlyZXR1cm4gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmY3B1X3N5c2Rldl9jbGFzcywKKwkJCQkJICAgICAgJm10cnJfc3lzZGV2X2RyaXZlcik7CisJfQorCXJldHVybiAtRU5YSU87Cit9CisKK3N1YnN5c19pbml0Y2FsbChtdHJyX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTEzNTEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIGxvY2FsIG10cnIgZGVmaW5lcy4KKyAqLworCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgMQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2RlZmluZSBNVFJSY2FwX01TUiAgICAgMHgwZmUKKyNkZWZpbmUgTVRSUmRlZlR5cGVfTVNSIDB4MmZmCisKKyNkZWZpbmUgTVRSUnBoeXNCYXNlX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSkKKyNkZWZpbmUgTVRSUnBoeXNNYXNrX01TUihyZWcpICgweDIwMCArIDIgKiAocmVnKSArIDEpCisKKyNkZWZpbmUgTlVNX0ZJWEVEX1JBTkdFUyA4OAorI2RlZmluZSBNVFJSZml4NjRLXzAwMDAwX01TUiAweDI1MAorI2RlZmluZSBNVFJSZml4MTZLXzgwMDAwX01TUiAweDI1OAorI2RlZmluZSBNVFJSZml4MTZLX0EwMDAwX01TUiAweDI1OQorI2RlZmluZSBNVFJSZml4NEtfQzAwMDBfTVNSIDB4MjY4CisjZGVmaW5lIE1UUlJmaXg0S19DODAwMF9NU1IgMHgyNjkKKyNkZWZpbmUgTVRSUmZpeDRLX0QwMDAwX01TUiAweDI2YQorI2RlZmluZSBNVFJSZml4NEtfRDgwMDBfTVNSIDB4MjZiCisjZGVmaW5lIE1UUlJmaXg0S19FMDAwMF9NU1IgMHgyNmMKKyNkZWZpbmUgTVRSUmZpeDRLX0U4MDAwX01TUiAweDI2ZAorI2RlZmluZSBNVFJSZml4NEtfRjAwMDBfTVNSIDB4MjZlCisjZGVmaW5lIE1UUlJmaXg0S19GODAwMF9NU1IgMHgyNmYKKworI2RlZmluZSBNVFJSX0NIQU5HRV9NQVNLX0ZJWEVEICAgICAweDAxCisjZGVmaW5lIE1UUlJfQ0hBTkdFX01BU0tfVkFSSUFCTEUgIDB4MDIKKyNkZWZpbmUgTVRSUl9DSEFOR0VfTUFTS19ERUZUWVBFICAgMHgwNAorCisvKiBJbiB0aGUgSW50ZWwgcHJvY2Vzc29yJ3MgTVRSUiBpbnRlcmZhY2UsIHRoZSBNVFJSIHR5cGUgaXMgYWx3YXlzIGhlbGQgaW4KKyAgIGFuIDggYml0IGZpZWxkOiAqLwordHlwZWRlZiB1OCBtdHJyX3R5cGU7CisKK3N0cnVjdCBtdHJyX29wcyB7CisJdTMyCXZlbmRvcjsKKwl1MzIJdXNlX2ludGVsX2lmOworLy8Jdm9pZAkoKmluaXQpKHZvaWQpOworCXZvaWQJKCpzZXQpKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgbXRycl90eXBlIHR5cGUpOworCXZvaWQJKCpzZXRfYWxsKSh2b2lkKTsKKworCXZvaWQJKCpnZXQpKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgKmJhc2UsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKnNpemUsIG10cnJfdHlwZSAqIHR5cGUpOworCWludAkoKmdldF9mcmVlX3JlZ2lvbikgKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworCWludAkoKnZhbGlkYXRlX2FkZF9wYWdlKSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0eXBlKTsKKwlpbnQJKCpoYXZlX3dyY29tYikodm9pZCk7Cit9OworCitleHRlcm4gaW50IGdlbmVyaWNfZ2V0X2ZyZWVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiBpbnQgZ2VuZXJpY192YWxpZGF0ZV9hZGRfcGFnZSh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0eXBlKTsKKworZXh0ZXJuIHN0cnVjdCBtdHJyX29wcyBnZW5lcmljX210cnJfb3BzOworCitleHRlcm4gaW50IHBvc2l0aXZlX2hhdmVfd3Jjb21iKHZvaWQpOworCisvKiBsaWJyYXJ5IGZ1bmN0aW9ucyBmb3IgcHJvY2Vzc29yLXNwZWNpZmljIHJvdXRpbmVzICovCitzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGRlZnR5cGVfbG87CisJdW5zaWduZWQgbG9uZyBkZWZ0eXBlX2hpOworCXVuc2lnbmVkIGxvbmcgY3I0dmFsOworCXVuc2lnbmVkIGxvbmcgY2NyMzsKK307CisKK3N0cnVjdCBtdHJyX3Zhcl9yYW5nZSB7CisJdW5zaWduZWQgbG9uZyBiYXNlX2xvOworCXVuc2lnbmVkIGxvbmcgYmFzZV9oaTsKKwl1bnNpZ25lZCBsb25nIG1hc2tfbG87CisJdW5zaWduZWQgbG9uZyBtYXNrX2hpOworfTsKKwordm9pZCBzZXRfbXRycl9kb25lKHN0cnVjdCBzZXRfbXRycl9jb250ZXh0ICpjdHh0KTsKK3ZvaWQgc2V0X210cnJfY2FjaGVfZGlzYWJsZShzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCAqY3R4dCk7Cit2b2lkIHNldF9tdHJyX3ByZXBhcmVfc2F2ZShzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCAqY3R4dCk7CisKK3ZvaWQgZ2V0X210cnJfc3RhdGUodm9pZCk7CisKK2V4dGVybiB2b2lkIHNldF9tdHJyX29wcyhzdHJ1Y3QgbXRycl9vcHMgKiBvcHMpOworCitleHRlcm4gdTMyIHNpemVfb3JfbWFzaywgc2l6ZV9hbmRfbWFzazsKK2V4dGVybiBzdHJ1Y3QgbXRycl9vcHMgKiBtdHJyX2lmOworCisjZGVmaW5lIGlzX2NwdSh2bmQpCShtdHJyX2lmICYmIG10cnJfaWYtPnZlbmRvciA9PSBYODZfVkVORE9SXyMjdm5kKQorI2RlZmluZSB1c2VfaW50ZWwoKQkobXRycl9pZiAmJiBtdHJyX2lmLT51c2VfaW50ZWxfaWYgPT0gMSkKKworZXh0ZXJuIHVuc2lnbmVkIGludCBudW1fdmFyX3JhbmdlczsKKwordm9pZCBmaW5hbGl6ZV9tdHJyX3N0YXRlKHZvaWQpOwordm9pZCBtdHJyX3N0YXRlX3dhcm4odm9pZCk7CitjaGFyICptdHJyX2F0dHJpYl90b19zdHIoaW50IHgpOwordm9pZCBtdHJyX3dybXNyKHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL3N0YXRlLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL3N0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyZWNkMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvc3RhdGUuYwpAQCAtMCwwICsxLDc4IEBACisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSAibXRyci5oIgorCisKKy8qICBQdXQgdGhlIHByb2Nlc3NvciBpbnRvIGEgc3RhdGUgd2hlcmUgTVRSUnMgY2FuIGJlIHNhZmVseSBzZXQgICovCit2b2lkIHNldF9tdHJyX3ByZXBhcmVfc2F2ZShzdHJ1Y3Qgc2V0X210cnJfY29udGV4dCAqY3R4dCkKK3sKKwl1bnNpZ25lZCBpbnQgY3IwOworCisJLyogIERpc2FibGUgaW50ZXJydXB0cyBsb2NhbGx5ICAqLworCWxvY2FsX2lycV9zYXZlKGN0eHQtPmZsYWdzKTsKKworCWlmICh1c2VfaW50ZWwoKSB8fCBpc19jcHUoQ1lSSVgpKSB7CisKKwkJLyogIFNhdmUgdmFsdWUgb2YgQ1I0IGFuZCBjbGVhciBQYWdlIEdsb2JhbCBFbmFibGUgKGJpdCA3KSAgKi8KKwkJaWYgKCBjcHVfaGFzX3BnZSApIHsKKwkJCWN0eHQtPmNyNHZhbCA9IHJlYWRfY3I0KCk7CisJCQl3cml0ZV9jcjQoY3R4dC0+Y3I0dmFsICYgKHVuc2lnbmVkIGNoYXIpIH4oMSA8PCA3KSk7CisJCX0KKworCQkvKiAgRGlzYWJsZSBhbmQgZmx1c2ggY2FjaGVzLiBOb3RlIHRoYXQgd2JpbnZkIGZsdXNoZXMgdGhlIFRMQnMgYXMKKwkJICAgIGEgc2lkZS1lZmZlY3QgICovCisJCWNyMCA9IHJlYWRfY3IwKCkgfCAweDQwMDAwMDAwOworCQl3YmludmQoKTsKKwkJd3JpdGVfY3IwKGNyMCk7CisJCXdiaW52ZCgpOworCisJCWlmICh1c2VfaW50ZWwoKSkKKwkJCS8qICBTYXZlIE1UUlIgc3RhdGUgKi8KKwkJCXJkbXNyKE1UUlJkZWZUeXBlX01TUiwgY3R4dC0+ZGVmdHlwZV9sbywgY3R4dC0+ZGVmdHlwZV9oaSk7CisJCWVsc2UKKwkJCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2VyZSBleGNsdWRlZCBhdCB0aGUgdG9wICovCisJCQljdHh0LT5jY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOworCX0KK30KKwordm9pZCBzZXRfbXRycl9jYWNoZV9kaXNhYmxlKHN0cnVjdCBzZXRfbXRycl9jb250ZXh0ICpjdHh0KQoreworCWlmICh1c2VfaW50ZWwoKSkgCisJCS8qICBEaXNhYmxlIE1UUlJzLCBhbmQgc2V0IHRoZSBkZWZhdWx0IHR5cGUgdG8gdW5jYWNoZWQgICovCisJCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBjdHh0LT5kZWZ0eXBlX2xvICYgMHhmMzAwVUwsCisJCSAgICAgIGN0eHQtPmRlZnR5cGVfaGkpOworCWVsc2UgaWYgKGlzX2NwdShDWVJJWCkpCisJCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2VyZSBleGNsdWRlZCBhdCB0aGUgdG9wICovCisJCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY3R4dC0+Y2NyMyAmIDB4MGYpIHwgMHgxMCk7Cit9CisKKy8qICBSZXN0b3JlIHRoZSBwcm9jZXNzb3IgYWZ0ZXIgYSBzZXRfbXRycl9wcmVwYXJlICAqLwordm9pZCBzZXRfbXRycl9kb25lKHN0cnVjdCBzZXRfbXRycl9jb250ZXh0ICpjdHh0KQoreworCWlmICh1c2VfaW50ZWwoKSB8fCBpc19jcHUoQ1lSSVgpKSB7CisKKwkJLyogIEZsdXNoIGNhY2hlcyBhbmQgVExCcyAgKi8KKwkJd2JpbnZkKCk7CisKKwkJLyogIFJlc3RvcmUgTVRSUmRlZlR5cGUgICovCisJCWlmICh1c2VfaW50ZWwoKSkKKwkJCS8qIEludGVsIChQNikgc3RhbmRhcmQgTVRSUnMgKi8KKwkJCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBjdHh0LT5kZWZ0eXBlX2xvLCBjdHh0LT5kZWZ0eXBlX2hpKTsKKwkJZWxzZQorCQkJLyogQ3lyaXggQVJScyAtIGV2ZXJ5dGhpbmcgZWxzZSB3YXMgZXhjbHVkZWQgYXQgdGhlIHRvcCAqLworCQkJc2V0Q3g4NihDWDg2X0NDUjMsIGN0eHQtPmNjcjMpOworCQkKKwkJLyogIEVuYWJsZSBjYWNoZXMgICovCisJCXdyaXRlX2NyMChyZWFkX2NyMCgpICYgMHhiZmZmZmZmZik7CisKKwkJLyogIFJlc3RvcmUgdmFsdWUgb2YgQ1I0ICAqLworCQlpZiAoIGNwdV9oYXNfcGdlICkKKwkJCXdyaXRlX2NyNChjdHh0LT5jcjR2YWwpOworCX0KKwkvKiAgUmUtZW5hYmxlIGludGVycnVwdHMgbG9jYWxseSAoaWYgZW5hYmxlZCBwcmV2aW91c2x5KSAgKi8KKwlsb2NhbF9pcnFfcmVzdG9yZShjdHh0LT5mbGFncyk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L25leGdlbi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbmV4Z2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4OThhMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L25leGdlbi5jCkBAIC0wLDAgKzEsNjMgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSAiY3B1LmgiCisKKy8qCisgKglEZXRlY3QgYSBOZXhHZW4gQ1BVIHJ1bm5pbmcgd2l0aG91dCBCSU9TIGh5cGVyY29kZSBuZXcgZW5vdWdoCisgKgl0byBoYXZlIENQVUlELiAoVGhhbmtzIHRvIEhlcmJlcnQgT3BwbWFubikKKyAqLworIAorc3RhdGljIGludCBfX2luaXQgZGVlcF9tYWdpY19uZXhnZW5fcHJvYmUodm9pZCkKK3sKKwlpbnQgcmV0OworCQorCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIgltb3Z3CSQweDU1NTUsICUlYXhcbiIKKwkJIgl4b3J3CSUlZHgsJSVkeFxuIgorCQkiCW1vdncJJDIsICUlY3hcbiIKKwkJIglkaXZ3CSUlY3hcbiIKKwkJIgltb3ZsCSQwLCAlJWVheFxuIgorCQkiCWpuegkxZlxuIgorCQkiCW1vdmwJJDEsICUlZWF4XG4iCisJCSIxOlxuIiAKKwkJOiAiPWEiIChyZXQpIDogOiAiY3giLCAiZHgiICk7CisJcmV0dXJuICByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X25leGdlbihzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQoreworCWMtPng4Nl9jYWNoZV9zaXplID0gMjU2OyAvKiBBIGZldyBoYWQgMSBNQi4uLiAqLworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbmV4Z2VuX2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCit7CisJLyogRGV0ZWN0IE5leEdlbiB3aXRoIG9sZCBoeXBlcmNvZGUgKi8KKwlpZiAoIGRlZXBfbWFnaWNfbmV4Z2VuX3Byb2JlKCkgKSB7CisJCXN0cmNweShjLT54ODZfdmVuZG9yX2lkLCAiTmV4R2VuRHJpdmVuIik7CisJfQorCWdlbmVyaWNfaWRlbnRpZnkoYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBuZXhnZW5fY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJOZXhnZW4iLAorCS5jX2lkZW50CT0geyAiTmV4R2VuRHJpdmVuIiB9LAorCS5jX21vZGVscyA9IHsKKwkJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfTkVYR0VOLAorCQkJICAuZmFtaWx5ID0gNSwKKwkJCSAgLm1vZGVsX25hbWVzID0geyBbMV0gPSAiTng1ODYiIH0KKwkJCX0sCisJfSwKKwkuY19pbml0CQk9IGluaXRfbmV4Z2VuLAorCS5jX2lkZW50aWZ5CT0gbmV4Z2VuX2lkZW50aWZ5LAorfTsKKworaW50IF9faW5pdCBuZXhnZW5faW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX05FWEdFTl0gPSAmbmV4Z2VuX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbChuZXhnZW5faW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZDgzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9wcm9jLmMKQEAgLTAsMCArMSwxNDkgQEAKKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisvKgorICoJR2V0IENQVSBpbmZvcm1hdGlvbiBmb3IgdXNlIGJ5IHRoZSBwcm9jZnMuCisgKi8KK3N0YXRpYyBpbnQgc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwkvKiAKKwkgKiBUaGVzZSBmbGFnIGJpdHMgbXVzdCBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4gPGFzbS9jcHVmZWF0dXJlLmg+LgorCSAqIE5VTEwgbWVhbnMgdGhpcyBiaXQgaXMgdW5kZWZpbmVkIG9yIHJlc2VydmVkOyBlaXRoZXIgd2F5IGl0IGRvZXNuJ3QKKwkgKiBoYXZlIG1lYW5pbmcgYXMgZmFyIGFzIExpbnV4IGlzIGNvbmNlcm5lZC4gIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudAorCSAqIHRvIHJlYWxpemUgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyB0YWJsZSBhbmQgQ1BVSUQgLS0gaWYKKwkgKiBhcHBsaWNhdGlvbnMgd2FudCB0byBnZXQgdGhlIHJhdyBDUFVJRCBkYXRhLCB0aGV5IHNob3VsZCBhY2Nlc3MKKwkgKiAvZGV2L2NwdS88Y3B1X25yPi9jcHVpZCBpbnN0ZWFkLgorCSAqLworCXN0YXRpYyBjaGFyICp4ODZfY2FwX2ZsYWdzW10gPSB7CisJCS8qIEludGVsLWRlZmluZWQgKi8KKwkgICAgICAgICJmcHUiLCAidm1lIiwgImRlIiwgInBzZSIsICJ0c2MiLCAibXNyIiwgInBhZSIsICJtY2UiLAorCSAgICAgICAgImN4OCIsICJhcGljIiwgTlVMTCwgInNlcCIsICJtdHJyIiwgInBnZSIsICJtY2EiLCAiY21vdiIsCisJICAgICAgICAicGF0IiwgInBzZTM2IiwgInBuIiwgImNsZmx1c2giLCBOVUxMLCAiZHRzIiwgImFjcGkiLCAibW14IiwKKwkgICAgICAgICJmeHNyIiwgInNzZSIsICJzc2UyIiwgInNzIiwgImh0IiwgInRtIiwgImlhNjQiLCAicGJlIiwKKworCQkvKiBBTUQtZGVmaW5lZCAqLworCQkicG5pIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgInN5c2NhbGwiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCAibXAiLCAibngiLCBOVUxMLCAibW14ZXh0IiwgTlVMTCwKKwkJTlVMTCwgImZ4c3Jfb3B0IiwgTlVMTCwgTlVMTCwgTlVMTCwgImxtIiwgIjNkbm93ZXh0IiwgIjNkbm93IiwKKworCQkvKiBUcmFuc21ldGEtZGVmaW5lZCAqLworCQkicmVjb3ZlcnkiLCAibG9uZ3J1biIsIE5VTEwsICJscnRpIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKworCQkvKiBPdGhlciAoTGludXgtZGVmaW5lZCkgKi8KKwkJImN4bW14IiwgIms2X210cnIiLCAiY3lyaXhfYXJyIiwgImNlbnRhdXJfbWNyIiwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKworCQkvKiBJbnRlbC1kZWZpbmVkICgjMikgKi8KKwkJInBuaSIsIE5VTEwsIE5VTEwsICJtb25pdG9yIiwgImRzX2NwbCIsIE5VTEwsIE5VTEwsICJlc3QiLAorCQkidG0yIiwgTlVMTCwgImNpZCIsIE5VTEwsIE5VTEwsICJjeDE2IiwgInh0cHIiLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCisJCS8qIFZJQS9DeXJpeC9DZW50YXVyLWRlZmluZWQgKi8KKwkJTlVMTCwgTlVMTCwgInJuZyIsICJybmdfZW4iLCBOVUxMLCBOVUxMLCAiYWNlIiwgImFjZV9lbiIsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisKKwkJLyogQU1ELWRlZmluZWQgKCMyKSAqLworCQkibGFoZl9sbSIsICJjbXBfbGVnYWN5IiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwl9OworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IHY7CisJaW50IGksIG4gPSBjIC0gY3B1X2RhdGE7CisJaW50IGZwdV9leGNlcHRpb247CisKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKCFjcHVfb25saW5lKG4pKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCXNlcV9wcmludGYobSwgInByb2Nlc3Nvclx0OiAlZFxuIgorCQkidmVuZG9yX2lkXHQ6ICVzXG4iCisJCSJjcHUgZmFtaWx5XHQ6ICVkXG4iCisJCSJtb2RlbFx0XHQ6ICVkXG4iCisJCSJtb2RlbCBuYW1lXHQ6ICVzXG4iLAorCQluLAorCQljLT54ODZfdmVuZG9yX2lkWzBdID8gYy0+eDg2X3ZlbmRvcl9pZCA6ICJ1bmtub3duIiwKKwkJYy0+eDg2LAorCQljLT54ODZfbW9kZWwsCisJCWMtPng4Nl9tb2RlbF9pZFswXSA/IGMtPng4Nl9tb2RlbF9pZCA6ICJ1bmtub3duIik7CisKKwlpZiAoYy0+eDg2X21hc2sgfHwgYy0+Y3B1aWRfbGV2ZWwgPj0gMCkKKwkJc2VxX3ByaW50ZihtLCAic3RlcHBpbmdcdDogJWRcbiIsIGMtPng4Nl9tYXNrKTsKKwllbHNlCisJCXNlcV9wcmludGYobSwgInN0ZXBwaW5nXHQ6IHVua25vd25cbiIpOworCisJaWYgKCBjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1RTQykgKSB7CisJCXNlcV9wcmludGYobSwgImNwdSBNSHpcdFx0OiAlbHUuJTAzbHVcbiIsCisJCQljcHVfa2h6IC8gMTAwMCwgKGNwdV9raHogJSAxMDAwKSk7CisJfQorCisJLyogQ2FjaGUgc2l6ZSAqLworCWlmIChjLT54ODZfY2FjaGVfc2l6ZSA+PSAwKQorCQlzZXFfcHJpbnRmKG0sICJjYWNoZSBzaXplXHQ6ICVkIEtCXG4iLCBjLT54ODZfY2FjaGVfc2l6ZSk7CisjaWZkZWYgQ09ORklHX1g4Nl9IVAorCXNlcV9wcmludGYobSwgInBoeXNpY2FsIGlkXHQ6ICVkXG4iLCBwaHlzX3Byb2NfaWRbbl0pOworCXNlcV9wcmludGYobSwgInNpYmxpbmdzXHQ6ICVkXG4iLCBjLT54ODZfbnVtX2NvcmVzICogc21wX251bV9zaWJsaW5ncyk7CisjZW5kaWYKKwkKKwkvKiBXZSB1c2UgZXhjZXB0aW9uIDE2IGlmIHdlIGhhdmUgaGFyZHdhcmUgbWF0aCBhbmQgd2UndmUgZWl0aGVyIHNlZW4gaXQgb3IgdGhlIENQVSBjbGFpbXMgaXQgaXMgaW50ZXJuYWwgKi8KKwlmcHVfZXhjZXB0aW9uID0gYy0+aGFyZF9tYXRoICYmIChpZ25vcmVfZnB1X2lycSB8fCBjcHVfaGFzX2ZwdSk7CisJc2VxX3ByaW50ZihtLCAiZmRpdl9idWdcdDogJXNcbiIKKwkJCSJobHRfYnVnXHRcdDogJXNcbiIKKwkJCSJmMDBmX2J1Z1x0OiAlc1xuIgorCQkJImNvbWFfYnVnXHQ6ICVzXG4iCisJCQkiZnB1XHRcdDogJXNcbiIKKwkJCSJmcHVfZXhjZXB0aW9uXHQ6ICVzXG4iCisJCQkiY3B1aWQgbGV2ZWxcdDogJWRcbiIKKwkJCSJ3cFx0XHQ6ICVzXG4iCisJCQkiZmxhZ3NcdFx0OiIsCisJCSAgICAgYy0+ZmRpdl9idWcgPyAieWVzIiA6ICJubyIsCisJCSAgICAgYy0+aGx0X3dvcmtzX29rID8gIm5vIiA6ICJ5ZXMiLAorCQkgICAgIGMtPmYwMGZfYnVnID8gInllcyIgOiAibm8iLAorCQkgICAgIGMtPmNvbWFfYnVnID8gInllcyIgOiAibm8iLAorCQkgICAgIGMtPmhhcmRfbWF0aCA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgICBmcHVfZXhjZXB0aW9uID8gInllcyIgOiAibm8iLAorCQkgICAgIGMtPmNwdWlkX2xldmVsLAorCQkgICAgIGMtPndwX3dvcmtzX29rID8gInllcyIgOiAibm8iKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IDMyKk5DQVBJTlRTIDsgaSsrICkKKwkJaWYgKCB0ZXN0X2JpdChpLCBjLT54ODZfY2FwYWJpbGl0eSkgJiYKKwkJICAgICB4ODZfY2FwX2ZsYWdzW2ldICE9IE5VTEwgKQorCQkJc2VxX3ByaW50ZihtLCAiICVzIiwgeDg2X2NhcF9mbGFnc1tpXSk7CisKKwlzZXFfcHJpbnRmKG0sICJcbmJvZ29taXBzXHQ6ICVsdS4lMDJsdVxuXG4iLAorCQkgICAgIGMtPmxvb3BzX3Blcl9qaWZmeS8oNTAwMDAwL0haKSwKKwkJICAgICAoYy0+bG9vcHNfcGVyX2ppZmZ5Lyg1MDAwL0haKSkgJSAxMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqY19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQoreworCXJldHVybiAqcG9zIDwgTlJfQ1BVUyA/IGNwdV9kYXRhICsgKnBvcyA6IE5VTEw7Cit9CitzdGF0aWMgdm9pZCAqY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiBjX3N0YXJ0KG0sIHBvcyk7Cit9CitzdGF0aWMgdm9pZCBjX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworfQorc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7CisJLnN0YXJ0CT0gY19zdGFydCwKKwkubmV4dAk9IGNfbmV4dCwKKwkuc3RvcAk9IGNfc3RvcCwKKwkuc2hvdwk9IHNob3dfY3B1aW5mbywKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9yaXNlLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9yaXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwMjQyNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L3Jpc2UuYwpAQCAtMCwwICsxLDUzIEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgImNwdS5oIgorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9yaXNlKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwlwcmludGsoIkNQVTogUmlzZSBpRHJhZ29uIik7CisJaWYgKGMtPng4Nl9tb2RlbCA+IDIpCisJCXByaW50aygiIElJIik7CisJcHJpbnRrKCJcbiIpOworCisJLyogVW5oaWRlIHBvc3NpYmx5IGhpZGRlbiBjYXBhYmlsaXR5IGZsYWdzCisJICAgVGhlIG1wNiBpRHJhZ29uIGZhbWlseSBkb24ndCBoYXZlIE1TUnMuCisJICAgV2Ugc3dpdGNoIG9uIGV4dHJhIGZlYXR1cmVzIHdpdGggdGhpcyBjcHVpZCB3ZWlyZG5lc3M6ICovCisJX19hc21fXyAoCisJCSJtb3ZsICQweDYzNjM0NTJhLCAlJWVheFxuXHQiCisJCSJtb3ZsICQweDMyMzEyMDZjLCAlJWVjeFxuXHQiCisJCSJtb3ZsICQweDJhMzIzMTNhLCAlJWVkeFxuXHQiCisJCSJjcHVpZFxuXHQiCisJCSJtb3ZsICQweDYzNjM0NTIzLCAlJWVheFxuXHQiCisJCSJtb3ZsICQweDMyMzE1ZjZjLCAlJWVjeFxuXHQiCisJCSJtb3ZsICQweDIzMzMzMTNhLCAlJWVkeFxuXHQiCisJCSJjcHVpZFxuXHQiIDogOiA6ICJlYXgiLCAiZWJ4IiwgImVjeCIsICJlZHgiCisJKTsKKwlzZXRfYml0KFg4Nl9GRUFUVVJFX0NYOCwgYy0+eDg2X2NhcGFiaWxpdHkpOworfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgcmlzZV9jcHVfZGV2IF9faW5pdGRhdGEgPSB7CisJLmNfdmVuZG9yCT0gIlJpc2UiLAorCS5jX2lkZW50CT0geyAiUmlzZVJpc2VSaXNlIiB9LAorCS5jX21vZGVscyA9IHsKKwkJeyAudmVuZG9yID0gWDg2X1ZFTkRPUl9SSVNFLCAuZmFtaWx5ID0gNSwgLm1vZGVsX25hbWVzID0gCisJCSAgeyAKKwkJCSAgWzBdID0gImlEcmFnb24iLCAKKwkJCSAgWzJdID0gImlEcmFnb24iLCAKKwkJCSAgWzhdID0gImlEcmFnb24gSUkiLCAKKwkJCSAgWzldID0gImlEcmFnb24gSUkiCisJCSAgfQorCQl9LAorCX0sCisJLmNfaW5pdAkJPSBpbml0X3Jpc2UsCit9OworCitpbnQgX19pbml0IHJpc2VfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX1JJU0VdID0gJnJpc2VfY3B1X2RldjsKKwlyZXR1cm4gMDsKK30KKworLy9lYXJseV9hcmNoX2luaXRjYWxsKHJpc2VfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdHJhbnNtZXRhLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS90cmFuc21ldGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTdlNWVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdHJhbnNtZXRhLmMKQEAgLTAsMCArMSwxMDcgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlICJjcHUuaCIKKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfdHJhbnNtZXRhKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwl1bnNpZ25lZCBpbnQgY2FwX21hc2ssIHVrLCBtYXgsIGR1bW15OworCXVuc2lnbmVkIGludCBjbXNfcmV2MSwgY21zX3JldjI7CisJdW5zaWduZWQgaW50IGNwdV9yZXYsIGNwdV9mcmVxLCBjcHVfZmxhZ3MsIG5ld19jcHVfcmV2OworCWNoYXIgY3B1X2luZm9bNjVdOworCisJZ2V0X21vZGVsX25hbWUoYyk7CS8qIFNhbWUgYXMgQU1EL0N5cml4ICovCisJZGlzcGxheV9jYWNoZWluZm8oYyk7CisKKwkvKiBQcmludCBDTVMgYW5kIENQVSByZXZpc2lvbiAqLworCW1heCA9IGNwdWlkX2VheCgweDgwODYwMDAwKTsKKwljcHVfcmV2ID0gMDsKKwlpZiAoIG1heCA+PSAweDgwODYwMDAxICkgeworCQljcHVpZCgweDgwODYwMDAxLCAmZHVtbXksICZjcHVfcmV2LCAmY3B1X2ZyZXEsICZjcHVfZmxhZ3MpOyAKKwkJaWYgKGNwdV9yZXYgIT0gMHgwMjAwMDAwMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiBQcm9jZXNzb3IgcmV2aXNpb24gJXUuJXUuJXUuJXUsICV1IE1IelxuIiwKKwkJCQkoY3B1X3JldiA+PiAyNCkgJiAweGZmLAorCQkJCShjcHVfcmV2ID4+IDE2KSAmIDB4ZmYsCisJCQkJKGNwdV9yZXYgPj4gOCkgJiAweGZmLAorCQkJCWNwdV9yZXYgJiAweGZmLAorCQkJCWNwdV9mcmVxKTsKKwkJfQorCX0KKwlpZiAoIG1heCA+PSAweDgwODYwMDAyICkgeworCQljcHVpZCgweDgwODYwMDAyLCAmbmV3X2NwdV9yZXYsICZjbXNfcmV2MSwgJmNtc19yZXYyLCAmZHVtbXkpOworCQlpZiAoY3B1X3JldiA9PSAweDAyMDAwMDAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IFByb2Nlc3NvciByZXZpc2lvbiAlMDhYLCAldSBNSHpcbiIsCisJCQkJbmV3X2NwdV9yZXYsIGNwdV9mcmVxKTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJDUFU6IENvZGUgTW9ycGhpbmcgU29mdHdhcmUgcmV2aXNpb24gJXUuJXUuJXUtJXUtJXVcbiIsCisJCSAgICAgICAoY21zX3JldjEgPj4gMjQpICYgMHhmZiwKKwkJICAgICAgIChjbXNfcmV2MSA+PiAxNikgJiAweGZmLAorCQkgICAgICAgKGNtc19yZXYxID4+IDgpICYgMHhmZiwKKwkJICAgICAgIGNtc19yZXYxICYgMHhmZiwKKwkJICAgICAgIGNtc19yZXYyKTsKKwl9CisJaWYgKCBtYXggPj0gMHg4MDg2MDAwNiApIHsKKwkJY3B1aWQoMHg4MDg2MDAwMywKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMF0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzRdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1s4XSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMTJdKTsKKwkJY3B1aWQoMHg4MDg2MDAwNCwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMTZdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1syMF0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzI0XSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMjhdKTsKKwkJY3B1aWQoMHg4MDg2MDAwNSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bMzJdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1szNl0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzQwXSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bNDRdKTsKKwkJY3B1aWQoMHg4MDg2MDAwNiwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bNDhdLAorCQkgICAgICAodm9pZCAqKSZjcHVfaW5mb1s1Ml0sCisJCSAgICAgICh2b2lkICopJmNwdV9pbmZvWzU2XSwKKwkJICAgICAgKHZvaWQgKikmY3B1X2luZm9bNjBdKTsKKwkJY3B1X2luZm9bNjRdID0gJ1wwJzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVOiAlc1xuIiwgY3B1X2luZm8pOworCX0KKworCS8qIFVuaGlkZSBwb3NzaWJseSBoaWRkZW4gY2FwYWJpbGl0eSBmbGFncyAqLworCXJkbXNyKDB4ODA4NjAwMDQsIGNhcF9tYXNrLCB1ayk7CisJd3Jtc3IoMHg4MDg2MDAwNCwgfjAsIHVrKTsKKwljLT54ODZfY2FwYWJpbGl0eVswXSA9IGNwdWlkX2VkeCgweDAwMDAwMDAxKTsKKwl3cm1zcigweDgwODYwMDA0LCBjYXBfbWFzaywgdWspOworCQorCS8qIElmIHdlIGNhbiBydW4gaTY4NiB1c2VyLXNwYWNlIGNvZGUsIGNhbGwgdXMgYW4gaTY4NiAqLworI2RlZmluZSBVU0VSNjg2IChYODZfRkVBVFVSRV9UU0N8WDg2X0ZFQVRVUkVfQ1g4fFg4Nl9GRUFUVVJFX0NNT1YpCisgICAgICAgIGlmICggYy0+eDg2ID09IDUgJiYgKGMtPng4Nl9jYXBhYmlsaXR5WzBdICYgVVNFUjY4NikgPT0gVVNFUjY4NiApCisJCWMtPng4NiA9IDY7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zbWV0YV9pZGVudGlmeShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQoreworCXUzMiB4bHZsOworCWdlbmVyaWNfaWRlbnRpZnkoYyk7CisKKwkvKiBUcmFuc21ldGEtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHg4MDg2MDAwMSAqLworCXhsdmwgPSBjcHVpZF9lYXgoMHg4MDg2MDAwMCk7CisJaWYgKCAoeGx2bCAmIDB4ZmZmZjAwMDApID09IDB4ODA4NjAwMDAgKSB7CisJCWlmICggIHhsdmwgPj0gMHg4MDg2MDAwMSApCisJCQljLT54ODZfY2FwYWJpbGl0eVsyXSA9IGNwdWlkX2VkeCgweDgwODYwMDAxKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiB0cmFuc21ldGFfY3B1X2RldiBfX2luaXRkYXRhID0geworCS5jX3ZlbmRvcgk9ICJUcmFuc21ldGEiLAorCS5jX2lkZW50CT0geyAiR2VudWluZVRNeDg2IiwgIlRyYW5zbWV0YUNQVSIgfSwKKwkuY19pbml0CQk9IGluaXRfdHJhbnNtZXRhLAorCS5jX2lkZW50aWZ5CT0gdHJhbnNtZXRhX2lkZW50aWZ5LAorfTsKKworaW50IF9faW5pdCB0cmFuc21ldGFfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX1RSQU5TTUVUQV0gPSAmdHJhbnNtZXRhX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbCh0cmFuc21ldGFfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdW1jLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS91bWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRmY2FkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdW1jLmMKQEAgLTAsMCArMSwzMyBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSAiY3B1LmgiCisKKy8qIFVNQyBjaGlwcyBhcHBlYXIgdG8gYmUgb25seSBlaXRoZXIgMzg2IG9yIDQ4Niwgc28gbm8gc3BlY2lhbCBpbml0IHRha2VzIHBsYWNlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF91bWMoc3RydWN0IGNwdWluZm9feDg2ICogYykKK3sKKworfQorCitzdGF0aWMgc3RydWN0IGNwdV9kZXYgdW1jX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKKwkuY192ZW5kb3IJPSAiVU1DIiwKKwkuY19pZGVudCAJPSB7ICJVTUMgVU1DIFVNQyIgfSwKKwkuY19tb2RlbHMgPSB7CisJCXsgLnZlbmRvciA9IFg4Nl9WRU5ET1JfVU1DLCAuZmFtaWx5ID0gNCwgLm1vZGVsX25hbWVzID0KKwkJICB7IAorCQkJICBbMV0gPSAiVTVEIiwgCisJCQkgIFsyXSA9ICJVNVMiLCAKKwkJICB9CisJCX0sCisJfSwKKwkuY19pbml0CQk9IGluaXRfdW1jLAorfTsKKworaW50IF9faW5pdCB1bWNfaW5pdF9jcHUodm9pZCkKK3sKKwljcHVfZGV2c1tYODZfVkVORE9SX1VNQ10gPSAmdW1jX2NwdV9kZXY7CisJcmV0dXJuIDA7Cit9CisKKy8vZWFybHlfYXJjaF9pbml0Y2FsbCh1bWNfaW5pdF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHVpZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHVpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjc1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdWlkLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiAgIENvcHlyaWdodCAyMDAwIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UgTUEgMDIxMzksCisgKiAgIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAqICAgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGNwdWlkLmMKKyAqCisgKiB4ODYgQ1BVSUQgYWNjZXNzIGRldmljZQorICoKKyAqIFRoaXMgZGV2aWNlIGlzIGFjY2Vzc2VkIGJ5IGxzZWVrKCkgdG8gdGhlIGFwcHJvcHJpYXRlIENQVUlEIGxldmVsCisgKiBhbmQgdGhlbiByZWFkIGluIGNodW5rcyBvZiAxNiBieXRlcy4gIEEgbGFyZ2VyIHNpemUgbWVhbnMgbXVsdGlwbGUKKyAqIHJlYWRzIG9mIGNvbnNlY3V0aXZlIGxldmVscy4KKyAqCisgKiBUaGlzIGRyaXZlciB1c2VzIC9kZXYvY3B1LyVkL2NwdWlkIHdoZXJlICVkIGlzIHRoZSBtaW5vciBudW1iZXIsIGFuZCBvbgorICogYW4gU01QIGJveCB3aWxsIGRpcmVjdCB0aGUgYWNjZXNzIHRvIENQVSAlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICpjcHVpZF9jbGFzczsKKworI2lmZGVmIENPTkZJR19TTVAKKworc3RydWN0IGNwdWlkX2NvbW1hbmQgeworCWludCBjcHU7CisJdTMyIHJlZzsKKwl1MzIgKmRhdGE7Cit9OworCitzdGF0aWMgdm9pZCBjcHVpZF9zbXBfY3B1aWQodm9pZCAqY21kX2Jsb2NrKQoreworCXN0cnVjdCBjcHVpZF9jb21tYW5kICpjbWQgPSAoc3RydWN0IGNwdWlkX2NvbW1hbmQgKiljbWRfYmxvY2s7CisKKwlpZiAoY21kLT5jcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQljcHVpZChjbWQtPnJlZywgJmNtZC0+ZGF0YVswXSwgJmNtZC0+ZGF0YVsxXSwgJmNtZC0+ZGF0YVsyXSwKKwkJICAgICAgJmNtZC0+ZGF0YVszXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19jcHVpZChpbnQgY3B1LCB1MzIgcmVnLCB1MzIgKiBkYXRhKQoreworCXN0cnVjdCBjcHVpZF9jb21tYW5kIGNtZDsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisJCWNwdWlkKHJlZywgJmRhdGFbMF0sICZkYXRhWzFdLCAmZGF0YVsyXSwgJmRhdGFbM10pOworCX0gZWxzZSB7CisJCWNtZC5jcHUgPSBjcHU7CisJCWNtZC5yZWcgPSByZWc7CisJCWNtZC5kYXRhID0gZGF0YTsKKworCQlzbXBfY2FsbF9mdW5jdGlvbihjcHVpZF9zbXBfY3B1aWQsICZjbWQsIDEsIDEpOworCX0KKwlwcmVlbXB0X2VuYWJsZSgpOworfQorI2Vsc2UJCQkJLyogISBDT05GSUdfU01QICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19jcHVpZChpbnQgY3B1LCB1MzIgcmVnLCB1MzIgKiBkYXRhKQoreworCWNwdWlkKHJlZywgJmRhdGFbMF0sICZkYXRhWzFdLCAmZGF0YVsyXSwgJmRhdGFbM10pOworfQorCisjZW5kaWYJCQkJLyogISBDT05GSUdfU01QICovCisKK3N0YXRpYyBsb2ZmX3QgY3B1aWRfc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCit7CisJbG9mZl90IHJldDsKKworCWxvY2tfa2VybmVsKCk7CisKKwlzd2l0Y2ggKG9yaWcpIHsKKwljYXNlIDA6CisJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQlyZXQgPSBmaWxlLT5mX3BvczsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlmaWxlLT5mX3BvcyArPSBvZmZzZXQ7CisJCXJldCA9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBjcHVpZF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJY2hhciBfX3VzZXIgKnRtcCA9IGJ1ZjsKKwl1MzIgZGF0YVs0XTsKKwlzaXplX3QgcnY7CisJdTMyIHJlZyA9ICpwcG9zOworCWludCBjcHUgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCisJaWYgKGNvdW50ICUgMTYpCisJCXJldHVybiAtRUlOVkFMOwkvKiBJbnZhbGlkIGNodW5rIHNpemUgKi8KKworCWZvciAocnYgPSAwOyBjb3VudDsgY291bnQgLT0gMTYpIHsKKwkJZG9fY3B1aWQoY3B1LCByZWcsIGRhdGEpOworCQlpZiAoY29weV90b191c2VyKHRtcCwgJmRhdGEsIDE2KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl0bXAgKz0gMTY7CisJCSpwcG9zID0gcmVnKys7CisJfQorCisJcmV0dXJuIHRtcCAtIGJ1ZjsKK30KKworc3RhdGljIGludCBjcHVpZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBjcHUgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICYoY3B1X2RhdGEpW2NwdV07CisKKwlpZiAoY3B1ID49IE5SX0NQVVMgfHwgIWNwdV9vbmxpbmUoY3B1KSkKKwkJcmV0dXJuIC1FTlhJTzsJLyogTm8gc3VjaCBDUFUgKi8KKwlpZiAoYy0+Y3B1aWRfbGV2ZWwgPCAwKQorCQlyZXR1cm4gLUVJTzsJLyogQ1BVSUQgbm90IHN1cHBvcnRlZCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydAorICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjcHVpZF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBjcHVpZF9zZWVrLAorCS5yZWFkID0gY3B1aWRfcmVhZCwKKwkub3BlbiA9IGNwdWlkX29wZW4sCit9OworCitzdGF0aWMgaW50IGNwdWlkX2NsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGludCBpKSAKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19lcnI7CisKKwljbGFzc19lcnIgPSBjbGFzc19zaW1wbGVfZGV2aWNlX2FkZChjcHVpZF9jbGFzcywgTUtERVYoQ1BVSURfTUFKT1IsIGkpLCBOVUxMLCAiY3B1JWQiLGkpOworCWlmIChJU19FUlIoY2xhc3NfZXJyKSkKKwkJZXJyID0gUFRSX0VSUihjbGFzc19lcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNwdWlkX2NsYXNzX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX09OTElORToKKwkJY3B1aWRfY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoY3B1KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfREVBRDoKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoQ1BVSURfTUFKT1IsIGNwdSkpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcHVpZF9jbGFzc19jcHVfbm90aWZpZXIgPQoreworCS5ub3RpZmllcl9jYWxsID0gY3B1aWRfY2xhc3NfY3B1X2NhbGxiYWNrLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3B1aWRfaW5pdCh2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCWkgPSAwOworCisJaWYgKHJlZ2lzdGVyX2NocmRldihDUFVJRF9NQUpPUiwgImNwdS9jcHVpZCIsICZjcHVpZF9mb3BzKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNwdWlkOiB1bmFibGUgdG8gZ2V0IG1ham9yICVkIGZvciBjcHVpZFxuIiwKKwkJICAgICAgIENQVUlEX01BSk9SKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJY3B1aWRfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAiY3B1aWQiKTsKKwlpZiAoSVNfRVJSKGNwdWlkX2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKGNwdWlkX2NsYXNzKTsKKwkJZ290byBvdXRfY2hyZGV2OworCX0KKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwkJZXJyID0gY3B1aWRfY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoaSk7CisJCWlmIChlcnIgIT0gMCkgCisJCQlnb3RvIG91dF9jbGFzczsKKwl9CisJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZjcHVpZF9jbGFzc19jcHVfbm90aWZpZXIpOworCisJZXJyID0gMDsKKwlnb3RvIG91dDsKKworb3V0X2NsYXNzOgorCWkgPSAwOworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihDUFVJRF9NQUpPUiwgaSkpOworCX0KKwljbGFzc19zaW1wbGVfZGVzdHJveShjcHVpZF9jbGFzcyk7CitvdXRfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2KENQVUlEX01BSk9SLCAiY3B1L2NwdWlkIik7CQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcHVpZF9leGl0KHZvaWQpCit7CisJaW50IGNwdSA9IDA7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoQ1BVSURfTUFKT1IsIGNwdSkpOworCWNsYXNzX3NpbXBsZV9kZXN0cm95KGNwdWlkX2NsYXNzKTsKKwl1bnJlZ2lzdGVyX2NocmRldihDUFVJRF9NQUpPUiwgImNwdS9jcHVpZCIpOworCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZjcHVpZF9jbGFzc19jcHVfbm90aWZpZXIpOworfQorCittb2R1bGVfaW5pdChjcHVpZF9pbml0KTsKK21vZHVsZV9leGl0KGNwdWlkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJILiBQZXRlciBBbnZpbiA8aHBhQHp5dG9yLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigieDg2IGdlbmVyaWMgQ1BVSUQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMgYi9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkN2UyOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZG1pX3NjYW4uYwpAQCAtMCwwICsxLDQ4NyBAQAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorCisKK3N0cnVjdCBkbWlfaGVhZGVyCit7CisJdTgJdHlwZTsKKwl1OAlsZW5ndGg7CisJdTE2CWhhbmRsZTsKK307CisKKyN1bmRlZiBETUlfREVCVUcKKworI2lmZGVmIERNSV9ERUJVRworI2RlZmluZSBkbWlfcHJpbnRrKHgpIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBkbWlfcHJpbnRrKHgpCisjZW5kaWYKKworc3RhdGljIGNoYXIgKiBfX2luaXQgZG1pX3N0cmluZyhzdHJ1Y3QgZG1pX2hlYWRlciAqZG0sIHU4IHMpCit7CisJdTggKmJwPSh1OCAqKWRtOworCWJwKz1kbS0+bGVuZ3RoOworCWlmKCFzKQorCQlyZXR1cm4gIiI7CisJcy0tOworCXdoaWxlKHM+MCAmJiAqYnApCisJeworCQlicCs9c3RybGVuKGJwKTsKKwkJYnArKzsKKwkJcy0tOworCX0KKwlyZXR1cm4gYnA7Cit9CisKKy8qCisgKglXZSBoYXZlIHRvIGJlIGNhdXRpb3VzIGhlcmUuIFdlIGhhdmUgc2VlbiBCSU9TZXMgd2l0aCBETUkgcG9pbnRlcnMKKyAqCXBvaW50aW5nIHRvIGNvbXBsZXRlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBleGFtcGxlCisgKi8KKyAKK3N0YXRpYyBpbnQgX19pbml0IGRtaV90YWJsZSh1MzIgYmFzZSwgaW50IGxlbiwgaW50IG51bSwgdm9pZCAoKmRlY29kZSkoc3RydWN0IGRtaV9oZWFkZXIgKikpCit7CisJdTggKmJ1ZjsKKwlzdHJ1Y3QgZG1pX2hlYWRlciAqZG07CisJdTggKmRhdGE7CisJaW50IGk9MDsKKwkJCisJYnVmID0gYnRfaW9yZW1hcChiYXNlLCBsZW4pOworCWlmKGJ1Zj09TlVMTCkKKwkJcmV0dXJuIC0xOworCisJZGF0YSA9IGJ1ZjsKKworCS8qCisgCSAqCVN0b3Agd2hlbiB3ZSBzZWUgYWxsIHRoZSBpdGVtcyB0aGUgdGFibGUgY2xhaW1lZCB0byBoYXZlCisgCSAqCU9SIHdlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgdGFibGUgKGFsc28gaGFwcGVucykKKyAJICovCisgCisJd2hpbGUoaTxudW0gJiYgZGF0YS1idWYrc2l6ZW9mKHN0cnVjdCBkbWlfaGVhZGVyKTw9bGVuKQorCXsKKwkJZG09KHN0cnVjdCBkbWlfaGVhZGVyICopZGF0YTsKKwkJLyoKKwkJICogIFdlIHdhbnQgdG8ga25vdyB0aGUgdG90YWwgbGVuZ3RoIChmb3JtYXRlZCBhcmVhIGFuZCBzdHJpbmdzKQorCQkgKiAgYmVmb3JlIGRlY29kaW5nIHRvIG1ha2Ugc3VyZSB3ZSB3b24ndCBydW4gb2ZmIHRoZSB0YWJsZSBpbgorCQkgKiAgZG1pX2RlY29kZSBvciBkbWlfc3RyaW5nCisJCSAqLworCQlkYXRhKz1kbS0+bGVuZ3RoOworCQl3aGlsZShkYXRhLWJ1ZjxsZW4tMSAmJiAoZGF0YVswXSB8fCBkYXRhWzFdKSkKKwkJCWRhdGErKzsKKwkJaWYoZGF0YS1idWY8bGVuLTEpCisJCQlkZWNvZGUoZG0pOworCQlkYXRhKz0yOworCQlpKys7CisJfQorCWJ0X2lvdW5tYXAoYnVmLCBsZW4pOworCXJldHVybiAwOworfQorCisKK2lubGluZSBzdGF0aWMgaW50IF9faW5pdCBkbWlfY2hlY2tzdW0odTggKmJ1ZikKK3sKKwl1OCBzdW09MDsKKwlpbnQgYTsKKwkKKwlmb3IoYT0wOyBhPDE1OyBhKyspCisJCXN1bSs9YnVmW2FdOworCXJldHVybiAoc3VtPT0wKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZG1pX2l0ZXJhdGUodm9pZCAoKmRlY29kZSkoc3RydWN0IGRtaV9oZWFkZXIgKikpCit7CisJdTggYnVmWzE1XTsKKwljaGFyIF9faW9tZW0gKnAsICpxOworCisJLyoKKwkgKiBubyBpb3VubWFwKCkgZm9yIHRoYXQgaW9yZW1hcCgpOyBpdCB3b3VsZCBiZSBhIG5vLW9wLCBidXQgaXQncworCSAqIHNvIGVhcmx5IGluIHNldHVwIHRoYXQgc3Vja2VyIGdldHMgY29uZnVzZWQgaW50byBkb2luZyB3aGF0CisJICogaXQgc2hvdWxkbid0IGlmIHdlIGFjdHVhbGx5IGNhbGwgaXQuCisJICovCisJcCA9IGlvcmVtYXAoMHhGMDAwMCwgMHgxMDAwMCk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCWZvciAocSA9IHA7IHEgPCBwICsgMHgxMDAwMDsgcSArPSAxNikgeworCQltZW1jcHlfZnJvbWlvKGJ1ZiwgcSwgMTUpOworCQlpZihtZW1jbXAoYnVmLCAiX0RNSV8iLCA1KT09MCAmJiBkbWlfY2hlY2tzdW0oYnVmKSkKKwkJeworCQkJdTE2IG51bT1idWZbMTNdPDw4fGJ1ZlsxMl07CisJCQl1MTYgbGVuPWJ1Zls3XTw8OHxidWZbNl07CisJCQl1MzIgYmFzZT1idWZbMTFdPDwyNHxidWZbMTBdPDwxNnxidWZbOV08PDh8YnVmWzhdOworCisJCQkvKgorCQkJICogRE1JIHZlcnNpb24gMC4wIG1lYW5zIHRoYXQgdGhlIHJlYWwgdmVyc2lvbiBpcyB0YWtlbiBmcm9tCisJCQkgKiB0aGUgU01CSU9TIHZlcnNpb24sIHdoaWNoIHdlIGRvbid0IGtub3cgYXQgdGhpcyBwb2ludC4KKwkJCSAqLworCQkJaWYoYnVmWzE0XSE9MCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJETUkgJWQuJWQgcHJlc2VudC5cbiIsCisJCQkJCWJ1ZlsxNF0+PjQsIGJ1ZlsxNF0mMHgwRik7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1JIHByZXNlbnQuXG4iKTsKKwkJCWRtaV9wcmludGsoKEtFUk5fSU5GTyAiJWQgc3RydWN0dXJlcyBvY2N1cHlpbmcgJWQgYnl0ZXMuXG4iLAorCQkJCW51bSwgbGVuKSk7CisJCQlkbWlfcHJpbnRrKChLRVJOX0lORk8gIkRNSSB0YWJsZSBhdCAweCUwOFguXG4iLAorCQkJCWJhc2UpKTsKKwkJCWlmKGRtaV90YWJsZShiYXNlLGxlbiwgbnVtLCBkZWNvZGUpPT0wKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGNoYXIgKmRtaV9pZGVudFtETUlfU1RSSU5HX01BWF07CisKKy8qCisgKglTYXZlIGEgRE1JIHN0cmluZworICovCisgCitzdGF0aWMgdm9pZCBfX2luaXQgZG1pX3NhdmVfaWRlbnQoc3RydWN0IGRtaV9oZWFkZXIgKmRtLCBpbnQgc2xvdCwgaW50IHN0cmluZykKK3sKKwljaGFyICpkID0gKGNoYXIqKWRtOworCWNoYXIgKnAgPSBkbWlfc3RyaW5nKGRtLCBkW3N0cmluZ10pOworCWlmKHA9PU5VTEwgfHwgKnAgPT0gMCkKKwkJcmV0dXJuOworCWlmIChkbWlfaWRlbnRbc2xvdF0pCisJCXJldHVybjsKKwlkbWlfaWRlbnRbc2xvdF0gPSBhbGxvY19ib290bWVtKHN0cmxlbihwKSsxKTsKKwlpZihkbWlfaWRlbnRbc2xvdF0pCisJCXN0cmNweShkbWlfaWRlbnRbc2xvdF0sIHApOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWlfc2F2ZV9pZGVudDogb3V0IG9mIG1lbW9yeS5cbiIpOworfQorCisvKgorICogVWdseSBjb21wYXRpYmlsaXR5IGNyYXAuCisgKi8KKyNkZWZpbmUgZG1pX2JsYWNrbGlzdAlkbWlfc3lzdGVtX2lkCisjZGVmaW5lIE5PX01BVENICXsgRE1JX05PTkUsIE5VTEx9CisjZGVmaW5lIE1BVENICQlETUlfTUFUQ0gKKworLyoKKyAqIFRvc2hpYmEga2V5Ym9hcmQgbGlrZXMgdG8gcmVwZWF0IGtleXMgd2hlbiB0aGV5IGFyZSBub3QgcmVwZWF0ZWQuCisgKi8KKworc3RhdGljIF9faW5pdCBpbnQgYnJva2VuX3Rvc2hpYmFfa2V5Ym9hcmQoc3RydWN0IGRtaV9ibGFja2xpc3QgKmQpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiVG9zaGliYSB3aXRoIGJyb2tlbiBrZXlib2FyZCBkZXRlY3RlZC4gSWYgeW91ciBrZXlib2FyZCBzb21ldGltZXMgZ2VuZXJhdGVzIDMga2V5cHJlc3NlcyBpbnN0ZWFkIG9mIG9uZSwgc2VlIGh0dHA6Ly9kYXZ5ZC51Y2MuYXNuLmF1L3Byb2plY3RzL3Rvc2hpYmEvUkVBRE1FXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKK3N0YXRpYyBfX2luaXQgaW50IHJlc2V0X3ZpZGVvbW9kZV9hZnRlcl9zMyhzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkKK3sKKwkvKiBTZWUgYWNwaV93YWtldXAuUyAqLworCWV4dGVybiBsb25nIGFjcGlfdmlkZW9fZmxhZ3M7CisJYWNwaV92aWRlb19mbGFncyB8PSAyOworCXJldHVybiAwOworfQorI2VuZGlmCisKKworI2lmZGVmCUNPTkZJR19BQ1BJX0JPT1QKK2V4dGVybiBpbnQgYWNwaV9mb3JjZTsKKworc3RhdGljIF9faW5pdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBpbnQgZG1pX2Rpc2FibGVfYWNwaShzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkgCit7IAorCWlmICghYWNwaV9mb3JjZSkgeyAKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBkZXRlY3RlZDogYWNwaSBvZmZcbiIsZC0+aWRlbnQpOyAKKwkJZGlzYWJsZV9hY3BpKCk7CisJfSBlbHNlIHsgCisJCXByaW50ayhLRVJOX05PVElDRSAKKwkJICAgICAgICJXYXJuaW5nOiBETUkgYmxhY2tsaXN0IHNheXMgYnJva2VuLCBidXQgYWNwaSBmb3JjZWRcbiIpOyAKKwl9CisJcmV0dXJuIDA7Cit9IAorCisvKgorICogTGltaXQgQUNQSSB0byBDUFUgZW51bWVyYXRpb24gZm9yIEhUCisgKi8KK3N0YXRpYyBfX2luaXQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaW50IGZvcmNlX2FjcGlfaHQoc3RydWN0IGRtaV9ibGFja2xpc3QgKmQpIAoreyAKKwlpZiAoIWFjcGlfZm9yY2UpIHsgCisJCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBhY3BpPWh0XG4iLCBkLT5pZGVudCk7IAorCQlkaXNhYmxlX2FjcGkoKTsKKwkJYWNwaV9odCA9IDE7IAorCX0gZWxzZSB7IAorCQlwcmludGsoS0VSTl9OT1RJQ0UgCisJCSAgICAgICAiV2FybmluZzogYWNwaT1mb3JjZSBvdmVycnVsZXMgRE1JIGJsYWNrbGlzdDogYWNwaT1odFxuIik7IAorCX0KKwlyZXR1cm4gMDsKK30gCisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19BQ1BJX1BDSQorc3RhdGljIF9faW5pdCBpbnQgZGlzYWJsZV9hY3BpX2lycShzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkgCit7CisJaWYgKCFhY3BpX2ZvcmNlKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBhY3BpPW5vaXJxXG4iLAorCQkgICAgICAgZC0+aWRlbnQpOyAJCisJCWFjcGlfbm9pcnFfc2V0KCk7CisJfQorCXJldHVybiAwOworfQorc3RhdGljIF9faW5pdCBpbnQgZGlzYWJsZV9hY3BpX3BjaShzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkgCit7CisJaWYgKCFhY3BpX2ZvcmNlKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBwY2k9bm9hY3BpXG4iLAorCQkgICAgICAgZC0+aWRlbnQpOyAJCisJCWFjcGlfZGlzYWJsZV9wY2koKTsKKwl9CisJcmV0dXJuIDA7Cit9ICAKKyNlbmRpZgorCisvKgorICoJUHJvY2VzcyB0aGUgRE1JIGJsYWNrbGlzdHMKKyAqLworIAorCisvKgorICoJVGhpcyB3aWxsIGJlIGV4cGFuZGVkIG92ZXIgdGltZSB0byBmb3JjZSB0aGluZ3MgbGlrZSB0aGUgQVBNIAorICoJaW50ZXJydXB0IG1hc2sgc2V0dGluZ3MgYWNjb3JkaW5nIHRvIHRoZSBsYXB0b3AKKyAqLworIAorc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IGRtaV9ibGFja2xpc3QgZG1pX2JsYWNrbGlzdFtdPXsKKworCXsgYnJva2VuX3Rvc2hpYmFfa2V5Ym9hcmQsICJUb3NoaWJhIFNhdGVsbGl0ZSA0MDMwY2R0IiwgeyAvKiBLZXlib2FyZCBnZW5lcmF0ZXMgc3B1cmlvdXMgcmVwZWF0cyAqLworCQkJTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlM0MDMwQ0RULzQuMyIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENILCBOT19NQVRDSAorCQkJfSB9LAorI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCisJeyByZXNldF92aWRlb21vZGVfYWZ0ZXJfczMsICJUb3NoaWJhIFNhdGVsbGl0ZSA0MDMwY2R0IiwgeyAvKiBSZXNldCB2aWRlbyBtb2RlIGFmdGVyIHJldHVybmluZyBmcm9tIEFDUEkgUzMgc2xlZXAgKi8KKwkJCU1BVENIKERNSV9QUk9EVUNUX05BTUUsICJTNDAzMENEVC80LjMiKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCwgTk9fTUFUQ0gKKwkJCX0gfSwKKyNlbmRpZgorCisjaWZkZWYJQ09ORklHX0FDUElfQk9PVAorCS8qCisJICogSWYgeW91ciBzeXN0ZW0gaXMgYmxhY2tsaXN0ZWQgaGVyZSwgYnV0IHlvdSBmaW5kIHRoYXQgYWNwaT1mb3JjZQorCSAqIHdvcmtzIGZvciB5b3UsIHBsZWFzZSBjb250YWN0IGFjcGktZGV2ZWxAc291cmNlZm9yZ2UubmV0CisJICovCisKKwkvKgorCSAqCUJveGVzIHRoYXQgbmVlZCBBQ1BJIGRpc2FibGVkCisJICovCisKKwl7IGRtaV9kaXNhYmxlX2FjcGksICJJQk0gVGhpbmtwYWQiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIjI2MjlIMUciKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKKworCS8qCisJICoJQm94ZXMgdGhhdCBuZWVkIGFjcGk9aHQgCisJICovCisKKwl7IGZvcmNlX2FjcGlfaHQsICJGU0MgUHJpbWVyZ3kgVDg1MCIsIHsKKwkJCU1BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCisJCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUFJJTUVSR1kgVDg1MCIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisJeyBmb3JjZV9hY3BpX2h0LCAiREVMTCBHWDI0MCIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIk9wdGlQbGV4IEdYMjQwIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJIUCBWSVNVQUxJWkUgTlQgV29ya3N0YXRpb24iLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCisJCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSFAgVklTVUFMSVpFIE5UIFdvcmtzdGF0aW9uIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJDb21wYXEgV29ya3N0YXRpb24gVzgwMDAiLCB7CisJCQlNQVRDSChETUlfU1lTX1ZFTkRPUiwgIkNvbXBhcSIpLAorCQkJTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIldvcmtzdGF0aW9uIFc4MDAwIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJBU1VTIFA0QjI2NiIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiUDRCMjY2IiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJBU1VTIFAyQi1EUyIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiUDJCLURTIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJBU1VTIENVUi1ETFMiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIkNVUi1ETFMiKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKKworCXsgZm9yY2VfYWNwaV9odCwgIkFCSVQgaTQ0MEJYLVc4Mzk3NyIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBQklUIDxodHRwOi8vd3d3LmFiaXQuY29tPiIpLAorCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJpNDQwQlgtVzgzOTc3IChCUDYpIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJJQk0gQmxhZGVjZW50ZXIiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIklCTSBlU2VydmVyIEJsYWRlQ2VudGVyIEhTMjAiKSwKKwkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKKworCXsgZm9yY2VfYWNwaV9odCwgIklCTSBlU2VydmVyIHhTZXJpZXMgMzYwIiwgeworCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJlU2VydmVyIHhTZXJpZXMgMzYwIiksCisJCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCisKKwl7IGZvcmNlX2FjcGlfaHQsICJJQk0gZXNlcnZlciB4U2VyaWVzIDMzMCIsIHsKKwkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKKwkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiZXNlcnZlciB4U2VyaWVzIDMzMCIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisJeyBmb3JjZV9hY3BpX2h0LCAiSUJNIGVzZXJ2ZXIgeFNlcmllcyA0NDAiLCB7CisJCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCisJCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiZXNlcnZlciB4U2VyaWVzIDQ0MCIpLAorCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAorCisjZW5kaWYJLy8gQ09ORklHX0FDUElfQk9PVAorCisjaWZkZWYJQ09ORklHX0FDUElfUENJCisJLyoKKwkgKglCb3hlcyB0aGF0IG5lZWQgQUNQSSBQQ0kgSVJRIHJvdXRpbmcgZGlzYWJsZWQKKwkgKi8KKworCXsgZGlzYWJsZV9hY3BpX2lycSwgIkFTVVMgQTdWIiwgeworCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DIiksCisJCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIjxBN1Y+IiksCisJCQkvKiBuZXdlciBCSU9TLCBSZXZpc2lvbiAxMDExLCBkb2VzIHdvcmsgKi8KKwkJCU1BVENIKERNSV9CSU9TX1ZFUlNJT04sICJBU1VTIEE3ViBBQ1BJIEJJT1MgUmV2aXNpb24gMTAwNyIpLAorCQkJTk9fTUFUQ0ggfX0sCisKKwkvKgorCSAqCUJveGVzIHRoYXQgbmVlZCBBQ1BJIFBDSSBJUlEgcm91dGluZyBhbmQgUENJIHNjYW4gZGlzYWJsZWQKKwkgKi8KKwl7IGRpc2FibGVfYWNwaV9wY2ksICJBU1VTIFBSLURMUyIsIHsJLyogX0JCTiAwIGJ1ZyAqLworCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJQUi1ETFMiKSwKKwkJCU1BVENIKERNSV9CSU9TX1ZFUlNJT04sICJBU1VTIFBSLURMUyBBQ1BJIEJJT1MgUmV2aXNpb24gMTAxMCIpLAorCQkJTUFUQ0goRE1JX0JJT1NfREFURSwgIjAzLzIxLzIwMDMiKSB9fSwKKworIAl7IGRpc2FibGVfYWNwaV9wY2ksICJBY2VyIFRyYXZlbE1hdGUgMzZ4IExhcHRvcCIsIHsKKyAJCQlNQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKyAJCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSAzNjAiKSwKKyAJCQlOT19NQVRDSCwgTk9fTUFUQ0gKKyAJCQl9IH0sCisKKyNlbmRpZgorCisJeyBOVUxMLCB9Cit9OworCisvKgorICoJUHJvY2VzcyBhIERNSSB0YWJsZSBlbnRyeS4gUmlnaHQgbm93IGFsbCB3ZSBjYXJlIGFib3V0IGFyZSB0aGUgQklPUworICoJYW5kIG1hY2hpbmUgZW50cmllcy4gRm9yIDIuNSB3ZSBzaG91bGQgcHVsbCB0aGUgc21idXMgY29udHJvbGxlciBpbmZvCisgKglvdXQgb2YgaGVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgZG1pX2RlY29kZShzdHJ1Y3QgZG1pX2hlYWRlciAqZG0pCit7CisjaWZkZWYgRE1JX0RFQlVHCisJdTggKmRhdGEgPSAodTggKilkbTsKKyNlbmRpZgorCQorCXN3aXRjaChkbS0+dHlwZSkKKwl7CisJCWNhc2UgIDA6CisJCQlkbWlfcHJpbnRrKCgiQklPUyBWZW5kb3I6ICVzXG4iLAorCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNF0pKSk7CisJCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JJT1NfVkVORE9SLCA0KTsKKwkJCWRtaV9wcmludGsoKCJCSU9TIFZlcnNpb246ICVzXG4iLCAKKwkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzVdKSkpOworCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CSU9TX1ZFUlNJT04sIDUpOworCQkJZG1pX3ByaW50aygoIkJJT1MgUmVsZWFzZTogJXNcbiIsCisJCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs4XSkpKTsKKwkJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQklPU19EQVRFLCA4KTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlkbWlfcHJpbnRrKCgiU3lzdGVtIFZlbmRvcjogJXNcbiIsCisJCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs0XSkpKTsKKwkJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfU1lTX1ZFTkRPUiwgNCk7CisJCQlkbWlfcHJpbnRrKCgiUHJvZHVjdCBOYW1lOiAlc1xuIiwKKwkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzVdKSkpOworCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9QUk9EVUNUX05BTUUsIDUpOworCQkJZG1pX3ByaW50aygoIlZlcnNpb246ICVzXG4iLAorCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNl0pKSk7CisJCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1BST0RVQ1RfVkVSU0lPTiwgNik7CisJCQlkbWlfcHJpbnRrKCgiU2VyaWFsIE51bWJlcjogJXNcbiIsCisJCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs3XSkpKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkbWlfcHJpbnRrKCgiQm9hcmQgVmVuZG9yOiAlc1xuIiwKKwkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzRdKSkpOworCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CT0FSRF9WRU5ET1IsIDQpOworCQkJZG1pX3ByaW50aygoIkJvYXJkIE5hbWU6ICVzXG4iLAorCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNV0pKSk7CisJCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX05BTUUsIDUpOworCQkJZG1pX3ByaW50aygoIkJvYXJkIFZlcnNpb246ICVzXG4iLAorCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNl0pKSk7CisJCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX1ZFUlNJT04sIDYpOworCQkJYnJlYWs7CisJfQorfQorCit2b2lkIF9faW5pdCBkbWlfc2Nhbl9tYWNoaW5lKHZvaWQpCit7CisJaW50IGVyciA9IGRtaV9pdGVyYXRlKGRtaV9kZWNvZGUpOworCWlmKGVyciA9PSAwKQorIAkJZG1pX2NoZWNrX3N5c3RlbShkbWlfYmxhY2tsaXN0KTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIkRNSSBub3QgcHJlc2VudC5cbiIpOworfQorCisKKy8qKgorICoJZG1pX2NoZWNrX3N5c3RlbSAtIGNoZWNrIHN5c3RlbSBETUkgZGF0YQorICoJQGxpc3Q6IGFycmF5IG9mIGRtaV9zeXN0ZW1faWQgc3RydWN0dXJlcyB0byBtYXRjaCBhZ2FpbnN0CisgKgorICoJV2FsayB0aGUgYmxhY2tsaXN0IHRhYmxlIHJ1bm5pbmcgbWF0Y2hpbmcgZnVuY3Rpb25zIHVudGlsIHNvbWVvbmUKKyAqCXJldHVybnMgbm9uIHplcm8gb3Igd2UgaGl0IHRoZSBlbmQuIENhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IKKyAqCWVhY2ggc3VjY2Vzc2Z1bGwgbWF0Y2guIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXRjaGVzLgorICovCitpbnQgZG1pX2NoZWNrX3N5c3RlbShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqbGlzdCkKK3sKKwlpbnQgaSwgY291bnQgPSAwOworCXN0cnVjdCBkbWlfc3lzdGVtX2lkICpkID0gbGlzdDsKKworCXdoaWxlIChkLT5pZGVudCkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkLT5tYXRjaGVzKTsgaSsrKSB7CisJCQlpbnQgcyA9IGQtPm1hdGNoZXNbaV0uc2xvdDsKKwkJCWlmIChzID09IERNSV9OT05FKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGRtaV9pZGVudFtzXSAmJiBzdHJzdHIoZG1pX2lkZW50W3NdLCBkLT5tYXRjaGVzW2ldLnN1YnN0cikpCisJCQkJY29udGludWU7CisJCQkvKiBObyBtYXRjaCAqLworCQkJZ290byBmYWlsOworCQl9CisJCWlmIChkLT5jYWxsYmFjayAmJiBkLT5jYWxsYmFjayhkKSkKKwkJCWJyZWFrOworCQljb3VudCsrOworZmFpbDoJCWQrKzsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK0VYUE9SVF9TWU1CT0woZG1pX2NoZWNrX3N5c3RlbSk7CisKKy8qKgorICoJZG1pX2dldF9zeXN0ZW1faW5mbyAtIHJldHVybiBETUkgZGF0YSB2YWx1ZQorICoJQGZpZWxkOiBkYXRhIGluZGV4IChzZWUgZW51bSBkbWlfZmlsZWQpCisgKgorICoJUmV0dXJucyBvbmUgRE1JIGRhdGEgdmFsdWUsIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0KKyAqCWNvbXBsZXggRE1JIGRhdGEgY2hlY2tzLgorICovCitjaGFyICogZG1pX2dldF9zeXN0ZW1faW5mbyhpbnQgZmllbGQpCit7CisJcmV0dXJuIGRtaV9pZGVudFtmaWVsZF07Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvZG91YmxlZmF1bHQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvZG91YmxlZmF1bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODlhZjNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9kb3VibGVmYXVsdC5jCkBAIC0wLDAgKzEsNjUgQEAKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisKKyNkZWZpbmUgRE9VQkxFRkFVTFRfU1RBQ0tTSVpFICgxMDI0KQorc3RhdGljIHVuc2lnbmVkIGxvbmcgZG91YmxlZmF1bHRfc3RhY2tbRE9VQkxFRkFVTFRfU1RBQ0tTSVpFXTsKKyNkZWZpbmUgU1RBQ0tfU1RBUlQgKHVuc2lnbmVkIGxvbmcpKGRvdWJsZWZhdWx0X3N0YWNrK0RPVUJMRUZBVUxUX1NUQUNLU0laRSkKKworI2RlZmluZSBwdHJfb2soeCkgKCh4KSA+IFBBR0VfT0ZGU0VUICYmICh4KSA8IFBBR0VfT0ZGU0VUICsgMHgxMDAwMDAwKQorCitzdGF0aWMgdm9pZCBkb3VibGVmYXVsdF9mbih2b2lkKQoreworCXN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgZ2R0X2Rlc2MgPSB7MCwgMH07CisJdW5zaWduZWQgbG9uZyBnZHQsIHRzczsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJzZ2R0ICUwIjogIj1tIiAoZ2R0X2Rlc2MpOiA6Im1lbW9yeSIpOworCWdkdCA9IGdkdF9kZXNjLmFkZHJlc3M7CisKKwlwcmludGsoImRvdWJsZSBmYXVsdCwgZ2R0IGF0ICUwOGx4IFslZCBieXRlc11cbiIsIGdkdCwgZ2R0X2Rlc2Muc2l6ZSk7CisKKwlpZiAocHRyX29rKGdkdCkpIHsKKwkJZ2R0ICs9IEdEVF9FTlRSWV9UU1MgPDwgMzsKKwkJdHNzID0gKih1MTYgKikoZ2R0KzIpOworCQl0c3MgKz0gKih1OCAqKShnZHQrNCkgPDwgMTY7CisJCXRzcyArPSAqKHU4ICopKGdkdCs3KSA8PCAyNDsKKwkJcHJpbnRrKCJkb3VibGUgZmF1bHQsIHRzcyBhdCAlMDhseFxuIiwgdHNzKTsKKworCQlpZiAocHRyX29rKHRzcykpIHsKKwkJCXN0cnVjdCB0c3Nfc3RydWN0ICp0ID0gKHN0cnVjdCB0c3Nfc3RydWN0ICopdHNzOworCisJCQlwcmludGsoImVpcCA9ICUwOGx4LCBlc3AgPSAlMDhseFxuIiwgdC0+ZWlwLCB0LT5lc3ApOworCisJCQlwcmludGsoImVheCA9ICUwOGx4LCBlYnggPSAlMDhseCwgZWN4ID0gJTA4bHgsIGVkeCA9ICUwOGx4XG4iLAorCQkJCXQtPmVheCwgdC0+ZWJ4LCB0LT5lY3gsIHQtPmVkeCk7CisJCQlwcmludGsoImVzaSA9ICUwOGx4LCBlZGkgPSAlMDhseFxuIiwKKwkJCQl0LT5lc2ksIHQtPmVkaSk7CisJCX0KKwl9CisKKwlmb3IgKDs7KSAvKiBub3RoaW5nICovOworfQorCitzdHJ1Y3QgdHNzX3N0cnVjdCBkb3VibGVmYXVsdF90c3MgX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsKKwkuZXNwMAkJPSBTVEFDS19TVEFSVCwKKwkuc3MwCQk9IF9fS0VSTkVMX0RTLAorCS5sZHQJCT0gMCwKKwkuaW9fYml0bWFwX2Jhc2UJPSBJTlZBTElEX0lPX0JJVE1BUF9PRkZTRVQsCisKKwkuZWlwCQk9ICh1bnNpZ25lZCBsb25nKSBkb3VibGVmYXVsdF9mbiwKKwkuZWZsYWdzCQk9IFg4Nl9FRkxBR1NfU0YgfCAweDIsCS8qIDB4MiBiaXQgaXMgYWx3YXlzIHNldCAqLworCS5lc3AJCT0gU1RBQ0tfU1RBUlQsCisJLmVzCQk9IF9fVVNFUl9EUywKKwkuY3MJCT0gX19LRVJORUxfQ1MsCisJLnNzCQk9IF9fS0VSTkVMX0RTLAorCS5kcwkJPSBfX1VTRVJfRFMsCisKKwkuX19jcjMJCT0gX19wYShzd2FwcGVyX3BnX2RpcikKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2Vhcmx5X3ByaW50ay5jIGIvYXJjaC9pMzg2L2tlcm5lbC9lYXJseV9wcmludGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmY4MTJiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9lYXJseV9wcmludGsuYwpAQCAtMCwwICsxLDIgQEAKKworI2luY2x1ZGUgIi4uLy4uL3g4Nl82NC9rZXJuZWwvZWFybHlfcHJpbnRrLmMiCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2VmaS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9lZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTVlMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9lZmkuYwpAQCAtMCwwICsxLDYzNSBAQAorLyoKKyAqIEV4dGVuc2libGUgRmlybXdhcmUgSW50ZXJmYWNlCisgKgorICogQmFzZWQgb24gRXh0ZW5zaWJsZSBGaXJtd2FyZSBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBWQSBMaW51eCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgV2FsdCBEcnVtbW9uZCA8ZHJ1bW1vbmRAdmFsaW51eC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMiBIZXdsZXR0LVBhY2thcmQgQ28uCisgKglEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+CisgKglTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGhwbC5ocC5jb20+CisgKgorICogQWxsIEVGSSBSdW50aW1lIFNlcnZpY2VzIGFyZSBub3QgaW1wbGVtZW50ZWQgeWV0IGFzIEVGSSBvbmx5CisgKiBzdXBwb3J0cyBwaHlzaWNhbCBtb2RlIGFkZHJlc3Npbmcgb24gU29mdFNEVi4gVGhpcyBpcyB0byBiZSBmaXhlZAorICogaW4gYSBmdXR1cmUgdmVyc2lvbi4gIC0tZHJ1bW1vbmQgMTk5OS0wNy0yMAorICoKKyAqIEltcGxlbWVudGVkIEVGSSBydW50aW1lIHNlcnZpY2VzIGFuZCB2aXJ0dWFsIG1vZGUgY2FsbHMuICAtLWRhdmlkbQorICoKKyAqIEdvdXRoYW0gUmFvOiA8Z291dGhhbS5yYW9AaW50ZWwuY29tPgorICoJU2tpcCBub24tV0IgbWVtb3J5IGFuZCBpZ25vcmUgZW1wdHkgbWVtb3J5IHJhbmdlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKKyNkZWZpbmUgRUZJX0RFQlVHCTAKKyNkZWZpbmUgUEZYIAkJIkVGSTogIgorCitleHRlcm4gZWZpX3N0YXR1c190IGFzbWxpbmthZ2UgZWZpX2NhbGxfcGh5cyh2b2lkICosIC4uLik7CisKK3N0cnVjdCBlZmkgZWZpOworRVhQT1JUX1NZTUJPTChlZmkpOworc3RhdGljIHN0cnVjdCBlZmkgZWZpX3BoeXMgX19pbml0ZGF0YTsKK3N0cnVjdCBlZmlfbWVtb3J5X21hcCBtZW1tYXAgX19pbml0ZGF0YTsKKworLyoKKyAqIFdlIHJlcXVpcmUgYW4gZWFybHkgYm9vdF9pb3JlbWFwIG1hcHBpbmcgbWVjaGFuaXNtIGluaXRpYWxseQorICovCitleHRlcm4gdm9pZCAqIGJvb3RfaW9yZW1hcCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKKworLyoKKyAqIFRvIG1ha2UgRUZJIGNhbGwgRUZJIHJ1bnRpbWUgc2VydmljZSBpbiBwaHlzaWNhbCBhZGRyZXNzaW5nIG1vZGUgd2UgbmVlZAorICogcHJlbG9nL2VwaWxvZyBiZWZvcmUvYWZ0ZXIgdGhlIGludm9jYXRpb24gdG8gZGlzYWJsZSBpbnRlcnJ1cHQsIHRvCisgKiBjbGFpbSBFRkkgcnVudGltZSBzZXJ2aWNlIGhhbmRsZXIgZXhjbHVzaXZlbHkgYW5kIHRvIGR1cGxpY2F0ZSBhIG1lbW9yeSBpbgorICogbG93IG1lbW9yeSBzcGFjZSBzYXkgMCAtIDNHLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVmaV9ydF9lZmxhZ3M7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGVmaV9ydF9sb2NrKTsKK3N0YXRpYyBwZ2RfdCBlZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzJdOworCitzdGF0aWMgdm9pZCBlZmlfY2FsbF9waHlzX3ByZWxvZyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY3I0OworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKworCXNwaW5fbG9jaygmZWZpX3J0X2xvY2spOworCWxvY2FsX2lycV9zYXZlKGVmaV9ydF9lZmxhZ3MpOworCisJLyoKKwkgKiBJZiBJIGRvbid0IGhhdmUgUFNFLCBJIHNob3VsZCBqdXN0IGR1cGxpY2F0ZSB0d28gZW50cmllcyBpbiBwYWdlCisJICogZGlyZWN0b3J5LiBJZiBJIGhhdmUgUFNFLCBJIGp1c3QgbmVlZCB0byBkdXBsaWNhdGUgb25lIGVudHJ5IGluCisJICogcGFnZSBkaXJlY3RvcnkuCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVjcjQsICUwIjoiPXIiKGNyNCkpOworCisJaWYgKGNyNCAmIFg4Nl9DUjRfUFNFKSB7CisJCWVmaV9iYWtfcGdfZGlyX3BvaW50ZXJbMF0ucGdkID0KKwkJICAgIHN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleCgwKV0ucGdkOworCQlzd2FwcGVyX3BnX2RpclswXS5wZ2QgPQorCQkgICAgc3dhcHBlcl9wZ19kaXJbcGdkX2luZGV4KFBBR0VfT0ZGU0VUKV0ucGdkOworCX0gZWxzZSB7CisJCWVmaV9iYWtfcGdfZGlyX3BvaW50ZXJbMF0ucGdkID0KKwkJICAgIHN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleCgwKV0ucGdkOworCQllZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzFdLnBnZCA9CisJCSAgICBzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMHg0MDAwMDApXS5wZ2Q7CisJCXN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleCgwKV0ucGdkID0KKwkJICAgIHN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleChQQUdFX09GRlNFVCldLnBnZDsKKwkJdGVtcCA9IFBBR0VfT0ZGU0VUICsgMHg0MDAwMDA7CisJCXN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleCgweDQwMDAwMCldLnBnZCA9CisJCSAgICBzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgodGVtcCldLnBnZDsKKwl9CisKKwkvKgorCSAqIEFmdGVyIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZSBpcyByZXN0b3JlZC4KKwkgKi8KKwlsb2NhbF9mbHVzaF90bGIoKTsKKworCWNwdV9nZHRfZGVzY3JbMF0uYWRkcmVzcyA9IF9fcGEoY3B1X2dkdF9kZXNjclswXS5hZGRyZXNzKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGdkdCAlMCI6Ij1tIgorCQkJICAgICgqKHN0cnVjdCBYZ3RfZGVzY19zdHJ1Y3QgKikgX19wYSgmY3B1X2dkdF9kZXNjclswXSkpKTsKK30KKworc3RhdGljIHZvaWQgZWZpX2NhbGxfcGh5c19lcGlsb2codm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNyNDsKKworCWNwdV9nZHRfZGVzY3JbMF0uYWRkcmVzcyA9CisJCSh1bnNpZ25lZCBsb25nKSBfX3ZhKGNwdV9nZHRfZGVzY3JbMF0uYWRkcmVzcyk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oImxnZHQgJTAiOiI9bSIoY3B1X2dkdF9kZXNjcikpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlY3I0LCAlMCI6Ij1yIihjcjQpKTsKKworCWlmIChjcjQgJiBYODZfQ1I0X1BTRSkgeworCQlzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMCldLnBnZCA9CisJCSAgICBlZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzBdLnBnZDsKKwl9IGVsc2UgeworCQlzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMCldLnBnZCA9CisJCSAgICBlZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzBdLnBnZDsKKwkJc3dhcHBlcl9wZ19kaXJbcGdkX2luZGV4KDB4NDAwMDAwKV0ucGdkID0KKwkJICAgIGVmaV9iYWtfcGdfZGlyX3BvaW50ZXJbMV0ucGdkOworCX0KKworCS8qCisJICogQWZ0ZXIgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlIGlzIHJlc3RvcmVkLgorCSAqLworCWxvY2FsX2ZsdXNoX3RsYigpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZWZpX3J0X2VmbGFncyk7CisJc3Bpbl91bmxvY2soJmVmaV9ydF9sb2NrKTsKK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorcGh5c19lZmlfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXAodW5zaWduZWQgbG9uZyBtZW1vcnlfbWFwX3NpemUsCisJCQkJIHVuc2lnbmVkIGxvbmcgZGVzY3JpcHRvcl9zaXplLAorCQkJCSB1MzIgZGVzY3JpcHRvcl92ZXJzaW9uLAorCQkJCSBlZmlfbWVtb3J5X2Rlc2NfdCAqdmlydHVhbF9tYXApCit7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKworCWVmaV9jYWxsX3BoeXNfcHJlbG9nKCk7CisJc3RhdHVzID0gZWZpX2NhbGxfcGh5cyhlZmlfcGh5cy5zZXRfdmlydHVhbF9hZGRyZXNzX21hcCwKKwkJCQkgICAgIG1lbW9yeV9tYXBfc2l6ZSwgZGVzY3JpcHRvcl9zaXplLAorCQkJCSAgICAgZGVzY3JpcHRvcl92ZXJzaW9uLCB2aXJ0dWFsX21hcCk7CisJZWZpX2NhbGxfcGh5c19lcGlsb2coKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitwaHlzX2VmaV9nZXRfdGltZShlZmlfdGltZV90ICp0bSwgZWZpX3RpbWVfY2FwX3QgKnRjKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisKKwllZmlfY2FsbF9waHlzX3ByZWxvZygpOworCXN0YXR1cyA9IGVmaV9jYWxsX3BoeXMoZWZpX3BoeXMuZ2V0X3RpbWUsIHRtLCB0Yyk7CisJZWZpX2NhbGxfcGh5c19lcGlsb2coKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbmxpbmUgaW50IGVmaV9zZXRfcnRjX21tc3ModW5zaWduZWQgbG9uZyBub3d0aW1lKQoreworCWludCByZWFsX3NlY29uZHMsIHJlYWxfbWludXRlczsKKwllZmlfc3RhdHVzX3QgCXN0YXR1czsKKwllZmlfdGltZV90IAllZnQ7CisJZWZpX3RpbWVfY2FwX3QgCWNhcDsKKworCXNwaW5fbG9jaygmZWZpX3J0X2xvY2spOworCXN0YXR1cyA9IGVmaS5nZXRfdGltZSgmZWZ0LCAmY2FwKTsKKwlzcGluX3VubG9jaygmZWZpX3J0X2xvY2spOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCXBhbmljKCJPb29wcywgZWZpdGltZTogY2FuJ3QgcmVhZCB0aW1lIVxuIik7CisJcmVhbF9zZWNvbmRzID0gbm93dGltZSAlIDYwOworCXJlYWxfbWludXRlcyA9IG5vd3RpbWUgLyA2MDsKKworCWlmICgoKGFicyhyZWFsX21pbnV0ZXMgLSBlZnQubWludXRlKSArIDE1KS8zMCkgJiAxKQorCQlyZWFsX21pbnV0ZXMgKz0gMzA7CisJcmVhbF9taW51dGVzICU9IDYwOworCisJZWZ0Lm1pbnV0ZSA9IHJlYWxfbWludXRlczsKKwllZnQuc2Vjb25kID0gcmVhbF9zZWNvbmRzOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlwcmludGsoIk9vb3BzOiBlZml0aW1lOiBjYW4ndCByZWFkIHRpbWUhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKy8qCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nIGtlcm5lbCBpbml0IGFuZCBiZWZvcmUgcnVudGltZQorICogc2VydmljZXMgaGF2ZSBiZWVuIHJlbWFwcGVkLCB0aGVyZWZvcmUsIHdlJ2xsIG5lZWQgdG8gY2FsbCBpbiBwaHlzaWNhbAorICogbW9kZS4gIE5vdGUsIHRoaXMgY2FsbCBpc24ndCB1c2VkIGxhdGVyLCBzbyBtYXJrIGl0IF9faW5pdC4KKyAqLworaW5saW5lIHVuc2lnbmVkIGxvbmcgX19pbml0IGVmaV9nZXRfdGltZSh2b2lkKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX3RpbWVfdCBlZnQ7CisJZWZpX3RpbWVfY2FwX3QgY2FwOworCisJc3RhdHVzID0gcGh5c19lZmlfZ2V0X3RpbWUoJmVmdCwgJmNhcCk7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcHJpbnRrKCJPb3BzOiBlZml0aW1lOiBjYW4ndCByZWFkIHRpbWUgc3RhdHVzOiAweCVseFxuIixzdGF0dXMpOworCisJcmV0dXJuIG1rdGltZShlZnQueWVhciwgZWZ0Lm1vbnRoLCBlZnQuZGF5LCBlZnQuaG91ciwKKwkJCWVmdC5taW51dGUsIGVmdC5zZWNvbmQpOworfQorCitpbnQgaXNfYXZhaWxhYmxlX21lbW9yeShlZmlfbWVtb3J5X2Rlc2NfdCAqIG1kKQoreworCWlmICghKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1dCKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKG1kLT50eXBlKSB7CisJCWNhc2UgRUZJX0xPQURFUl9DT0RFOgorCQljYXNlIEVGSV9MT0FERVJfREFUQToKKwkJY2FzZSBFRklfQk9PVF9TRVJWSUNFU19DT0RFOgorCQljYXNlIEVGSV9CT09UX1NFUlZJQ0VTX0RBVEE6CisJCWNhc2UgRUZJX0NPTlZFTlRJT05BTF9NRU1PUlk6CisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBuZWVkIHRvIG1hcCB0aGUgRUZJIG1lbW9yeSBtYXAgYWdhaW4gYWZ0ZXIgcGFnaW5nX2luaXQoKS4KKyAqLwordm9pZCBfX2luaXQgZWZpX21hcF9tZW1tYXAodm9pZCkKK3sKKwltZW1tYXAubWFwID0gTlVMTDsKKworCW1lbW1hcC5tYXAgPSAoZWZpX21lbW9yeV9kZXNjX3QgKikKKwkJYnRfaW9yZW1hcCgodW5zaWduZWQgbG9uZykgbWVtbWFwLnBoeXNfbWFwLAorCQkJKG1lbW1hcC5ucl9tYXAgKiBzaXplb2YoZWZpX21lbW9yeV9kZXNjX3QpKSk7CisKKwlpZiAobWVtbWFwLm1hcCA9PSBOVUxMKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgcmVtYXAgdGhlIEVGSSBtZW1tYXAhXG4iKTsKK30KKworI2lmIEVGSV9ERUJVRworc3RhdGljIHZvaWQgX19pbml0IHByaW50X2VmaV9tZW1tYXAodm9pZCkKK3sKKwllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWVtbWFwLm5yX21hcDsgaSsrKSB7CisJCW1kID0gJm1lbW1hcC5tYXBbaV07CisJCXByaW50ayhLRVJOX0lORk8gIm1lbSUwMnU6IHR5cGU9JXUsIGF0dHI9MHglbGx4LCAiCisJCQkicmFuZ2U9WzB4JTAxNmxseC0weCUwMTZsbHgpICglbGx1TUIpXG4iLAorCQkJaSwgbWQtPnR5cGUsIG1kLT5hdHRyaWJ1dGUsIG1kLT5waHlzX2FkZHIsCisJCQltZC0+cGh5c19hZGRyICsgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpLAorCQkJKG1kLT5udW1fcGFnZXMgPj4gKDIwIC0gRUZJX1BBR0VfU0hJRlQpKSk7CisJfQorfQorI2VuZGlmICAvKiAgRUZJX0RFQlVHICAqLworCisvKgorICogV2Fsa3MgdGhlIEVGSSBtZW1vcnkgbWFwIGFuZCBjYWxscyBDQUxMQkFDSyBvbmNlIGZvciBlYWNoIEVGSQorICogbWVtb3J5IGRlc2NyaXB0b3IgdGhhdCBoYXMgbWVtb3J5IHRoYXQgaXMgYXZhaWxhYmxlIGZvciBrZXJuZWwgdXNlLgorICovCit2b2lkIGVmaV9tZW1tYXBfd2FsayhlZmlfZnJlZW1lbV9jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkICphcmcpCit7CisJaW50IHByZXZfdmFsaWQgPSAwOworCXN0cnVjdCByYW5nZSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJCXVuc2lnbmVkIGxvbmcgZW5kOworCX0gcHJldiwgY3VycjsKKwllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgeworCQltZCA9ICZtZW1tYXAubWFwW2ldOworCisJCWlmICgobWQtPm51bV9wYWdlcyA9PSAwKSB8fCAoIWlzX2F2YWlsYWJsZV9tZW1vcnkobWQpKSkKKwkJCWNvbnRpbnVlOworCisJCWN1cnIuc3RhcnQgPSBtZC0+cGh5c19hZGRyOworCQljdXJyLmVuZCA9IGN1cnIuc3RhcnQgKyAobWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCk7CisKKwkJaWYgKCFwcmV2X3ZhbGlkKSB7CisJCQlwcmV2ID0gY3VycjsKKwkJCXByZXZfdmFsaWQgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKGN1cnIuc3RhcnQgPCBwcmV2LnN0YXJ0KQorCQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJVbm9yZGVyZWQgbWVtb3J5IG1hcFxuIik7CisJCQlpZiAocHJldi5lbmQgPT0gY3Vyci5zdGFydCkKKwkJCQlwcmV2LmVuZCA9IGN1cnIuZW5kOworCQkJZWxzZSB7CisJCQkJc3RhcnQgPQorCQkJCSAgICAodW5zaWduZWQgbG9uZykgKFBBR0VfQUxJR04ocHJldi5zdGFydCkpOworCQkJCWVuZCA9ICh1bnNpZ25lZCBsb25nKSAocHJldi5lbmQgJiBQQUdFX01BU0spOworCQkJCWlmICgoZW5kID4gc3RhcnQpCisJCQkJICAgICYmICgqY2FsbGJhY2spIChzdGFydCwgZW5kLCBhcmcpIDwgMCkKKwkJCQkJcmV0dXJuOworCQkJCXByZXYgPSBjdXJyOworCQkJfQorCQl9CisJfQorCWlmIChwcmV2X3ZhbGlkKSB7CisJCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIFBBR0VfQUxJR04ocHJldi5zdGFydCk7CisJCWVuZCA9ICh1bnNpZ25lZCBsb25nKSAocHJldi5lbmQgJiBQQUdFX01BU0spOworCQlpZiAoZW5kID4gc3RhcnQpCisJCQkoKmNhbGxiYWNrKSAoc3RhcnQsIGVuZCwgYXJnKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IGVmaV9pbml0KHZvaWQpCit7CisJZWZpX2NvbmZpZ190YWJsZV90ICpjb25maWdfdGFibGVzOworCWVmaV9ydW50aW1lX3NlcnZpY2VzX3QgKnJ1bnRpbWU7CisJZWZpX2NoYXIxNl90ICpjMTY7CisJY2hhciB2ZW5kb3JbMTAwXSA9ICJ1bmtub3duIjsKKwl1bnNpZ25lZCBsb25nIG51bV9jb25maWdfdGFibGVzOworCWludCBpID0gMDsKKworCW1lbXNldCgmZWZpLCAwLCBzaXplb2YoZWZpKSApOworCW1lbXNldCgmZWZpX3BoeXMsIDAsIHNpemVvZihlZmlfcGh5cykpOworCisJZWZpX3BoeXMuc3lzdGFiID0gRUZJX1NZU1RBQjsKKwltZW1tYXAucGh5c19tYXAgPSBFRklfTUVNTUFQOworCW1lbW1hcC5ucl9tYXAgPSBFRklfTUVNTUFQX1NJWkUvRUZJX01FTURFU0NfU0laRTsKKwltZW1tYXAuZGVzY192ZXJzaW9uID0gRUZJX01FTURFU0NfVkVSU0lPTjsKKworCWVmaS5zeXN0YWIgPSAoZWZpX3N5c3RlbV90YWJsZV90ICopCisJCWJvb3RfaW9yZW1hcCgodW5zaWduZWQgbG9uZykgZWZpX3BoeXMuc3lzdGFiLAorCQkJc2l6ZW9mKGVmaV9zeXN0ZW1fdGFibGVfdCkpOworCS8qCisJICogVmVyaWZ5IHRoZSBFRkkgVGFibGUKKwkgKi8KKwlpZiAoZWZpLnN5c3RhYiA9PSBOVUxMKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJXb2FoISBDb3VsZG4ndCBtYXAgdGhlIEVGSSBzeXN0ZW0gdGFibGUuXG4iKTsKKwlpZiAoZWZpLnN5c3RhYi0+aGRyLnNpZ25hdHVyZSAhPSBFRklfU1lTVEVNX1RBQkxFX1NJR05BVFVSRSkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiV29haCEgRUZJIHN5c3RlbSB0YWJsZSBzaWduYXR1cmUgaW5jb3JyZWN0XG4iKTsKKwlpZiAoKGVmaS5zeXN0YWItPmhkci5yZXZpc2lvbiBeIEVGSV9TWVNURU1fVEFCTEVfUkVWSVNJT04pID4+IDE2ICE9IDApCisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICJXYXJuaW5nOiBFRkkgc3lzdGVtIHRhYmxlIG1ham9yIHZlcnNpb24gbWlzbWF0Y2g6ICIKKwkJICAgICAgICJnb3QgJWQuJTAyZCwgZXhwZWN0ZWQgJWQuJTAyZFxuIiwKKwkJICAgICAgIGVmaS5zeXN0YWItPmhkci5yZXZpc2lvbiA+PiAxNiwKKwkJICAgICAgIGVmaS5zeXN0YWItPmhkci5yZXZpc2lvbiAmIDB4ZmZmZiwKKwkJICAgICAgIEVGSV9TWVNURU1fVEFCTEVfUkVWSVNJT04gPj4gMTYsCisJCSAgICAgICBFRklfU1lTVEVNX1RBQkxFX1JFVklTSU9OICYgMHhmZmZmKTsKKwkvKgorCSAqIEdyYWIgc29tZSBkZXRhaWxzIGZyb20gdGhlIHN5c3RlbSB0YWJsZQorCSAqLworCW51bV9jb25maWdfdGFibGVzID0gZWZpLnN5c3RhYi0+bnJfdGFibGVzOworCWNvbmZpZ190YWJsZXMgPSAoZWZpX2NvbmZpZ190YWJsZV90ICopZWZpLnN5c3RhYi0+dGFibGVzOworCXJ1bnRpbWUgPSBlZmkuc3lzdGFiLT5ydW50aW1lOworCisJLyoKKwkgKiBTaG93IHdoYXQgd2Uga25vdyBmb3IgcG9zdGVyaXR5CisJICovCisJYzE2ID0gKGVmaV9jaGFyMTZfdCAqKSBib290X2lvcmVtYXAoZWZpLnN5c3RhYi0+ZndfdmVuZG9yLCAyKTsKKwlpZiAoYzE2KSB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodmVuZG9yKSAmJiAqYzE2OyArK2kpCisJCQl2ZW5kb3JbaV0gPSAqYzE2Kys7CisJCXZlbmRvcltpXSA9ICdcMCc7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCBtYXAgdGhlIGZpcm13YXJlIHZlbmRvciFcbiIpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkVGSSB2JXUuJS4wMnUgYnkgJXMgXG4iLAorCSAgICAgICBlZmkuc3lzdGFiLT5oZHIucmV2aXNpb24gPj4gMTYsCisJICAgICAgIGVmaS5zeXN0YWItPmhkci5yZXZpc2lvbiAmIDB4ZmZmZiwgdmVuZG9yKTsKKworCS8qCisJICogTGV0J3Mgc2VlIHdoYXQgY29uZmlnIHRhYmxlcyB0aGUgZmlybXdhcmUgcGFzc2VkIHRvIHVzLgorCSAqLworCWNvbmZpZ190YWJsZXMgPSAoZWZpX2NvbmZpZ190YWJsZV90ICopCisJCQkJYm9vdF9pb3JlbWFwKCh1bnNpZ25lZCBsb25nKSBjb25maWdfdGFibGVzLAorCQkJICAgICAgICBudW1fY29uZmlnX3RhYmxlcyAqIHNpemVvZihlZmlfY29uZmlnX3RhYmxlX3QpKTsKKworCWlmIChjb25maWdfdGFibGVzID09IE5VTEwpCisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCBtYXAgRUZJIENvbmZpZ3VyYXRpb24gVGFibGUhXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY29uZmlnX3RhYmxlczsgaSsrKSB7CisJCWlmIChlZmlfZ3VpZGNtcChjb25maWdfdGFibGVzW2ldLmd1aWQsIE1QU19UQUJMRV9HVUlEKSA9PSAwKSB7CisJCQllZmkubXBzID0gKHZvaWQgKiljb25maWdfdGFibGVzW2ldLnRhYmxlOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIE1QUz0weCVseCAiLCBjb25maWdfdGFibGVzW2ldLnRhYmxlKTsKKwkJfSBlbHNlCisJCSAgICBpZiAoZWZpX2d1aWRjbXAoY29uZmlnX3RhYmxlc1tpXS5ndWlkLCBBQ1BJXzIwX1RBQkxFX0dVSUQpID09IDApIHsKKwkJCWVmaS5hY3BpMjAgPSBfX3ZhKGNvbmZpZ190YWJsZXNbaV0udGFibGUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIEFDUEkgMi4wPTB4JWx4ICIsIGNvbmZpZ190YWJsZXNbaV0udGFibGUpOworCQl9IGVsc2UKKwkJICAgIGlmIChlZmlfZ3VpZGNtcChjb25maWdfdGFibGVzW2ldLmd1aWQsIEFDUElfVEFCTEVfR1VJRCkgPT0gMCkgeworCQkJZWZpLmFjcGkgPSBfX3ZhKGNvbmZpZ190YWJsZXNbaV0udGFibGUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIEFDUEk9MHglbHggIiwgY29uZmlnX3RhYmxlc1tpXS50YWJsZSk7CisJCX0gZWxzZQorCQkgICAgaWYgKGVmaV9ndWlkY21wKGNvbmZpZ190YWJsZXNbaV0uZ3VpZCwgU01CSU9TX1RBQkxFX0dVSUQpID09IDApIHsKKwkJCWVmaS5zbWJpb3MgPSAodm9pZCAqKSBjb25maWdfdGFibGVzW2ldLnRhYmxlOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIFNNQklPUz0weCVseCAiLCBjb25maWdfdGFibGVzW2ldLnRhYmxlKTsKKwkJfSBlbHNlCisJCSAgICBpZiAoZWZpX2d1aWRjbXAoY29uZmlnX3RhYmxlc1tpXS5ndWlkLCBIQ0RQX1RBQkxFX0dVSUQpID09IDApIHsKKwkJCWVmaS5oY2RwID0gKHZvaWQgKiljb25maWdfdGFibGVzW2ldLnRhYmxlOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIEhDRFA9MHglbHggIiwgY29uZmlnX3RhYmxlc1tpXS50YWJsZSk7CisJCX0gZWxzZQorCQkgICAgaWYgKGVmaV9ndWlkY21wKGNvbmZpZ190YWJsZXNbaV0uZ3VpZCwgVUdBX0lPX1BST1RPQ09MX0dVSUQpID09IDApIHsKKwkJCWVmaS51Z2EgPSAodm9pZCAqKWNvbmZpZ190YWJsZXNbaV0udGFibGU7CisJCQlwcmludGsoS0VSTl9JTkZPICIgVUdBPTB4JWx4ICIsIGNvbmZpZ190YWJsZXNbaV0udGFibGUpOworCQl9CisJfQorCXByaW50aygiXG4iKTsKKworCS8qCisJICogQ2hlY2sgb3V0IHRoZSBydW50aW1lIHNlcnZpY2VzIHRhYmxlLiBXZSBuZWVkIHRvIG1hcAorCSAqIHRoZSBydW50aW1lIHNlcnZpY2VzIHRhYmxlIHNvIHRoYXQgd2UgY2FuIGdyYWIgdGhlIHBoeXNpY2FsCisJICogYWRkcmVzcyBvZiBzZXZlcmFsIG9mIHRoZSBFRkkgcnVudGltZSBmdW5jdGlvbnMsIG5lZWRlZCB0bworCSAqIHNldCB0aGUgZmlybXdhcmUgaW50byB2aXJ0dWFsIG1vZGUuCisJICovCisKKwlydW50aW1lID0gKGVmaV9ydW50aW1lX3NlcnZpY2VzX3QgKikgYm9vdF9pb3JlbWFwKCh1bnNpZ25lZCBsb25nKQorCQkJCQkJcnVudGltZSwKKwkJCQkgICAgICAJCXNpemVvZihlZmlfcnVudGltZV9zZXJ2aWNlc190KSk7CisJaWYgKHJ1bnRpbWUgIT0gTlVMTCkgeworCQkvKgorCSAJICogV2Ugd2lsbCBvbmx5IG5lZWQgKmVhcmx5KiBhY2Nlc3MgdG8gdGhlIGZvbGxvd2luZworCQkgKiB0d28gRUZJIHJ1bnRpbWUgc2VydmljZXMgYmVmb3JlIHNldF92aXJ0dWFsX2FkZHJlc3NfbWFwCisJCSAqIGlzIGludm9rZWQuCisgCSAJICovCisJCWVmaV9waHlzLmdldF90aW1lID0gKGVmaV9nZXRfdGltZV90ICopIHJ1bnRpbWUtPmdldF90aW1lOworCQllZmlfcGh5cy5zZXRfdmlydHVhbF9hZGRyZXNzX21hcCA9CisJCQkoZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwX3QgKikKKwkJCQlydW50aW1lLT5zZXRfdmlydHVhbF9hZGRyZXNzX21hcDsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGQgbm90IG1hcCB0aGUgcnVudGltZSBzZXJ2aWNlIHRhYmxlIVxuIik7CisKKwkvKiBNYXAgdGhlIEVGSSBtZW1vcnkgbWFwIGZvciB1c2UgdW50aWwgcGFnaW5nX2luaXQoKSAqLworCisJbWVtbWFwLm1hcCA9IChlZmlfbWVtb3J5X2Rlc2NfdCAqKQorCQlib290X2lvcmVtYXAoKHVuc2lnbmVkIGxvbmcpIEVGSV9NRU1NQVAsIEVGSV9NRU1NQVBfU0laRSk7CisKKwlpZiAobWVtbWFwLm1hcCA9PSBOVUxMKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgbWFwIHRoZSBFRkkgbWVtb3J5IG1hcCFcbiIpOworCisJaWYgKEVGSV9NRU1ERVNDX1NJWkUgIT0gc2l6ZW9mKGVmaV9tZW1vcnlfZGVzY190KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiV2FybmluZyEgS2VybmVsLWRlZmluZWQgbWVtZGVzYyBkb2Vzbid0ICIKKwkJCSAgICJtYXRjaCB0aGUgb25lIGZyb20gRUZJIVxuIik7CisJfQorI2lmIEVGSV9ERUJVRworCXByaW50X2VmaV9tZW1tYXAoKTsKKyNlbmRpZgorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHN3aXRjaCB0aGUgRUZJIHJ1bnRpbWUgc2VydmljZXMgdG8gdmlydHVhbCBtb2RlLgorICogRXNzZW50aWFsbHksIGxvb2sgdGhyb3VnaCB0aGUgRUZJIG1lbW1hcCBhbmQgbWFwIGV2ZXJ5IHJlZ2lvbiB0aGF0CisgKiBoYXMgdGhlIHJ1bnRpbWUgYXR0cmlidXRlIGJpdCBzZXQgaW4gaXRzIG1lbW9yeSBkZXNjcmlwdG9yIGFuZCB1cGRhdGUKKyAqIHRoYXQgbWVtb3J5IGRlc2NyaXB0b3Igd2l0aCB0aGUgdmlydHVhbCBhZGRyZXNzIG9idGFpbmVkIGZyb20gaW9yZW1hcCgpLgorICogVGhpcyBlbmFibGVzIHRoZSBydW50aW1lIHNlcnZpY2VzIHRvIGJlIGNhbGxlZCB3aXRob3V0IGhhdmluZyB0bworICogdGh1bmsgYmFjayBpbnRvIHBoeXNpY2FsIG1vZGUgZm9yIGV2ZXJ5IGludm9jYXRpb24uCisgKi8KKwordm9pZCBfX2luaXQgZWZpX2VudGVyX3ZpcnR1YWxfbW9kZSh2b2lkKQoreworCWVmaV9tZW1vcnlfZGVzY190ICptZDsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWludCBpOworCisJZWZpLnN5c3RhYiA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWVtbWFwLm5yX21hcDsgaSsrKSB7CisJCW1kID0gJm1lbW1hcC5tYXBbaV07CisKKwkJaWYgKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpIHsKKwkJCW1kLT52aXJ0X2FkZHIgPQorCQkJCSh1bnNpZ25lZCBsb25nKWlvcmVtYXAobWQtPnBoeXNfYWRkciwKKwkJCQkJbWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCk7CisJCQlpZiAoISh1bnNpZ25lZCBsb25nKW1kLT52aXJ0X2FkZHIpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJpb3JlbWFwIG9mIDB4JWxYIGZhaWxlZFxuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpbWQtPnBoeXNfYWRkcik7CisJCQl9CisKKwkJCWlmICgoKHVuc2lnbmVkIGxvbmcpbWQtPnBoeXNfYWRkciA8PQorCQkJCQkodW5zaWduZWQgbG9uZyllZmlfcGh5cy5zeXN0YWIpICYmCisJCQkJKCh1bnNpZ25lZCBsb25nKWVmaV9waHlzLnN5c3RhYiA8CisJCQkJCW1kLT5waHlzX2FkZHIgKworCQkJCQkoKHVuc2lnbmVkIGxvbmcpbWQtPm51bV9wYWdlcyA8PAorCQkJCQkJRUZJX1BBR0VfU0hJRlQpKSkgeworCQkJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCQkJCWFkZHIgPSBtZC0+dmlydF9hZGRyIC0gbWQtPnBoeXNfYWRkciArCisJCQkJCQkodW5zaWduZWQgbG9uZyllZmlfcGh5cy5zeXN0YWI7CisJCQkJZWZpLnN5c3RhYiA9IChlZmlfc3lzdGVtX3RhYmxlX3QgKilhZGRyOworCQkJfQorCQl9CisJfQorCisJaWYgKCFlZmkuc3lzdGFiKQorCQlCVUcoKTsKKworCXN0YXR1cyA9IHBoeXNfZWZpX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwKAorCQkJc2l6ZW9mKGVmaV9tZW1vcnlfZGVzY190KSAqIG1lbW1hcC5ucl9tYXAsCisJCQlzaXplb2YoZWZpX21lbW9yeV9kZXNjX3QpLAorCQkJbWVtbWFwLmRlc2NfdmVyc2lvbiwKKwkJICAgICAgIAltZW1tYXAucGh5c19tYXApOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlwcmludGsgKEtFUk5fQUxFUlQgIllvdSBhcmUgc2NyZXdlZCEgIgorCQkJIlVuYWJsZSB0byBzd2l0Y2ggRUZJIGludG8gdmlydHVhbCBtb2RlICIKKwkJCSIoc3RhdHVzPSVseClcbiIsIHN0YXR1cyk7CisJCXBhbmljKCJFRkkgY2FsbCB0byBTZXRWaXJ0dWFsQWRkcmVzc01hcCgpIGZhaWxlZCEiKTsKKwl9CisKKwkvKgorCSAqIE5vdyB0aGF0IEVGSSBpcyBpbiB2aXJ0dWFsIG1vZGUsIHVwZGF0ZSB0aGUgZnVuY3Rpb24KKwkgKiBwb2ludGVycyBpbiB0aGUgcnVudGltZSBzZXJ2aWNlIHRhYmxlIHRvIHRoZSBuZXcgdmlydHVhbCBhZGRyZXNzZXMuCisJICovCisKKwllZmkuZ2V0X3RpbWUgPSAoZWZpX2dldF90aW1lX3QgKikgZWZpLnN5c3RhYi0+cnVudGltZS0+Z2V0X3RpbWU7CisJZWZpLnNldF90aW1lID0gKGVmaV9zZXRfdGltZV90ICopIGVmaS5zeXN0YWItPnJ1bnRpbWUtPnNldF90aW1lOworCWVmaS5nZXRfd2FrZXVwX3RpbWUgPSAoZWZpX2dldF93YWtldXBfdGltZV90ICopCisJCQkJCWVmaS5zeXN0YWItPnJ1bnRpbWUtPmdldF93YWtldXBfdGltZTsKKwllZmkuc2V0X3dha2V1cF90aW1lID0gKGVmaV9zZXRfd2FrZXVwX3RpbWVfdCAqKQorCQkJCQllZmkuc3lzdGFiLT5ydW50aW1lLT5zZXRfd2FrZXVwX3RpbWU7CisJZWZpLmdldF92YXJpYWJsZSA9IChlZmlfZ2V0X3ZhcmlhYmxlX3QgKikKKwkJCQkJZWZpLnN5c3RhYi0+cnVudGltZS0+Z2V0X3ZhcmlhYmxlOworCWVmaS5nZXRfbmV4dF92YXJpYWJsZSA9IChlZmlfZ2V0X25leHRfdmFyaWFibGVfdCAqKQorCQkJCQllZmkuc3lzdGFiLT5ydW50aW1lLT5nZXRfbmV4dF92YXJpYWJsZTsKKwllZmkuc2V0X3ZhcmlhYmxlID0gKGVmaV9zZXRfdmFyaWFibGVfdCAqKQorCQkJCQllZmkuc3lzdGFiLT5ydW50aW1lLT5zZXRfdmFyaWFibGU7CisJZWZpLmdldF9uZXh0X2hpZ2hfbW9ub19jb3VudCA9IChlZmlfZ2V0X25leHRfaGlnaF9tb25vX2NvdW50X3QgKikKKwkJCQkJZWZpLnN5c3RhYi0+cnVudGltZS0+Z2V0X25leHRfaGlnaF9tb25vX2NvdW50OworCWVmaS5yZXNldF9zeXN0ZW0gPSAoZWZpX3Jlc2V0X3N5c3RlbV90ICopCisJCQkJCWVmaS5zeXN0YWItPnJ1bnRpbWUtPnJlc2V0X3N5c3RlbTsKK30KKwordm9pZCBfX2luaXQKK2VmaV9pbml0aWFsaXplX2lvbWVtX3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKmNvZGVfcmVzb3VyY2UsCisJCQkgICAgICAgc3RydWN0IHJlc291cmNlICpkYXRhX3Jlc291cmNlKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWVmaV9tZW1vcnlfZGVzY190ICptZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtZW1tYXAubnJfbWFwOyBpKyspIHsKKwkJbWQgPSAmbWVtbWFwLm1hcFtpXTsKKworCQlpZiAoKG1kLT5waHlzX2FkZHIgKyAobWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkpID4KKwkJICAgIDB4MTAwMDAwMDAwVUxMKQorCQkJY29udGludWU7CisJCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwkJc3dpdGNoIChtZC0+dHlwZSkgeworCQljYXNlIEVGSV9SRVNFUlZFRF9UWVBFOgorCQkJcmVzLT5uYW1lID0gIlJlc2VydmVkIE1lbW9yeSI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfTE9BREVSX0NPREU6CisJCQlyZXMtPm5hbWUgPSAiTG9hZGVyIENvZGUiOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX0xPQURFUl9EQVRBOgorCQkJcmVzLT5uYW1lID0gIkxvYWRlciBEYXRhIjsKKwkJCWJyZWFrOworCQljYXNlIEVGSV9CT09UX1NFUlZJQ0VTX0RBVEE6CisJCQlyZXMtPm5hbWUgPSAiQm9vdFNlcnZpY2VzIERhdGEiOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX0JPT1RfU0VSVklDRVNfQ09ERToKKwkJCXJlcy0+bmFtZSA9ICJCb290U2VydmljZXMgQ29kZSI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfUlVOVElNRV9TRVJWSUNFU19DT0RFOgorCQkJcmVzLT5uYW1lID0gIlJ1bnRpbWUgU2VydmljZSBDb2RlIjsKKwkJCWJyZWFrOworCQljYXNlIEVGSV9SVU5USU1FX1NFUlZJQ0VTX0RBVEE6CisJCQlyZXMtPm5hbWUgPSAiUnVudGltZSBTZXJ2aWNlIERhdGEiOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX0NPTlZFTlRJT05BTF9NRU1PUlk6CisJCQlyZXMtPm5hbWUgPSAiQ29udmVudGlvbmFsIE1lbW9yeSI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfVU5VU0FCTEVfTUVNT1JZOgorCQkJcmVzLT5uYW1lID0gIlVudXNhYmxlIE1lbW9yeSI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfQUNQSV9SRUNMQUlNX01FTU9SWToKKwkJCXJlcy0+bmFtZSA9ICJBQ1BJIFJlY2xhaW0iOworCQkJYnJlYWs7CisJCWNhc2UgRUZJX0FDUElfTUVNT1JZX05WUzoKKwkJCXJlcy0+bmFtZSA9ICJBQ1BJIE5WUyI7CisJCQlicmVhazsKKwkJY2FzZSBFRklfTUVNT1JZX01BUFBFRF9JTzoKKwkJCXJlcy0+bmFtZSA9ICJNZW1vcnkgTWFwcGVkIElPIjsKKwkJCWJyZWFrOworCQljYXNlIEVGSV9NRU1PUllfTUFQUEVEX0lPX1BPUlRfU1BBQ0U6CisJCQlyZXMtPm5hbWUgPSAiTWVtb3J5IE1hcHBlZCBJTyBQb3J0IFNwYWNlIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVzLT5uYW1lID0gIlJlc2VydmVkIjsKKwkJCWJyZWFrOworCQl9CisJCXJlcy0+c3RhcnQgPSBtZC0+cGh5c19hZGRyOworCQlyZXMtPmVuZCA9IHJlcy0+c3RhcnQgKyAoKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpIC0gMSk7CisJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKKwkJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpIDwgMCkKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIkZhaWxlZCB0byBhbGxvY2F0ZSByZXMgJXMgOiAweCVseC0weCVseFxuIiwKKwkJCQlyZXMtPm5hbWUsIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKwkJLyoKKwkJICogV2UgZG9uJ3Qga25vdyB3aGljaCByZWdpb24gY29udGFpbnMga2VybmVsIGRhdGEgc28gd2UgdHJ5CisJCSAqIGl0IHJlcGVhdGVkbHkgYW5kIGxldCB0aGUgcmVzb3VyY2UgbWFuYWdlciB0ZXN0IGl0LgorCQkgKi8KKwkJaWYgKG1kLT50eXBlID09IEVGSV9DT05WRU5USU9OQUxfTUVNT1JZKSB7CisJCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgY29kZV9yZXNvdXJjZSk7CisJCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgZGF0YV9yZXNvdXJjZSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gb2J0YWluIG1lbW9yeSB0eXBlcyBhbmQgYXR0cmlidXRlcworICovCisKK3UzMiBlZmlfbWVtX3R5cGUodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCit7CisJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgeworCQltZCA9ICZtZW1tYXAubWFwW2ldOworCQlpZiAoKG1kLT5waHlzX2FkZHIgPD0gcGh5c19hZGRyKSAmJiAocGh5c19hZGRyIDwKKwkJCShtZC0+cGh5c19hZGRyICsgKG1kLT4gbnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSkgKSkKKwkJCXJldHVybiBtZC0+dHlwZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3U2NCBlZmlfbWVtX2F0dHJpYnV0ZXModW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCit7CisJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgeworCQltZCA9ICZtZW1tYXAubWFwW2ldOworCQlpZiAoKG1kLT5waHlzX2FkZHIgPD0gcGh5c19hZGRyKSAmJiAocGh5c19hZGRyIDwKKwkJCShtZC0+cGh5c19hZGRyICsgKG1kLT4gbnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSkgKSkKKwkJCXJldHVybiBtZC0+YXR0cmlidXRlOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvZWZpX3N0dWIuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvZWZpX3N0dWIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGMwMzEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9lZmlfc3R1Yi5TCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogRUZJIGNhbGwgc3R1YiBmb3IgSUEzMi4KKyAqCisgKiBUaGlzIHN0dWIgYWxsb3dzIHVzIHRvIG1ha2UgRUZJIGNhbGxzIGluIHBoeXNpY2FsIG1vZGUgd2l0aCBpbnRlcnJ1cHRzCisgKiB0dXJuZWQgb2ZmLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisvKgorICogZWZpX2NhbGxfcGh5cyh2b2lkICosIC4uLikgaXMgYSBmdW5jdGlvbiB3aXRoIHZhcmlhYmxlIHBhcmFtZXRlcnMuCisgKiBBbGwgdGhlIGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbiBhc3N1cmUgdGhhdCBhbGwgdGhlIHBhcmFtZXRlcnMgYXJlIDQtYnl0ZXMuCisgKi8KKworLyoKKyAqIEluIGdjYyBjYWxsaW5nIGNvbnZlbnRpb24sIEVCWCwgRVNQLCBFQlAsIEVTSSBhbmQgRURJIGFyZSBhbGwgY2FsbGVlIHNhdmUuCisgKiBTbyB3ZSdkIGJldHRlciBzYXZlIGFsbCBvZiB0aGVtIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBmdW5jdGlvbiBhbmQgcmVzdG9yZQorICogYXQgdGhlIGVuZCBubyBtYXR0ZXIgaG93IG1hbnkgd2UgdXNlLCBiZWNhdXNlIHdlIGNhbiBub3QgYXNzdXJlIEVGSSBydW50aW1lCisgKiBzZXJ2aWNlIGZ1bmN0aW9ucyB3aWxsIGNvbXBseSB3aXRoIGdjYyBjYWxsaW5nIGNvbnZlbnRpb24sIHRvby4KKyAqLworCisudGV4dAorRU5UUlkoZWZpX2NhbGxfcGh5cykKKwkvKgorCSAqIDAuIFRoZSBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgaW4gTGludXgga2VybmVsLiBTbyBDUyBoYXMgYmVlbgorCSAqIHNldCB0byAweDAwMTAsIERTIGFuZCBTUyBoYXZlIGJlZW4gc2V0IHRvIDB4MDAxOC4gSW4gRUZJLCBJIGZvdW5kCisJICogdGhlIHZhbHVlcyBvZiB0aGVzZSByZWdpc3RlcnMgYXJlIHRoZSBzYW1lLiBBbmQsIHRoZSBjb3JyZXNwb25kaW5nCisJICogR0RUIGVudHJpZXMgYXJlIGlkZW50aWNhbC4gU28gSSB3aWxsIGRvIG5vdGhpbmcgYWJvdXQgc2VnbWVudCByZWcKKwkgKiBhbmQgR0RULCBidXQgY2hhbmdlIEdEVCBiYXNlIHJlZ2lzdGVyIGluIHByZWxvZyBhbmQgZXBpbG9nLgorCSAqLworCisJLyoKKwkgKiAxLiBOb3cgSSBhbSBydW5uaW5nIHdpdGggRUlQID0gPHBoeXNpY2FsIGFkZHJlc3M+ICsgUEFHRV9PRkZTRVQuCisJICogQnV0IHRvIG1ha2UgaXQgc21vb3RobHkgc3dpdGNoIGZyb20gdmlydHVhbCBtb2RlIHRvIGZsYXQgbW9kZS4KKwkgKiBUaGUgbWFwcGluZyBvZiBsb3dlciB2aXJ0dWFsIG1lbW9yeSBoYXMgYmVlbiBjcmVhdGVkIGluIHByZWxvZyBhbmQKKwkgKiBlcGlsb2cuCisJICovCisJbW92bAkkMWYsICVlZHgKKwlzdWJsCSRfX1BBR0VfT0ZGU0VULCAlZWR4CisJam1wCSolZWR4CisxOgorCisJLyoKKwkgKiAyLiBOb3cgb24gdGhlIHRvcCBvZiBzdGFjayBpcyB0aGUgcmV0dXJuCisJICogYWRkcmVzcyBpbiB0aGUgY2FsbGVyIG9mIGVmaV9jYWxsX3BoeXMoKSwgdGhlbiBwYXJhbWV0ZXIgMSwKKwkgKiBwYXJhbWV0ZXIgMiwgLi4uLCBwYXJhbSBuLiBUbyBtYWtlIHRoaW5ncyBlYXN5LCB3ZSBzYXZlIHRoZSByZXR1cm4KKwkgKiBhZGRyZXNzIG9mIGVmaV9jYWxsX3BoeXMgaW4gYSBnbG9iYWwgdmFyaWFibGUuCisJICovCisJcG9wbAklZWR4CisJbW92bAklZWR4LCBzYXZlZF9yZXR1cm5fYWRkcgorCS8qIGdldCB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnRvIEVDWCovCisJcG9wbAklZWN4CisJbW92bAklZWN4LCBlZmlfcnRfZnVuY3Rpb25fcHRyCisJbW92bAkkMmYsICVlZHgKKwlzdWJsCSRfX1BBR0VfT0ZGU0VULCAlZWR4CisJcHVzaGwJJWVkeAorCisJLyoKKwkgKiAzLiBDbGVhciBQRyBiaXQgaW4gJUNSMC4KKwkgKi8KKwltb3ZsCSVjcjAsICVlZHgKKwlhbmRsCSQweDdmZmZmZmZmLCAlZWR4CisJbW92bAklZWR4LCAlY3IwCisJam1wCTFmCisxOgorCisJLyoKKwkgKiA0LiBBZGp1c3Qgc3RhY2sgcG9pbnRlci4KKwkgKi8KKwlzdWJsCSRfX1BBR0VfT0ZGU0VULCAlZXNwCisKKwkvKgorCSAqIDUuIENhbGwgdGhlIHBoeXNpY2FsIGZ1bmN0aW9uLgorCSAqLworCWptcAkqJWVjeAorCisyOgorCS8qCisJICogNi4gQWZ0ZXIgRUZJIHJ1bnRpbWUgc2VydmljZSByZXR1cm5zLCBjb250cm9sIHdpbGwgcmV0dXJuIHRvCisJICogZm9sbG93aW5nIGluc3RydWN0aW9uLiBXZSdkIGJldHRlciByZWFkanVzdCBzdGFjayBwb2ludGVyIGZpcnN0LgorCSAqLworCWFkZGwJJF9fUEFHRV9PRkZTRVQsICVlc3AKKworCS8qCisJICogNy4gUmVzdG9yZSBQRyBiaXQKKwkgKi8KKwltb3ZsCSVjcjAsICVlZHgKKwlvcmwJJDB4ODAwMDAwMDAsICVlZHgKKwltb3ZsCSVlZHgsICVjcjAKKwlqbXAJMWYKKzE6CisJLyoKKwkgKiA4LiBOb3cgcmVzdG9yZSB0aGUgdmlydHVhbCBtb2RlIGZyb20gZmxhdCBtb2RlIGJ5CisJICogYWRkaW5nIEVJUCB3aXRoIFBBR0VfT0ZGU0VULgorCSAqLworCW1vdmwJJDFmLCAlZWR4CisJam1wCSolZWR4CisxOgorCisJLyoKKwkgKiA5LiBCYWxhbmNlIHRoZSBzdGFjay4gQW5kIGJlY2F1c2UgRUFYIGNvbnRhaW4gdGhlIHJldHVybiB2YWx1ZSwKKwkgKiB3ZSdkIGJldHRlciBub3QgY2xvYmJlciBpdC4KKwkgKi8KKwlsZWFsCWVmaV9ydF9mdW5jdGlvbl9wdHIsICVlZHgKKwltb3ZsCSglZWR4KSwgJWVjeAorCXB1c2hsCSVlY3gKKworCS8qCisJICogMTAuIFB1c2ggdGhlIHNhdmVkIHJldHVybiBhZGRyZXNzIG9udG8gdGhlIHN0YWNrIGFuZCByZXR1cm4uCisJICovCisJbGVhbAlzYXZlZF9yZXR1cm5fYWRkciwgJWVkeAorCW1vdmwJKCVlZHgpLCAlZWN4CisJcHVzaGwJJWVjeAorCXJldAorLnByZXZpb3VzCisKKy5kYXRhCitzYXZlZF9yZXR1cm5fYWRkcjoKKwkubG9uZyAwCitlZmlfcnRfZnVuY3Rpb25fcHRyOgorCS5sb25nIDAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTQ1ZmYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9lbnRyeS5TCkBAIC0wLDAgKzEsOTUwIEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9lbnRyeS5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisvKgorICogZW50cnkuUyBjb250YWlucyB0aGUgc3lzdGVtLWNhbGwgYW5kIGZhdWx0IGxvdy1sZXZlbCBoYW5kbGluZyByb3V0aW5lcy4KKyAqIFRoaXMgYWxzbyBjb250YWlucyB0aGUgdGltZXItaW50ZXJydXB0IGhhbmRsZXIsIGFzIHdlbGwgYXMgYWxsIGludGVycnVwdHMKKyAqIGFuZCBmYXVsdHMgdGhhdCBjYW4gcmVzdWx0IGluIGEgdGFzay1zd2l0Y2guCisgKgorICogTk9URTogVGhpcyBjb2RlIGhhbmRsZXMgc2lnbmFsLXJlY29nbml0aW9uLCB3aGljaCBoYXBwZW5zIGV2ZXJ5IHRpbWUKKyAqIGFmdGVyIGEgdGltZXItaW50ZXJydXB0IGFuZCBhZnRlciBlYWNoIHN5c3RlbSBjYWxsLgorICoKKyAqIEkgY2hhbmdlZCBhbGwgdGhlIC5hbGlnbidzIHRvIDQgKDE2IGJ5dGUgYWxpZ25tZW50KSwgYXMgdGhhdCdzIGZhc3RlcgorICogb24gYSA0ODYuCisgKgorICogU3RhY2sgbGF5b3V0IGluICdyZXRfZnJvbV9zeXN0ZW1fY2FsbCc6CisgKiAJcHRyYWNlIG5lZWRzIHRvIGhhdmUgYWxsIHJlZ3Mgb24gdGhlIHN0YWNrLgorICoJaWYgdGhlIG9yZGVyIGhlcmUgaXMgY2hhbmdlZCwgaXQgbmVlZHMgdG8gYmUKKyAqCXVwZGF0ZWQgaW4gZm9yay5jOmNvcHlfcHJvY2Vzcywgc2lnbmFsLmM6ZG9fc2lnbmFsLAorICoJcHRyYWNlLmMgYW5kIHB0cmFjZS5oCisgKgorICoJIDAoJWVzcCkgLSAlZWJ4CisgKgkgNCglZXNwKSAtICVlY3gKKyAqCSA4KCVlc3ApIC0gJWVkeAorICogICAgICAgQyglZXNwKSAtICVlc2kKKyAqCTEwKCVlc3ApIC0gJWVkaQorICoJMTQoJWVzcCkgLSAlZWJwCisgKgkxOCglZXNwKSAtICVlYXgKKyAqCTFDKCVlc3ApIC0gJWRzCisgKgkyMCglZXNwKSAtICVlcworICoJMjQoJWVzcCkgLSBvcmlnX2VheAorICoJMjgoJWVzcCkgLSAlZWlwCisgKgkyQyglZXNwKSAtICVjcworICoJMzAoJWVzcCkgLSAlZWZsYWdzCisgKgkzNCglZXNwKSAtICVvbGRlc3AKKyAqCTM4KCVlc3ApIC0gJW9sZHNzCisgKgorICogImN1cnJlbnQiIGlzIGluIHJlZ2lzdGVyICVlYnggZHVyaW5nIGFueSBzbG93IGVudHJpZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSAiaXJxX3ZlY3RvcnMuaCIKKworI2RlZmluZSBucl9zeXNjYWxscyAoKHN5c2NhbGxfdGFibGVfc2l6ZSkvNCkKKworRUJYCQk9IDB4MDAKK0VDWAkJPSAweDA0CitFRFgJCT0gMHgwOAorRVNJCQk9IDB4MEMKK0VESQkJPSAweDEwCitFQlAJCT0gMHgxNAorRUFYCQk9IDB4MTgKK0RTCQk9IDB4MUMKK0VTCQk9IDB4MjAKK09SSUdfRUFYCT0gMHgyNAorRUlQCQk9IDB4MjgKK0NTCQk9IDB4MkMKK0VGTEFHUwkJPSAweDMwCitPTERFU1AJCT0gMHgzNAorT0xEU1MJCT0gMHgzOAorCitDRl9NQVNLCQk9IDB4MDAwMDAwMDEKK1RGX01BU0sJCT0gMHgwMDAwMDEwMAorSUZfTUFTSwkJPSAweDAwMDAwMjAwCitERl9NQVNLCQk9IDB4MDAwMDA0MDAgCitOVF9NQVNLCQk9IDB4MDAwMDQwMDAKK1ZNX01BU0sJCT0gMHgwMDAyMDAwMAorCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKyNkZWZpbmUgcHJlZW1wdF9zdG9wCQljbGkKKyNlbHNlCisjZGVmaW5lIHByZWVtcHRfc3RvcAorI2RlZmluZSByZXN1bWVfa2VybmVsCQlyZXN0b3JlX25vY2hlY2sKKyNlbmRpZgorCisjZGVmaW5lIFNBVkVfQUxMIFwKKwljbGQ7IFwKKwlwdXNobCAlZXM7IFwKKwlwdXNobCAlZHM7IFwKKwlwdXNobCAlZWF4OyBcCisJcHVzaGwgJWVicDsgXAorCXB1c2hsICVlZGk7IFwKKwlwdXNobCAlZXNpOyBcCisJcHVzaGwgJWVkeDsgXAorCXB1c2hsICVlY3g7IFwKKwlwdXNobCAlZWJ4OyBcCisJbW92bCAkKF9fVVNFUl9EUyksICVlZHg7IFwKKwltb3ZsICVlZHgsICVkczsgXAorCW1vdmwgJWVkeCwgJWVzOworCisjZGVmaW5lIFJFU1RPUkVfSU5UX1JFR1MgXAorCXBvcGwgJWVieDsJXAorCXBvcGwgJWVjeDsJXAorCXBvcGwgJWVkeDsJXAorCXBvcGwgJWVzaTsJXAorCXBvcGwgJWVkaTsJXAorCXBvcGwgJWVicDsJXAorCXBvcGwgJWVheAorCisjZGVmaW5lIFJFU1RPUkVfUkVHUwlcCisJUkVTVE9SRV9JTlRfUkVHUzsgXAorMToJcG9wbCAlZHM7CVwKKzI6CXBvcGwgJWVzOwlcCisuc2VjdGlvbiAuZml4dXAsImF4IjsJXAorMzoJbW92bCAkMCwoJWVzcCk7CVwKKwlqbXAgMWI7CQlcCis0Ogltb3ZsICQwLCglZXNwKTsJXAorCWptcCAyYjsJCVwKKy5wcmV2aW91czsJCVwKKy5zZWN0aW9uIF9fZXhfdGFibGUsImEiO1wKKwkuYWxpZ24gNDsJXAorCS5sb25nIDFiLDNiOwlcCisJLmxvbmcgMmIsNGI7CVwKKy5wcmV2aW91cworCisKK0VOVFJZKHJldF9mcm9tX2ZvcmspCisJcHVzaGwgJWVheAorCWNhbGwgc2NoZWR1bGVfdGFpbAorCUdFVF9USFJFQURfSU5GTyglZWJwKQorCXBvcGwgJWVheAorCWptcCBzeXNjYWxsX2V4aXQKKworLyoKKyAqIFJldHVybiB0byB1c2VyIG1vZGUgaXMgbm90IGFzIGNvbXBsZXggYXMgYWxsIHRoaXMgbG9va3MsCisgKiBidXQgd2Ugd2FudCB0aGUgZGVmYXVsdCBwYXRoIGZvciBhIHN5c3RlbSBjYWxsIHJldHVybiB0bworICogZ28gYXMgcXVpY2tseSBhcyBwb3NzaWJsZSB3aGljaCBpcyB3aHkgc29tZSBvZiB0aGlzIGlzCisgKiBsZXNzIGNsZWFyIHRoYW4gaXQgb3RoZXJ3aXNlIHNob3VsZCBiZS4KKyAqLworCisJIyB1c2Vyc3BhY2UgcmVzdW1wdGlvbiBzdHViIGJ5cGFzc2luZyBzeXNjYWxsIGV4aXQgdHJhY2luZworCUFMSUdOCityZXRfZnJvbV9leGNlcHRpb246CisJcHJlZW1wdF9zdG9wCityZXRfZnJvbV9pbnRyOgorCUdFVF9USFJFQURfSU5GTyglZWJwKQorCW1vdmwgRUZMQUdTKCVlc3ApLCAlZWF4CQkjIG1peCBFRkxBR1MgYW5kIENTCisJbW92YiBDUyglZXNwKSwgJWFsCisJdGVzdGwgJChWTV9NQVNLIHwgMyksICVlYXgKKwlqeiByZXN1bWVfa2VybmVsCitFTlRSWShyZXN1bWVfdXNlcnNwYWNlKQorIAljbGkJCQkJIyBtYWtlIHN1cmUgd2UgZG9uJ3QgbWlzcyBhbiBpbnRlcnJ1cHQKKwkJCQkJIyBzZXR0aW5nIG5lZWRfcmVzY2hlZCBvciBzaWdwZW5kaW5nCisJCQkJCSMgYmV0d2VlbiBzYW1wbGluZyBhbmQgdGhlIGlyZXQKKwltb3ZsIFRJX2ZsYWdzKCVlYnApLCAlZWN4CisJYW5kbCAkX1RJRl9XT1JLX01BU0ssICVlY3gJIyBpcyB0aGVyZSBhbnkgd29yayB0byBiZSBkb25lIG9uCisJCQkJCSMgaW50L2V4Y2VwdGlvbiByZXR1cm4/CisJam5lIHdvcmtfcGVuZGluZworCWptcCByZXN0b3JlX2FsbAorCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKK0VOVFJZKHJlc3VtZV9rZXJuZWwpCisJY2xpCisJY21wbCAkMCxUSV9wcmVlbXB0X2NvdW50KCVlYnApCSMgbm9uLXplcm8gcHJlZW1wdF9jb3VudCA/CisJam56IHJlc3RvcmVfbm9jaGVjaworbmVlZF9yZXNjaGVkOgorCW1vdmwgVElfZmxhZ3MoJWVicCksICVlY3gJIyBuZWVkX3Jlc2NoZWQgc2V0ID8KKwl0ZXN0YiAkX1RJRl9ORUVEX1JFU0NIRUQsICVjbAorCWp6IHJlc3RvcmVfYWxsCisJdGVzdGwgJElGX01BU0ssRUZMQUdTKCVlc3ApICAgICAjIGludGVycnVwdHMgb2ZmIChleGNlcHRpb24gcGF0aCkgPworCWp6IHJlc3RvcmVfYWxsCisJY2FsbCBwcmVlbXB0X3NjaGVkdWxlX2lycQorCWptcCBuZWVkX3Jlc2NoZWQKKyNlbmRpZgorCisvKiBTWVNFTlRFUl9SRVRVUk4gcG9pbnRzIHRvIGFmdGVyIHRoZSAic3lzZW50ZXIiIGluc3RydWN0aW9uIGluCisgICB0aGUgdnN5c2NhbGwgcGFnZS4gIFNlZSB2c3lzY2FsbC1zeXNlbnRyeS5TLCB3aGljaCBkZWZpbmVzIHRoZSBzeW1ib2wuICAqLworCisJIyBzeXNlbnRlciBjYWxsIGhhbmRsZXIgc3R1YgorRU5UUlkoc3lzZW50ZXJfZW50cnkpCisJbW92bCBUU1Nfc3lzZW50ZXJfZXNwMCglZXNwKSwlZXNwCitzeXNlbnRlcl9wYXN0X2VzcDoKKwlzdGkKKwlwdXNobCAkKF9fVVNFUl9EUykKKwlwdXNobCAlZWJwCisJcHVzaGZsCisJcHVzaGwgJChfX1VTRVJfQ1MpCisJcHVzaGwgJFNZU0VOVEVSX1JFVFVSTgorCisvKgorICogTG9hZCB0aGUgcG90ZW50aWFsIHNpeHRoIGFyZ3VtZW50IGZyb20gdXNlciBzdGFjay4KKyAqIENhcmVmdWwgYWJvdXQgc2VjdXJpdHkuCisgKi8KKwljbXBsICRfX1BBR0VfT0ZGU0VULTMsJWVicAorCWphZSBzeXNjYWxsX2ZhdWx0CisxOgltb3ZsICglZWJwKSwlZWJwCisuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5hbGlnbiA0CisJLmxvbmcgMWIsc3lzY2FsbF9mYXVsdAorLnByZXZpb3VzCisKKwlwdXNobCAlZWF4CisJU0FWRV9BTEwKKwlHRVRfVEhSRUFEX0lORk8oJWVicCkKKworCS8qIE5vdGUsIF9USUZfU0VDQ09NUCBpcyBiaXQgbnVtYmVyIDgsIGFuZCBzbyBpdCBuZWVkcyB0ZXN0dyBhbmQgbm90IHRlc3RiICovCisJdGVzdHcgJChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0VDQ09NUCksVElfZmxhZ3MoJWVicCkKKwlqbnogc3lzY2FsbF90cmFjZV9lbnRyeQorCWNtcGwgJChucl9zeXNjYWxscyksICVlYXgKKwlqYWUgc3lzY2FsbF9iYWRzeXMKKwljYWxsICpzeXNfY2FsbF90YWJsZSgsJWVheCw0KQorCW1vdmwgJWVheCxFQVgoJWVzcCkKKwljbGkKKwltb3ZsIFRJX2ZsYWdzKCVlYnApLCAlZWN4CisJdGVzdHcgJF9USUZfQUxMV09SS19NQVNLLCAlY3gKKwlqbmUgc3lzY2FsbF9leGl0X3dvcmsKKy8qIGlmIHNvbWV0aGluZyBtb2RpZmllcyByZWdpc3RlcnMgaXQgbXVzdCBhbHNvIGRpc2FibGUgc3lzZXhpdCAqLworCW1vdmwgRUlQKCVlc3ApLCAlZWR4CisJbW92bCBPTERFU1AoJWVzcCksICVlY3gKKwl4b3JsICVlYnAsJWVicAorCXN0aQorCXN5c2V4aXQKKworCisJIyBzeXN0ZW0gY2FsbCBoYW5kbGVyIHN0dWIKK0VOVFJZKHN5c3RlbV9jYWxsKQorCXB1c2hsICVlYXgJCQkjIHNhdmUgb3JpZ19lYXgKKwlTQVZFX0FMTAorCUdFVF9USFJFQURfSU5GTyglZWJwKQorCQkJCQkjIHN5c3RlbSBjYWxsIHRyYWNpbmcgaW4gb3BlcmF0aW9uCisJLyogTm90ZSwgX1RJRl9TRUNDT01QIGlzIGJpdCBudW1iZXIgOCwgYW5kIHNvIGl0IG5lZWRzIHRlc3R3IGFuZCBub3QgdGVzdGIgKi8KKwl0ZXN0dyAkKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVR8X1RJRl9TRUNDT01QKSxUSV9mbGFncyglZWJwKQorCWpueiBzeXNjYWxsX3RyYWNlX2VudHJ5CisJY21wbCAkKG5yX3N5c2NhbGxzKSwgJWVheAorCWphZSBzeXNjYWxsX2JhZHN5cworc3lzY2FsbF9jYWxsOgorCWNhbGwgKnN5c19jYWxsX3RhYmxlKCwlZWF4LDQpCisJbW92bCAlZWF4LEVBWCglZXNwKQkJIyBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlCitzeXNjYWxsX2V4aXQ6CisJY2xpCQkJCSMgbWFrZSBzdXJlIHdlIGRvbid0IG1pc3MgYW4gaW50ZXJydXB0CisJCQkJCSMgc2V0dGluZyBuZWVkX3Jlc2NoZWQgb3Igc2lncGVuZGluZworCQkJCQkjIGJldHdlZW4gc2FtcGxpbmcgYW5kIHRoZSBpcmV0CisJbW92bCBUSV9mbGFncyglZWJwKSwgJWVjeAorCXRlc3R3ICRfVElGX0FMTFdPUktfTUFTSywgJWN4CSMgY3VycmVudC0+d29yaworCWpuZSBzeXNjYWxsX2V4aXRfd29yaworCityZXN0b3JlX2FsbDoKKwltb3ZsIEVGTEFHUyglZXNwKSwgJWVheAkJIyBtaXggRUZMQUdTLCBTUyBhbmQgQ1MKKwltb3ZiIE9MRFNTKCVlc3ApLCAlYWgKKwltb3ZiIENTKCVlc3ApLCAlYWwKKwlhbmRsICQoVk1fTUFTSyB8ICg0IDw8IDgpIHwgMyksICVlYXgKKwljbXBsICQoKDQgPDwgOCkgfCAzKSwgJWVheAorCWplIGxkdF9zcwkJCSMgcmV0dXJuaW5nIHRvIHVzZXItc3BhY2Ugd2l0aCBMRFQgU1MKK3Jlc3RvcmVfbm9jaGVjazoKKwlSRVNUT1JFX1JFR1MKKwlhZGRsICQ0LCAlZXNwCisxOglpcmV0Cisuc2VjdGlvbiAuZml4dXAsImF4IgoraXJldF9leGM6CisJc3RpCisJbW92bCAkX19VU0VSX0RTLCAlZWR4CisJbW92bCAlZWR4LCAlZHMKKwltb3ZsICVlZHgsICVlcworCW1vdmwgJDExLCVlYXgKKwljYWxsIGRvX2V4aXQKKy5wcmV2aW91cworLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkuYWxpZ24gNAorCS5sb25nIDFiLGlyZXRfZXhjCisucHJldmlvdXMKKworbGR0X3NzOgorCWxhcmwgT0xEU1MoJWVzcCksICVlYXgKKwlqbnogcmVzdG9yZV9ub2NoZWNrCisJdGVzdGwgJDB4MDA0MDAwMDAsICVlYXgJCSMgcmV0dXJuaW5nIHRvIDMyYml0IHN0YWNrPworCWpueiByZXN0b3JlX25vY2hlY2sJCSMgYWxscmlnaHQsIG5vcm1hbCByZXR1cm4KKwkvKiBJZiByZXR1cm5pbmcgdG8gdXNlcnNwYWNlIHdpdGggMTZiaXQgc3RhY2ssCisJICogdHJ5IHRvIGZpeCB0aGUgaGlnaGVyIHdvcmQgb2YgRVNQLCBhcyB0aGUgQ1BVCisJICogd29uJ3QgcmVzdG9yZSBpdC4KKwkgKiBUaGlzIGlzIGFuICJvZmZpY2lhbCIgYnVnIG9mIGFsbCB0aGUgeDg2LWNvbXBhdGlibGUKKwkgKiBDUFVzLCB3aGljaCB3ZSBjYW4gdHJ5IHRvIHdvcmsgYXJvdW5kIHRvIG1ha2UKKwkgKiBkb3NlbXUgYW5kIHdpbmUgaGFwcHkuICovCisJc3VibCAkOCwgJWVzcAkJIyByZXNlcnZlIHNwYWNlIGZvciBzd2l0Y2gxNiBwb2ludGVyCisJY2xpCisJbW92bCAlZXNwLCAlZWF4CisJLyogU2V0IHVwIHRoZSAxNmJpdCBzdGFjayBmcmFtZSB3aXRoIHN3aXRjaDMyIHBvaW50ZXIgb24gdG9wLAorCSAqIGFuZCBhIHN3aXRjaDE2IHBvaW50ZXIgb24gdG9wIG9mIHRoZSBjdXJyZW50IGZyYW1lLiAqLworCWNhbGwgc2V0dXBfeDg2X2JvZ3VzX3N0YWNrCisJUkVTVE9SRV9SRUdTCisJbHNzIDIwKzQoJWVzcCksICVlc3AJIyBzd2l0Y2ggdG8gMTZiaXQgc3RhY2sKKzE6CWlyZXQKKy5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLmFsaWduIDQKKwkubG9uZyAxYixpcmV0X2V4YworLnByZXZpb3VzCisKKwkjIHBlcmZvcm0gd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgaW1tZWRpYXRlbHkgYmVmb3JlIHJlc3VtcHRpb24KKwlBTElHTgord29ya19wZW5kaW5nOgorCXRlc3RiICRfVElGX05FRURfUkVTQ0hFRCwgJWNsCisJanogd29ya19ub3RpZnlzaWcKK3dvcmtfcmVzY2hlZDoKKwljYWxsIHNjaGVkdWxlCisJY2xpCQkJCSMgbWFrZSBzdXJlIHdlIGRvbid0IG1pc3MgYW4gaW50ZXJydXB0CisJCQkJCSMgc2V0dGluZyBuZWVkX3Jlc2NoZWQgb3Igc2lncGVuZGluZworCQkJCQkjIGJldHdlZW4gc2FtcGxpbmcgYW5kIHRoZSBpcmV0CisJbW92bCBUSV9mbGFncyglZWJwKSwgJWVjeAorCWFuZGwgJF9USUZfV09SS19NQVNLLCAlZWN4CSMgaXMgdGhlcmUgYW55IHdvcmsgdG8gYmUgZG9uZSBvdGhlcgorCQkJCQkjIHRoYW4gc3lzY2FsbCB0cmFjaW5nPworCWp6IHJlc3RvcmVfYWxsCisJdGVzdGIgJF9USUZfTkVFRF9SRVNDSEVELCAlY2wKKwlqbnogd29ya19yZXNjaGVkCisKK3dvcmtfbm90aWZ5c2lnOgkJCQkjIGRlYWwgd2l0aCBwZW5kaW5nIHNpZ25hbHMgYW5kCisJCQkJCSMgbm90aWZ5LXJlc3VtZSByZXF1ZXN0cworCXRlc3RsICRWTV9NQVNLLCBFRkxBR1MoJWVzcCkKKwltb3ZsICVlc3AsICVlYXgKKwlqbmUgd29ya19ub3RpZnlzaWdfdjg2CQkjIHJldHVybmluZyB0byBrZXJuZWwtc3BhY2Ugb3IKKwkJCQkJIyB2bTg2LXNwYWNlCisJeG9ybCAlZWR4LCAlZWR4CisJY2FsbCBkb19ub3RpZnlfcmVzdW1lCisJam1wIHJlc3RvcmVfYWxsCisKKwlBTElHTgord29ya19ub3RpZnlzaWdfdjg2OgorCXB1c2hsICVlY3gJCQkjIHNhdmUgdGlfZmxhZ3MgZm9yIGRvX25vdGlmeV9yZXN1bWUKKwljYWxsIHNhdmVfdjg2X3N0YXRlCQkjICVlYXggY29udGFpbnMgcHRfcmVncyBwb2ludGVyCisJcG9wbCAlZWN4CisJbW92bCAlZWF4LCAlZXNwCisJeG9ybCAlZWR4LCAlZWR4CisJY2FsbCBkb19ub3RpZnlfcmVzdW1lCisJam1wIHJlc3RvcmVfYWxsCisKKwkjIHBlcmZvcm0gc3lzY2FsbCBleGl0IHRyYWNpbmcKKwlBTElHTgorc3lzY2FsbF90cmFjZV9lbnRyeToKKwltb3ZsICQtRU5PU1lTLEVBWCglZXNwKQorCW1vdmwgJWVzcCwgJWVheAorCXhvcmwgJWVkeCwlZWR4CisJY2FsbCBkb19zeXNjYWxsX3RyYWNlCisJbW92bCBPUklHX0VBWCglZXNwKSwgJWVheAorCWNtcGwgJChucl9zeXNjYWxscyksICVlYXgKKwlqbmFlIHN5c2NhbGxfY2FsbAorCWptcCBzeXNjYWxsX2V4aXQKKworCSMgcGVyZm9ybSBzeXNjYWxsIGV4aXQgdHJhY2luZworCUFMSUdOCitzeXNjYWxsX2V4aXRfd29yazoKKwl0ZXN0YiAkKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVR8X1RJRl9TSU5HTEVTVEVQKSwgJWNsCisJanogd29ya19wZW5kaW5nCisJc3RpCQkJCSMgY291bGQgbGV0IGRvX3N5c2NhbGxfdHJhY2UoKSBjYWxsCisJCQkJCSMgc2NoZWR1bGUoKSBpbnN0ZWFkCisJbW92bCAlZXNwLCAlZWF4CisJbW92bCAkMSwgJWVkeAorCWNhbGwgZG9fc3lzY2FsbF90cmFjZQorCWptcCByZXN1bWVfdXNlcnNwYWNlCisKKwlBTElHTgorc3lzY2FsbF9mYXVsdDoKKwlwdXNobCAlZWF4CQkJIyBzYXZlIG9yaWdfZWF4CisJU0FWRV9BTEwKKwlHRVRfVEhSRUFEX0lORk8oJWVicCkKKwltb3ZsICQtRUZBVUxULEVBWCglZXNwKQorCWptcCByZXN1bWVfdXNlcnNwYWNlCisKKwlBTElHTgorc3lzY2FsbF9iYWRzeXM6CisJbW92bCAkLUVOT1NZUyxFQVgoJWVzcCkKKwlqbXAgcmVzdW1lX3VzZXJzcGFjZQorCisjZGVmaW5lIEZJWFVQX0VTUEZJWF9TVEFDSyBcCisJbW92bCAlZXNwLCAlZWF4OyBcCisJLyogc3dpdGNoIHRvIDMyYml0IHN0YWNrIHVzaW5nIHRoZSBwb2ludGVyIG9uIHRvcCBvZiAxNmJpdCBzdGFjayAqLyBcCisJbHNzICVzczpDUFVfMTZCSVRfU1RBQ0tfU0laRS04LCAlZXNwOyBcCisJLyogY29weSBkYXRhIGZyb20gMTZiaXQgc3RhY2sgdG8gMzJiaXQgc3RhY2sgKi8gXAorCWNhbGwgZml4dXBfeDg2X2JvZ3VzX3N0YWNrOyBcCisJLyogcHV0IEVTUCB0byB0aGUgcHJvcGVyIGxvY2F0aW9uICovIFwKKwltb3ZsICVlYXgsICVlc3A7CisjZGVmaW5lIFVOV0lORF9FU1BGSVhfU1RBQ0sgXAorCXB1c2hsICVlYXg7IFwKKwltb3ZsICVzcywgJWVheDsgXAorCS8qIHNlZSBpZiBvbiAxNmJpdCBzdGFjayAqLyBcCisJY21wdyAkX19FU1BGSVhfU1MsICVheDsgXAorCWpuZSAyOGY7IFwKKwltb3ZsICRfX0tFUk5FTF9EUywgJWVkeDsgXAorCW1vdmwgJWVkeCwgJWRzOyBcCisJbW92bCAlZWR4LCAlZXM7IFwKKwkvKiBzd2l0Y2ggdG8gMzJiaXQgc3RhY2sgKi8gXAorCUZJWFVQX0VTUEZJWF9TVEFDSyBcCisyODoJcG9wbCAlZWF4OworCisvKgorICogQnVpbGQgdGhlIGVudHJ5IHN0dWJzIGFuZCBwb2ludGVyIHRhYmxlIHdpdGgKKyAqIHNvbWUgYXNzZW1ibGVyIG1hZ2ljLgorICovCisuZGF0YQorRU5UUlkoaW50ZXJydXB0KQorLnRleHQKKwordmVjdG9yPTAKK0VOVFJZKGlycV9lbnRyaWVzX3N0YXJ0KQorLnJlcHQgTlJfSVJRUworCUFMSUdOCisxOglwdXNobCAkdmVjdG9yLTI1NgorCWptcCBjb21tb25faW50ZXJydXB0CisuZGF0YQorCS5sb25nIDFiCisudGV4dAordmVjdG9yPXZlY3RvcisxCisuZW5kcgorCisJQUxJR04KK2NvbW1vbl9pbnRlcnJ1cHQ6CisJU0FWRV9BTEwKKwltb3ZsICVlc3AsJWVheAorCWNhbGwgZG9fSVJRCisJam1wIHJldF9mcm9tX2ludHIKKworI2RlZmluZSBCVUlMRF9JTlRFUlJVUFQobmFtZSwgbnIpCVwKK0VOVFJZKG5hbWUpCQkJCVwKKwlwdXNobCAkbnItMjU2OwkJCVwKKwlTQVZFX0FMTAkJCVwKKwltb3ZsICVlc3AsJWVheDsJCQlcCisJY2FsbCBzbXBfLyoqL25hbWU7CQlcCisJam1wIHJldF9mcm9tX2ludHI7CisKKy8qIFRoZSBpbmNsdWRlIGlzIHdoZXJlIGFsbCBvZiB0aGUgU01QIGV0Yy4gaW50ZXJydXB0cyBjb21lIGZyb20gKi8KKyNpbmNsdWRlICJlbnRyeV9hcmNoLmgiCisKK0VOVFJZKGRpdmlkZV9lcnJvcikKKwlwdXNobCAkMAkJCSMgbm8gZXJyb3IgY29kZQorCXB1c2hsICRkb19kaXZpZGVfZXJyb3IKKwlBTElHTgorZXJyb3JfY29kZToKKwlwdXNobCAlZHMKKwlwdXNobCAlZWF4CisJeG9ybCAlZWF4LCAlZWF4CisJcHVzaGwgJWVicAorCXB1c2hsICVlZGkKKwlwdXNobCAlZXNpCisJcHVzaGwgJWVkeAorCWRlY2wgJWVheAkJCSMgZWF4ID0gLTEKKwlwdXNobCAlZWN4CisJcHVzaGwgJWVieAorCWNsZAorCXB1c2hsICVlcworCVVOV0lORF9FU1BGSVhfU1RBQ0sKKwlwb3BsICVlY3gKKwltb3ZsIEVTKCVlc3ApLCAlZWRpCQkjIGdldCB0aGUgZnVuY3Rpb24gYWRkcmVzcworCW1vdmwgT1JJR19FQVgoJWVzcCksICVlZHgJIyBnZXQgdGhlIGVycm9yIGNvZGUKKwltb3ZsICVlYXgsIE9SSUdfRUFYKCVlc3ApCisJbW92bCAlZWN4LCBFUyglZXNwKQorCW1vdmwgJChfX1VTRVJfRFMpLCAlZWN4CisJbW92bCAlZWN4LCAlZHMKKwltb3ZsICVlY3gsICVlcworCW1vdmwgJWVzcCwlZWF4CQkJIyBwdF9yZWdzIHBvaW50ZXIKKwljYWxsIColZWRpCisJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgorCitFTlRSWShjb3Byb2Nlc3Nvcl9lcnJvcikKKwlwdXNobCAkMAorCXB1c2hsICRkb19jb3Byb2Nlc3Nvcl9lcnJvcgorCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKHNpbWRfY29wcm9jZXNzb3JfZXJyb3IpCisJcHVzaGwgJDAKKwlwdXNobCAkZG9fc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcgorCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKGRldmljZV9ub3RfYXZhaWxhYmxlKQorCXB1c2hsICQtMQkJCSMgbWFyayB0aGlzIGFzIGFuIGludAorCVNBVkVfQUxMCisJbW92bCAlY3IwLCAlZWF4CisJdGVzdGwgJDB4NCwgJWVheAkJIyBFTSAobWF0aCBlbXVsYXRpb24gYml0KQorCWpuZSBkZXZpY2Vfbm90X2F2YWlsYWJsZV9lbXVsYXRlCisJcHJlZW1wdF9zdG9wCisJY2FsbCBtYXRoX3N0YXRlX3Jlc3RvcmUKKwlqbXAgcmV0X2Zyb21fZXhjZXB0aW9uCitkZXZpY2Vfbm90X2F2YWlsYWJsZV9lbXVsYXRlOgorCXB1c2hsICQwCQkJIyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgT1JJR19FSVAKKwljYWxsIG1hdGhfZW11bGF0ZQorCWFkZGwgJDQsICVlc3AKKwlqbXAgcmV0X2Zyb21fZXhjZXB0aW9uCisKKy8qCisgKiBEZWJ1ZyB0cmFwcyBhbmQgTk1JIGNhbiBoYXBwZW4gYXQgdGhlIG9uZSBTWVNFTlRFUiBpbnN0cnVjdGlvbgorICogdGhhdCBzZXRzIHVwIHRoZSByZWFsIGtlcm5lbCBzdGFjay4gQ2hlY2sgaGVyZSwgc2luY2Ugd2UgY2FuJ3QKKyAqIGFsbG93IHRoZSB3cm9uZyBzdGFjayB0byBiZSB1c2VkLgorICoKKyAqICJUU1Nfc3lzZW50ZXJfZXNwMCsxMiIgaXMgYmVjYXVzZSB0aGUgTk1JL2RlYnVnIGhhbmRsZXIgd2lsbCBoYXZlCisgKiBhbHJlYWR5IHB1c2hlZCAzIHdvcmRzIGlmIGl0IGhpdHMgb24gdGhlIHN5c2VudGVyIGluc3RydWN0aW9uOgorICogZWZsYWdzLCBjcyBhbmQgZWlwLgorICoKKyAqIFdlIGp1c3QgbG9hZCB0aGUgcmlnaHQgc3RhY2ssIGFuZCBwdXNoIHRoZSB0aHJlZSAoa25vd24pIHZhbHVlcworICogYnkgaGFuZCBvbnRvIHRoZSBuZXcgc3RhY2sgLSB3aGlsZSB1cGRhdGluZyB0aGUgcmV0dXJuIGVpcCBwYXN0CisgKiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB3b3VsZCBoYXZlIGRvbmUgaXQgZm9yIHN5c2VudGVyLgorICovCisjZGVmaW5lIEZJWF9TVEFDSyhvZmZzZXQsIG9rLCBsYWJlbCkJCVwKKwljbXB3ICRfX0tFUk5FTF9DUyw0KCVlc3ApOwkJXAorCWpuZSBvazsJCQkJCVwKK2xhYmVsOgkJCQkJCVwKKwltb3ZsIFRTU19zeXNlbnRlcl9lc3AwK29mZnNldCglZXNwKSwlZXNwOwlcCisJcHVzaGZsOwkJCQkJXAorCXB1c2hsICRfX0tFUk5FTF9DUzsJCQlcCisJcHVzaGwgJHN5c2VudGVyX3Bhc3RfZXNwCisKK0VOVFJZKGRlYnVnKQorCWNtcGwgJHN5c2VudGVyX2VudHJ5LCglZXNwKQorCWpuZSBkZWJ1Z19zdGFja19jb3JyZWN0CisJRklYX1NUQUNLKDEyLCBkZWJ1Z19zdGFja19jb3JyZWN0LCBkZWJ1Z19lc3BfZml4X2luc24pCitkZWJ1Z19zdGFja19jb3JyZWN0OgorCXB1c2hsICQtMQkJCSMgbWFyayB0aGlzIGFzIGFuIGludAorCVNBVkVfQUxMCisJeG9ybCAlZWR4LCVlZHgJCQkjIGVycm9yIGNvZGUgMAorCW1vdmwgJWVzcCwlZWF4CQkJIyBwdF9yZWdzIHBvaW50ZXIKKwljYWxsIGRvX2RlYnVnCisJdGVzdGwgJWVheCwlZWF4CisJam56IHJlc3RvcmVfYWxsCisJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgorCisvKgorICogTk1JIGlzIGRvdWJseSBuYXN0eS4gSXQgY2FuIGhhcHBlbiBfd2hpbGVfIHdlJ3JlIGhhbmRsaW5nCisgKiBhIGRlYnVnIGZhdWx0LCBhbmQgdGhlIGRlYnVnIGZhdWx0IGhhc24ndCB5ZXQgYmVlbiBhYmxlIHRvCisgKiBjbGVhciB1cCB0aGUgc3RhY2suIFNvIHdlIGZpcnN0IGNoZWNrIHdoZXRoZXIgd2UgZ290ICBhbgorICogTk1JIG9uIHRoZSBzeXNlbnRlciBlbnRyeSBwYXRoLCBidXQgYWZ0ZXIgdGhhdCB3ZSBuZWVkIHRvCisgKiBjaGVjayB3aGV0aGVyIHdlIGdvdCBhbiBOTUkgb24gdGhlIGRlYnVnIHBhdGggd2hlcmUgdGhlIGRlYnVnCisgKiBmYXVsdCBoYXBwZW5lZCBvbiB0aGUgc3lzZW50ZXIgcGF0aC4KKyAqLworRU5UUlkobm1pKQorCXB1c2hsICVlYXgKKwltb3ZsICVzcywgJWVheAorCWNtcHcgJF9fRVNQRklYX1NTLCAlYXgKKwlwb3BsICVlYXgKKwlqZSBubWlfMTZiaXRfc3RhY2sKKwljbXBsICRzeXNlbnRlcl9lbnRyeSwoJWVzcCkKKwlqZSBubWlfc3RhY2tfZml4dXAKKwlwdXNobCAlZWF4CisJbW92bCAlZXNwLCVlYXgKKwkvKiBEbyBub3QgYWNjZXNzIG1lbW9yeSBhYm92ZSB0aGUgZW5kIG9mIG91ciBzdGFjayBwYWdlLAorCSAqIGl0IG1pZ2h0IG5vdCBleGlzdC4KKwkgKi8KKwlhbmRsICQoVEhSRUFEX1NJWkUtMSksJWVheAorCWNtcGwgJChUSFJFQURfU0laRS0yMCksJWVheAorCXBvcGwgJWVheAorCWphZSBubWlfc3RhY2tfY29ycmVjdAorCWNtcGwgJHN5c2VudGVyX2VudHJ5LDEyKCVlc3ApCisJamUgbm1pX2RlYnVnX3N0YWNrX2NoZWNrCitubWlfc3RhY2tfY29ycmVjdDoKKwlwdXNobCAlZWF4CisJU0FWRV9BTEwKKwl4b3JsICVlZHgsJWVkeAkJIyB6ZXJvIGVycm9yIGNvZGUKKwltb3ZsICVlc3AsJWVheAkJIyBwdF9yZWdzIHBvaW50ZXIKKwljYWxsIGRvX25taQorCWptcCByZXN0b3JlX2FsbAorCitubWlfc3RhY2tfZml4dXA6CisJRklYX1NUQUNLKDEyLG5taV9zdGFja19jb3JyZWN0LCAxKQorCWptcCBubWlfc3RhY2tfY29ycmVjdAorbm1pX2RlYnVnX3N0YWNrX2NoZWNrOgorCWNtcHcgJF9fS0VSTkVMX0NTLDE2KCVlc3ApCisJam5lIG5taV9zdGFja19jb3JyZWN0CisJY21wbCAkZGVidWcgLSAxLCglZXNwKQorCWpsZSBubWlfc3RhY2tfY29ycmVjdAorCWNtcGwgJGRlYnVnX2VzcF9maXhfaW5zbiwoJWVzcCkKKwlqbGUgbm1pX2RlYnVnX3N0YWNrX2ZpeHVwCitubWlfZGVidWdfc3RhY2tfZml4dXA6CisJRklYX1NUQUNLKDI0LG5taV9zdGFja19jb3JyZWN0LCAxKQorCWptcCBubWlfc3RhY2tfY29ycmVjdAorCitubWlfMTZiaXRfc3RhY2s6CisJLyogY3JlYXRlIHRoZSBwb2ludGVyIHRvIGxzcyBiYWNrICovCisJcHVzaGwgJXNzCisJcHVzaGwgJWVzcAorCW1vdnp3bCAlc3AsICVlc3AKKwlhZGR3ICQ0LCAoJWVzcCkKKwkvKiBjb3B5IHRoZSBpcmV0IGZyYW1lIG9mIDEyIGJ5dGVzICovCisJLnJlcHQgMworCXB1c2hsIDE2KCVlc3ApCisJLmVuZHIKKwlwdXNobCAlZWF4CisJU0FWRV9BTEwKKwlGSVhVUF9FU1BGSVhfU1RBQ0sJCSMgJWVheCA9PSAlZXNwCisJeG9ybCAlZWR4LCVlZHgJCQkjIHplcm8gZXJyb3IgY29kZQorCWNhbGwgZG9fbm1pCisJUkVTVE9SRV9SRUdTCisJbHNzIDEyKzQoJWVzcCksICVlc3AJCSMgYmFjayB0byAxNmJpdCBzdGFjaworMToJaXJldAorLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkuYWxpZ24gNAorCS5sb25nIDFiLGlyZXRfZXhjCisucHJldmlvdXMKKworRU5UUlkoaW50MykKKwlwdXNobCAkLTEJCQkjIG1hcmsgdGhpcyBhcyBhbiBpbnQKKwlTQVZFX0FMTAorCXhvcmwgJWVkeCwlZWR4CQkjIHplcm8gZXJyb3IgY29kZQorCW1vdmwgJWVzcCwlZWF4CQkjIHB0X3JlZ3MgcG9pbnRlcgorCWNhbGwgZG9faW50MworCXRlc3RsICVlYXgsJWVheAorCWpueiByZXN0b3JlX2FsbAorCWptcCByZXRfZnJvbV9leGNlcHRpb24KKworRU5UUlkob3ZlcmZsb3cpCisJcHVzaGwgJDAKKwlwdXNobCAkZG9fb3ZlcmZsb3cKKwlqbXAgZXJyb3JfY29kZQorCitFTlRSWShib3VuZHMpCisJcHVzaGwgJDAKKwlwdXNobCAkZG9fYm91bmRzCisJam1wIGVycm9yX2NvZGUKKworRU5UUlkoaW52YWxpZF9vcCkKKwlwdXNobCAkMAorCXB1c2hsICRkb19pbnZhbGlkX29wCisJam1wIGVycm9yX2NvZGUKKworRU5UUlkoY29wcm9jZXNzb3Jfc2VnbWVudF9vdmVycnVuKQorCXB1c2hsICQwCisJcHVzaGwgJGRvX2NvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bgorCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKGludmFsaWRfVFNTKQorCXB1c2hsICRkb19pbnZhbGlkX1RTUworCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKHNlZ21lbnRfbm90X3ByZXNlbnQpCisJcHVzaGwgJGRvX3NlZ21lbnRfbm90X3ByZXNlbnQKKwlqbXAgZXJyb3JfY29kZQorCitFTlRSWShzdGFja19zZWdtZW50KQorCXB1c2hsICRkb19zdGFja19zZWdtZW50CisJam1wIGVycm9yX2NvZGUKKworRU5UUlkoZ2VuZXJhbF9wcm90ZWN0aW9uKQorCXB1c2hsICRkb19nZW5lcmFsX3Byb3RlY3Rpb24KKwlqbXAgZXJyb3JfY29kZQorCitFTlRSWShhbGlnbm1lbnRfY2hlY2spCisJcHVzaGwgJGRvX2FsaWdubWVudF9jaGVjaworCWptcCBlcnJvcl9jb2RlCisKK0VOVFJZKHBhZ2VfZmF1bHQpCisJcHVzaGwgJGRvX3BhZ2VfZmF1bHQKKwlqbXAgZXJyb3JfY29kZQorCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKK0VOVFJZKG1hY2hpbmVfY2hlY2spCisJcHVzaGwgJDAKKwlwdXNobCBtYWNoaW5lX2NoZWNrX3ZlY3RvcgorCWptcCBlcnJvcl9jb2RlCisjZW5kaWYKKworRU5UUlkoc3B1cmlvdXNfaW50ZXJydXB0X2J1ZykKKwlwdXNobCAkMAorCXB1c2hsICRkb19zcHVyaW91c19pbnRlcnJ1cHRfYnVnCisJam1wIGVycm9yX2NvZGUKKworLmRhdGEKK0VOVFJZKHN5c19jYWxsX3RhYmxlKQorCS5sb25nIHN5c19yZXN0YXJ0X3N5c2NhbGwJLyogMCAtIG9sZCAic2V0dXAoKSIgc3lzdGVtIGNhbGwsIHVzZWQgZm9yIHJlc3RhcnRpbmcgKi8KKwkubG9uZyBzeXNfZXhpdAorCS5sb25nIHN5c19mb3JrCisJLmxvbmcgc3lzX3JlYWQKKwkubG9uZyBzeXNfd3JpdGUKKwkubG9uZyBzeXNfb3BlbgkJLyogNSAqLworCS5sb25nIHN5c19jbG9zZQorCS5sb25nIHN5c193YWl0cGlkCisJLmxvbmcgc3lzX2NyZWF0CisJLmxvbmcgc3lzX2xpbmsKKwkubG9uZyBzeXNfdW5saW5rCS8qIDEwICovCisJLmxvbmcgc3lzX2V4ZWN2ZQorCS5sb25nIHN5c19jaGRpcgorCS5sb25nIHN5c190aW1lCisJLmxvbmcgc3lzX21rbm9kCisJLmxvbmcgc3lzX2NobW9kCQkvKiAxNSAqLworCS5sb25nIHN5c19sY2hvd24xNgorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBicmVhayBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19zdGF0CisJLmxvbmcgc3lzX2xzZWVrCisJLmxvbmcgc3lzX2dldHBpZAkvKiAyMCAqLworCS5sb25nIHN5c19tb3VudAorCS5sb25nIHN5c19vbGR1bW91bnQKKwkubG9uZyBzeXNfc2V0dWlkMTYKKwkubG9uZyBzeXNfZ2V0dWlkMTYKKwkubG9uZyBzeXNfc3RpbWUJCS8qIDI1ICovCisJLmxvbmcgc3lzX3B0cmFjZQorCS5sb25nIHN5c19hbGFybQorCS5sb25nIHN5c19mc3RhdAorCS5sb25nIHN5c19wYXVzZQorCS5sb25nIHN5c191dGltZQkJLyogMzAgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgc3R0eSBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBndHR5IHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX2FjY2VzcworCS5sb25nIHN5c19uaWNlCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogMzUgLSBvbGQgZnRpbWUgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfc3luYworCS5sb25nIHN5c19raWxsCisJLmxvbmcgc3lzX3JlbmFtZQorCS5sb25nIHN5c19ta2RpcgorCS5sb25nIHN5c19ybWRpcgkJLyogNDAgKi8KKwkubG9uZyBzeXNfZHVwCisJLmxvbmcgc3lzX3BpcGUKKwkubG9uZyBzeXNfdGltZXMKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgcHJvZiBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19icmsJCS8qIDQ1ICovCisJLmxvbmcgc3lzX3NldGdpZDE2CisJLmxvbmcgc3lzX2dldGdpZDE2CisJLmxvbmcgc3lzX3NpZ25hbAorCS5sb25nIHN5c19nZXRldWlkMTYKKwkubG9uZyBzeXNfZ2V0ZWdpZDE2CS8qIDUwICovCisJLmxvbmcgc3lzX2FjY3QKKwkubG9uZyBzeXNfdW1vdW50CS8qIHJlY3ljbGVkIG5ldmVyIHVzZWQgcGh5cygpICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIGxvY2sgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfaW9jdGwKKwkubG9uZyBzeXNfZmNudGwJCS8qIDU1ICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIG1weCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19zZXRwZ2lkCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHVsaW1pdCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19vbGR1bmFtZQorCS5sb25nIHN5c191bWFzawkJLyogNjAgKi8KKwkubG9uZyBzeXNfY2hyb290CisJLmxvbmcgc3lzX3VzdGF0CisJLmxvbmcgc3lzX2R1cDIKKwkubG9uZyBzeXNfZ2V0cHBpZAorCS5sb25nIHN5c19nZXRwZ3JwCS8qIDY1ICovCisJLmxvbmcgc3lzX3NldHNpZAorCS5sb25nIHN5c19zaWdhY3Rpb24KKwkubG9uZyBzeXNfc2dldG1hc2sKKwkubG9uZyBzeXNfc3NldG1hc2sKKwkubG9uZyBzeXNfc2V0cmV1aWQxNgkvKiA3MCAqLworCS5sb25nIHN5c19zZXRyZWdpZDE2CisJLmxvbmcgc3lzX3NpZ3N1c3BlbmQKKwkubG9uZyBzeXNfc2lncGVuZGluZworCS5sb25nIHN5c19zZXRob3N0bmFtZQorCS5sb25nIHN5c19zZXRybGltaXQJLyogNzUgKi8KKwkubG9uZyBzeXNfb2xkX2dldHJsaW1pdAorCS5sb25nIHN5c19nZXRydXNhZ2UKKwkubG9uZyBzeXNfZ2V0dGltZW9mZGF5CisJLmxvbmcgc3lzX3NldHRpbWVvZmRheQorCS5sb25nIHN5c19nZXRncm91cHMxNgkvKiA4MCAqLworCS5sb25nIHN5c19zZXRncm91cHMxNgorCS5sb25nIG9sZF9zZWxlY3QKKwkubG9uZyBzeXNfc3ltbGluaworCS5sb25nIHN5c19sc3RhdAorCS5sb25nIHN5c19yZWFkbGluawkvKiA4NSAqLworCS5sb25nIHN5c191c2VsaWIKKwkubG9uZyBzeXNfc3dhcG9uCisJLmxvbmcgc3lzX3JlYm9vdAorCS5sb25nIG9sZF9yZWFkZGlyCisJLmxvbmcgb2xkX21tYXAJCS8qIDkwICovCisJLmxvbmcgc3lzX211bm1hcAorCS5sb25nIHN5c190cnVuY2F0ZQorCS5sb25nIHN5c19mdHJ1bmNhdGUKKwkubG9uZyBzeXNfZmNobW9kCisJLmxvbmcgc3lzX2ZjaG93bjE2CS8qIDk1ICovCisJLmxvbmcgc3lzX2dldHByaW9yaXR5CisJLmxvbmcgc3lzX3NldHByaW9yaXR5CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHByb2ZpbCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19zdGF0ZnMKKwkubG9uZyBzeXNfZnN0YXRmcwkvKiAxMDAgKi8KKwkubG9uZyBzeXNfaW9wZXJtCisJLmxvbmcgc3lzX3NvY2tldGNhbGwKKwkubG9uZyBzeXNfc3lzbG9nCisJLmxvbmcgc3lzX3NldGl0aW1lcgorCS5sb25nIHN5c19nZXRpdGltZXIJLyogMTA1ICovCisJLmxvbmcgc3lzX25ld3N0YXQKKwkubG9uZyBzeXNfbmV3bHN0YXQKKwkubG9uZyBzeXNfbmV3ZnN0YXQKKwkubG9uZyBzeXNfdW5hbWUKKwkubG9uZyBzeXNfaW9wbAkJLyogMTEwICovCisJLmxvbmcgc3lzX3ZoYW5ndXAKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgImlkbGUiIHN5c3RlbSBjYWxsICovCisJLmxvbmcgc3lzX3ZtODZvbGQKKwkubG9uZyBzeXNfd2FpdDQKKwkubG9uZyBzeXNfc3dhcG9mZgkvKiAxMTUgKi8KKwkubG9uZyBzeXNfc3lzaW5mbworCS5sb25nIHN5c19pcGMKKwkubG9uZyBzeXNfZnN5bmMKKwkubG9uZyBzeXNfc2lncmV0dXJuCisJLmxvbmcgc3lzX2Nsb25lCQkvKiAxMjAgKi8KKwkubG9uZyBzeXNfc2V0ZG9tYWlubmFtZQorCS5sb25nIHN5c19uZXd1bmFtZQorCS5sb25nIHN5c19tb2RpZnlfbGR0CisJLmxvbmcgc3lzX2FkanRpbWV4CisJLmxvbmcgc3lzX21wcm90ZWN0CS8qIDEyNSAqLworCS5sb25nIHN5c19zaWdwcm9jbWFzaworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCAiY3JlYXRlX21vZHVsZSIgKi8gCisJLmxvbmcgc3lzX2luaXRfbW9kdWxlCisJLmxvbmcgc3lzX2RlbGV0ZV9tb2R1bGUKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiAxMzA6CW9sZCAiZ2V0X2tlcm5lbF9zeW1zIiAqLworCS5sb25nIHN5c19xdW90YWN0bAorCS5sb25nIHN5c19nZXRwZ2lkCisJLmxvbmcgc3lzX2ZjaGRpcgorCS5sb25nIHN5c19iZGZsdXNoCisJLmxvbmcgc3lzX3N5c2ZzCQkvKiAxMzUgKi8KKwkubG9uZyBzeXNfcGVyc29uYWxpdHkKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiByZXNlcnZlZCBmb3IgYWZzX3N5c2NhbGwgKi8KKwkubG9uZyBzeXNfc2V0ZnN1aWQxNgorCS5sb25nIHN5c19zZXRmc2dpZDE2CisJLmxvbmcgc3lzX2xsc2VlawkvKiAxNDAgKi8KKwkubG9uZyBzeXNfZ2V0ZGVudHMKKwkubG9uZyBzeXNfc2VsZWN0CisJLmxvbmcgc3lzX2Zsb2NrCisJLmxvbmcgc3lzX21zeW5jCisJLmxvbmcgc3lzX3JlYWR2CQkvKiAxNDUgKi8KKwkubG9uZyBzeXNfd3JpdGV2CisJLmxvbmcgc3lzX2dldHNpZAorCS5sb25nIHN5c19mZGF0YXN5bmMKKwkubG9uZyBzeXNfc3lzY3RsCisJLmxvbmcgc3lzX21sb2NrCQkvKiAxNTAgKi8KKwkubG9uZyBzeXNfbXVubG9jaworCS5sb25nIHN5c19tbG9ja2FsbAorCS5sb25nIHN5c19tdW5sb2NrYWxsCisJLmxvbmcgc3lzX3NjaGVkX3NldHBhcmFtCisJLmxvbmcgc3lzX3NjaGVkX2dldHBhcmFtICAgLyogMTU1ICovCisJLmxvbmcgc3lzX3NjaGVkX3NldHNjaGVkdWxlcgorCS5sb25nIHN5c19zY2hlZF9nZXRzY2hlZHVsZXIKKwkubG9uZyBzeXNfc2NoZWRfeWllbGQKKwkubG9uZyBzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heAorCS5sb25nIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluICAvKiAxNjAgKi8KKwkubG9uZyBzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsCisJLmxvbmcgc3lzX25hbm9zbGVlcAorCS5sb25nIHN5c19tcmVtYXAKKwkubG9uZyBzeXNfc2V0cmVzdWlkMTYKKwkubG9uZyBzeXNfZ2V0cmVzdWlkMTYJLyogMTY1ICovCisJLmxvbmcgc3lzX3ZtODYKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBPbGQgc3lzX3F1ZXJ5X21vZHVsZSAqLworCS5sb25nIHN5c19wb2xsCisJLmxvbmcgc3lzX25mc3NlcnZjdGwKKwkubG9uZyBzeXNfc2V0cmVzZ2lkMTYJLyogMTcwICovCisJLmxvbmcgc3lzX2dldHJlc2dpZDE2CisJLmxvbmcgc3lzX3ByY3RsCisJLmxvbmcgc3lzX3J0X3NpZ3JldHVybgorCS5sb25nIHN5c19ydF9zaWdhY3Rpb24KKwkubG9uZyBzeXNfcnRfc2lncHJvY21hc2sJLyogMTc1ICovCisJLmxvbmcgc3lzX3J0X3NpZ3BlbmRpbmcKKwkubG9uZyBzeXNfcnRfc2lndGltZWR3YWl0CisJLmxvbmcgc3lzX3J0X3NpZ3F1ZXVlaW5mbworCS5sb25nIHN5c19ydF9zaWdzdXNwZW5kCisJLmxvbmcgc3lzX3ByZWFkNjQJLyogMTgwICovCisJLmxvbmcgc3lzX3B3cml0ZTY0CisJLmxvbmcgc3lzX2Nob3duMTYKKwkubG9uZyBzeXNfZ2V0Y3dkCisJLmxvbmcgc3lzX2NhcGdldAorCS5sb25nIHN5c19jYXBzZXQJLyogMTg1ICovCisJLmxvbmcgc3lzX3NpZ2FsdHN0YWNrCisJLmxvbmcgc3lzX3NlbmRmaWxlCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogcmVzZXJ2ZWQgZm9yIHN0cmVhbXMxICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogcmVzZXJ2ZWQgZm9yIHN0cmVhbXMyICovCisJLmxvbmcgc3lzX3Zmb3JrCQkvKiAxOTAgKi8KKwkubG9uZyBzeXNfZ2V0cmxpbWl0CisJLmxvbmcgc3lzX21tYXAyCisJLmxvbmcgc3lzX3RydW5jYXRlNjQKKwkubG9uZyBzeXNfZnRydW5jYXRlNjQKKwkubG9uZyBzeXNfc3RhdDY0CS8qIDE5NSAqLworCS5sb25nIHN5c19sc3RhdDY0CisJLmxvbmcgc3lzX2ZzdGF0NjQKKwkubG9uZyBzeXNfbGNob3duCisJLmxvbmcgc3lzX2dldHVpZAorCS5sb25nIHN5c19nZXRnaWQJLyogMjAwICovCisJLmxvbmcgc3lzX2dldGV1aWQKKwkubG9uZyBzeXNfZ2V0ZWdpZAorCS5sb25nIHN5c19zZXRyZXVpZAorCS5sb25nIHN5c19zZXRyZWdpZAorCS5sb25nIHN5c19nZXRncm91cHMJLyogMjA1ICovCisJLmxvbmcgc3lzX3NldGdyb3VwcworCS5sb25nIHN5c19mY2hvd24KKwkubG9uZyBzeXNfc2V0cmVzdWlkCisJLmxvbmcgc3lzX2dldHJlc3VpZAorCS5sb25nIHN5c19zZXRyZXNnaWQJLyogMjEwICovCisJLmxvbmcgc3lzX2dldHJlc2dpZAorCS5sb25nIHN5c19jaG93bgorCS5sb25nIHN5c19zZXR1aWQKKwkubG9uZyBzeXNfc2V0Z2lkCisJLmxvbmcgc3lzX3NldGZzdWlkCS8qIDIxNSAqLworCS5sb25nIHN5c19zZXRmc2dpZAorCS5sb25nIHN5c19waXZvdF9yb290CisJLmxvbmcgc3lzX21pbmNvcmUKKwkubG9uZyBzeXNfbWFkdmlzZQorCS5sb25nIHN5c19nZXRkZW50czY0CS8qIDIyMCAqLworCS5sb25nIHN5c19mY250bDY0CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogcmVzZXJ2ZWQgZm9yIFRVWCAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCisJLmxvbmcgc3lzX2dldHRpZAorCS5sb25nIHN5c19yZWFkYWhlYWQJLyogMjI1ICovCisJLmxvbmcgc3lzX3NldHhhdHRyCisJLmxvbmcgc3lzX2xzZXR4YXR0cgorCS5sb25nIHN5c19mc2V0eGF0dHIKKwkubG9uZyBzeXNfZ2V0eGF0dHIKKwkubG9uZyBzeXNfbGdldHhhdHRyCS8qIDIzMCAqLworCS5sb25nIHN5c19mZ2V0eGF0dHIKKwkubG9uZyBzeXNfbGlzdHhhdHRyCisJLmxvbmcgc3lzX2xsaXN0eGF0dHIKKwkubG9uZyBzeXNfZmxpc3R4YXR0cgorCS5sb25nIHN5c19yZW1vdmV4YXR0cgkvKiAyMzUgKi8KKwkubG9uZyBzeXNfbHJlbW92ZXhhdHRyCisJLmxvbmcgc3lzX2ZyZW1vdmV4YXR0cgorCS5sb25nIHN5c190a2lsbAorCS5sb25nIHN5c19zZW5kZmlsZTY0CisJLmxvbmcgc3lzX2Z1dGV4CQkvKiAyNDAgKi8KKwkubG9uZyBzeXNfc2NoZWRfc2V0YWZmaW5pdHkKKwkubG9uZyBzeXNfc2NoZWRfZ2V0YWZmaW5pdHkKKwkubG9uZyBzeXNfc2V0X3RocmVhZF9hcmVhCisJLmxvbmcgc3lzX2dldF90aHJlYWRfYXJlYQorCS5sb25nIHN5c19pb19zZXR1cAkvKiAyNDUgKi8KKwkubG9uZyBzeXNfaW9fZGVzdHJveQorCS5sb25nIHN5c19pb19nZXRldmVudHMKKwkubG9uZyBzeXNfaW9fc3VibWl0CisJLmxvbmcgc3lzX2lvX2NhbmNlbAorCS5sb25nIHN5c19mYWR2aXNlNjQJLyogMjUwICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwKKwkubG9uZyBzeXNfZXhpdF9ncm91cAorCS5sb25nIHN5c19sb29rdXBfZGNvb2tpZQorCS5sb25nIHN5c19lcG9sbF9jcmVhdGUKKwkubG9uZyBzeXNfZXBvbGxfY3RsCS8qIDI1NSAqLworCS5sb25nIHN5c19lcG9sbF93YWl0CisgCS5sb25nIHN5c19yZW1hcF9maWxlX3BhZ2VzCisgCS5sb25nIHN5c19zZXRfdGlkX2FkZHJlc3MKKyAJLmxvbmcgc3lzX3RpbWVyX2NyZWF0ZQorIAkubG9uZyBzeXNfdGltZXJfc2V0dGltZQkJLyogMjYwICovCisgCS5sb25nIHN5c190aW1lcl9nZXR0aW1lCisgCS5sb25nIHN5c190aW1lcl9nZXRvdmVycnVuCisgCS5sb25nIHN5c190aW1lcl9kZWxldGUKKyAJLmxvbmcgc3lzX2Nsb2NrX3NldHRpbWUKKyAJLmxvbmcgc3lzX2Nsb2NrX2dldHRpbWUJCS8qIDI2NSAqLworIAkubG9uZyBzeXNfY2xvY2tfZ2V0cmVzCisgCS5sb25nIHN5c19jbG9ja19uYW5vc2xlZXAKKwkubG9uZyBzeXNfc3RhdGZzNjQKKwkubG9uZyBzeXNfZnN0YXRmczY0CQorCS5sb25nIHN5c190Z2tpbGwJLyogMjcwICovCisJLmxvbmcgc3lzX3V0aW1lcworIAkubG9uZyBzeXNfZmFkdmlzZTY0XzY0CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX3ZzZXJ2ZXIgKi8KKwkubG9uZyBzeXNfbWJpbmQKKwkubG9uZyBzeXNfZ2V0X21lbXBvbGljeQorCS5sb25nIHN5c19zZXRfbWVtcG9saWN5CisJLmxvbmcgc3lzX21xX29wZW4KKwkubG9uZyBzeXNfbXFfdW5saW5rCisJLmxvbmcgc3lzX21xX3RpbWVkc2VuZAorCS5sb25nIHN5c19tcV90aW1lZHJlY2VpdmUJLyogMjgwICovCisJLmxvbmcgc3lzX21xX25vdGlmeQorCS5sb25nIHN5c19tcV9nZXRzZXRhdHRyCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIHJlc2VydmVkIGZvciBrZXhlYyAqLworCS5sb25nIHN5c193YWl0aWQKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogMjg1ICovIC8qIGF2YWlsYWJsZSAqLworCS5sb25nIHN5c19hZGRfa2V5CisJLmxvbmcgc3lzX3JlcXVlc3Rfa2V5CisJLmxvbmcgc3lzX2tleWN0bAorCitzeXNjYWxsX3RhYmxlX3NpemU9KC4tc3lzX2NhbGxfdGFibGUpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2hlYWQuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzNmZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2hlYWQuUwpAQCAtMCwwICsxLDUyMSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYva2VybmVsL2hlYWQuUyAtLSB0aGUgMzItYml0IHN0YXJ0dXAgY29kZS4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBFbmhhbmNlZCBDUFUgZGV0ZWN0aW9uIGFuZCBmZWF0dXJlIHNldHRpbmcgY29kZSBieSBNaWtlIEphZ2RpcworICogIGFuZCBNYXJ0aW4gTWFyZXMsIE5vdmVtYmVyIDE5OTcuCisgKi8KKworLnRleHQKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKy8qCisgKiBSZWZlcmVuY2VzIHRvIG1lbWJlcnMgb2YgdGhlIG5ld19jcHVfZGF0YSBzdHJ1Y3R1cmUuCisgKi8KKworI2RlZmluZSBYODYJCW5ld19jcHVfZGF0YStDUFVJTkZPX3g4NgorI2RlZmluZSBYODZfVkVORE9SCW5ld19jcHVfZGF0YStDUFVJTkZPX3g4Nl92ZW5kb3IKKyNkZWZpbmUgWDg2X01PREVMCW5ld19jcHVfZGF0YStDUFVJTkZPX3g4Nl9tb2RlbAorI2RlZmluZSBYODZfTUFTSwluZXdfY3B1X2RhdGErQ1BVSU5GT194ODZfbWFzaworI2RlZmluZSBYODZfSEFSRF9NQVRICW5ld19jcHVfZGF0YStDUFVJTkZPX2hhcmRfbWF0aAorI2RlZmluZSBYODZfQ1BVSUQJbmV3X2NwdV9kYXRhK0NQVUlORk9fY3B1aWRfbGV2ZWwKKyNkZWZpbmUgWDg2X0NBUEFCSUxJVFkJbmV3X2NwdV9kYXRhK0NQVUlORk9feDg2X2NhcGFiaWxpdHkKKyNkZWZpbmUgWDg2X1ZFTkRPUl9JRAluZXdfY3B1X2RhdGErQ1BVSU5GT194ODZfdmVuZG9yX2lkCisKKy8qCisgKiBUaGlzIGlzIGhvdyBtdWNoIG1lbW9yeSAqaW4gYWRkaXRpb24gdG8gdGhlIG1lbW9yeSBjb3ZlcmVkIHVwIHRvCisgKiBhbmQgaW5jbHVkaW5nIF9lbmQqIHdlIG5lZWQgbWFwcGVkIGluaXRpYWxseS4gIFdlIG5lZWQgb25lIGJpdCBmb3IKKyAqIGVhY2ggcG9zc2libGUgcGFnZSwgYnV0IG9ubHkgaW4gbG93IG1lbW9yeSwgd2hpY2ggbWVhbnMKKyAqIDJeMzIvNDA5Ni84ID0gMTI4SyB3b3JzdCBjYXNlICg0Ry80RyBzcGxpdC4pCisgKgorICogTW9kdWxvIHJvdW5kaW5nLCBlYWNoIG1lZ2FieXRlIGFzc2lnbmVkIGhlcmUgcmVxdWlyZXMgYSBraWxvYnl0ZSBvZgorICogbWVtb3J5LCB3aGljaCBpcyBjdXJyZW50bHkgdW5yZWNsYWltZWQuCisgKgorICogVGhpcyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBhIHBhZ2UuCisgKi8KKyNkZWZpbmUgSU5JVF9NQVBfQkVZT05EX0VORAkoMTI4KjEwMjQpCisKKworLyoKKyAqIDMyLWJpdCBrZXJuZWwgZW50cnlwb2ludDsgb25seSB1c2VkIGJ5IHRoZSBib290IENQVS4gIE9uIGVudHJ5LAorICogJWVzaSBwb2ludHMgdG8gdGhlIHJlYWwtbW9kZSBjb2RlIGFzIGEgMzItYml0IHBvaW50ZXIuCisgKiBDUyBhbmQgRFMgbXVzdCBiZSA0IEdCIGZsYXQgc2VnbWVudHMsIGJ1dCB3ZSBkb24ndCBkZXBlbmQgb24KKyAqIGFueSBwYXJ0aWN1bGFyIEdEVCBsYXlvdXQsIGJlY2F1c2Ugd2UgbG9hZCBvdXIgb3duIGFzIHNvb24gYXMgd2UKKyAqIGNhbi4KKyAqLworRU5UUlkoc3RhcnR1cF8zMikKKworLyoKKyAqIFNldCBzZWdtZW50cyB0byBrbm93biB2YWx1ZXMuCisgKi8KKwljbGQKKwlsZ2R0IGJvb3RfZ2R0X2Rlc2NyIC0gX19QQUdFX09GRlNFVAorCW1vdmwgJChfX0JPT1RfRFMpLCVlYXgKKwltb3ZsICVlYXgsJWRzCisJbW92bCAlZWF4LCVlcworCW1vdmwgJWVheCwlZnMKKwltb3ZsICVlYXgsJWdzCisKKy8qCisgKiBDbGVhciBCU1MgZmlyc3Qgc28gdGhhdCB0aGVyZSBhcmUgbm8gc3VycHJpc2VzLi4uCisgKiBObyBuZWVkIHRvIGNsZCBhcyBERiBpcyBhbHJlYWR5IGNsZWFyIGZyb20gY2xkIGFib3ZlLi4uCisgKi8KKwl4b3JsICVlYXgsJWVheAorCW1vdmwgJF9fYnNzX3N0YXJ0IC0gX19QQUdFX09GRlNFVCwlZWRpCisJbW92bCAkX19ic3Nfc3RvcCAtIF9fUEFHRV9PRkZTRVQsJWVjeAorCXN1YmwgJWVkaSwlZWN4CisJc2hybCAkMiwlZWN4CisJcmVwIDsgc3Rvc2wKKworLyoKKyAqIEluaXRpYWxpemUgcGFnZSB0YWJsZXMuICBUaGlzIGNyZWF0ZXMgYSBQREUgYW5kIGEgc2V0IG9mIHBhZ2UKKyAqIHRhYmxlcywgd2hpY2ggYXJlIGxvY2F0ZWQgaW1tZWRpYXRlbHkgYmV5b25kIF9lbmQuICBUaGUgdmFyaWFibGUKKyAqIGluaXRfcGdfdGFibGVzX2VuZCBpcyBzZXQgdXAgdG8gcG9pbnQgdG8gdGhlIGZpcnN0ICJzYWZlIiBsb2NhdGlvbi4KKyAqIE1hcHBpbmdzIGFyZSBjcmVhdGVkIGJvdGggYXQgdmlydHVhbCBhZGRyZXNzIDAgKGlkZW50aXR5IG1hcHBpbmcpCisgKiBhbmQgUEFHRV9PRkZTRVQgZm9yIHVwIHRvIF9lbmQrc2l6ZW9mKHBhZ2UgdGFibGVzKStJTklUX01BUF9CRVlPTkRfRU5ELgorICoKKyAqIFdhcm5pbmc6IGRvbid0IHVzZSAlZXNpIG9yIHRoZSBzdGFjayBpbiB0aGlzIGNvZGUuICBIb3dldmVyLCAlZXNwCisgKiBjYW4gYmUgdXNlZCBhcyBhIEdQUiBpZiB5b3UgcmVhbGx5IG5lZWQgaXQuLi4KKyAqLworcGFnZV9wZGVfb2Zmc2V0ID0gKF9fUEFHRV9PRkZTRVQgPj4gMjApOworCisJbW92bCAkKHBnMCAtIF9fUEFHRV9PRkZTRVQpLCAlZWRpCisJbW92bCAkKHN3YXBwZXJfcGdfZGlyIC0gX19QQUdFX09GRlNFVCksICVlZHgKKwltb3ZsICQweDAwNywgJWVheAkJCS8qIDB4MDA3ID0gUFJFU0VOVCtSVytVU0VSICovCisxMDoKKwlsZWFsIDB4MDA3KCVlZGkpLCVlY3gJCQkvKiBDcmVhdGUgUERFIGVudHJ5ICovCisJbW92bCAlZWN4LCglZWR4KQkJCS8qIFN0b3JlIGlkZW50aXR5IFBERSBlbnRyeSAqLworCW1vdmwgJWVjeCxwYWdlX3BkZV9vZmZzZXQoJWVkeCkJCS8qIFN0b3JlIGtlcm5lbCBQREUgZW50cnkgKi8KKwlhZGRsICQ0LCVlZHgKKwltb3ZsICQxMDI0LCAlZWN4CisxMToKKwlzdG9zbAorCWFkZGwgJDB4MTAwMCwlZWF4CisJbG9vcCAxMWIKKwkvKiBFbmQgY29uZGl0aW9uOiB3ZSBtdXN0IG1hcCB1cCB0byBhbmQgaW5jbHVkaW5nIElOSVRfTUFQX0JFWU9ORF9FTkQgKi8KKwkvKiBieXRlcyBiZXlvbmQgdGhlIGVuZCBvZiBvdXIgb3duIHBhZ2UgdGFibGVzOyB0aGUgKzB4MDA3IGlzIHRoZSBhdHRyaWJ1dGUgYml0cyAqLworCWxlYWwgKElOSVRfTUFQX0JFWU9ORF9FTkQrMHgwMDcpKCVlZGkpLCVlYnAKKwljbXBsICVlYnAsJWVheAorCWpiIDEwYgorCW1vdmwgJWVkaSwoaW5pdF9wZ190YWJsZXNfZW5kIC0gX19QQUdFX09GRlNFVCkKKworI2lmZGVmIENPTkZJR19TTVAKKwl4b3JsICVlYngsJWVieAkJCQkvKiBUaGlzIGlzIHRoZSBib290IENQVSAoQlNQKSAqLworCWptcCAzZgorCisvKgorICogTm9uLWJvb3QgQ1BVIGVudHJ5IHBvaW50OyBlbnRlcmVkIGZyb20gdHJhbXBvbGluZS5TCisgKiBXZSBjYW4ndCBsZ2R0IGhlcmUsIGJlY2F1c2UgbGdkdCBpdHNlbGYgdXNlcyBhIGRhdGEgc2VnbWVudCwgYnV0CisgKiB3ZSBrbm93IHRoZSB0cmFtcG9saW5lIGhhcyBhbHJlYWR5IGxvYWRlZCB0aGUgYm9vdF9nZHRfdGFibGUgR0RUCisgKiBmb3IgdXMuCisgKi8KK0VOVFJZKHN0YXJ0dXBfMzJfc21wKQorCWNsZAorCW1vdmwgJChfX0JPT1RfRFMpLCVlYXgKKwltb3ZsICVlYXgsJWRzCisJbW92bCAlZWF4LCVlcworCW1vdmwgJWVheCwlZnMKKwltb3ZsICVlYXgsJWdzCisKKy8qCisgKglOZXcgcGFnZSB0YWJsZXMgbWF5IGJlIGluIDRNYnl0ZSBwYWdlIG1vZGUgYW5kIG1heQorICoJYmUgdXNpbmcgdGhlIGdsb2JhbCBwYWdlcy4gCisgKgorICoJTk9URSEgSWYgd2UgYXJlIG9uIGEgNDg2IHdlIG1heSBoYXZlIG5vIGNyNCBhdCBhbGwhCisgKglTbyB3ZSBkbyBub3QgdHJ5IHRvIHRvdWNoIGl0IHVubGVzcyB3ZSByZWFsbHkgaGF2ZQorICoJc29tZSBiaXRzIGluIGl0IHRvIHNldC4gIFRoaXMgd29uJ3Qgd29yayBpZiB0aGUgQlNQCisgKglpbXBsZW1lbnRzIGNyNCBidXQgdGhpcyBBUCBkb2VzIG5vdCAtLSB2ZXJ5IHVubGlrZWx5CisgKglidXQgYmUgd2FybmVkISAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgcHNlIGZlYXR1cmUKKyAqCWlmIG5vdCBlcXVhbGx5IHN1cHBvcnRlZC4gLS1tYWNybworICoKKyAqCU5PVEUhIFdlIGhhdmUgdG8gY29ycmVjdCBmb3IgdGhlIGZhY3QgdGhhdCB3ZSdyZQorICoJbm90IHlldCBvZmZzZXQgUEFHRV9PRkZTRVQuLgorICovCisjZGVmaW5lIGNyNF9iaXRzIG1tdV9jcjRfZmVhdHVyZXMtX19QQUdFX09GRlNFVAorCW1vdmwgY3I0X2JpdHMsJWVkeAorCWFuZGwgJWVkeCwlZWR4CisJanogNmYKKwltb3ZsICVjcjQsJWVheAkJIyBUdXJuIG9uIHBhZ2luZyBvcHRpb25zIChQU0UsUEFFLC4uKQorCW9ybCAlZWR4LCVlYXgKKwltb3ZsICVlYXgsJWNyNAorCisJYnRsICQ1LCAlZWF4CQkjIGNoZWNrIGlmIFBBRSBpcyBlbmFibGVkCisJam5jIDZmCisKKwkvKiBDaGVjayBpZiBleHRlbmRlZCBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkICovCisJbW92bCAkMHg4MDAwMDAwMCwgJWVheAorCWNwdWlkCisJY21wbCAkMHg4MDAwMDAwMCwgJWVheAorCWpiZSA2ZgorCW1vdiAkMHg4MDAwMDAwMSwgJWVheAorCWNwdWlkCisJLyogRXhlY3V0ZSBEaXNhYmxlIGJpdCBzdXBwb3J0ZWQ/ICovCisJYnRsICQyMCwgJWVkeAorCWpuYyA2ZgorCisJLyogU2V0dXAgRUZFUiAoRXh0ZW5kZWQgRmVhdHVyZSBFbmFibGUgUmVnaXN0ZXIpICovCisJbW92bCAkMHhjMDAwMDA4MCwgJWVjeAorCXJkbXNyCisKKwlidHNsICQxMSwgJWVheAorCS8qIE1ha2UgY2hhbmdlcyBlZmZlY3RpdmUgKi8KKwl3cm1zcgorCis2OgorCS8qIFRoaXMgaXMgYSBzZWNvbmRhcnkgcHJvY2Vzc29yIChBUCkgKi8KKwl4b3JsICVlYngsJWVieAorCWluY2wgJWVieAorCiszOgorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKworLyoKKyAqIEVuYWJsZSBwYWdpbmcKKyAqLworCW1vdmwgJHN3YXBwZXJfcGdfZGlyLV9fUEFHRV9PRkZTRVQsJWVheAorCW1vdmwgJWVheCwlY3IzCQkvKiBzZXQgdGhlIHBhZ2UgdGFibGUgcG9pbnRlci4uICovCisJbW92bCAlY3IwLCVlYXgKKwlvcmwgJDB4ODAwMDAwMDAsJWVheAorCW1vdmwgJWVheCwlY3IwCQkvKiAuLmFuZCBzZXQgcGFnaW5nIChQRykgYml0ICovCisJbGptcCAkX19CT09UX0NTLCQxZgkvKiBDbGVhciBwcmVmZXRjaCBhbmQgbm9ybWFsaXplICVlaXAgKi8KKzE6CisJLyogU2V0IHVwIHRoZSBzdGFjayBwb2ludGVyICovCisJbHNzIHN0YWNrX3N0YXJ0LCVlc3AKKworLyoKKyAqIEluaXRpYWxpemUgZWZsYWdzLiAgU29tZSBCSU9TJ3MgbGVhdmUgYml0cyBsaWtlIE5UIHNldC4gIFRoaXMgd291bGQKKyAqIGNvbmZ1c2UgdGhlIGRlYnVnZ2VyIGlmIHRoaXMgY29kZSBpcyB0cmFjZWQuCisgKiBYWFggLSBiZXN0IHRvIGluaXRpYWxpemUgYmVmb3JlIHN3aXRjaGluZyB0byBwcm90ZWN0ZWQgbW9kZS4KKyAqLworCXB1c2hsICQwCisJcG9wZmwKKworI2lmZGVmIENPTkZJR19TTVAKKwlhbmRsICVlYngsJWVieAorCWp6ICAxZgkJCQkvKiBJbml0aWFsIENQVSBjbGVhbnMgQlNTICovCisJam1wIGNoZWNrQ1BVdHlwZQorMToKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKKy8qCisgKiBzdGFydCBzeXN0ZW0gMzItYml0IHNldHVwLiBXZSBuZWVkIHRvIHJlLWRvIHNvbWUgb2YgdGhlIHRoaW5ncyBkb25lCisgKiBpbiAxNi1iaXQgbW9kZSBmb3IgdGhlICJyZWFsIiBvcGVyYXRpb25zLgorICovCisJY2FsbCBzZXR1cF9pZHQKKworLyoKKyAqIENvcHkgYm9vdHVwIHBhcmFtZXRlcnMgb3V0IG9mIHRoZSB3YXkuCisgKiBOb3RlOiAlZXNpIHN0aWxsIGhhcyB0aGUgcG9pbnRlciB0byB0aGUgcmVhbC1tb2RlIGRhdGEuCisgKi8KKwltb3ZsICRib290X3BhcmFtcywlZWRpCisJbW92bCAkKFBBUkFNX1NJWkUvNCksJWVjeAorCWNsZAorCXJlcAorCW1vdnNsCisJbW92bCBib290X3BhcmFtcytORVdfQ0xfUE9JTlRFUiwlZXNpCisJYW5kbCAlZXNpLCVlc2kKKwlqbnogMmYJCQkjIE5ldyBjb21tYW5kIGxpbmUgcHJvdG9jb2wKKwljbXB3ICQoT0xEX0NMX01BR0lDKSxPTERfQ0xfTUFHSUNfQUREUgorCWpuZSAxZgorCW1vdnp3bCBPTERfQ0xfT0ZGU0VULCVlc2kKKwlhZGRsICQoT0xEX0NMX0JBU0VfQUREUiksJWVzaQorMjoKKwltb3ZsICRzYXZlZF9jb21tYW5kX2xpbmUsJWVkaQorCW1vdmwgJChDT01NQU5EX0xJTkVfU0laRS80KSwlZWN4CisJcmVwCisJbW92c2wKKzE6CitjaGVja0NQVXR5cGU6CisKKwltb3ZsICQtMSxYODZfQ1BVSUQJCSMgIC0xIGZvciBubyBDUFVJRCBpbml0aWFsbHkKKworLyogY2hlY2sgaWYgaXQgaXMgNDg2IG9yIDM4Ni4gKi8KKy8qCisgKiBYWFggLSB0aGlzIGRvZXMgYSBsb3Qgb2YgdW5uZWNlc3Nhcnkgc2V0dXAuICBBbGlnbm1lbnQgY2hlY2tzIGRvbid0CisgKiBhcHBseSBhdCBvdXIgY3BsIG9mIDAgYW5kIHRoZSBzdGFjayBvdWdodCB0byBiZSBhbGlnbmVkIGFscmVhZHksIGFuZAorICogd2UgZG9uJ3QgbmVlZCB0byBwcmVzZXJ2ZSBlZmxhZ3MuCisgKi8KKworCW1vdmIgJDMsWDg2CQkjIGF0IGxlYXN0IDM4NgorCXB1c2hmbAkJCSMgcHVzaCBFRkxBR1MKKwlwb3BsICVlYXgJCSMgZ2V0IEVGTEFHUworCW1vdmwgJWVheCwlZWN4CQkjIHNhdmUgb3JpZ2luYWwgRUZMQUdTCisJeG9ybCAkMHgyNDAwMDAsJWVheAkjIGZsaXAgQUMgYW5kIElEIGJpdHMgaW4gRUZMQUdTCisJcHVzaGwgJWVheAkJIyBjb3B5IHRvIEVGTEFHUworCXBvcGZsCQkJIyBzZXQgRUZMQUdTCisJcHVzaGZsCQkJIyBnZXQgbmV3IEVGTEFHUworCXBvcGwgJWVheAkJIyBwdXQgaXQgaW4gZWF4CisJeG9ybCAlZWN4LCVlYXgJCSMgY2hhbmdlIGluIGZsYWdzCisJcHVzaGwgJWVjeAkJIyByZXN0b3JlIG9yaWdpbmFsIEVGTEFHUworCXBvcGZsCisJdGVzdGwgJDB4NDAwMDAsJWVheAkjIGNoZWNrIGlmIEFDIGJpdCBjaGFuZ2VkCisJamUgaXMzODYKKworCW1vdmIgJDQsWDg2CQkjIGF0IGxlYXN0IDQ4NgorCXRlc3RsICQweDIwMDAwMCwlZWF4CSMgY2hlY2sgaWYgSUQgYml0IGNoYW5nZWQKKwlqZSBpczQ4NgorCisJLyogZ2V0IHZlbmRvciBpbmZvICovCisJeG9ybCAlZWF4LCVlYXgJCQkjIGNhbGwgQ1BVSUQgd2l0aCAwIC0+IHJldHVybiB2ZW5kb3IgSUQKKwljcHVpZAorCW1vdmwgJWVheCxYODZfQ1BVSUQJCSMgc2F2ZSBDUFVJRCBsZXZlbAorCW1vdmwgJWVieCxYODZfVkVORE9SX0lECQkjIGxvIDQgY2hhcnMKKwltb3ZsICVlZHgsWDg2X1ZFTkRPUl9JRCs0CSMgbmV4dCA0IGNoYXJzCisJbW92bCAlZWN4LFg4Nl9WRU5ET1JfSUQrOAkjIGxhc3QgNCBjaGFycworCisJb3JsICVlYXgsJWVheAkJCSMgZG8gd2UgaGF2ZSBwcm9jZXNzb3IgaW5mbyBhcyB3ZWxsPworCWplIGlzNDg2CisKKwltb3ZsICQxLCVlYXgJCSMgVXNlIHRoZSBDUFVJRCBpbnN0cnVjdGlvbiB0byBnZXQgQ1BVIHR5cGUKKwljcHVpZAorCW1vdmIgJWFsLCVjbAkJIyBzYXZlIHJlZyBmb3IgZnV0dXJlIHVzZQorCWFuZGIgJDB4MGYsJWFoCQkjIG1hc2sgcHJvY2Vzc29yIGZhbWlseQorCW1vdmIgJWFoLFg4NgorCWFuZGIgJDB4ZjAsJWFsCQkjIG1hc2sgbW9kZWwKKwlzaHJiICQ0LCVhbAorCW1vdmIgJWFsLFg4Nl9NT0RFTAorCWFuZGIgJDB4MGYsJWNsCQkjIG1hc2sgbWFzayByZXZpc2lvbgorCW1vdmIgJWNsLFg4Nl9NQVNLCisJbW92bCAlZWR4LFg4Nl9DQVBBQklMSVRZCisKK2lzNDg2Ogltb3ZsICQweDUwMDIyLCVlY3gJIyBzZXQgQU0sIFdQLCBORSBhbmQgTVAKKwlqbXAgMmYKKworaXMzODY6CW1vdmwgJDIsJWVjeAkJIyBzZXQgTVAKKzI6CW1vdmwgJWNyMCwlZWF4CisJYW5kbCAkMHg4MDAwMDAxMSwlZWF4CSMgU2F2ZSBQRyxQRSxFVAorCW9ybCAlZWN4LCVlYXgKKwltb3ZsICVlYXgsJWNyMAorCisJY2FsbCBjaGVja194ODcKKwlpbmNiIHJlYWR5CisJbGdkdCBjcHVfZ2R0X2Rlc2NyCisJbGlkdCBpZHRfZGVzY3IKKwlsam1wICQoX19LRVJORUxfQ1MpLCQxZgorMToJbW92bCAkKF9fS0VSTkVMX0RTKSwlZWF4CSMgcmVsb2FkIGFsbCB0aGUgc2VnbWVudCByZWdpc3RlcnMKKwltb3ZsICVlYXgsJXNzCQkJIyBhZnRlciBjaGFuZ2luZyBnZHQuCisKKwltb3ZsICQoX19VU0VSX0RTKSwlZWF4CQkjIERTL0VTIGNvbnRhaW5zIGRlZmF1bHQgVVNFUiBzZWdtZW50CisJbW92bCAlZWF4LCVkcworCW1vdmwgJWVheCwlZXMKKworCXhvcmwgJWVheCwlZWF4CQkJIyBDbGVhciBGUy9HUyBhbmQgTERUCisJbW92bCAlZWF4LCVmcworCW1vdmwgJWVheCwlZ3MKKwlsbGR0ICVheAorCWNsZAkJCSMgZ2NjMiB3YW50cyB0aGUgZGlyZWN0aW9uIGZsYWcgY2xlYXJlZCBhdCBhbGwgdGltZXMKKyNpZmRlZiBDT05GSUdfU01QCisJbW92YiByZWFkeSwgJWNsCQorCWNtcGIgJDEsJWNsCisJamUgMWYJCQkjIHRoZSBmaXJzdCBDUFUgY2FsbHMgc3RhcnRfa2VybmVsCisJCQkJIyBhbGwgb3RoZXIgQ1BVcyBjYWxsIGluaXRpYWxpemVfc2Vjb25kYXJ5CisJY2FsbCBpbml0aWFsaXplX3NlY29uZGFyeQorCWptcCBMNgorMToKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisJY2FsbCBzdGFydF9rZXJuZWwKK0w2OgorCWptcCBMNgkJCSMgbWFpbiBzaG91bGQgbmV2ZXIgcmV0dXJuIGhlcmUsIGJ1dAorCQkJCSMganVzdCBpbiBjYXNlLCB3ZSBrbm93IHdoYXQgaGFwcGVucy4KKworLyoKKyAqIFdlIGRlcGVuZCBvbiBFVCB0byBiZSBjb3JyZWN0LiBUaGlzIGNoZWNrcyBmb3IgMjg3LzM4Ny4KKyAqLworY2hlY2tfeDg3OgorCW1vdmIgJDAsWDg2X0hBUkRfTUFUSAorCWNsdHMKKwlmbmluaXQKKwlmc3RzdyAlYXgKKwljbXBiICQwLCVhbAorCWplIDFmCisJbW92bCAlY3IwLCVlYXgJCS8qIG5vIGNvcHJvY2Vzc29yOiBoYXZlIHRvIHNldCBiaXRzICovCisJeG9ybCAkNCwlZWF4CQkvKiBzZXQgRU0gKi8KKwltb3ZsICVlYXgsJWNyMAorCXJldAorCUFMSUdOCisxOgltb3ZiICQxLFg4Nl9IQVJEX01BVEgKKwkuYnl0ZSAweERCLDB4RTQJCS8qIGZzZXRwbSBmb3IgMjg3LCBpZ25vcmVkIGJ5IDM4NyAqLworCXJldAorCisvKgorICogIHNldHVwX2lkdAorICoKKyAqICBzZXRzIHVwIGEgaWR0IHdpdGggMjU2IGVudHJpZXMgcG9pbnRpbmcgdG8KKyAqICBpZ25vcmVfaW50LCBpbnRlcnJ1cHQgZ2F0ZXMuIEl0IGRvZXNuJ3QgYWN0dWFsbHkgbG9hZAorICogIGlkdCAtIHRoYXQgY2FuIGJlIGRvbmUgb25seSBhZnRlciBwYWdpbmcgaGFzIGJlZW4gZW5hYmxlZAorICogIGFuZCB0aGUga2VybmVsIG1vdmVkIHRvIFBBR0VfT0ZGU0VULiBJbnRlcnJ1cHRzCisgKiAgYXJlIGVuYWJsZWQgZWxzZXdoZXJlLCB3aGVuIHdlIGNhbiBiZSByZWxhdGl2ZWx5CisgKiAgc3VyZSBldmVyeXRoaW5nIGlzIG9rLgorICoKKyAqICBXYXJuaW5nOiAlZXNpIGlzIGxpdmUgYWNyb3NzIHRoaXMgZnVuY3Rpb24uCisgKi8KK3NldHVwX2lkdDoKKwlsZWEgaWdub3JlX2ludCwlZWR4CisJbW92bCAkKF9fS0VSTkVMX0NTIDw8IDE2KSwlZWF4CisJbW92dyAlZHgsJWF4CQkvKiBzZWxlY3RvciA9IDB4MDAxMCA9IGNzICovCisJbW92dyAkMHg4RTAwLCVkeAkvKiBpbnRlcnJ1cHQgZ2F0ZSAtIGRwbD0wLCBwcmVzZW50ICovCisKKwlsZWEgaWR0X3RhYmxlLCVlZGkKKwltb3YgJDI1NiwlZWN4CitycF9zaWR0OgorCW1vdmwgJWVheCwoJWVkaSkKKwltb3ZsICVlZHgsNCglZWRpKQorCWFkZGwgJDgsJWVkaQorCWRlYyAlZWN4CisJam5lIHJwX3NpZHQKKwlyZXQKKworLyogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgImhhbmRsZXIiIDotKSAqLworCUFMSUdOCitpZ25vcmVfaW50OgorCWNsZAorCXB1c2hsICVlYXgKKwlwdXNobCAlZWN4CisJcHVzaGwgJWVkeAorCXB1c2hsICVlcworCXB1c2hsICVkcworCW1vdmwgJChfX0tFUk5FTF9EUyksJWVheAorCW1vdmwgJWVheCwlZHMKKwltb3ZsICVlYXgsJWVzCisJcHVzaGwgMTYoJWVzcCkKKwlwdXNobCAyNCglZXNwKQorCXB1c2hsIDMyKCVlc3ApCisJcHVzaGwgNDAoJWVzcCkKKwlwdXNobCAkaW50X21zZworCWNhbGwgcHJpbnRrCisJYWRkbCAkKDUqNCksJWVzcAorCXBvcGwgJWRzCisJcG9wbCAlZXMKKwlwb3BsICVlZHgKKwlwb3BsICVlY3gKKwlwb3BsICVlYXgKKwlpcmV0CisKKy8qCisgKiBSZWFsIGJlZ2lubmluZyBvZiBub3JtYWwgInRleHQiIHNlZ21lbnQKKyAqLworRU5UUlkoc3RleHQpCitFTlRSWShfc3RleHQpCisKKy8qCisgKiBCU1Mgc2VjdGlvbgorICovCisuc2VjdGlvbiAiLmJzcy5wYWdlX2FsaWduZWQiLCJ3IgorRU5UUlkoc3dhcHBlcl9wZ19kaXIpCisJLmZpbGwgMTAyNCw0LDAKK0VOVFJZKGVtcHR5X3plcm9fcGFnZSkKKwkuZmlsbCA0MDk2LDEsMAorCisvKgorICogVGhpcyBzdGFydHMgdGhlIGRhdGEgc2VjdGlvbi4KKyAqLworLmRhdGEKKworRU5UUlkoc3RhY2tfc3RhcnQpCisJLmxvbmcgaW5pdF90aHJlYWRfdW5pb24rVEhSRUFEX1NJWkUKKwkubG9uZyBfX0JPT1RfRFMKKworcmVhZHk6CS5ieXRlIDAKKworaW50X21zZzoKKwkuYXNjaXogIlVua25vd24gaW50ZXJydXB0IG9yIGZhdWx0IGF0IEVJUCAlcCAlcCAlcFxuIgorCisvKgorICogVGhlIElEVCBhbmQgR0RUICdkZXNjcmlwdG9ycycgYXJlIGEgc3RyYW5nZSA0OC1iaXQgb2JqZWN0CisgKiBvbmx5IHVzZWQgYnkgdGhlIGxpZHQgYW5kIGxnZHQgaW5zdHJ1Y3Rpb25zLiBUaGV5IGFyZSBub3QKKyAqIGxpa2UgdXN1YWwgc2VnbWVudCBkZXNjcmlwdG9ycyAtIHRoZXkgY29uc2lzdCBvZiBhIDE2LWJpdAorICogc2VnbWVudCBzaXplLCBhbmQgMzItYml0IGxpbmVhciBhZGRyZXNzIHZhbHVlOgorICovCisKKy5nbG9ibCBib290X2dkdF9kZXNjcgorLmdsb2JsIGlkdF9kZXNjcgorLmdsb2JsIGNwdV9nZHRfZGVzY3IKKworCUFMSUdOCisjIGVhcmx5IGJvb3QgR0RUIGRlc2NyaXB0b3IgKG11c3QgdXNlIDE6MSBhZGRyZXNzIG1hcHBpbmcpCisJLndvcmQgMAkJCQkjIDMyIGJpdCBhbGlnbiBnZHRfZGVzYy5hZGRyZXNzCitib290X2dkdF9kZXNjcjoKKwkud29yZCBfX0JPT1RfRFMrNworCS5sb25nIGJvb3RfZ2R0X3RhYmxlIC0gX19QQUdFX09GRlNFVAorCisJLndvcmQgMAkJCQkjIDMyLWJpdCBhbGlnbiBpZHRfZGVzYy5hZGRyZXNzCitpZHRfZGVzY3I6CisJLndvcmQgSURUX0VOVFJJRVMqOC0xCQkjIGlkdCBjb250YWlucyAyNTYgZW50cmllcworCS5sb25nIGlkdF90YWJsZQorCisjIGJvb3QgR0RUIGRlc2NyaXB0b3IgKGxhdGVyIG9uIHVzZWQgYnkgQ1BVIzApOgorCS53b3JkIDAJCQkJIyAzMiBiaXQgYWxpZ24gZ2R0X2Rlc2MuYWRkcmVzcworY3B1X2dkdF9kZXNjcjoKKwkud29yZCBHRFRfRU5UUklFUyo4LTEKKwkubG9uZyBjcHVfZ2R0X3RhYmxlCisKKwkuZmlsbCBOUl9DUFVTLTEsOCwwCQkjIHNwYWNlIGZvciB0aGUgb3RoZXIgR0RUIGRlc2NyaXB0b3JzCisKKy8qCisgKiBUaGUgYm9vdF9nZHRfdGFibGUgbXVzdCBtaXJyb3IgdGhlIGVxdWl2YWxlbnQgaW4gc2V0dXAuUyBhbmQgaXMKKyAqIHVzZWQgb25seSBmb3IgYm9vdGluZy4KKyAqLworCS5hbGlnbiBMMV9DQUNIRV9CWVRFUworRU5UUlkoYm9vdF9nZHRfdGFibGUpCisJLmZpbGwgR0RUX0VOVFJZX0JPT1RfQ1MsOCwwCisJLnF1YWQgMHgwMGNmOWEwMDAwMDBmZmZmCS8qIGtlcm5lbCA0R0IgY29kZSBhdCAweDAwMDAwMDAwICovCisJLnF1YWQgMHgwMGNmOTIwMDAwMDBmZmZmCS8qIGtlcm5lbCA0R0IgZGF0YSBhdCAweDAwMDAwMDAwICovCisKKy8qCisgKiBUaGUgR2xvYmFsIERlc2NyaXB0b3IgVGFibGUgY29udGFpbnMgMjggcXVhZHdvcmRzLCBwZXItQ1BVLgorICovCisJLmFsaWduIFBBR0VfU0laRV9hc20KK0VOVFJZKGNwdV9nZHRfdGFibGUpCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIE5VTEwgZGVzY3JpcHRvciAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDBiIHJlc2VydmVkICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4MTMgcmVzZXJ2ZWQgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHgxYiByZXNlcnZlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDIwIHVudXNlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDI4IHVudXNlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDMzIFRMUyBlbnRyeSAxICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4M2IgVExTIGVudHJ5IDIgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHg0MyBUTFMgZW50cnkgMyAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweDRiIHJlc2VydmVkICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4NTMgcmVzZXJ2ZWQgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHg1YiByZXNlcnZlZCAqLworCisJLnF1YWQgMHgwMGNmOWEwMDAwMDBmZmZmCS8qIDB4NjAga2VybmVsIDRHQiBjb2RlIGF0IDB4MDAwMDAwMDAgKi8KKwkucXVhZCAweDAwY2Y5MjAwMDAwMGZmZmYJLyogMHg2OCBrZXJuZWwgNEdCIGRhdGEgYXQgMHgwMDAwMDAwMCAqLworCS5xdWFkIDB4MDBjZmZhMDAwMDAwZmZmZgkvKiAweDczIHVzZXIgNEdCIGNvZGUgYXQgMHgwMDAwMDAwMCAqLworCS5xdWFkIDB4MDBjZmYyMDAwMDAwZmZmZgkvKiAweDdiIHVzZXIgNEdCIGRhdGEgYXQgMHgwMDAwMDAwMCAqLworCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4ODAgVFNTIGRlc2NyaXB0b3IgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHg4OCBMRFQgZGVzY3JpcHRvciAqLworCisJLyogU2VnbWVudHMgdXNlZCBmb3IgY2FsbGluZyBQblAgQklPUyAqLworCS5xdWFkIDB4MDBjMDlhMDAwMDAwMDAwMAkvKiAweDkwIDMyLWJpdCBjb2RlICovCisJLnF1YWQgMHgwMDgwOWEwMDAwMDAwMDAwCS8qIDB4OTggMTYtYml0IGNvZGUgKi8KKwkucXVhZCAweDAwODA5MjAwMDAwMDAwMDAJLyogMHhhMCAxNi1iaXQgZGF0YSAqLworCS5xdWFkIDB4MDA4MDkyMDAwMDAwMDAwMAkvKiAweGE4IDE2LWJpdCBkYXRhICovCisJLnF1YWQgMHgwMDgwOTIwMDAwMDAwMDAwCS8qIDB4YjAgMTYtYml0IGRhdGEgKi8KKwkvKgorCSAqIFRoZSBBUE0gc2VnbWVudHMgaGF2ZSBieXRlIGdyYW51bGFyaXR5IGFuZCB0aGVpciBiYXNlcworCSAqIGFuZCBsaW1pdHMgYXJlIHNldCBhdCBydW4gdGltZS4KKwkgKi8KKwkucXVhZCAweDAwNDA5YTAwMDAwMDAwMDAJLyogMHhiOCBBUE0gQ1MgICAgY29kZSAqLworCS5xdWFkIDB4MDAwMDlhMDAwMDAwMDAwMAkvKiAweGMwIEFQTSBDUyAxNiBjb2RlICgxNiBiaXQpICovCisJLnF1YWQgMHgwMDQwOTIwMDAwMDAwMDAwCS8qIDB4YzggQVBNIERTICAgIGRhdGEgKi8KKworCS5xdWFkIDB4MDAwMDkyMDAwMDAwMDAwMAkvKiAweGQwIC0gRVNQRklYIDE2LWJpdCBTUyAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweGQ4IC0gdW51c2VkICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4ZTAgLSB1bnVzZWQgKi8KKwkucXVhZCAweDAwMDAwMDAwMDAwMDAwMDAJLyogMHhlOCAtIHVudXNlZCAqLworCS5xdWFkIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiAweGYwIC0gdW51c2VkICovCisJLnF1YWQgMHgwMDAwMDAwMDAwMDAwMDAwCS8qIDB4ZjggLSBHRFQgZW50cnkgMzE6IGRvdWJsZS1mYXVsdCBUU1MgKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pMzg2X2tzeW1zLmMgYi9hcmNoL2kzODYva2VybmVsL2kzODZfa3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGVjMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pMzg2X2tzeW1zLmMKQEAgLTAsMCArMSwxOTUgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FwbV9iaW9zLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbW14Lmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KKyNpbmNsdWRlIDxhc20vaXN0Lmg+CisjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgorCitleHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKK2V4dGVybiBzcGlubG9ja190IHJ0Y19sb2NrOworCisvKiBUaGlzIGlzIGRlZmluaXRlbHkgYSBHUEwtb25seSBzeW1ib2wgKi8KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9nZHRfdGFibGUpOworCisjaWYgZGVmaW5lZChDT05GSUdfQVBNX01PRFVMRSkKK2V4dGVybiB2b2lkIG1hY2hpbmVfcmVhbF9yZXN0YXJ0KHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK0VYUE9SVF9TWU1CT0wobWFjaGluZV9yZWFsX3Jlc3RhcnQpOworZXh0ZXJuIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOworRVhQT1JUX1NZTUJPTChkZWZhdWx0X2lkbGUpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU01QCitleHRlcm4gdm9pZCBGQVNUQ0FMTCggX193cml0ZV9sb2NrX2ZhaWxlZChyd2xvY2tfdCAqcncpKTsKK2V4dGVybiB2b2lkIEZBU1RDQUxMKCBfX3JlYWRfbG9ja19mYWlsZWQocndsb2NrX3QgKnJ3KSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSURFKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0hEKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lERV9NT0RVTEUpIHx8IGRlZmluZWQoQ09ORklHX0JMS19ERVZfSERfTU9EVUxFKQorZXh0ZXJuIHN0cnVjdCBkcml2ZV9pbmZvX3N0cnVjdCBkcml2ZV9pbmZvOworRVhQT1JUX1NZTUJPTChkcml2ZV9pbmZvKTsKKyNlbmRpZgorCitleHRlcm4gdW5zaWduZWQgbG9uZyBjcHVfa2h6OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X2Ntb3NfdGltZSh2b2lkKTsKKworLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KK0VYUE9SVF9TWU1CT0woYm9vdF9jcHVfZGF0YSk7CisjaWZkZWYgQ09ORklHX0RJU0NPTlRJR01FTQorRVhQT1JUX1NZTUJPTChub2RlX2RhdGEpOworRVhQT1JUX1NZTUJPTChwaHlzbm9kZV9tYXApOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1g4Nl9OVU1BUQorRVhQT1JUX1NZTUJPTCh4cXVhZF9wb3J0aW8pOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGR1bXBfdGhyZWFkKTsKK0VYUE9SVF9TWU1CT0woZHVtcF9mcHUpOworRVhQT1JUX1NZTUJPTF9HUEwoa2VybmVsX2ZwdV9iZWdpbik7CitFWFBPUlRfU1lNQk9MKF9faW9yZW1hcCk7CitFWFBPUlRfU1lNQk9MKGlvcmVtYXBfbm9jYWNoZSk7CitFWFBPUlRfU1lNQk9MKGlvdW5tYXApOworRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKK0VYUE9SVF9TWU1CT0wocG1faWRsZSk7CitFWFBPUlRfU1lNQk9MKHBtX3Bvd2VyX29mZik7CitFWFBPUlRfU1lNQk9MKGdldF9jbW9zX3RpbWUpOworRVhQT1JUX1NZTUJPTChjcHVfa2h6KTsKK0VYUE9SVF9TWU1CT0woYXBtX2luZm8pOworCitFWFBPUlRfU1lNQk9MKF9fZG93bl9mYWlsZWQpOworRVhQT1JUX1NZTUJPTChfX2Rvd25fZmFpbGVkX2ludGVycnVwdGlibGUpOworRVhQT1JUX1NZTUJPTChfX2Rvd25fZmFpbGVkX3RyeWxvY2spOworRVhQT1JUX1NZTUJPTChfX3VwX3dha2V1cCk7CisvKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyk7CisvKiBEZWxheSBsb29wcyAqLworRVhQT1JUX1NZTUJPTChfX25kZWxheSk7CitFWFBPUlRfU1lNQk9MKF9fdWRlbGF5KTsKK0VYUE9SVF9TWU1CT0woX19kZWxheSk7CitFWFBPUlRfU1lNQk9MKF9fY29uc3RfdWRlbGF5KTsKKworRVhQT1JUX1NZTUJPTChfX2dldF91c2VyXzEpOworRVhQT1JUX1NZTUJPTChfX2dldF91c2VyXzIpOworRVhQT1JUX1NZTUJPTChfX2dldF91c2VyXzQpOworCitFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfMSk7CitFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfMik7CitFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfNCk7CitFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfOCk7CisKK0VYUE9SVF9TWU1CT0woc3RycGJyayk7CitFWFBPUlRfU1lNQk9MKHN0cnN0cik7CisKK0VYUE9SVF9TWU1CT0woc3RybmNweV9mcm9tX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX3N0cm5jcHlfZnJvbV91c2VyKTsKK0VYUE9SVF9TWU1CT0woY2xlYXJfdXNlcik7CitFWFBPUlRfU1lNQk9MKF9fY2xlYXJfdXNlcik7CitFWFBPUlRfU1lNQk9MKF9fY29weV9mcm9tX3VzZXJfbGwpOworRVhQT1JUX1NZTUJPTChfX2NvcHlfdG9fdXNlcl9sbCk7CitFWFBPUlRfU1lNQk9MKHN0cm5sZW5fdXNlcik7CisKK0VYUE9SVF9TWU1CT0woZG1hX2FsbG9jX2NvaGVyZW50KTsKK0VYUE9SVF9TWU1CT0woZG1hX2ZyZWVfY29oZXJlbnQpOworCisjaWZkZWYgQ09ORklHX1BDSQorRVhQT1JUX1NZTUJPTChwY2lfbWVtX3N0YXJ0KTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSV9CSU9TCitFWFBPUlRfU1lNQk9MKHBjaWJpb3Nfc2V0X2lycV9yb3V0aW5nKTsKK0VYUE9SVF9TWU1CT0wocGNpYmlvc19nZXRfaXJxX3JvdXRpbmdfdGFibGUpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X1VTRV8zRE5PVworRVhQT1JUX1NZTUJPTChfbW14X21lbWNweSk7CitFWFBPUlRfU1lNQk9MKG1teF9jbGVhcl9wYWdlKTsKK0VYUE9SVF9TWU1CT0wobW14X2NvcHlfcGFnZSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfSFQKK0VYUE9SVF9TWU1CT0woc21wX251bV9zaWJsaW5ncyk7CitFWFBPUlRfU1lNQk9MKGNwdV9zaWJsaW5nX21hcCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TTVAKK0VYUE9SVF9TWU1CT0woY3B1X2RhdGEpOworRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwdV9jYWxsb3V0X21hcCk7CitFWFBPUlRfU1lNQk9MKF9fd3JpdGVfbG9ja19mYWlsZWQpOworRVhQT1JUX1NZTUJPTChfX3JlYWRfbG9ja19mYWlsZWQpOworCisvKiBHbG9iYWwgU01QIHN0dWZmICovCitFWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uKTsKKworLyogVExCIGZsdXNoaW5nICovCitFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9wYWdlKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCitFWFBPUlRfU1lNQk9MKElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01DQQorRVhQT1JUX1NZTUJPTChtYWNoaW5lX2lkKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1ZUCitFWFBPUlRfU1lNQk9MKHNjcmVlbl9pbmZvKTsKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKGdldF93Y2hhbik7CisKK0VYUE9SVF9TWU1CT0wocnRjX2xvY2spOworCitFWFBPUlRfU1lNQk9MX0dQTChzZXRfbm1pX2NhbGxiYWNrKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVuc2V0X25taV9jYWxsYmFjayk7CisKKyN1bmRlZiBtZW1jbXAKK2V4dGVybiBpbnQgbWVtY21wKGNvbnN0IHZvaWQgKixjb25zdCB2b2lkICosX19rZXJuZWxfc2l6ZV90KTsKK0VYUE9SVF9TWU1CT0wobWVtY21wKTsKKworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9kaWVfbm90aWZpZXIpOworI2lmZGVmIENPTkZJR19IQVZFX0RFQ19MT0NLCitFWFBPUlRfU1lNQk9MKF9hdG9taWNfZGVjX2FuZF9sb2NrKTsKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKF9fUEFHRV9LRVJORUwpOworCisjaWZkZWYgQ09ORklHX0hJR0hNRU0KK0VYUE9SVF9TWU1CT0woa21hcCk7CitFWFBPUlRfU1lNQk9MKGt1bm1hcCk7CitFWFBPUlRfU1lNQk9MKGttYXBfYXRvbWljKTsKK0VYUE9SVF9TWU1CT0woa3VubWFwX2F0b21pYyk7CitFWFBPUlRfU1lNQk9MKGttYXBfYXRvbWljX3RvX3BhZ2UpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfU1BFRURTVEVQX1NNSSkgfHwgZGVmaW5lZChDT05GSUdfWDg2X1NQRUVEU1RFUF9TTUlfTU9EVUxFKQorRVhQT1JUX1NZTUJPTChpc3RfaW5mbyk7CisjZW5kaWYKKworRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pMzg3LmMgYi9hcmNoL2kzODYva2VybmVsL2kzODcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTVlMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pMzg3LmMKQEAgLTAsMCArMSw1NTUgQEAKKy8qCisgKiAgbGludXgvYXJjaC9pMzg2L2tlcm5lbC9pMzg3LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0IExpbnVzIFRvcnZhbGRzCisgKgorICogIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0CisgKiAgR2VuZXJhbCBGUFUgc3RhdGUgaGFuZGxpbmcgY2xlYW51cHMKKyAqCUdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4sIE1heSAyMDAwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CisjaW5jbHVkZSA8YXNtL21hdGhfZW11Lmg+CisjaW5jbHVkZSA8YXNtL3NpZ2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vdXNlci5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgQ09ORklHX01BVEhfRU1VTEFUSU9OCisjZGVmaW5lIEhBVkVfSFdGUCAoYm9vdF9jcHVfZGF0YS5oYXJkX21hdGgpCisjZWxzZQorI2RlZmluZSBIQVZFX0hXRlAgMQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG14Y3NyX2ZlYXR1cmVfbWFzayA9IDB4ZmZmZmZmZmY7CisKK3ZvaWQgbXhjc3JfZmVhdHVyZV9tYXNrX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSAwOworCWNsdHMoKTsKKwlpZiAoY3B1X2hhc19meHNyKSB7CisJCW1lbXNldCgmY3VycmVudC0+dGhyZWFkLmkzODcuZnhzYXZlLCAwLCBzaXplb2Yoc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCkpOworCQlhc20gdm9sYXRpbGUoImZ4c2F2ZSAlMCIgOiA6ICJtIiAoY3VycmVudC0+dGhyZWFkLmkzODcuZnhzYXZlKSk7IAorCQltYXNrID0gY3VycmVudC0+dGhyZWFkLmkzODcuZnhzYXZlLm14Y3NyX21hc2s7CisJCWlmIChtYXNrID09IDApIG1hc2sgPSAweDAwMDBmZmJmOworCX0gCisJbXhjc3JfZmVhdHVyZV9tYXNrICY9IG1hc2s7CisJc3R0cygpOworfQorCisvKgorICogVGhlIF9jdXJyZW50XyB0YXNrIGlzIHVzaW5nIHRoZSBGUFUgZm9yIHRoZSBmaXJzdCB0aW1lCisgKiBzbyBpbml0aWFsaXplIGl0IGFuZCBzZXQgdGhlIG14Y3NyIHRvIGl0cyBkZWZhdWx0CisgKiB2YWx1ZSBhdCByZXNldCBpZiB3ZSBzdXBwb3J0IFhNTSBpbnN0cnVjdGlvbnMgYW5kIHRoZW4KKyAqIHJlbWViZXIgdGhlIGN1cnJlbnQgdGFzayBoYXMgdXNlZCB0aGUgRlBVLgorICovCit2b2lkIGluaXRfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCWlmIChjcHVfaGFzX2Z4c3IpIHsKKwkJbWVtc2V0KCZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QpKTsKKwkJdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUuY3dkID0gMHgzN2Y7CisJCWlmIChjcHVfaGFzX3htbSkKKwkJCXRzay0+dGhyZWFkLmkzODcuZnhzYXZlLm14Y3NyID0gMHgxZjgwOworCX0gZWxzZSB7CisJCW1lbXNldCgmdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpMzg3X2ZzYXZlX3N0cnVjdCkpOworCQl0c2stPnRocmVhZC5pMzg3LmZzYXZlLmN3ZCA9IDB4ZmZmZjAzN2Z1OworCQl0c2stPnRocmVhZC5pMzg3LmZzYXZlLnN3ZCA9IDB4ZmZmZjAwMDB1OworCQl0c2stPnRocmVhZC5pMzg3LmZzYXZlLnR3ZCA9IDB4ZmZmZmZmZmZ1OworCQl0c2stPnRocmVhZC5pMzg3LmZzYXZlLmZvcyA9IDB4ZmZmZjAwMDB1OworCX0KKwkvKiBvbmx5IHRoZSBkZXZpY2Ugbm90IGF2YWlsYWJsZSBleGNlcHRpb24gb3IgcHRyYWNlIGNhbiBjYWxsIGluaXRfZnB1ICovCisJc2V0X3N0b3BwZWRfY2hpbGRfdXNlZF9tYXRoKHRzayk7Cit9CisKKy8qCisgKiBGUFUgbGF6eSBzdGF0ZSBzYXZlIGhhbmRsaW5nLgorICovCisKK3ZvaWQga2VybmVsX2ZwdV9iZWdpbih2b2lkKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKHRocmVhZC0+c3RhdHVzICYgVFNfVVNFREZQVSkgeworCQlfX3NhdmVfaW5pdF9mcHUodGhyZWFkLT50YXNrKTsKKwkJcmV0dXJuOworCX0KKwljbHRzKCk7Cit9CisKK3ZvaWQgcmVzdG9yZV9mcHUoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKK3sKKwlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJYXNtIHZvbGF0aWxlKCAiZnhyc3RvciAlMCIKKwkJCSAgICAgIDogOiAibSIgKHRzay0+dGhyZWFkLmkzODcuZnhzYXZlKSApOworCX0gZWxzZSB7CisJCWFzbSB2b2xhdGlsZSggImZyc3RvciAlMCIKKwkJCSAgICAgIDogOiAibSIgKHRzay0+dGhyZWFkLmkzODcuZnNhdmUpICk7CisJfQorfQorCisvKgorICogRlBVIHRhZyB3b3JkIGNvbnZlcnNpb25zLgorICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgdHdkX2kzODdfdG9fZnhzciggdW5zaWduZWQgc2hvcnQgdHdkICkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOyAvKiB0byBhdm9pZCAxNiBiaXQgcHJlZml4ZXMgaW4gdGhlIGNvZGUgKi8KKyAKKwkvKiBUcmFuc2Zvcm0gZWFjaCBwYWlyIG9mIGJpdHMgaW50byAwMSAodmFsaWQpIG9yIDAwIChlbXB0eSkgKi8KKyAgICAgICAgdG1wID0gfnR3ZDsKKyAgICAgICAgdG1wID0gKHRtcCB8ICh0bXA+PjEpKSAmIDB4NTU1NTsgLyogMFYwVjBWMFYwVjBWMFYwViAqLworICAgICAgICAvKiBhbmQgbW92ZSB0aGUgdmFsaWQgYml0cyB0byB0aGUgbG93ZXIgYnl0ZS4gKi8KKyAgICAgICAgdG1wID0gKHRtcCB8ICh0bXAgPj4gMSkpICYgMHgzMzMzOyAvKiAwMFZWMDBWVjAwVlYwMFZWICovCisgICAgICAgIHRtcCA9ICh0bXAgfCAodG1wID4+IDIpKSAmIDB4MGYwZjsgLyogMDAwMFZWVlYwMDAwVlZWViAqLworICAgICAgICB0bXAgPSAodG1wIHwgKHRtcCA+PiA0KSkgJiAweDAwZmY7IC8qIDAwMDAwMDAwVlZWVlZWVlYgKi8KKyAgICAgICAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHR3ZF9meHNyX3RvX2kzODcoIHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgKmZ4c2F2ZSApCit7CisJc3RydWN0IF9mcHhyZWcgKnN0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHRvcyA9IChmeHNhdmUtPnN3ZCA+PiAxMSkgJiA3OworCXVuc2lnbmVkIGxvbmcgdHdkID0gKHVuc2lnbmVkIGxvbmcpIGZ4c2F2ZS0+dHdkOworCXVuc2lnbmVkIGxvbmcgdGFnOworCXVuc2lnbmVkIGxvbmcgcmV0ID0gMHhmZmZmMDAwMHU7CisJaW50IGk7CisKKyNkZWZpbmUgRlBSRUdfQUREUihmLCBuKQkoKHZvaWQgKikmKGYpLT5zdF9zcGFjZSArIChuKSAqIDE2KTsKKworCWZvciAoIGkgPSAwIDsgaSA8IDggOyBpKysgKSB7CisJCWlmICggdHdkICYgMHgxICkgeworCQkJc3QgPSBGUFJFR19BRERSKCBmeHNhdmUsIChpIC0gdG9zKSAmIDcgKTsKKworCQkJc3dpdGNoICggc3QtPmV4cG9uZW50ICYgMHg3ZmZmICkgeworCQkJY2FzZSAweDdmZmY6CisJCQkJdGFnID0gMjsJCS8qIFNwZWNpYWwgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMDAwOgorCQkJCWlmICggIXN0LT5zaWduaWZpY2FuZFswXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFsxXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFsyXSAmJgorCQkJCSAgICAgIXN0LT5zaWduaWZpY2FuZFszXSApIHsKKwkJCQkJdGFnID0gMTsJLyogWmVybyAqLworCQkJCX0gZWxzZSB7CisJCQkJCXRhZyA9IDI7CS8qIFNwZWNpYWwgKi8KKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWlmICggc3QtPnNpZ25pZmljYW5kWzNdICYgMHg4MDAwICkgeworCQkJCQl0YWcgPSAwOwkvKiBWYWxpZCAqLworCQkJCX0gZWxzZSB7CisJCQkJCXRhZyA9IDI7CS8qIFNwZWNpYWwgKi8KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0YWcgPSAzOwkJCS8qIEVtcHR5ICovCisJCX0KKwkJcmV0IHw9ICh0YWcgPDwgKDIgKiBpKSk7CisJCXR3ZCA9IHR3ZCA+PiAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRlBVIHN0YXRlIGludGVyYWN0aW9uLgorICovCisKK3Vuc2lnbmVkIHNob3J0IGdldF9mcHVfY3dkKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayApCit7CisJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCXJldHVybiB0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS5jd2Q7CisJfSBlbHNlIHsKKwkJcmV0dXJuICh1bnNpZ25lZCBzaG9ydCl0c2stPnRocmVhZC5pMzg3LmZzYXZlLmN3ZDsKKwl9Cit9CisKK3Vuc2lnbmVkIHNob3J0IGdldF9mcHVfc3dkKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayApCit7CisJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCXJldHVybiB0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS5zd2Q7CisJfSBlbHNlIHsKKwkJcmV0dXJuICh1bnNpZ25lZCBzaG9ydCl0c2stPnRocmVhZC5pMzg3LmZzYXZlLnN3ZDsKKwl9Cit9CisKKyNpZiAwCit1bnNpZ25lZCBzaG9ydCBnZXRfZnB1X3R3ZCggc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQoreworCWlmICggY3B1X2hhc19meHNyICkgeworCQlyZXR1cm4gdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUudHdkOworCX0gZWxzZSB7CisJCXJldHVybiAodW5zaWduZWQgc2hvcnQpdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS50d2Q7CisJfQorfQorI2VuZGlmICAvKiAgMCAgKi8KKwordW5zaWduZWQgc2hvcnQgZ2V0X2ZwdV9teGNzciggc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQoreworCWlmICggY3B1X2hhc194bW0gKSB7CisJCXJldHVybiB0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS5teGNzcjsKKwl9IGVsc2UgeworCQlyZXR1cm4gMHgxZjgwOworCX0KK30KKworI2lmIDAKKwordm9pZCBzZXRfZnB1X2N3ZCggc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIHNob3J0IGN3ZCApCit7CisJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCXRzay0+dGhyZWFkLmkzODcuZnhzYXZlLmN3ZCA9IGN3ZDsKKwl9IGVsc2UgeworCQl0c2stPnRocmVhZC5pMzg3LmZzYXZlLmN3ZCA9ICgobG9uZyljd2QgfCAweGZmZmYwMDAwdSk7CisJfQorfQorCit2b2lkIHNldF9mcHVfc3dkKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgc2hvcnQgc3dkICkKK3sKKwlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUuc3dkID0gc3dkOworCX0gZWxzZSB7CisJCXRzay0+dGhyZWFkLmkzODcuZnNhdmUuc3dkID0gKChsb25nKXN3ZCB8IDB4ZmZmZjAwMDB1KTsKKwl9Cit9CisKK3ZvaWQgc2V0X2ZwdV90d2QoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBzaG9ydCB0d2QgKQoreworCWlmICggY3B1X2hhc19meHNyICkgeworCQl0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS50d2QgPSB0d2RfaTM4N190b19meHNyKHR3ZCk7CisJfSBlbHNlIHsKKwkJdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZS50d2QgPSAoKGxvbmcpdHdkIHwgMHhmZmZmMDAwMHUpOworCX0KK30KKworI2VuZGlmICAvKiAgMCAgKi8KKworLyoKKyAqIEZYU1IgZmxvYXRpbmcgcG9pbnQgZW52aXJvbm1lbnQgY29udmVyc2lvbnMuCisgKi8KKworc3RhdGljIGludCBjb252ZXJ0X2Z4c3JfdG9fdXNlciggc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmLAorCQkJCQlzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0ICpmeHNhdmUgKQoreworCXVuc2lnbmVkIGxvbmcgZW52WzddOworCXN0cnVjdCBfZnByZWcgX191c2VyICp0bzsKKwlzdHJ1Y3QgX2ZweHJlZyAqZnJvbTsKKwlpbnQgaTsKKworCWVudlswXSA9ICh1bnNpZ25lZCBsb25nKWZ4c2F2ZS0+Y3dkIHwgMHhmZmZmMDAwMHVsOworCWVudlsxXSA9ICh1bnNpZ25lZCBsb25nKWZ4c2F2ZS0+c3dkIHwgMHhmZmZmMDAwMHVsOworCWVudlsyXSA9IHR3ZF9meHNyX3RvX2kzODcoZnhzYXZlKTsKKwllbnZbM10gPSBmeHNhdmUtPmZpcDsKKwllbnZbNF0gPSBmeHNhdmUtPmZjcyB8ICgodW5zaWduZWQgbG9uZylmeHNhdmUtPmZvcCA8PCAxNik7CisJZW52WzVdID0gZnhzYXZlLT5mb287CisJZW52WzZdID0gZnhzYXZlLT5mb3M7CisKKwlpZiAoIF9fY29weV90b191c2VyKCBidWYsIGVudiwgNyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSApICkKKwkJcmV0dXJuIDE7CisKKwl0byA9ICZidWYtPl9zdFswXTsKKwlmcm9tID0gKHN0cnVjdCBfZnB4cmVnICopICZmeHNhdmUtPnN0X3NwYWNlWzBdOworCWZvciAoIGkgPSAwIDsgaSA8IDggOyBpKyssIHRvKyssIGZyb20rKyApIHsKKwkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnQgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKil0bzsKKwkJdW5zaWduZWQgbG9uZyAqZiA9ICh1bnNpZ25lZCBsb25nICopZnJvbTsKKworCQlpZiAoX19wdXRfdXNlcigqZiwgdCkgfHwKKwkJCQlfX3B1dF91c2VyKCooZiArIDEpLCB0ICsgMSkgfHwKKwkJCQlfX3B1dF91c2VyKGZyb20tPmV4cG9uZW50LCAmdG8tPmV4cG9uZW50KSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb252ZXJ0X2Z4c3JfZnJvbV91c2VyKCBzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0ICpmeHNhdmUsCisJCQkJCSAgc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmICkKK3sKKwl1bnNpZ25lZCBsb25nIGVudls3XTsKKwlzdHJ1Y3QgX2ZweHJlZyAqdG87CisJc3RydWN0IF9mcHJlZyBfX3VzZXIgKmZyb207CisJaW50IGk7CisKKwlpZiAoIF9fY29weV9mcm9tX3VzZXIoIGVudiwgYnVmLCA3ICogc2l6ZW9mKGxvbmcpICkgKQorCQlyZXR1cm4gMTsKKworCWZ4c2F2ZS0+Y3dkID0gKHVuc2lnbmVkIHNob3J0KShlbnZbMF0gJiAweGZmZmYpOworCWZ4c2F2ZS0+c3dkID0gKHVuc2lnbmVkIHNob3J0KShlbnZbMV0gJiAweGZmZmYpOworCWZ4c2F2ZS0+dHdkID0gdHdkX2kzODdfdG9fZnhzcigodW5zaWduZWQgc2hvcnQpKGVudlsyXSAmIDB4ZmZmZikpOworCWZ4c2F2ZS0+ZmlwID0gZW52WzNdOworCWZ4c2F2ZS0+Zm9wID0gKHVuc2lnbmVkIHNob3J0KSgoZW52WzRdICYgMHhmZmZmMDAwMHVsKSA+PiAxNik7CisJZnhzYXZlLT5mY3MgPSAoZW52WzRdICYgMHhmZmZmKTsKKwlmeHNhdmUtPmZvbyA9IGVudls1XTsKKwlmeHNhdmUtPmZvcyA9IGVudls2XTsKKworCXRvID0gKHN0cnVjdCBfZnB4cmVnICopICZmeHNhdmUtPnN0X3NwYWNlWzBdOworCWZyb20gPSAmYnVmLT5fc3RbMF07CisJZm9yICggaSA9IDAgOyBpIDwgOCA7IGkrKywgdG8rKywgZnJvbSsrICkgeworCQl1bnNpZ25lZCBsb25nICp0ID0gKHVuc2lnbmVkIGxvbmcgKil0bzsKKwkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKmYgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilmcm9tOworCisJCWlmIChfX2dldF91c2VyKCp0LCBmKSB8fAorCQkJCV9fZ2V0X3VzZXIoKih0ICsgMSksIGYgKyAxKSB8fAorCQkJCV9fZ2V0X3VzZXIodG8tPmV4cG9uZW50LCAmZnJvbS0+ZXhwb25lbnQpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogU2lnbmFsIGZyYW1lIGhhbmRsZXJzLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHNhdmVfaTM4N19mc2F2ZSggc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmICkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKKwl1bmxhenlfZnB1KCB0c2sgKTsKKwl0c2stPnRocmVhZC5pMzg3LmZzYXZlLnN0YXR1cyA9IHRzay0+dGhyZWFkLmkzODcuZnNhdmUuc3dkOworCWlmICggX19jb3B5X3RvX3VzZXIoIGJ1ZiwgJnRzay0+dGhyZWFkLmkzODcuZnNhdmUsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgaTM4N19mc2F2ZV9zdHJ1Y3QpICkgKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2F2ZV9pMzg3X2Z4c2F2ZSggc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmICkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJaW50IGVyciA9IDA7CisKKwl1bmxhenlfZnB1KCB0c2sgKTsKKworCWlmICggY29udmVydF9meHNyX3RvX3VzZXIoIGJ1ZiwgJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlICkgKQorCQlyZXR1cm4gLTE7CisKKwllcnIgfD0gX19wdXRfdXNlciggdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUuc3dkLCAmYnVmLT5zdGF0dXMgKTsKKwllcnIgfD0gX19wdXRfdXNlciggWDg2X0ZYU1JfTUFHSUMsICZidWYtPm1hZ2ljICk7CisJaWYgKCBlcnIgKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIF9fY29weV90b191c2VyKCAmYnVmLT5fZnhzcl9lbnZbMF0sICZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QpICkgKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDE7Cit9CisKK2ludCBzYXZlX2kzODcoIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZiApCit7CisJaWYgKCAhdXNlZF9tYXRoKCkgKQorCQlyZXR1cm4gMDsKKworCS8qIFRoaXMgd2lsbCBjYXVzZSBhICJmaW5pdCIgdG8gYmUgdHJpZ2dlcmVkIGJ5IHRoZSBuZXh0CisJICogYXR0ZW1wdGVkIEZQVSBvcGVyYXRpb24gYnkgdGhlICdjdXJyZW50JyBwcm9jZXNzLgorCSAqLworCWNsZWFyX3VzZWRfbWF0aCgpOworCisJaWYgKCBIQVZFX0hXRlAgKSB7CisJCWlmICggY3B1X2hhc19meHNyICkgeworCQkJcmV0dXJuIHNhdmVfaTM4N19meHNhdmUoIGJ1ZiApOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHNhdmVfaTM4N19mc2F2ZSggYnVmICk7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gc2F2ZV9pMzg3X3NvZnQoICZjdXJyZW50LT50aHJlYWQuaTM4Ny5zb2Z0LCBidWYgKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlc3RvcmVfaTM4N19mc2F2ZSggc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmICkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJY2xlYXJfZnB1KCB0c2sgKTsKKwlyZXR1cm4gX19jb3B5X2Zyb21fdXNlciggJnRzay0+dGhyZWFkLmkzODcuZnNhdmUsIGJ1ZiwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBpMzg3X2ZzYXZlX3N0cnVjdCkgKTsKK30KKworc3RhdGljIGludCByZXN0b3JlX2kzODdfZnhzYXZlKCBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpidWYgKQoreworCWludCBlcnI7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCWNsZWFyX2ZwdSggdHNrICk7CisJZXJyID0gX19jb3B5X2Zyb21fdXNlciggJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlLCAmYnVmLT5fZnhzcl9lbnZbMF0sCisJCQkJc2l6ZW9mKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QpICk7CisJLyogbXhjc3IgcmVzZXJ2ZWQgYml0cyBtdXN0IGJlIG1hc2tlZCB0byB6ZXJvIGZvciBzZWN1cml0eSByZWFzb25zICovCisJdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUubXhjc3IgJj0gbXhjc3JfZmVhdHVyZV9tYXNrOworCXJldHVybiBlcnIgPyAxIDogY29udmVydF9meHNyX2Zyb21fdXNlciggJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlLCBidWYgKTsKK30KKworaW50IHJlc3RvcmVfaTM4Nyggc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmICkKK3sKKwlpbnQgZXJyOworCisJaWYgKCBIQVZFX0hXRlAgKSB7CisJCWlmICggY3B1X2hhc19meHNyICkgeworCQkJZXJyID0gcmVzdG9yZV9pMzg3X2Z4c2F2ZSggYnVmICk7CisJCX0gZWxzZSB7CisJCQllcnIgPSByZXN0b3JlX2kzODdfZnNhdmUoIGJ1ZiApOworCQl9CisJfSBlbHNlIHsKKwkJZXJyID0gcmVzdG9yZV9pMzg3X3NvZnQoICZjdXJyZW50LT50aHJlYWQuaTM4Ny5zb2Z0LCBidWYgKTsKKwl9CisJc2V0X3VzZWRfbWF0aCgpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBwdHJhY2UgcmVxdWVzdCBoYW5kbGVycy4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBnZXRfZnByZWdzX2ZzYXZlKCBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQoreworCXJldHVybiBfX2NvcHlfdG9fdXNlciggYnVmLCAmdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QpICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9mcHJlZ3NfZnhzYXZlKCBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKK3sKKwlyZXR1cm4gY29udmVydF9meHNyX3RvX3VzZXIoIChzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICopYnVmLAorCQkJCSAgICAgJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlICk7Cit9CisKK2ludCBnZXRfZnByZWdzKCBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgKQoreworCWlmICggSEFWRV9IV0ZQICkgeworCQlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJCXJldHVybiBnZXRfZnByZWdzX2Z4c2F2ZSggYnVmLCB0c2sgKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBnZXRfZnByZWdzX2ZzYXZlKCBidWYsIHRzayApOworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNhdmVfaTM4N19zb2Z0KCAmdHNrLT50aHJlYWQuaTM4Ny5zb2Z0LAorCQkJCSAgICAgICAoc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqKWJ1ZiApOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgc2V0X2ZwcmVnc19mc2F2ZSggc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJICAgIHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmICkKK3sKKwlyZXR1cm4gX19jb3B5X2Zyb21fdXNlciggJnRzay0+dGhyZWFkLmkzODcuZnNhdmUsIGJ1ZiwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0KSApOworfQorCitzdGF0aWMgaW5saW5lIGludCBzZXRfZnByZWdzX2Z4c2F2ZSggc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJICAgICBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1ZiApCit7CisJcmV0dXJuIGNvbnZlcnRfZnhzcl9mcm9tX3VzZXIoICZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSwKKwkJCQkgICAgICAgKHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKilidWYgKTsKK30KKworaW50IHNldF9mcHJlZ3MoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBfX3VzZXIgKmJ1ZiApCit7CisJaWYgKCBIQVZFX0hXRlAgKSB7CisJCWlmICggY3B1X2hhc19meHNyICkgeworCQkJcmV0dXJuIHNldF9mcHJlZ3NfZnhzYXZlKCB0c2ssIGJ1ZiApOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHNldF9mcHJlZ3NfZnNhdmUoIHRzaywgYnVmICk7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gcmVzdG9yZV9pMzg3X3NvZnQoICZ0c2stPnRocmVhZC5pMzg3LnNvZnQsCisJCQkJCSAgKHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKilidWYgKTsKKwl9Cit9CisKK2ludCBnZXRfZnB4cmVncyggc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrICkKK3sKKwlpZiAoIGNwdV9oYXNfZnhzciApIHsKKwkJaWYgKF9fY29weV90b191c2VyKCBidWYsICZ0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlPOworCX0KK30KKworaW50IHNldF9mcHhyZWdzKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgX191c2VyICpidWYgKQoreworCWludCByZXQgPSAwOworCisJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCWlmIChfX2NvcHlfZnJvbV91c2VyKCAmdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUsIGJ1ZiwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCkgKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCS8qIG14Y3NyIHJlc2VydmVkIGJpdHMgbXVzdCBiZSBtYXNrZWQgdG8gemVybyBmb3Igc2VjdXJpdHkgcmVhc29ucyAqLworCQl0c2stPnRocmVhZC5pMzg3LmZ4c2F2ZS5teGNzciAmPSBteGNzcl9mZWF0dXJlX21hc2s7CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVJTzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZQVSBzdGF0ZSBmb3IgY29yZSBkdW1wcy4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9mcHVfZnNhdmUoIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQkJCSAgIHN0cnVjdCB1c2VyX2kzODdfc3RydWN0ICpmcHUgKQoreworCW1lbWNweSggZnB1LCAmdHNrLT50aHJlYWQuaTM4Ny5mc2F2ZSwKKwkJc2l6ZW9mKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0KSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9mcHVfZnhzYXZlKCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCQkgICBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCAqZnB1ICkKK3sKKwl1bnNpZ25lZCBzaG9ydCAqdG87CisJdW5zaWduZWQgc2hvcnQgKmZyb207CisJaW50IGk7CisKKwltZW1jcHkoIGZwdSwgJnRzay0+dGhyZWFkLmkzODcuZnhzYXZlLCA3ICogc2l6ZW9mKGxvbmcpICk7CisKKwl0byA9ICh1bnNpZ25lZCBzaG9ydCAqKSZmcHUtPnN0X3NwYWNlWzBdOworCWZyb20gPSAodW5zaWduZWQgc2hvcnQgKikmdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUuc3Rfc3BhY2VbMF07CisJZm9yICggaSA9IDAgOyBpIDwgOCA7IGkrKywgdG8gKz0gNSwgZnJvbSArPSA4ICkgeworCQltZW1jcHkoIHRvLCBmcm9tLCA1ICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSApOworCX0KK30KKworaW50IGR1bXBfZnB1KCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgKmZwdSApCit7CisJaW50IGZwdmFsaWQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCisJZnB2YWxpZCA9ICEhdXNlZF9tYXRoKCk7CisJaWYgKCBmcHZhbGlkICkgeworCQl1bmxhenlfZnB1KCB0c2sgKTsKKwkJaWYgKCBjcHVfaGFzX2Z4c3IgKSB7CisJCQljb3B5X2ZwdV9meHNhdmUoIHRzaywgZnB1ICk7CisJCX0gZWxzZSB7CisJCQljb3B5X2ZwdV9mc2F2ZSggdHNrLCBmcHUgKTsKKwkJfQorCX0KKworCXJldHVybiBmcHZhbGlkOworfQorCitpbnQgZHVtcF90YXNrX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgKmZwdSkKK3sKKwlpbnQgZnB2YWxpZCA9ICEhdHNrX3VzZWRfbWF0aCh0c2spOworCisJaWYgKGZwdmFsaWQpIHsKKwkJaWYgKHRzayA9PSBjdXJyZW50KQorCQkJdW5sYXp5X2ZwdSh0c2spOworCQlpZiAoY3B1X2hhc19meHNyKQorCQkJY29weV9mcHVfZnhzYXZlKHRzaywgZnB1KTsKKwkJZWxzZQorCQkJY29weV9mcHVfZnNhdmUodHNrLCBmcHUpOworCX0KKwlyZXR1cm4gZnB2YWxpZDsKK30KKworaW50IGR1bXBfdGFza19leHRlbmRlZF9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0ICpmcHUpCit7CisJaW50IGZwdmFsaWQgPSB0c2tfdXNlZF9tYXRoKHRzaykgJiYgY3B1X2hhc19meHNyOworCisJaWYgKGZwdmFsaWQpIHsKKwkJaWYgKHRzayA9PSBjdXJyZW50KQorCQkgICAgICAgdW5sYXp5X2ZwdSh0c2spOworCQltZW1jcHkoZnB1LCAmdHNrLT50aHJlYWQuaTM4Ny5meHNhdmUsIHNpemVvZigqZnB1KSk7CisJfQorCXJldHVybiBmcHZhbGlkOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MGJlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMKQEAgLTAsMCArMSw0MjkgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vODI1M3BpdC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS90aW1lci5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKworI2luY2x1ZGUgPGlvX3BvcnRzLmg+CisKKy8qCisgKiBUaGlzIGlzIHRoZSAnbGVnYWN5JyA4MjU5QSBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIsCisgKiBwcmVzZW50IGluIHRoZSBtYWpvcml0eSBvZiBQQy9BVCBib3hlcy4KKyAqIHBsdXMgc29tZSBnZW5lcmljIHg4NiBzcGVjaWZpYyB0aGluZ3MgaWYgZ2VuZXJpYyBzcGVjaWZpY3MgbWFrZXMKKyAqIGFueSBzZW5zZSBhdCBhbGwuCisgKiB0aGlzIGZpbGUgc2hvdWxkIGJlY29tZSBhcmNoL2kzODYva2VybmVsL2lycS5jIHdoZW4gdGhlIG9sZCBpcnEuYworICogbW92ZXMgdG8gYXJjaCBpbmRlcGVuZGVudCBsYW5kCisgKi8KKworREVGSU5FX1NQSU5MT0NLKGk4MjU5QV9sb2NrKTsKKworc3RhdGljIHZvaWQgZW5kXzgyNTlBX2lycSAodW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSAmJgorCQkJCQkJCWlycV9kZXNjW2lycV0uYWN0aW9uKQorCQllbmFibGVfODI1OUFfaXJxKGlycSk7Cit9CisKKyNkZWZpbmUgc2h1dGRvd25fODI1OUFfaXJxCWRpc2FibGVfODI1OUFfaXJxCisKK3N0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja184MjU5QSh1bnNpZ25lZCBpbnQpOworCit1bnNpZ25lZCBpbnQgc3RhcnR1cF84MjU5QV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sgCisJZW5hYmxlXzgyNTlBX2lycShpcnEpOworCXJldHVybiAwOyAvKiBuZXZlciBhbnl0aGluZyBwZW5kaW5nICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaTgyNTlBX2lycV90eXBlID0geworCS50eXBlbmFtZSA9ICJYVC1QSUMiLAorCS5zdGFydHVwID0gc3RhcnR1cF84MjU5QV9pcnEsCisJLnNodXRkb3duID0gc2h1dGRvd25fODI1OUFfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfODI1OUFfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV84MjU5QV9pcnEsCisJLmFjayA9IG1hc2tfYW5kX2Fja184MjU5QSwKKwkuZW5kID0gZW5kXzgyNTlBX2lycSwKK307CisKKy8qCisgKiA4MjU5QSBQSUMgZnVuY3Rpb25zIHRvIGhhbmRsZSBJU0EgZGV2aWNlczoKKyAqLworCisvKgorICogVGhpcyBjb250YWlucyB0aGUgaXJxIG1hc2sgZm9yIGJvdGggODI1OUEgaXJxIGNvbnRyb2xsZXJzLAorICovCit1bnNpZ25lZCBpbnQgY2FjaGVkX2lycV9tYXNrID0gMHhmZmZmOworCisvKgorICogTm90IGFsbCBJUlFzIGNhbiBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgSU8tQVBJQywgZWcuIG9uIGNlcnRhaW4gKG9sZGVyKQorICogYm9hcmRzIHRoZSB0aW1lciBpbnRlcnJ1cHQgaXMgbm90IHJlYWxseSBjb25uZWN0ZWQgdG8gYW55IElPLUFQSUMgcGluLAorICogaXQncyBmZWQgdG8gdGhlIG1hc3RlciA4MjU5QSdzIElSMCBsaW5lIG9ubHkuCisgKgorICogQW55ICcxJyBiaXQgaW4gdGhpcyBtYXNrIG1lYW5zIHRoZSBJUlEgaXMgcm91dGVkIHRocm91Z2ggdGhlIElPLUFQSUMuCisgKiB0aGlzICdtaXhlZCBtb2RlJyBJUlEgaGFuZGxpbmcgY29zdHMgbm90aGluZyBiZWNhdXNlIGl0J3Mgb25seSB1c2VkCisgKiBhdCBJUlEgc2V0dXAgdGltZS4KKyAqLwordW5zaWduZWQgbG9uZyBpb19hcGljX2lycXM7CisKK3ZvaWQgZGlzYWJsZV84MjU5QV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgaXJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKwljYWNoZWRfaXJxX21hc2sgfD0gbWFzazsKKwlpZiAoaXJxICYgOCkKKwkJb3V0YihjYWNoZWRfc2xhdmVfbWFzaywgUElDX1NMQVZFX0lNUik7CisJZWxzZQorCQlvdXRiKGNhY2hlZF9tYXN0ZXJfbWFzaywgUElDX01BU1RFUl9JTVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgZW5hYmxlXzgyNTlBX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gfigxIDw8IGlycSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCWNhY2hlZF9pcnFfbWFzayAmPSBtYXNrOworCWlmIChpcnEgJiA4KQorCQlvdXRiKGNhY2hlZF9zbGF2ZV9tYXNrLCBQSUNfU0xBVkVfSU1SKTsKKwllbHNlCisJCW91dGIoY2FjaGVkX21hc3Rlcl9tYXNrLCBQSUNfTUFTVEVSX0lNUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKK30KKworaW50IGk4MjU5QV9pcnFfcGVuZGluZyh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMTw8aXJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCWlmIChpcnEgPCA4KQorCQlyZXQgPSBpbmIoUElDX01BU1RFUl9DTUQpICYgbWFzazsKKwllbHNlCisJCXJldCA9IGluYihQSUNfU0xBVkVfQ01EKSAmIChtYXNrID4+IDgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG1ha2VfODI1OUFfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJaW9fYXBpY19pcnFzICY9IH4oMTw8aXJxKTsKKwlpcnFfZGVzY1tpcnFdLmhhbmRsZXIgPSAmaTgyNTlBX2lycV90eXBlOworCWVuYWJsZV9pcnEoaXJxKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0byBiZSBjYWxsZWQgcmFyZWx5LiBTd2l0Y2hpbmcgYmV0d2VlbgorICogODI1OUEgcmVnaXN0ZXJzIGlzIHNsb3cuCisgKiBUaGlzIGhhcyB0byBiZSBwcm90ZWN0ZWQgYnkgdGhlIGlycSBjb250cm9sbGVyIHNwaW5sb2NrCisgKiBiZWZvcmUgYmVpbmcgY2FsbGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBpODI1OUFfaXJxX3JlYWwodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgdmFsdWU7CisJaW50IGlycW1hc2sgPSAxPDxpcnE7CisKKwlpZiAoaXJxIDwgOCkgeworCQlvdXRiKDB4MEIsUElDX01BU1RFUl9DTUQpOwkvKiBJU1IgcmVnaXN0ZXIgKi8KKwkJdmFsdWUgPSBpbmIoUElDX01BU1RFUl9DTUQpICYgaXJxbWFzazsKKwkJb3V0YigweDBBLFBJQ19NQVNURVJfQ01EKTsJLyogYmFjayB0byB0aGUgSVJSIHJlZ2lzdGVyICovCisJCXJldHVybiB2YWx1ZTsKKwl9CisJb3V0YigweDBCLFBJQ19TTEFWRV9DTUQpOwkvKiBJU1IgcmVnaXN0ZXIgKi8KKwl2YWx1ZSA9IGluYihQSUNfU0xBVkVfQ01EKSAmIChpcnFtYXNrID4+IDgpOworCW91dGIoMHgwQSxQSUNfU0xBVkVfQ01EKTsJLyogYmFjayB0byB0aGUgSVJSIHJlZ2lzdGVyICovCisJcmV0dXJuIHZhbHVlOworfQorCisvKgorICogQ2FyZWZ1bCEgVGhlIDgyNTlBIGlzIGEgZnJhZ2lsZSBiZWFzdCwgaXQgcHJldHR5CisgKiBtdWNoIF9oYXNfIHRvIGJlIGRvbmUgZXhhY3RseSBsaWtlIHRoaXMgKG1hc2sgaXQKKyAqIGZpcnN0LCBfdGhlbl8gc2VuZCB0aGUgRU9JLCBhbmQgdGhlIG9yZGVyIG9mIEVPSQorICogdG8gdGhlIHR3byA4MjU5cyBpcyBpbXBvcnRhbnQhCisgKi8KK3N0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja184MjU5QSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBpcnFtYXNrID0gMSA8PCBpcnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCS8qCisJICogTGlnaHR3ZWlnaHQgc3B1cmlvdXMgSVJRIGRldGVjdGlvbi4gV2UgZG8gbm90IHdhbnQKKwkgKiB0byBvdmVyZG8gc3B1cmlvdXMgSVJRIGhhbmRsaW5nIC0gaXQncyB1c3VhbGx5IGEgc2lnbgorCSAqIG9mIGhhcmR3YXJlIHByb2JsZW1zLCBzbyB3ZSBvbmx5IGRvIHRoZSBjaGVja3Mgd2UgY2FuCisJICogZG8gd2l0aG91dCBzbG93aW5nIGRvd24gZ29vZCBoYXJkd2FyZSB1bm5lY2Vzc2VyaWx5LgorCSAqCisJICogTm90ZSB0aGF0IElSUTcgYW5kIElSUTE1ICh0aGUgdHdvIHNwdXJpb3VzIElSUXMKKwkgKiB1c3VhbGx5IHJlc3VsdGluZyBmcm9tIHRoZSA4MjU5QS0xfDIgUElDcykgb2NjdXIKKwkgKiBldmVuIGlmIHRoZSBJUlEgaXMgbWFza2VkIGluIHRoZSA4MjU5QS4gVGh1cyB3ZQorCSAqIGNhbiBjaGVjayBzcHVyaW91cyA4MjU5QSBJUlFzIHdpdGhvdXQgZG9pbmcgdGhlCisJICogcXVpdGUgc2xvdyBpODI1OUFfaXJxX3JlYWwoKSBjYWxsIGZvciBldmVyeSBJUlEuCisJICogVGhpcyBkb2VzIG5vdCBjb3ZlciAxMDAlIG9mIHNwdXJpb3VzIGludGVycnVwdHMsCisJICogYnV0IHNob3VsZCBiZSBlbm91Z2ggdG8gd2FybiB0aGUgdXNlciB0aGF0IHRoZXJlCisJICogaXMgc29tZXRoaW5nIGJhZCBnb2luZyBvbiAuLi4KKwkgKi8KKwlpZiAoY2FjaGVkX2lycV9tYXNrICYgaXJxbWFzaykKKwkJZ290byBzcHVyaW91c184MjU5QV9pcnE7CisJY2FjaGVkX2lycV9tYXNrIHw9IGlycW1hc2s7CisKK2hhbmRsZV9yZWFsX2lycToKKwlpZiAoaXJxICYgOCkgeworCQlpbmIoUElDX1NMQVZFX0lNUik7CS8qIERVTU1ZIC0gKGRvIHdlIG5lZWQgdGhpcz8pICovCisJCW91dGIoY2FjaGVkX3NsYXZlX21hc2ssIFBJQ19TTEFWRV9JTVIpOworCQlvdXRiKDB4NjArKGlycSY3KSxQSUNfU0xBVkVfQ01EKTsvKiAnU3BlY2lmaWMgRU9JJyB0byBzbGF2ZSAqLworCQlvdXRiKDB4NjArUElDX0NBU0NBREVfSVIsUElDX01BU1RFUl9DTUQpOyAvKiAnU3BlY2lmaWMgRU9JJyB0byBtYXN0ZXItSVJRMiAqLworCX0gZWxzZSB7CisJCWluYihQSUNfTUFTVEVSX0lNUik7CS8qIERVTU1ZIC0gKGRvIHdlIG5lZWQgdGhpcz8pICovCisJCW91dGIoY2FjaGVkX21hc3Rlcl9tYXNrLCBQSUNfTUFTVEVSX0lNUik7CisJCW91dGIoMHg2MCtpcnEsUElDX01BU1RFUl9DTUQpOwkvKiAnU3BlY2lmaWMgRU9JIHRvIG1hc3RlciAqLworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCXJldHVybjsKKworc3B1cmlvdXNfODI1OUFfaXJxOgorCS8qCisJICogdGhpcyBpcyB0aGUgc2xvdyBwYXRoIC0gc2hvdWxkIGhhcHBlbiByYXJlbHkuCisJICovCisJaWYgKGk4MjU5QV9pcnFfcmVhbChpcnEpKQorCQkvKgorCQkgKiBvb3BzLCB0aGUgSVJRIF9pc18gaW4gc2VydmljZSBhY2NvcmRpbmcgdG8gdGhlCisJCSAqIDgyNTlBIC0gbm90IHNwdXJpb3VzLCBnbyBoYW5kbGUgaXQuCisJCSAqLworCQlnb3RvIGhhbmRsZV9yZWFsX2lycTsKKworCXsKKwkJc3RhdGljIGludCBzcHVyaW91c19pcnFfbWFzazsKKwkJLyoKKwkJICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgSVJRIGlzIHNwdXJpb3VzLAorCQkgKiBsZXRzIEFDSyBhbmQgcmVwb3J0IGl0LiBbb25jZSBwZXIgSVJRXQorCQkgKi8KKwkJaWYgKCEoc3B1cmlvdXNfaXJxX21hc2sgJiBpcnFtYXNrKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNwdXJpb3VzIDgyNTlBIGludGVycnVwdDogSVJRJWQuXG4iLCBpcnEpOworCQkJc3B1cmlvdXNfaXJxX21hc2sgfD0gaXJxbWFzazsKKwkJfQorCQlhdG9taWNfaW5jKCZpcnFfZXJyX2NvdW50KTsKKwkJLyoKKwkJICogVGhlb3JldGljYWxseSB3ZSBkbyBub3QgaGF2ZSB0byBoYW5kbGUgdGhpcyBJUlEsCisJCSAqIGJ1dCBpbiBMaW51eCB0aGlzIGRvZXMgbm90IGNhdXNlIHByb2JsZW1zIGFuZCBpcworCQkgKiBzaW1wbGVyIGZvciB1cy4KKwkJICovCisJCWdvdG8gaGFuZGxlX3JlYWxfaXJxOworCX0KK30KKworc3RhdGljIGNoYXIgaXJxX3RyaWdnZXJbMl07CisvKioKKyAqIEVMQ1IgcmVnaXN0ZXJzICgweDRkMCwgMHg0ZDEpIGNvbnRyb2wgZWRnZS9sZXZlbCBvZiBJUlEKKyAqLworc3RhdGljIHZvaWQgcmVzdG9yZV9FTENSKGNoYXIgKnRyaWdnZXIpCit7CisJb3V0Yih0cmlnZ2VyWzBdLCAweDRkMCk7CisJb3V0Yih0cmlnZ2VyWzFdLCAweDRkMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVfRUxDUihjaGFyICp0cmlnZ2VyKQoreworCS8qIElSUSAwLDEsMiw4LDEzIGFyZSBtYXJrZWQgYXMgcmVzZXJ2ZWQgKi8KKwl0cmlnZ2VyWzBdID0gaW5iKDB4NGQwKSAmIDB4Rjg7CisJdHJpZ2dlclsxXSA9IGluYigweDRkMSkgJiAweERFOworfQorCitzdGF0aWMgaW50IGk4MjU5QV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlpbml0XzgyNTlBKDApOworCXJlc3RvcmVfRUxDUihpcnFfdHJpZ2dlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTgyNTlBX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgdTMyIHN0YXRlKQoreworCXNhdmVfRUxDUihpcnFfdHJpZ2dlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGk4MjU5X3N5c2Rldl9jbGFzcyA9IHsKKwlzZXRfa3NldF9uYW1lKCJpODI1OSIpLAorCS5zdXNwZW5kID0gaTgyNTlBX3N1c3BlbmQsCisJLnJlc3VtZSA9IGk4MjU5QV9yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2k4MjU5QSA9IHsKKwkuaWQJPSAwLAorCS5jbHMJPSAmaTgyNTlfc3lzZGV2X2NsYXNzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaTgyNTlBX2luaXRfc3lzZnModm9pZCkKK3sKKwlpbnQgZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmk4MjU5X3N5c2Rldl9jbGFzcyk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV9pODI1OUEpOworCXJldHVybiBlcnJvcjsKK30KKworZGV2aWNlX2luaXRjYWxsKGk4MjU5QV9pbml0X3N5c2ZzKTsKKwordm9pZCBpbml0XzgyNTlBKGludCBhdXRvX2VvaSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7CisKKwlvdXRiKDB4ZmYsIFBJQ19NQVNURVJfSU1SKTsJLyogbWFzayBhbGwgb2YgODI1OUEtMSAqLworCW91dGIoMHhmZiwgUElDX1NMQVZFX0lNUik7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTIgKi8KKworCS8qCisJICogb3V0Yl9wIC0gdGhpcyBoYXMgdG8gd29yayBvbiBhIHdpZGUgcmFuZ2Ugb2YgUEMgaGFyZHdhcmUuCisJICovCisJb3V0Yl9wKDB4MTEsIFBJQ19NQVNURVJfQ01EKTsJLyogSUNXMTogc2VsZWN0IDgyNTlBLTEgaW5pdCAqLworCW91dGJfcCgweDIwICsgMCwgUElDX01BU1RFUl9JTVIpOwkvKiBJQ1cyOiA4MjU5QS0xIElSMC03IG1hcHBlZCB0byAweDIwLTB4MjcgKi8KKwlvdXRiX3AoMVUgPDwgUElDX0NBU0NBREVfSVIsIFBJQ19NQVNURVJfSU1SKTsJLyogODI1OUEtMSAodGhlIG1hc3RlcikgaGFzIGEgc2xhdmUgb24gSVIyICovCisJaWYgKGF1dG9fZW9pKQkvKiBtYXN0ZXIgZG9lcyBBdXRvIEVPSSAqLworCQlvdXRiX3AoTUFTVEVSX0lDVzRfREVGQVVMVCB8IFBJQ19JQ1c0X0FFT0ksIFBJQ19NQVNURVJfSU1SKTsKKwllbHNlCQkvKiBtYXN0ZXIgZXhwZWN0cyBub3JtYWwgRU9JICovCisJCW91dGJfcChNQVNURVJfSUNXNF9ERUZBVUxULCBQSUNfTUFTVEVSX0lNUik7CisKKwlvdXRiX3AoMHgxMSwgUElDX1NMQVZFX0NNRCk7CS8qIElDVzE6IHNlbGVjdCA4MjU5QS0yIGluaXQgKi8KKwlvdXRiX3AoMHgyMCArIDgsIFBJQ19TTEFWRV9JTVIpOwkvKiBJQ1cyOiA4MjU5QS0yIElSMC03IG1hcHBlZCB0byAweDI4LTB4MmYgKi8KKwlvdXRiX3AoUElDX0NBU0NBREVfSVIsIFBJQ19TTEFWRV9JTVIpOwkvKiA4MjU5QS0yIGlzIGEgc2xhdmUgb24gbWFzdGVyJ3MgSVIyICovCisJb3V0Yl9wKFNMQVZFX0lDVzRfREVGQVVMVCwgUElDX1NMQVZFX0lNUik7IC8qIChzbGF2ZSdzIHN1cHBvcnQgZm9yIEFFT0kgaW4gZmxhdCBtb2RlIGlzIHRvIGJlIGludmVzdGlnYXRlZCkgKi8KKwlpZiAoYXV0b19lb2kpCisJCS8qCisJCSAqIGluIEFFT0kgbW9kZSB3ZSBqdXN0IGhhdmUgdG8gbWFzayB0aGUgaW50ZXJydXB0CisJCSAqIHdoZW4gYWNraW5nLgorCQkgKi8KKwkJaTgyNTlBX2lycV90eXBlLmFjayA9IGRpc2FibGVfODI1OUFfaXJxOworCWVsc2UKKwkJaTgyNTlBX2lycV90eXBlLmFjayA9IG1hc2tfYW5kX2Fja184MjU5QTsKKworCXVkZWxheSgxMDApOwkJLyogd2FpdCBmb3IgODI1OUEgdG8gaW5pdGlhbGl6ZSAqLworCisJb3V0YihjYWNoZWRfbWFzdGVyX21hc2ssIFBJQ19NQVNURVJfSU1SKTsgLyogcmVzdG9yZSBtYXN0ZXIgSVJRIG1hc2sgKi8KKwlvdXRiKGNhY2hlZF9zbGF2ZV9tYXNrLCBQSUNfU0xBVkVfSU1SKTsJICAvKiByZXN0b3JlIHNsYXZlIElSUSBtYXNrICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogTm90ZSB0aGF0IG9uIGEgNDg2LCB3ZSBkb24ndCB3YW50IHRvIGRvIGEgU0lHRlBFIG9uIGFuIGlycTEzCisgKiBhcyB0aGUgaXJxIGlzIHVucmVsaWFibGUsIGFuZCBleGNlcHRpb24gMTYgd29ya3MgY29ycmVjdGx5CisgKiAoaWUgYXMgZXhwbGFpbmVkIGluIHRoZSBpbnRlbCBsaXRlcmF0dXJlKS4gT24gYSAzODYsIHlvdQorICogY2FuJ3QgdXNlIGV4Y2VwdGlvbiAxNiBkdWUgdG8gYmFkIElCTSBkZXNpZ24sIHNvIHdlIGhhdmUgdG8KKyAqIHJlbHkgb24gdGhlIGxlc3MgZXhhY3QgaXJxMTMuCisgKgorICogQ2FyZWZ1bC4uIE5vdCBvbmx5IGlzIElSUTEzIHVucmVsaWFibGUsIGJ1dCBpdCBpcyBhbHNvCisgKiBsZWFkcyB0byByYWNlcy4gSUJNIGRlc2lnbmVycyB3aG8gY2FtZSB1cCB3aXRoIGl0IHNob3VsZAorICogYmUgc2hvdC4KKyAqLworIAorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWF0aF9lcnJvcl9pcnEoaW50IGNwbCwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlleHRlcm4gdm9pZCBtYXRoX2Vycm9yKHZvaWQgX191c2VyICopOworCW91dGIoMCwweEYwKTsKKwlpZiAoaWdub3JlX2ZwdV9pcnEgfHwgIWJvb3RfY3B1X2RhdGEuaGFyZF9tYXRoKQorCQlyZXR1cm4gSVJRX05PTkU7CisJbWF0aF9lcnJvcigodm9pZCBfX3VzZXIgKilyZWdzLT5laXApOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIE5ldyBtb3RoZXJib2FyZHMgc29tZXRpbWVzIG1ha2UgSVJRIDEzIGJlIGEgUENJIGludGVycnVwdCwKKyAqIHNvIGFsbG93IGludGVycnVwdCBzaGFyaW5nLgorICovCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBmcHVfaXJxID0geyBtYXRoX2Vycm9yX2lycSwgMCwgQ1BVX01BU0tfTk9ORSwgImZwdSIsIE5VTEwsIE5VTEwgfTsKKwordm9pZCBfX2luaXQgaW5pdF9JU0FfaXJxcyAodm9pZCkKK3sKKwlpbnQgaTsKKworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCWluaXRfYnNwX0FQSUMoKTsKKyNlbmRpZgorCWluaXRfODI1OUEoMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKSB7CisJCWlycV9kZXNjW2ldLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKKwkJaXJxX2Rlc2NbaV0uYWN0aW9uID0gTlVMTDsKKwkJaXJxX2Rlc2NbaV0uZGVwdGggPSAxOworCisJCWlmIChpIDwgMTYpIHsKKwkJCS8qCisJCQkgKiAxNiBvbGQtc3R5bGUgSU5UQS1jeWNsZSBpbnRlcnJ1cHRzOgorCQkJICovCisJCQlpcnFfZGVzY1tpXS5oYW5kbGVyID0gJmk4MjU5QV9pcnFfdHlwZTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiAnaGlnaCcgUENJIElSUXMgZmlsbGVkIGluIG9uIGRlbWFuZAorCQkJICovCisJCQlpcnFfZGVzY1tpXS5oYW5kbGVyID0gJm5vX2lycV90eXBlOworCQl9CisJfQorfQorCit2b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQoreworCWludCBpOworCisJLyogYWxsIHRoZSBzZXQgdXAgYmVmb3JlIHRoZSBjYWxsIGdhdGVzIGFyZSBpbml0aWFsaXNlZCAqLworCXByZV9pbnRyX2luaXRfaG9vaygpOworCisJLyoKKwkgKiBDb3ZlciB0aGUgd2hvbGUgdmVjdG9yIHNwYWNlLCBubyB2ZWN0b3IgY2FuIGVzY2FwZQorCSAqIHVzLiAoc29tZSBvZiB0aGVzZSB3aWxsIGJlIG92ZXJyaWRkZW4gYW5kIGJlY29tZQorCSAqICdzcGVjaWFsJyBTTVAgaW50ZXJydXB0cykKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKE5SX1ZFQ1RPUlMgLSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IpOyBpKyspIHsKKwkJaW50IHZlY3RvciA9IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiArIGk7CisJCWlmIChpID49IE5SX0lSUVMpCisJCQlicmVhazsKKwkJaWYgKHZlY3RvciAhPSBTWVNDQUxMX1ZFQ1RPUikgCisJCQlzZXRfaW50cl9nYXRlKHZlY3RvciwgaW50ZXJydXB0W2ldKTsKKwl9CisKKwkvKiBzZXR1cCBhZnRlciBjYWxsIGdhdGVzIGFyZSBpbml0aWFsaXNlZCAodXN1YWxseSBhZGQgaW4KKwkgKiB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGdhdGVzKQorCSAqLworCWludHJfaW5pdF9ob29rKCk7CisKKwkvKgorCSAqIFNldCB0aGUgY2xvY2sgdG8gSFogSHosIHdlIGFscmVhZHkgaGF2ZSBhIHZhbGlkCisJICogdmVjdG9yIG5vdzoKKwkgKi8KKwlzZXR1cF9waXRfdGltZXIoKTsKKworCS8qCisJICogRXh0ZXJuYWwgRlBVPyBTZXQgdXAgaXJxMTMgaWYgc28sIGZvcgorCSAqIG9yaWdpbmFsIGJyYWluZGFtYWdlZCBJQk0gRkVSUiBjb3VwbGluZy4KKwkgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS5oYXJkX21hdGggJiYgIWNwdV9oYXNfZnB1KQorCQlzZXR1cF9pcnEoRlBVX0lSUSwgJmZwdV9pcnEpOworCisJaXJxX2N0eF9pbml0KHNtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pbml0X3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FhOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMCwwICsxLDQ2IEBACisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21xdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZnNfc3RydWN0IGluaXRfZnMgPSBJTklUX0ZTOworc3RhdGljIHN0cnVjdCBmaWxlc19zdHJ1Y3QgaW5pdF9maWxlcyA9IElOSVRfRklMRVM7CitzdGF0aWMgc3RydWN0IHNpZ25hbF9zdHJ1Y3QgaW5pdF9zaWduYWxzID0gSU5JVF9TSUdOQUxTKGluaXRfc2lnbmFscyk7CitzdGF0aWMgc3RydWN0IHNpZ2hhbmRfc3RydWN0IGluaXRfc2lnaGFuZCA9IElOSVRfU0lHSEFORChpbml0X3NpZ2hhbmQpOworc3RydWN0IG1tX3N0cnVjdCBpbml0X21tID0gSU5JVF9NTShpbml0X21tKTsKKworRVhQT1JUX1NZTUJPTChpbml0X21tKTsKKworLyoKKyAqIEluaXRpYWwgdGhyZWFkIHN0cnVjdHVyZS4KKyAqCisgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgVEhSRUFEX1NJWkUgYWxpZ25lZCBkdWUgdG8gdGhlCisgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBoYXZpbmcgYSBzcGVjaWFsCisgKiAiaW5pdF90YXNrIiBsaW5rZXIgbWFwIGVudHJ5Li4KKyAqLwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIAorCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0KKwkJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKKworLyoKKyAqIEluaXRpYWwgdGFzayBzdHJ1Y3R1cmUuCisgKgorICogQWxsIG90aGVyIHRhc2sgc3RydWN0cyB3aWxsIGJlIGFsbG9jYXRlZCBvbiBzbGFicyBpbiBmb3JrLmMKKyAqLworc3RydWN0IHRhc2tfc3RydWN0IGluaXRfdGFzayA9IElOSVRfVEFTSyhpbml0X3Rhc2spOworCitFWFBPUlRfU1lNQk9MKGluaXRfdGFzayk7CisKKy8qCisgKiBwZXItQ1BVIFRTUyBzZWdtZW50cy4gVGhyZWFkcyBhcmUgY29tcGxldGVseSAnc29mdCcgb24gTGludXgsCisgKiBubyBtb3JlIHBlci10YXNrIFRTUydzLgorICovIAorREVGSU5FX1BFUl9DUFUoc3RydWN0IHRzc19zdHJ1Y3QsIGluaXRfdHNzKSBfX19fY2FjaGVsaW5lX21heGFsaWduZWRfaW5fc21wID0gSU5JVF9UU1M7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxMzUwZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCkBAIC0wLDAgKzEsMjU0NSBAQAorLyoKKyAqCUludGVsIElPLUFQSUMgc3VwcG9ydCBmb3IgbXVsdGktUGVudGl1bSBob3N0cy4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgSW5nbyBNb2xuYXIsIEhham5hbGthIFN6YWJvCisgKgorICoJTWFueSB0aGFua3MgdG8gU3RpZyBWZW5hYXMgZm9yIHRyeWluZyBvdXQgY291bnRsZXNzIGV4cGVyaW1lbnRhbAorICoJcGF0Y2hlcyBhbmQgcmVwb3J0aW5nL2RlYnVnZ2luZyBwcm9ibGVtcyBwYXRpZW50bHkhCisgKgorICoJKGMpIDE5OTksIE11bHRpcGxlIElPLUFQSUMgc3VwcG9ydCwgZGV2ZWxvcGVkIGJ5CisgKglLZW4taWNoaSBZYWt1IDx5YWt1QGNzczEua2JuZXMubmVjLmNvLmpwPiBhbmQKKyAqICAgICAgSGlkZW1pIEtpc2hpbW90byA8a2lzaW1vdG9AY3NzMS5rYm5lcy5uZWMuY28uanA+LAorICoJZnVydGhlciB0ZXN0ZWQgYW5kIGNsZWFuZWQgdXAgYnkgWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+CisgKglhbmQgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKgorICoJRml4ZXMKKyAqCU1hY2llaiBXLiBSb3p5Y2tpCToJQml0cyBmb3IgZ2VudWluZSA4MjQ4OURYIEFQSUNzOworICoJCQkJCXRoYW5rcyB0byBFcmljIEdpbG1vcmUKKyAqCQkJCQlhbmQgUm9sZiBHLiBUZXdzCisgKgkJCQkJZm9yIHRlc3RpbmcgdGhlc2UgZXh0ZW5zaXZlbHkKKyAqCVBhdWwgRGllZmVuYmF1Z2gJOglBZGRlZCBmdWxsIEFDUEkgc3VwcG9ydAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKworI2luY2x1ZGUgImlvX3BvcnRzLmgiCisKK2ludCAoKmlvYXBpY19yZW51bWJlcl9pcnEpKGludCBpb2FwaWMsIGludCBpcnEpOworYXRvbWljX3QgaXJxX21pc19jb3VudDsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhpb2FwaWNfbG9jayk7CisKKy8qCisgKglJcyB0aGUgU2lTIEFQSUMgcm13IGJ1ZyBwcmVzZW50ID8KKyAqCS0xID0gZG9uJ3Qga25vdywgMCA9IG5vLCAxID0geWVzCisgKi8KK2ludCBzaXNfYXBpY19idWcgPSAtMTsKKworLyoKKyAqICMgb2YgSVJRIHJvdXRpbmcgcmVnaXN0ZXJzCisgKi8KK2ludCBucl9pb2FwaWNfcmVnaXN0ZXJzW01BWF9JT19BUElDU107CisKKy8qCisgKiBSb3VnaCBlc3RpbWF0aW9uIG9mIGhvdyBtYW55IHNoYXJlZCBJUlFzIHRoZXJlIGFyZSwgY2FuCisgKiBiZSBjaGFuZ2VkIGFueXRpbWUuCisgKi8KKyNkZWZpbmUgTUFYX1BMVVNfU0hBUkVEX0lSUVMgTlJfSVJRUworI2RlZmluZSBQSU5fTUFQX1NJWkUgKE1BWF9QTFVTX1NIQVJFRF9JUlFTICsgTlJfSVJRUykKKworLyoKKyAqIFRoaXMgaXMgcGVyZm9ybWFuY2UtY3JpdGljYWwsIHdlIHdhbnQgdG8gZG8gaXQgTygxKQorICoKKyAqIHRoZSBpbmRleGluZyBvcmRlciBvZiB0aGlzIGFycmF5IGZhdm9ycyAxOjEgbWFwcGluZ3MKKyAqIGJldHdlZW4gcGlucyBhbmQgSVJRcy4KKyAqLworCitzdGF0aWMgc3RydWN0IGlycV9waW5fbGlzdCB7CisJaW50IGFwaWMsIHBpbiwgbmV4dDsKK30gaXJxXzJfcGluW1BJTl9NQVBfU0laRV07CisKK2ludCB2ZWN0b3JfaXJxW05SX1ZFQ1RPUlNdID0geyBbMCAuLi4gTlJfVkVDVE9SUyAtIDFdID0gLTF9OworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisjZGVmaW5lIHZlY3Rvcl90b19pcnEodmVjdG9yKSAJXAorCShwbGF0Zm9ybV9sZWdhY3lfaXJxKHZlY3RvcikgPyB2ZWN0b3IgOiB2ZWN0b3JfaXJxW3ZlY3Rvcl0pCisjZWxzZQorI2RlZmluZSB2ZWN0b3JfdG9faXJxKHZlY3RvcikJKHZlY3RvcikKKyNlbmRpZgorCisvKgorICogVGhlIGNvbW1vbiBjYXNlIGlzIDE6MSBJUlE8LT5waW4gbWFwcGluZ3MuIFNvbWV0aW1lcyB0aGVyZSBhcmUKKyAqIHNoYXJlZCBJU0Etc3BhY2UgSVJRcywgc28gd2UgaGF2ZSB0byBzdXBwb3J0IHRoZW0uIFdlIGFyZSBzdXBlcgorICogZmFzdCBpbiB0aGUgY29tbW9uIGNhc2UsIGFuZCBmYXN0IGZvciBzaGFyZWQgSVNBLXNwYWNlIElSUXMuCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9waW5fdG9faXJxKHVuc2lnbmVkIGludCBpcnEsIGludCBhcGljLCBpbnQgcGluKQoreworCXN0YXRpYyBpbnQgZmlyc3RfZnJlZV9lbnRyeSA9IE5SX0lSUVM7CisJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnkgPSBpcnFfMl9waW4gKyBpcnE7CisKKwl3aGlsZSAoZW50cnktPm5leHQpCisJCWVudHJ5ID0gaXJxXzJfcGluICsgZW50cnktPm5leHQ7CisKKwlpZiAoZW50cnktPnBpbiAhPSAtMSkgeworCQllbnRyeS0+bmV4dCA9IGZpcnN0X2ZyZWVfZW50cnk7CisJCWVudHJ5ID0gaXJxXzJfcGluICsgZW50cnktPm5leHQ7CisJCWlmICgrK2ZpcnN0X2ZyZWVfZW50cnkgPj0gUElOX01BUF9TSVpFKQorCQkJcGFuaWMoImlvX2FwaWMuYzogd2hvb3BzIik7CisJfQorCWVudHJ5LT5hcGljID0gYXBpYzsKKwllbnRyeS0+cGluID0gcGluOworfQorCisvKgorICogUmVyb3V0ZSBhbiBJUlEgdG8gYSBkaWZmZXJlbnQgcGluLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcmVwbGFjZV9waW5fYXRfaXJxKHVuc2lnbmVkIGludCBpcnEsCisJCQkJICAgICAgaW50IG9sZGFwaWMsIGludCBvbGRwaW4sCisJCQkJICAgICAgaW50IG5ld2FwaWMsIGludCBuZXdwaW4pCit7CisJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnkgPSBpcnFfMl9waW4gKyBpcnE7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoZW50cnktPmFwaWMgPT0gb2xkYXBpYyAmJiBlbnRyeS0+cGluID09IG9sZHBpbikgeworCQkJZW50cnktPmFwaWMgPSBuZXdhcGljOworCQkJZW50cnktPnBpbiA9IG5ld3BpbjsKKwkJfQorCQlpZiAoIWVudHJ5LT5uZXh0KQorCQkJYnJlYWs7CisJCWVudHJ5ID0gaXJxXzJfcGluICsgZW50cnktPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX21vZGlmeV9JT19BUElDX2lycSAodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgbG9uZyBlbmFibGUsIHVuc2lnbmVkIGxvbmcgZGlzYWJsZSkKK3sKKwlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeSA9IGlycV8yX3BpbiArIGlycTsKKwl1bnNpZ25lZCBpbnQgcGluLCByZWc7CisKKwlmb3IgKDs7KSB7CisJCXBpbiA9IGVudHJ5LT5waW47CisJCWlmIChwaW4gPT0gLTEpCisJCQlicmVhazsKKwkJcmVnID0gaW9fYXBpY19yZWFkKGVudHJ5LT5hcGljLCAweDEwICsgcGluKjIpOworCQlyZWcgJj0gfmRpc2FibGU7CisJCXJlZyB8PSBlbmFibGU7CisJCWlvX2FwaWNfbW9kaWZ5KGVudHJ5LT5hcGljLCAweDEwICsgcGluKjIsIHJlZyk7CisJCWlmICghZW50cnktPm5leHQpCisJCQlicmVhazsKKwkJZW50cnkgPSBpcnFfMl9waW4gKyBlbnRyeS0+bmV4dDsKKwl9Cit9CisKKy8qIG1hc2sgPSAxICovCitzdGF0aWMgdm9pZCBfX21hc2tfSU9fQVBJQ19pcnEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJX19tb2RpZnlfSU9fQVBJQ19pcnEoaXJxLCAweDAwMDEwMDAwLCAwKTsKK30KKworLyogbWFzayA9IDAgKi8KK3N0YXRpYyB2b2lkIF9fdW5tYXNrX0lPX0FQSUNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fbW9kaWZ5X0lPX0FQSUNfaXJxKGlycSwgMCwgMHgwMDAxMDAwMCk7Cit9CisKKy8qIG1hc2sgPSAxLCB0cmlnZ2VyID0gMCAqLworc3RhdGljIHZvaWQgX19tYXNrX2FuZF9lZGdlX0lPX0FQSUNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fbW9kaWZ5X0lPX0FQSUNfaXJxKGlycSwgMHgwMDAxMDAwMCwgMHgwMDAwODAwMCk7Cit9CisKKy8qIG1hc2sgPSAwLCB0cmlnZ2VyID0gMSAqLworc3RhdGljIHZvaWQgX191bm1hc2tfYW5kX2xldmVsX0lPX0FQSUNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fbW9kaWZ5X0lPX0FQSUNfaXJxKGlycSwgMHgwMDAwODAwMCwgMHgwMDAxMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tfSU9fQVBJQ19pcnEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCV9fbWFza19JT19BUElDX2lycShpcnEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFza19JT19BUElDX2lycSAodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJX191bm1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9JT19BUElDX3Bpbih1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWduZWQgaW50IHBpbikKK3sKKwlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCS8qIENoZWNrIGRlbGl2ZXJ5X21vZGUgdG8gYmUgc3VyZSB3ZSdyZSBub3QgY2xlYXJpbmcgYW4gU01JIHBpbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCSooKChpbnQqKSZlbnRyeSkgKyAwKSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDEwICsgMiAqIHBpbik7CisJKigoKGludCopJmVudHJ5KSArIDEpID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTEgKyAyICogcGluKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWlmIChlbnRyeS5kZWxpdmVyeV9tb2RlID09IGRlc3RfU01JKQorCQlyZXR1cm47CisKKwkvKgorCSAqIERpc2FibGUgaXQgaW4gdGhlIElPLUFQSUMgaXJxLXJvdXRpbmcgdGFibGU6CisJICovCisJbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7CisJZW50cnkubWFzayA9IDE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeSkgKyAwKSk7CisJaW9fYXBpY193cml0ZShhcGljLCAweDExICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeSkgKyAxKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfSU9fQVBJQyAodm9pZCkKK3sKKwlpbnQgYXBpYywgcGluOworCisJZm9yIChhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykKKwkJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNdOyBwaW4rKykKKwkJCWNsZWFyX0lPX0FQSUNfcGluKGFwaWMsIHBpbik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBjcHVtYXNrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHBpbjsKKwlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeSA9IGlycV8yX3BpbiArIGlycTsKKwl1bnNpZ25lZCBpbnQgYXBpY2lkX3ZhbHVlOworCQorCWFwaWNpZF92YWx1ZSA9IGNwdV9tYXNrX3RvX2FwaWNpZChjcHVtYXNrKTsKKwkvKiBQcmVwYXJlIHRvIGRvIHRoZSBpb19hcGljX3dyaXRlICovCisJYXBpY2lkX3ZhbHVlID0gYXBpY2lkX3ZhbHVlIDw8IDI0OworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWZvciAoOzspIHsKKwkJcGluID0gZW50cnktPnBpbjsKKwkJaWYgKHBpbiA9PSAtMSkKKwkJCWJyZWFrOworCQlpb19hcGljX3dyaXRlKGVudHJ5LT5hcGljLCAweDEwICsgMSArIHBpbioyLCBhcGljaWRfdmFsdWUpOworCQlpZiAoIWVudHJ5LT5uZXh0KQorCQkJYnJlYWs7CisJCWVudHJ5ID0gaXJxXzJfcGluICsgZW50cnktPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JUlFCQUxBTkNFKQorIyBpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CS8qIGtlcm5lbF90aHJlYWQoKSAqLworIyBpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgkvKiBrc3RhdCAqLworIyBpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCkgKi8KKyMgaW5jbHVkZSA8bGludXgvdGltZXIuaD4JLyogdGltZV9hZnRlcigpICovCisgCisjIGlmZGVmIENPTkZJR19CQUxBTkNFRF9JUlFfREVCVUcKKyMgIGRlZmluZSBURHByaW50ayh4Li4uKSBkbyB7IHByaW50aygiPCVsZDolczolZD46ICIsIGppZmZpZXMsIF9fRklMRV9fLCBfX0xJTkVfXyk7IHByaW50ayh4KTsgfSB3aGlsZSAoMCkKKyMgIGRlZmluZSBEcHJpbnRrKHguLi4pIGRvIHsgVERwcmludGsoeCk7IH0gd2hpbGUgKDApCisjIGVsc2UKKyMgIGRlZmluZSBURHByaW50ayh4Li4uKSAKKyMgIGRlZmluZSBEcHJpbnRrKHguLi4pIAorIyBlbmRpZgorCitjcHVtYXNrX3QgX19jYWNoZWxpbmVfYWxpZ25lZCBwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbTlJfSVJRU107CisKKyNkZWZpbmUgSVJRQkFMQU5DRV9DSEVDS19BUkNIIC05OTkKK3N0YXRpYyBpbnQgaXJxYmFsYW5jZV9kaXNhYmxlZCA9IElSUUJBTEFOQ0VfQ0hFQ0tfQVJDSDsKK3N0YXRpYyBpbnQgcGh5c2ljYWxfYmFsYW5jZSA9IDA7CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NwdV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nICogbGFzdF9pcnE7CisJdW5zaWduZWQgbG9uZyAqIGlycV9kZWx0YTsKKwl1bnNpZ25lZCBsb25nIGlycTsKK30gaXJxX2NwdV9kYXRhW05SX0NQVVNdOworCisjZGVmaW5lIENQVV9JUlEoY3B1KQkJKGlycV9jcHVfZGF0YVtjcHVdLmlycSkKKyNkZWZpbmUgTEFTVF9DUFVfSVJRKGNwdSxpcnEpICAgKGlycV9jcHVfZGF0YVtjcHVdLmxhc3RfaXJxW2lycV0pCisjZGVmaW5lIElSUV9ERUxUQShjcHUsaXJxKSAJKGlycV9jcHVfZGF0YVtjcHVdLmlycV9kZWx0YVtpcnFdKQorCisjZGVmaW5lIElETEVfRU5PVUdIKGNwdSxub3cpIFwKKwkoaWRsZV9jcHUoY3B1KSAmJiAoKG5vdykgLSBwZXJfY3B1KGlycV9zdGF0LCAoY3B1KSkuaWRsZV90aW1lc3RhbXAgPiAxKSkKKworI2RlZmluZSBJUlFfQUxMT1dFRChjcHUsIGFsbG93ZWRfbWFzaykJY3B1X2lzc2V0KGNwdSwgYWxsb3dlZF9tYXNrKQorCisjZGVmaW5lIENQVV9UT19QQUNLQUdFSU5ERVgoaSkgKGZpcnN0X2NwdShjcHVfc2libGluZ19tYXBbaV0pKQorCisjZGVmaW5lIE1BWF9CQUxBTkNFRF9JUlFfSU5URVJWQUwJKDUqSFopCisjZGVmaW5lIE1JTl9CQUxBTkNFRF9JUlFfSU5URVJWQUwJKEhaLzIpCisjZGVmaW5lIEJBTEFOQ0VEX0lSUV9NT1JFX0RFTFRBCQkoSFovMTApCisjZGVmaW5lIEJBTEFOQ0VEX0lSUV9MRVNTX0RFTFRBCQkoSFopCisKK3N0YXRpYyBsb25nIGJhbGFuY2VkX2lycV9pbnRlcnZhbCA9IE1BWF9CQUxBTkNFRF9JUlFfSU5URVJWQUw7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vdmUoaW50IGN1cnJfY3B1LCBjcHVtYXNrX3QgYWxsb3dlZF9tYXNrLAorCQkJdW5zaWduZWQgbG9uZyBub3csIGludCBkaXJlY3Rpb24pCit7CisJaW50IHNlYXJjaF9pZGxlID0gMTsKKwlpbnQgY3B1ID0gY3Vycl9jcHU7CisKKwlnb3RvIGluc2lkZTsKKworCWRvIHsKKwkJaWYgKHVubGlrZWx5KGNwdSA9PSBjdXJyX2NwdSkpCisJCQlzZWFyY2hfaWRsZSA9IDA7CitpbnNpZGU6CisJCWlmIChkaXJlY3Rpb24gPT0gMSkgeworCQkJY3B1Kys7CisJCQlpZiAoY3B1ID49IE5SX0NQVVMpCisJCQkJY3B1ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWNwdS0tOworCQkJaWYgKGNwdSA9PSAtMSkKKwkJCQljcHUgPSBOUl9DUFVTLTE7CisJCX0KKwl9IHdoaWxlICghY3B1X29ubGluZShjcHUpIHx8ICFJUlFfQUxMT1dFRChjcHUsYWxsb3dlZF9tYXNrKSB8fAorCQkJKHNlYXJjaF9pZGxlICYmICFJRExFX0VOT1VHSChjcHUsbm93KSkpOworCisJcmV0dXJuIGNwdTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJhbGFuY2VfaXJxKGludCBjcHUsIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCWNwdW1hc2tfdCBhbGxvd2VkX21hc2s7CisJdW5zaWduZWQgaW50IG5ld19jcHU7CisJCQorCWlmIChpcnFiYWxhbmNlX2Rpc2FibGVkKQorCQlyZXR1cm47IAorCisJY3B1c19hbmQoYWxsb3dlZF9tYXNrLCBjcHVfb25saW5lX21hcCwgaXJxX2FmZmluaXR5W2lycV0pOworCW5ld19jcHUgPSBtb3ZlKGNwdSwgYWxsb3dlZF9tYXNrLCBub3csIDEpOworCWlmIChjcHUgIT0gbmV3X2NwdSkgeworCQlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwkJcGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW2lycV0gPSBjcHVtYXNrX29mX2NwdShuZXdfY3B1KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJvdGF0ZV9pcnFzX2Ftb25nX2NwdXModW5zaWduZWQgbG9uZyB1c2VmdWxfbG9hZF90aHJlc2hvbGQpCit7CisJaW50IGksIGo7CisJRHByaW50aygiUm90YXRpbmcgSVJRcyBhbW9uZyBDUFVzLlxuIik7CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlmb3IgKGogPSAwOyBjcHVfb25saW5lKGkpICYmIChqIDwgTlJfSVJRUyk7IGorKykgeworCQkJaWYgKCFpcnFfZGVzY1tqXS5hY3Rpb24pCisJCQkJY29udGludWU7CisJCQkvKiBJcyBpdCBhIHNpZ25pZmljYW50IGxvYWQgPyAgKi8KKwkJCWlmIChJUlFfREVMVEEoQ1BVX1RPX1BBQ0tBR0VJTkRFWChpKSxqKSA8CisJCQkJCQl1c2VmdWxfbG9hZF90aHJlc2hvbGQpCisJCQkJY29udGludWU7CisJCQliYWxhbmNlX2lycShpLCBqKTsKKwkJfQorCX0KKwliYWxhbmNlZF9pcnFfaW50ZXJ2YWwgPSBtYXgoKGxvbmcpTUlOX0JBTEFOQ0VEX0lSUV9JTlRFUlZBTCwKKwkJYmFsYW5jZWRfaXJxX2ludGVydmFsIC0gQkFMQU5DRURfSVJRX0xFU1NfREVMVEEpOwkKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGRvX2lycV9iYWxhbmNlKHZvaWQpCit7CisJaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBtYXhfY3B1X2lycSA9IDAsIG1pbl9jcHVfaXJxID0gKH4wKTsKKwl1bnNpZ25lZCBsb25nIG1vdmVfdGhpc19sb2FkID0gMDsKKwlpbnQgbWF4X2xvYWRlZCA9IDAsIG1pbl9sb2FkZWQgPSAwOworCWludCBsb2FkOworCXVuc2lnbmVkIGxvbmcgdXNlZnVsX2xvYWRfdGhyZXNob2xkID0gYmFsYW5jZWRfaXJxX2ludGVydmFsICsgMTA7CisJaW50IHNlbGVjdGVkX2lycTsKKwlpbnQgdG1wX2xvYWRlZCwgZmlyc3RfYXR0ZW1wdCA9IDE7CisJdW5zaWduZWQgbG9uZyB0bXBfY3B1X2lycTsKKwl1bnNpZ25lZCBsb25nIGltYmFsYW5jZSA9IDA7CisJY3B1bWFza190IGFsbG93ZWRfbWFzaywgdGFyZ2V0X2NwdV9tYXNrLCB0bXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCWludCBwYWNrYWdlX2luZGV4OworCQlDUFVfSVJRKGkpID0gMDsKKwkJaWYgKCFjcHVfb25saW5lKGkpKQorCQkJY29udGludWU7CisJCXBhY2thZ2VfaW5kZXggPSBDUFVfVE9fUEFDS0FHRUlOREVYKGkpOworCQlmb3IgKGogPSAwOyBqIDwgTlJfSVJRUzsgaisrKSB7CisJCQl1bnNpZ25lZCBsb25nIHZhbHVlX25vdywgZGVsdGE7CisJCQkvKiBJcyB0aGlzIGFuIGFjdGl2ZSBJUlE/ICovCisJCQlpZiAoIWlycV9kZXNjW2pdLmFjdGlvbikKKwkJCQljb250aW51ZTsKKwkJCWlmICggcGFja2FnZV9pbmRleCA9PSBpICkKKwkJCQlJUlFfREVMVEEocGFja2FnZV9pbmRleCxqKSA9IDA7CisJCQkvKiBEZXRlcm1pbmUgdGhlIHRvdGFsIGNvdW50IHBlciBwcm9jZXNzb3IgcGVyIElSUSAqLworCQkJdmFsdWVfbm93ID0gKHVuc2lnbmVkIGxvbmcpIGtzdGF0X2NwdShpKS5pcnFzW2pdOworCisJCQkvKiBEZXRlcm1pbmUgdGhlIGFjdGl2aXR5IHBlciBwcm9jZXNzb3IgcGVyIElSUSAqLworCQkJZGVsdGEgPSB2YWx1ZV9ub3cgLSBMQVNUX0NQVV9JUlEoaSxqKTsKKworCQkJLyogVXBkYXRlIGxhc3RfY3B1X2lycVtdW10gZm9yIHRoZSBuZXh0IHRpbWUgKi8KKwkJCUxBU1RfQ1BVX0lSUShpLGopID0gdmFsdWVfbm93OworCisJCQkvKiBJZ25vcmUgSVJRcyB3aG9zZSByYXRlIGlzIGxlc3MgdGhhbiB0aGUgY2xvY2sgKi8KKwkJCWlmIChkZWx0YSA8IHVzZWZ1bF9sb2FkX3RocmVzaG9sZCkKKwkJCQljb250aW51ZTsKKwkJCS8qIHVwZGF0ZSB0aGUgbG9hZCBmb3IgdGhlIHByb2Nlc3NvciBvciBwYWNrYWdlIHRvdGFsICovCisJCQlJUlFfREVMVEEocGFja2FnZV9pbmRleCxqKSArPSBkZWx0YTsKKworCQkJLyogS2VlcCB0cmFjayBvZiB0aGUgaGlnaGVyIG51bWJlcmVkIHNpYmxpbmcgYXMgd2VsbCAqLworCQkJaWYgKGkgIT0gcGFja2FnZV9pbmRleCkKKwkJCQlDUFVfSVJRKGkpICs9IGRlbHRhOworCQkJLyoKKwkJCSAqIFdlIGhhdmUgc2libGluZyBBIGFuZCBzaWJsaW5nIEIgaW4gdGhlIHBhY2thZ2UKKwkJCSAqCisJCQkgKiBjcHVfaXJxW0FdID0gbG9hZCBmb3IgY3B1IEEgKyBsb2FkIGZvciBjcHUgQgorCQkJICogY3B1X2lycVtCXSA9IGxvYWQgZm9yIGNwdSBCCisJCQkgKi8KKwkJCUNQVV9JUlEocGFja2FnZV9pbmRleCkgKz0gZGVsdGE7CisJCX0KKwl9CisJLyogRmluZCB0aGUgbGVhc3QgbG9hZGVkIHByb2Nlc3NvciBwYWNrYWdlICovCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNwdV9vbmxpbmUoaSkpCisJCQljb250aW51ZTsKKwkJaWYgKGkgIT0gQ1BVX1RPX1BBQ0tBR0VJTkRFWChpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobWluX2NwdV9pcnEgPiBDUFVfSVJRKGkpKSB7CisJCQltaW5fY3B1X2lycSA9IENQVV9JUlEoaSk7CisJCQltaW5fbG9hZGVkID0gaTsKKwkJfQorCX0KKwltYXhfY3B1X2lycSA9IFVMT05HX01BWDsKKwordHJ5YW5vdGhlcmNwdToKKwkvKiBMb29rIGZvciBoZWF2aWVzdCBsb2FkZWQgcHJvY2Vzc29yLgorCSAqIFdlIG1heSBjb21lIGJhY2sgdG8gZ2V0IHRoZSBuZXh0IGhlYXZpZXN0IGxvYWRlZCBwcm9jZXNzb3IuCisJICogU2tpcCBwcm9jZXNzb3JzIHdpdGggdHJpdmlhbCBsb2Fkcy4KKwkgKi8KKwl0bXBfY3B1X2lycSA9IDA7CisJdG1wX2xvYWRlZCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjcHVfb25saW5lKGkpKQorCQkJY29udGludWU7CisJCWlmIChpICE9IENQVV9UT19QQUNLQUdFSU5ERVgoaSkpCisJCQljb250aW51ZTsKKwkJaWYgKG1heF9jcHVfaXJxIDw9IENQVV9JUlEoaSkpIAorCQkJY29udGludWU7CisJCWlmICh0bXBfY3B1X2lycSA8IENQVV9JUlEoaSkpIHsKKwkJCXRtcF9jcHVfaXJxID0gQ1BVX0lSUShpKTsKKwkJCXRtcF9sb2FkZWQgPSBpOworCQl9CisJfQorCisJaWYgKHRtcF9sb2FkZWQgPT0gLTEpIHsKKyAJIC8qIEluIHRoZSBjYXNlIG9mIHNtYWxsIG51bWJlciBvZiBoZWF2eSBpbnRlcnJ1cHQgc291cmNlcywgCisJICAqIGxvYWRpbmcgc29tZSBvZiB0aGUgY3B1cyB0b28gbXVjaC4gV2UgdXNlIEluZ28ncyBvcmlnaW5hbCAKKwkgICogYXBwcm9hY2ggdG8gcm90YXRlIHRoZW0gYXJvdW5kLgorCSAgKi8KKwkJaWYgKCFmaXJzdF9hdHRlbXB0ICYmIGltYmFsYW5jZSA+PSB1c2VmdWxfbG9hZF90aHJlc2hvbGQpIHsKKwkJCXJvdGF0ZV9pcnFzX2Ftb25nX2NwdXModXNlZnVsX2xvYWRfdGhyZXNob2xkKTsKKwkJCXJldHVybjsKKwkJfQorCQlnb3RvIG5vdF93b3J0aF90aGVfZWZmb3J0OworCX0KKwkKKwlmaXJzdF9hdHRlbXB0ID0gMDsJCS8qIGhlYXZpZXN0IHNlYXJjaCAqLworCW1heF9jcHVfaXJxID0gdG1wX2NwdV9pcnE7CS8qIGxvYWQgKi8KKwltYXhfbG9hZGVkID0gdG1wX2xvYWRlZDsJLyogcHJvY2Vzc29yICovCisJaW1iYWxhbmNlID0gKG1heF9jcHVfaXJxIC0gbWluX2NwdV9pcnEpIC8gMjsKKwkKKwlEcHJpbnRrKCJtYXhfbG9hZGVkIGNwdSA9ICVkXG4iLCBtYXhfbG9hZGVkKTsKKwlEcHJpbnRrKCJtaW5fbG9hZGVkIGNwdSA9ICVkXG4iLCBtaW5fbG9hZGVkKTsKKwlEcHJpbnRrKCJtYXhfY3B1X2lycSBsb2FkID0gJWxkXG4iLCBtYXhfY3B1X2lycSk7CisJRHByaW50aygibWluX2NwdV9pcnEgbG9hZCA9ICVsZFxuIiwgbWluX2NwdV9pcnEpOworCURwcmludGsoImxvYWQgaW1iYWxhbmNlID0gJWx1XG4iLCBpbWJhbGFuY2UpOworCisJLyogaWYgaW1iYWxhbmNlIGlzIGxlc3MgdGhhbiBhcHByb3ggMTAlIG9mIG1heCBsb2FkLCB0aGVuCisJICogb2JzZXJ2ZSBkaW1pbmlzaGluZyByZXR1cm5zIGFjdGlvbi4gLSBxdWl0CisJICovCisJaWYgKGltYmFsYW5jZSA8IChtYXhfY3B1X2lycSA+PiAzKSkgeworCQlEcHJpbnRrKCJJbWJhbGFuY2UgdG9vIHRyaXZpYWxcbiIpOworCQlnb3RvIG5vdF93b3J0aF90aGVfZWZmb3J0OworCX0KKwordHJ5YW5vdGhlcmlycToKKwkvKiBpZiB3ZSBzZWxlY3QgYW4gSVJRIHRvIG1vdmUgdGhhdCBjYW4ndCBnbyB3aGVyZSB3ZSB3YW50LCB0aGVuCisJICogc2VlIGlmIHRoZXJlIGlzIGFub3RoZXIgb25lIHRvIHRyeS4KKwkgKi8KKwltb3ZlX3RoaXNfbG9hZCA9IDA7CisJc2VsZWN0ZWRfaXJxID0gLTE7CisJZm9yIChqID0gMDsgaiA8IE5SX0lSUVM7IGorKykgeworCQkvKiBJcyB0aGlzIGFuIGFjdGl2ZSBJUlE/ICovCisJCWlmICghaXJxX2Rlc2Nbal0uYWN0aW9uKQorCQkJY29udGludWU7CisJCWlmIChpbWJhbGFuY2UgPD0gSVJRX0RFTFRBKG1heF9sb2FkZWQsaikpCisJCQljb250aW51ZTsKKwkJLyogVHJ5IHRvIGZpbmQgdGhlIElSUSB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIGltYmFsYW5jZQorCQkgKiB3aXRob3V0IGdvaW5nIG92ZXIuCisJCSAqLworCQlpZiAobW92ZV90aGlzX2xvYWQgPCBJUlFfREVMVEEobWF4X2xvYWRlZCxqKSkgeworCQkJbW92ZV90aGlzX2xvYWQgPSBJUlFfREVMVEEobWF4X2xvYWRlZCxqKTsKKwkJCXNlbGVjdGVkX2lycSA9IGo7CisJCX0KKwl9CisJaWYgKHNlbGVjdGVkX2lycSA9PSAtMSkgeworCQlnb3RvIHRyeWFub3RoZXJjcHU7CisJfQorCisJaW1iYWxhbmNlID0gbW92ZV90aGlzX2xvYWQ7CisJCisJLyogRm9yIHBoeXNpY2FsX2JhbGFuY2UgY2FzZSwgd2UgYWNjdW1sYXRlZCBib3RoIGxvYWQKKwkgKiB2YWx1ZXMgaW4gdGhlIG9uZSBvZiB0aGUgc2libGluZ3MgY3B1X2lycVtdLAorCSAqIHRvIHVzZSB0aGUgc2FtZSBjb2RlIGZvciBwaHlzaWNhbCBhbmQgbG9naWNhbCBwcm9jZXNzb3JzCisJICogYXMgbXVjaCBhcyBwb3NzaWJsZS4gCisJICoKKwkgKiBOT1RFOiB0aGUgY3B1X2lycVtdIGFycmF5IGhvbGRzIHRoZSBzdW0gb2YgdGhlIGxvYWQgZm9yCisJICogc2libGluZyBBIGFuZCBzaWJsaW5nIEIgaW4gdGhlIHNsb3QgZm9yIHRoZSBsb3dlc3QgbnVtYmVyZWQKKwkgKiBzaWJsaW5nIChBKSwgX0FORF8gdGhlIGxvYWQgZm9yIHNpYmxpbmcgQiBpbiB0aGUgc2xvdCBmb3IKKwkgKiB0aGUgaGlnaGVyIG51bWJlcmVkIHNpYmxpbmcuCisJICoKKwkgKiBXZSBzZWVrIHRoZSBsZWFzdCBsb2FkZWQgc2libGluZyBieSBtYWtpbmcgdGhlIGNvbXBhcmlzb24KKwkgKiAoQStCKS8yIHZzIEIKKwkgKi8KKwlsb2FkID0gQ1BVX0lSUShtaW5fbG9hZGVkKSA+PiAxOworCWZvcl9lYWNoX2NwdV9tYXNrKGosIGNwdV9zaWJsaW5nX21hcFttaW5fbG9hZGVkXSkgeworCQlpZiAobG9hZCA+IENQVV9JUlEoaikpIHsKKwkJCS8qIFRoaXMgd29uJ3QgY2hhbmdlIGNwdV9zaWJsaW5nX21hcFttaW5fbG9hZGVkXSAqLworCQkJbG9hZCA9IENQVV9JUlEoaik7CisJCQltaW5fbG9hZGVkID0gajsKKwkJfQorCX0KKworCWNwdXNfYW5kKGFsbG93ZWRfbWFzaywgY3B1X29ubGluZV9tYXAsIGlycV9hZmZpbml0eVtzZWxlY3RlZF9pcnFdKTsKKwl0YXJnZXRfY3B1X21hc2sgPSBjcHVtYXNrX29mX2NwdShtaW5fbG9hZGVkKTsKKwljcHVzX2FuZCh0bXAsIHRhcmdldF9jcHVfbWFzaywgYWxsb3dlZF9tYXNrKTsKKworCWlmICghY3B1c19lbXB0eSh0bXApKSB7CisJCWlycV9kZXNjX3QgKmRlc2MgPSBpcnFfZGVzYyArIHNlbGVjdGVkX2lycTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlEcHJpbnRrKCJpcnEgPSAlZCBtb3ZlZCB0byBjcHUgPSAlZFxuIiwKKwkJCQlzZWxlY3RlZF9pcnEsIG1pbl9sb2FkZWQpOworCQkvKiBtYXJrIGZvciBjaGFuZ2UgZGVzdGluYXRpb24gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwkJcGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW3NlbGVjdGVkX2lycV0gPQorCQkJCQljcHVtYXNrX29mX2NwdShtaW5fbG9hZGVkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworCQkvKiBTaW5jZSB3ZSBtYWRlIGEgY2hhbmdlLCBjb21lIGJhY2sgc29vbmVyIHRvIAorCQkgKiBjaGVjayBmb3IgbW9yZSB2YXJpYXRpb24uCisJCSAqLworCQliYWxhbmNlZF9pcnFfaW50ZXJ2YWwgPSBtYXgoKGxvbmcpTUlOX0JBTEFOQ0VEX0lSUV9JTlRFUlZBTCwKKwkJCWJhbGFuY2VkX2lycV9pbnRlcnZhbCAtIEJBTEFOQ0VEX0lSUV9MRVNTX0RFTFRBKTsJCisJCXJldHVybjsKKwl9CisJZ290byB0cnlhbm90aGVyaXJxOworCitub3Rfd29ydGhfdGhlX2VmZm9ydDoKKwkvKgorCSAqIGlmIHdlIGRpZCBub3QgZmluZCBhbiBJUlEgdG8gbW92ZSwgdGhlbiBhZGp1c3QgdGhlIHRpbWUgaW50ZXJ2YWwKKwkgKiB1cHdhcmQKKwkgKi8KKwliYWxhbmNlZF9pcnFfaW50ZXJ2YWwgPSBtaW4oKGxvbmcpTUFYX0JBTEFOQ0VEX0lSUV9JTlRFUlZBTCwKKwkJYmFsYW5jZWRfaXJxX2ludGVydmFsICsgQkFMQU5DRURfSVJRX01PUkVfREVMVEEpOwkKKwlEcHJpbnRrKCJJUlEgd29ydGggcm90YXRpbmcgbm90IGZvdW5kXG4iKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgYmFsYW5jZWRfaXJxKHZvaWQgKnVudXNlZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHByZXZfYmFsYW5jZV90aW1lID0gamlmZmllczsKKwlsb25nIHRpbWVfcmVtYWluaW5nID0gYmFsYW5jZWRfaXJxX2ludGVydmFsOworCisJZGFlbW9uaXplKCJraXJxZCIpOworCQorCS8qIHB1c2ggZXZlcnl0aGluZyB0byBDUFUgMCB0byBnaXZlIHVzIGEgc3RhcnRpbmcgcG9pbnQuICAqLworCWZvciAoaSA9IDAgOyBpIDwgTlJfSVJRUyA7IGkrKykgeworCQlwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbaV0gPSBjcHVtYXNrX29mX2NwdSgwKTsKKwl9CisKKwlmb3IgKCA7IDsgKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXRpbWVfcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dCh0aW1lX3JlbWFpbmluZyk7CisJCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKKwkJCQlwcmV2X2JhbGFuY2VfdGltZStiYWxhbmNlZF9pcnFfaW50ZXJ2YWwpKSB7CisJCQlkb19pcnFfYmFsYW5jZSgpOworCQkJcHJldl9iYWxhbmNlX3RpbWUgPSBqaWZmaWVzOworCQkJdGltZV9yZW1haW5pbmcgPSBiYWxhbmNlZF9pcnFfaW50ZXJ2YWw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGJhbGFuY2VkX2lycV9pbml0KHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGNwdWluZm9feDg2ICpjOworCWNwdW1hc2tfdCB0bXA7CisKKwljcHVzX3NoaWZ0X3JpZ2h0KHRtcCwgY3B1X29ubGluZV9tYXAsIDIpOworICAgICAgICBjID0gJmJvb3RfY3B1X2RhdGE7CisJLyogV2hlbiBub3Qgb3ZlcndyaXR0ZW4gYnkgdGhlIGNvbW1hbmQgbGluZSBhc2sgc3ViYXJjaGl0ZWN0dXJlLiAqLworCWlmIChpcnFiYWxhbmNlX2Rpc2FibGVkID09IElSUUJBTEFOQ0VfQ0hFQ0tfQVJDSCkKKwkJaXJxYmFsYW5jZV9kaXNhYmxlZCA9IE5PX0JBTEFOQ0VfSVJROworCWlmIChpcnFiYWxhbmNlX2Rpc2FibGVkKQorCQlyZXR1cm4gMDsKKwkKKwkgLyogZGlzYWJsZSBpcnFiYWxhbmNlIGNvbXBsZXRlbHkgaWYgdGhlcmUgaXMgb25seSBvbmUgcHJvY2Vzc29yIG9ubGluZSAqLworCWlmIChudW1fb25saW5lX2NwdXMoKSA8IDIpIHsKKwkJaXJxYmFsYW5jZV9kaXNhYmxlZCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEVuYWJsZSBwaHlzaWNhbCBiYWxhbmNlIG9ubHkgaWYgbW9yZSB0aGFuIDEgcGh5c2ljYWwgcHJvY2Vzc29yCisJICogaXMgcHJlc2VudAorCSAqLworCWlmIChzbXBfbnVtX3NpYmxpbmdzID4gMSAmJiAhY3B1c19lbXB0eSh0bXApKQorCQlwaHlzaWNhbF9iYWxhbmNlID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjcHVfb25saW5lKGkpKQorCQkJY29udGludWU7CisJCWlycV9jcHVfZGF0YVtpXS5pcnFfZGVsdGEgPSBrbWFsbG9jKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIE5SX0lSUVMsIEdGUF9LRVJORUwpOworCQlpcnFfY3B1X2RhdGFbaV0ubGFzdF9pcnEgPSBrbWFsbG9jKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIE5SX0lSUVMsIEdGUF9LRVJORUwpOworCQlpZiAoaXJxX2NwdV9kYXRhW2ldLmlycV9kZWx0YSA9PSBOVUxMIHx8IGlycV9jcHVfZGF0YVtpXS5sYXN0X2lycSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJhbGFuY2VkX2lycV9pbml0OiBvdXQgb2YgbWVtb3J5Iik7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQltZW1zZXQoaXJxX2NwdV9kYXRhW2ldLmlycV9kZWx0YSwwLHNpemVvZih1bnNpZ25lZCBsb25nKSAqIE5SX0lSUVMpOworCQltZW1zZXQoaXJxX2NwdV9kYXRhW2ldLmxhc3RfaXJxLDAsc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogTlJfSVJRUyk7CisJfQorCQorCXByaW50ayhLRVJOX0lORk8gIlN0YXJ0aW5nIGJhbGFuY2VkX2lycVxuIik7CisJaWYgKGtlcm5lbF90aHJlYWQoYmFsYW5jZWRfaXJxLCBOVUxMLCBDTE9ORV9LRVJORUwpID49IDApIAorCQlyZXR1cm4gMDsKKwllbHNlIAorCQlwcmludGsoS0VSTl9FUlIgImJhbGFuY2VkX2lycV9pbml0OiBmYWlsZWQgdG8gc3Bhd24gYmFsYW5jZWRfaXJxIik7CitmYWlsZWQ6CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZihpcnFfY3B1X2RhdGFbaV0uaXJxX2RlbHRhKQorCQkJa2ZyZWUoaXJxX2NwdV9kYXRhW2ldLmlycV9kZWx0YSk7CisJCWlmKGlycV9jcHVfZGF0YVtpXS5sYXN0X2lycSkKKwkJCWtmcmVlKGlycV9jcHVfZGF0YVtpXS5sYXN0X2lycSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgX19pbml0IGlycWJhbGFuY2VfZGlzYWJsZShjaGFyICpzdHIpCit7CisJaXJxYmFsYW5jZV9kaXNhYmxlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK19fc2V0dXAoIm5vaXJxYmFsYW5jZSIsIGlycWJhbGFuY2VfZGlzYWJsZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtb3ZlX2lycShpbnQgaXJxKQoreworCS8qIG5vdGUgLSB3ZSBob2xkIHRoZSBkZXNjLT5sb2NrICovCisJaWYgKHVubGlrZWx5KCFjcHVzX2VtcHR5KHBlbmRpbmdfaXJxX2JhbGFuY2VfY3B1bWFza1tpcnFdKSkpIHsKKwkJc2V0X2lvYXBpY19hZmZpbml0eV9pcnEoaXJxLCBwZW5kaW5nX2lycV9iYWxhbmNlX2NwdW1hc2tbaXJxXSk7CisJCWNwdXNfY2xlYXIocGVuZGluZ19pcnFfYmFsYW5jZV9jcHVtYXNrW2lycV0pOworCX0KK30KKworbGF0ZV9pbml0Y2FsbChiYWxhbmNlZF9pcnFfaW5pdCk7CisKKyNlbHNlIC8qICFDT05GSUdfSVJRQkFMQU5DRSAqLworc3RhdGljIGlubGluZSB2b2lkIG1vdmVfaXJxKGludCBpcnEpIHsgfQorI2VuZGlmIC8qIENPTkZJR19JUlFCQUxBTkNFICovCisKKyNpZm5kZWYgQ09ORklHX1NNUAordm9pZCBmYXN0Y2FsbCBzZW5kX0lQSV9zZWxmKGludCB2ZWN0b3IpCit7CisJdW5zaWduZWQgaW50IGNmZzsKKworCS8qCisJICogV2FpdCBmb3IgaWRsZS4KKwkgKi8KKwlhcGljX3dhaXRfaWNyX2lkbGUoKTsKKwljZmcgPSBBUElDX0RNX0ZJWEVEIHwgQVBJQ19ERVNUX1NFTEYgfCB2ZWN0b3IgfCBBUElDX0RFU1RfTE9HSUNBTDsKKwkvKgorCSAqIFNlbmQgdGhlIElQSS4gVGhlIHdyaXRlIHRvIEFQSUNfSUNSIGZpcmVzIHRoaXMgb2ZmLgorCSAqLworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSLCBjZmcpOworfQorI2VuZGlmIC8qICFDT05GSUdfU01QICovCisKKworLyoKKyAqIHN1cHBvcnQgZm9yIGJyb2tlbiBNUCBCSU9TcywgZW5hYmxlcyBoYW5kLXJlZGlyZWN0aW9uIG9mIFBJUlEwLTcgdG8KKyAqIHNwZWNpZmljIENQVS1zaWRlIElSUXMuCisgKi8KKworI2RlZmluZSBNQVhfUElSUVMgOAorc3RhdGljIGludCBwaXJxX2VudHJpZXMgW01BWF9QSVJRU107CitzdGF0aWMgaW50IHBpcnFzX2VuYWJsZWQ7CitpbnQgc2tpcF9pb2FwaWNfc2V0dXA7CisKK3N0YXRpYyBpbnQgX19pbml0IGlvYXBpY19zZXR1cChjaGFyICpzdHIpCit7CisJc2tpcF9pb2FwaWNfc2V0dXAgPSAxOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJub2FwaWMiLCBpb2FwaWNfc2V0dXApOworCitzdGF0aWMgaW50IF9faW5pdCBpb2FwaWNfcGlycV9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGksIG1heDsKKwlpbnQgaW50c1tNQVhfUElSUVMrMV07CisKKwlnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9QSVJRUzsgaSsrKQorCQlwaXJxX2VudHJpZXNbaV0gPSAtMTsKKworCXBpcnFzX2VuYWJsZWQgPSAxOworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9JTkZPCisJCQkiUElSUSByZWRpcmVjdGlvbiwgd29ya2luZyBhcm91bmQgYnJva2VuIE1QLUJJT1MuXG4iKTsKKwltYXggPSBNQVhfUElSUVM7CisJaWYgKGludHNbMF0gPCBNQVhfUElSUVMpCisJCW1heCA9IGludHNbMF07CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHCisJCQkJIi4uLiBQSVJRJWQgLT4gSVJRICVkXG4iLCBpLCBpbnRzW2krMV0pOworCQkvKgorCQkgKiBQSVJRcyBhcmUgbWFwcGVkIHVwc2lkZSBkb3duLCB1c3VhbGx5LgorCQkgKi8KKwkJcGlycV9lbnRyaWVzW01BWF9QSVJRUy1pLTFdID0gaW50c1tpKzFdOworCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgicGlycT0iLCBpb2FwaWNfcGlycV9zZXR1cCk7CisKKy8qCisgKiBGaW5kIHRoZSBJUlEgZW50cnkgbnVtYmVyIG9mIGEgY2VydGFpbiBwaW4uCisgKi8KK3N0YXRpYyBpbnQgZmluZF9pcnFfZW50cnkoaW50IGFwaWMsIGludCBwaW4sIGludCB0eXBlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1wX2lycV9lbnRyaWVzOyBpKyspCisJCWlmIChtcF9pcnFzW2ldLm1wY19pcnF0eXBlID09IHR5cGUgJiYKKwkJICAgIChtcF9pcnFzW2ldLm1wY19kc3RhcGljID09IG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCB8fAorCQkgICAgIG1wX2lycXNbaV0ubXBjX2RzdGFwaWMgPT0gTVBfQVBJQ19BTEwpICYmCisJCSAgICBtcF9pcnFzW2ldLm1wY19kc3RpcnEgPT0gcGluKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBwaW4gdG8gd2hpY2ggSVJRW2lycV0gKElTQSkgaXMgY29ubmVjdGVkCisgKi8KK3N0YXRpYyBpbnQgZmluZF9pc2FfaXJxX3BpbihpbnQgaXJxLCBpbnQgdHlwZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtcF9pcnFfZW50cmllczsgaSsrKSB7CisJCWludCBsYnVzID0gbXBfaXJxc1tpXS5tcGNfc3JjYnVzOworCisJCWlmICgobXBfYnVzX2lkX3RvX3R5cGVbbGJ1c10gPT0gTVBfQlVTX0lTQSB8fAorCQkgICAgIG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19FSVNBIHx8CisJCSAgICAgbXBfYnVzX2lkX3RvX3R5cGVbbGJ1c10gPT0gTVBfQlVTX01DQSB8fAorCQkgICAgIG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19ORUM5OAorCQkgICAgKSAmJgorCQkgICAgKG1wX2lycXNbaV0ubXBjX2lycXR5cGUgPT0gdHlwZSkgJiYKKwkJICAgIChtcF9pcnFzW2ldLm1wY19zcmNidXNpcnEgPT0gaXJxKSkKKworCQkJcmV0dXJuIG1wX2lycXNbaV0ubXBjX2RzdGlycTsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICogRmluZCBhIHNwZWNpZmljIFBDSSBJUlEgZW50cnkuCisgKiBOb3QgYW4gX19pbml0LCBwb3NzaWJseSBuZWVkZWQgYnkgbW9kdWxlcworICovCitzdGF0aWMgaW50IHBpbl8yX2lycShpbnQgaWR4LCBpbnQgYXBpYywgaW50IHBpbik7CisKK2ludCBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IHBpbikKK3sKKwlpbnQgYXBpYywgaSwgYmVzdF9ndWVzcyA9IC0xOworCisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgInF1ZXJ5aW5nIFBDSSAtPiBJUlEgbWFwcGluZyBidXM6JWQsICIKKwkJInNsb3Q6JWQsIHBpbjolZC5cbiIsIGJ1cywgc2xvdCwgcGluKTsKKwlpZiAobXBfYnVzX2lkX3RvX3BjaV9idXNbYnVzXSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0kgQklPUyBwYXNzZWQgbm9uZXhpc3RlbnQgUENJIGJ1cyAlZCFcbiIsIGJ1cyk7CisJCXJldHVybiAtMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG1wX2lycV9lbnRyaWVzOyBpKyspIHsKKwkJaW50IGxidXMgPSBtcF9pcnFzW2ldLm1wY19zcmNidXM7CisKKwkJZm9yIChhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykKKwkJCWlmIChtcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQgPT0gbXBfaXJxc1tpXS5tcGNfZHN0YXBpYyB8fAorCQkJICAgIG1wX2lycXNbaV0ubXBjX2RzdGFwaWMgPT0gTVBfQVBJQ19BTEwpCisJCQkJYnJlYWs7CisKKwkJaWYgKChtcF9idXNfaWRfdG9fdHlwZVtsYnVzXSA9PSBNUF9CVVNfUENJKSAmJgorCQkgICAgIW1wX2lycXNbaV0ubXBjX2lycXR5cGUgJiYKKwkJICAgIChidXMgPT0gbGJ1cykgJiYKKwkJICAgIChzbG90ID09ICgobXBfaXJxc1tpXS5tcGNfc3JjYnVzaXJxID4+IDIpICYgMHgxZikpKSB7CisJCQlpbnQgaXJxID0gcGluXzJfaXJxKGksYXBpYyxtcF9pcnFzW2ldLm1wY19kc3RpcnEpOworCisJCQlpZiAoIShhcGljIHx8IElPX0FQSUNfSVJRKGlycSkpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAocGluID09IChtcF9pcnFzW2ldLm1wY19zcmNidXNpcnEgJiAzKSkKKwkJCQlyZXR1cm4gaXJxOworCQkJLyoKKwkJCSAqIFVzZSB0aGUgZmlyc3QgYWxsLWJ1dC1waW4gbWF0Y2hpbmcgZW50cnkgYXMgYQorCQkJICogYmVzdC1ndWVzcyBmdXp6eSByZXN1bHQgZm9yIGJyb2tlbiBtcHRhYmxlcy4KKwkJCSAqLworCQkJaWYgKGJlc3RfZ3Vlc3MgPCAwKQorCQkJCWJlc3RfZ3Vlc3MgPSBpcnE7CisJCX0KKwl9CisJcmV0dXJuIGJlc3RfZ3Vlc3M7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGN1cnJlbnRseSBpcyBvbmx5IGEgaGVscGVyIGZvciB0aGUgaTM4NiBzbXAgYm9vdCBwcm9jZXNzIHdoZXJlIAorICogd2UgbmVlZCB0byByZXByb2dyYW0gdGhlIGlvcmVkdGJscyB0byBjYXRlciBmb3IgdGhlIGNwdXMgd2hpY2ggaGF2ZSBjb21lIG9ubGluZQorICogc28gbWFzayBpbiBhbGwgY2FzZXMgc2hvdWxkIHNpbXBseSBiZSBUQVJHRVRfQ1BVUworICovCit2b2lkIF9faW5pdCBzZXR1cF9pb2FwaWNfZGVzdCh2b2lkKQoreworCWludCBwaW4sIGlvYXBpYywgaXJxLCBpcnFfZW50cnk7CisKKwlpZiAoc2tpcF9pb2FwaWNfc2V0dXAgPT0gMSkKKwkJcmV0dXJuOworCisJZm9yIChpb2FwaWMgPSAwOyBpb2FwaWMgPCBucl9pb2FwaWNzOyBpb2FwaWMrKykgeworCQlmb3IgKHBpbiA9IDA7IHBpbiA8IG5yX2lvYXBpY19yZWdpc3RlcnNbaW9hcGljXTsgcGluKyspIHsKKwkJCWlycV9lbnRyeSA9IGZpbmRfaXJxX2VudHJ5KGlvYXBpYywgcGluLCBtcF9JTlQpOworCQkJaWYgKGlycV9lbnRyeSA9PSAtMSkKKwkJCQljb250aW51ZTsKKwkJCWlycSA9IHBpbl8yX2lycShpcnFfZW50cnksIGlvYXBpYywgcGluKTsKKwkJCXNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKGlycSwgVEFSR0VUX0NQVVMpOworCQl9CisKKwl9Cit9CisKKy8qCisgKiBFSVNBIEVkZ2UvTGV2ZWwgY29udHJvbCByZWdpc3RlciwgRUxDUgorICovCitzdGF0aWMgaW50IEVJU0FfRUxDUih1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmIChpcnEgPCAxNikgeworCQl1bnNpZ25lZCBpbnQgcG9ydCA9IDB4NGQwICsgKGlycSA+PiAzKTsKKwkJcmV0dXJuIChpbmIocG9ydCkgPj4gKGlycSAmIDcpKSAmIDE7CisJfQorCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9JTkZPCisJCQkiQnJva2VuIE1QdGFibGUgcmVwb3J0cyBJU0EgaXJxICVkXG4iLCBpcnEpOworCXJldHVybiAwOworfQorCisvKiBFSVNBIGludGVycnVwdHMgYXJlIGFsd2F5cyBwb2xhcml0eSB6ZXJvIGFuZCBjYW4gYmUgZWRnZSBvciBsZXZlbAorICogdHJpZ2dlciBkZXBlbmRpbmcgb24gdGhlIEVMQ1IgdmFsdWUuICBJZiBhbiBpbnRlcnJ1cHQgaXMgbGlzdGVkIGFzCisgKiBFSVNBIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLCB0aGF0IG1lYW5zIGl0cyB0cmlnZ2VyIHR5cGUgbXVzdAorICogYmUgcmVhZCBpbiBmcm9tIHRoZSBFTENSICovCisKKyNkZWZpbmUgZGVmYXVsdF9FSVNBX3RyaWdnZXIoaWR4KQkoRUlTQV9FTENSKG1wX2lycXNbaWR4XS5tcGNfc3JjYnVzaXJxKSkKKyNkZWZpbmUgZGVmYXVsdF9FSVNBX3BvbGFyaXR5KGlkeCkJKDApCisKKy8qIElTQSBpbnRlcnJ1cHRzIGFyZSBhbHdheXMgcG9sYXJpdHkgemVybyBlZGdlIHRyaWdnZXJlZCwKKyAqIHdoZW4gbGlzdGVkIGFzIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLiAqLworCisjZGVmaW5lIGRlZmF1bHRfSVNBX3RyaWdnZXIoaWR4KQkoMCkKKyNkZWZpbmUgZGVmYXVsdF9JU0FfcG9sYXJpdHkoaWR4KQkoMCkKKworLyogUENJIGludGVycnVwdHMgYXJlIGFsd2F5cyBwb2xhcml0eSBvbmUgbGV2ZWwgdHJpZ2dlcmVkLAorICogd2hlbiBsaXN0ZWQgYXMgY29uZm9ybWluZyBpbiB0aGUgTVAgdGFibGUuICovCisKKyNkZWZpbmUgZGVmYXVsdF9QQ0lfdHJpZ2dlcihpZHgpCSgxKQorI2RlZmluZSBkZWZhdWx0X1BDSV9wb2xhcml0eShpZHgpCSgxKQorCisvKiBNQ0EgaW50ZXJydXB0cyBhcmUgYWx3YXlzIHBvbGFyaXR5IHplcm8gbGV2ZWwgdHJpZ2dlcmVkLAorICogd2hlbiBsaXN0ZWQgYXMgY29uZm9ybWluZyBpbiB0aGUgTVAgdGFibGUuICovCisKKyNkZWZpbmUgZGVmYXVsdF9NQ0FfdHJpZ2dlcihpZHgpCSgxKQorI2RlZmluZSBkZWZhdWx0X01DQV9wb2xhcml0eShpZHgpCSgwKQorCisvKiBORUM5OCBpbnRlcnJ1cHRzIGFyZSBhbHdheXMgcG9sYXJpdHkgemVybyBlZGdlIHRyaWdnZXJlZCwKKyAqIHdoZW4gbGlzdGVkIGFzIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLiAqLworCisjZGVmaW5lIGRlZmF1bHRfTkVDOThfdHJpZ2dlcihpZHgpICAgICAoMCkKKyNkZWZpbmUgZGVmYXVsdF9ORUM5OF9wb2xhcml0eShpZHgpICAgICgwKQorCitzdGF0aWMgaW50IF9faW5pdCBNUEJJT1NfcG9sYXJpdHkoaW50IGlkeCkKK3sKKwlpbnQgYnVzID0gbXBfaXJxc1tpZHhdLm1wY19zcmNidXM7CisJaW50IHBvbGFyaXR5OworCisJLyoKKwkgKiBEZXRlcm1pbmUgSVJRIGxpbmUgcG9sYXJpdHkgKGhpZ2ggYWN0aXZlIG9yIGxvdyBhY3RpdmUpOgorCSAqLworCXN3aXRjaCAobXBfaXJxc1tpZHhdLm1wY19pcnFmbGFnICYgMykKKwl7CisJCWNhc2UgMDogLyogY29uZm9ybXMsIGllLiBidXMtdHlwZSBkZXBlbmRlbnQgcG9sYXJpdHkgKi8KKwkJeworCQkJc3dpdGNoIChtcF9idXNfaWRfdG9fdHlwZVtidXNdKQorCQkJeworCQkJCWNhc2UgTVBfQlVTX0lTQTogLyogSVNBIHBpbiAqLworCQkJCXsKKwkJCQkJcG9sYXJpdHkgPSBkZWZhdWx0X0lTQV9wb2xhcml0eShpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfRUlTQTogLyogRUlTQSBwaW4gKi8KKwkJCQl7CisJCQkJCXBvbGFyaXR5ID0gZGVmYXVsdF9FSVNBX3BvbGFyaXR5KGlkeCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIE1QX0JVU19QQ0k6IC8qIFBDSSBwaW4gKi8KKwkJCQl7CisJCQkJCXBvbGFyaXR5ID0gZGVmYXVsdF9QQ0lfcG9sYXJpdHkoaWR4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgTVBfQlVTX01DQTogLyogTUNBIHBpbiAqLworCQkJCXsKKwkJCQkJcG9sYXJpdHkgPSBkZWZhdWx0X01DQV9wb2xhcml0eShpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfTkVDOTg6IC8qIE5FQyA5OCBwaW4gKi8KKwkJCQl7CisJCQkJCXBvbGFyaXR5ID0gZGVmYXVsdF9ORUM5OF9wb2xhcml0eShpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJyb2tlbiBCSU9TISFcbiIpOworCQkJCQlwb2xhcml0eSA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMTogLyogaGlnaCBhY3RpdmUgKi8KKwkJeworCQkJcG9sYXJpdHkgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAyOiAvKiByZXNlcnZlZCAqLworCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJicm9rZW4gQklPUyEhXG4iKTsKKwkJCXBvbGFyaXR5ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMzogLyogbG93IGFjdGl2ZSAqLworCQl7CisJCQlwb2xhcml0eSA9IDE7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OiAvKiBpbnZhbGlkICovCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJyb2tlbiBCSU9TISFcbiIpOworCQkJcG9sYXJpdHkgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHBvbGFyaXR5OworfQorCitzdGF0aWMgaW50IE1QQklPU190cmlnZ2VyKGludCBpZHgpCit7CisJaW50IGJ1cyA9IG1wX2lycXNbaWR4XS5tcGNfc3JjYnVzOworCWludCB0cmlnZ2VyOworCisJLyoKKwkgKiBEZXRlcm1pbmUgSVJRIHRyaWdnZXIgbW9kZSAoZWRnZSBvciBsZXZlbCBzZW5zaXRpdmUpOgorCSAqLworCXN3aXRjaCAoKG1wX2lycXNbaWR4XS5tcGNfaXJxZmxhZz4+MikgJiAzKQorCXsKKwkJY2FzZSAwOiAvKiBjb25mb3JtcywgaWUuIGJ1cy10eXBlIGRlcGVuZGVudCAqLworCQl7CisJCQlzd2l0Y2ggKG1wX2J1c19pZF90b190eXBlW2J1c10pCisJCQl7CisJCQkJY2FzZSBNUF9CVVNfSVNBOiAvKiBJU0EgcGluICovCisJCQkJeworCQkJCQl0cmlnZ2VyID0gZGVmYXVsdF9JU0FfdHJpZ2dlcihpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfRUlTQTogLyogRUlTQSBwaW4gKi8KKwkJCQl7CisJCQkJCXRyaWdnZXIgPSBkZWZhdWx0X0VJU0FfdHJpZ2dlcihpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfUENJOiAvKiBQQ0kgcGluICovCisJCQkJeworCQkJCQl0cmlnZ2VyID0gZGVmYXVsdF9QQ0lfdHJpZ2dlcihpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfTUNBOiAvKiBNQ0EgcGluICovCisJCQkJeworCQkJCQl0cmlnZ2VyID0gZGVmYXVsdF9NQ0FfdHJpZ2dlcihpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSBNUF9CVVNfTkVDOTg6IC8qIE5FQyA5OCBwaW4gKi8KKwkJCQl7CisJCQkJCXRyaWdnZXIgPSBkZWZhdWx0X05FQzk4X3RyaWdnZXIoaWR4KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJicm9rZW4gQklPUyEhXG4iKTsKKwkJCQkJdHJpZ2dlciA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMTogLyogZWRnZSAqLworCQl7CisJCQl0cmlnZ2VyID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMjogLyogcmVzZXJ2ZWQgKi8KKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnJva2VuIEJJT1MhIVxuIik7CisJCQl0cmlnZ2VyID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMzogLyogbGV2ZWwgKi8KKwkJeworCQkJdHJpZ2dlciA9IDE7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OiAvKiBpbnZhbGlkICovCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJyb2tlbiBCSU9TISFcbiIpOworCQkJdHJpZ2dlciA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gdHJpZ2dlcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXJxX3BvbGFyaXR5KGludCBpZHgpCit7CisJcmV0dXJuIE1QQklPU19wb2xhcml0eShpZHgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpcnFfdHJpZ2dlcihpbnQgaWR4KQoreworCXJldHVybiBNUEJJT1NfdHJpZ2dlcihpZHgpOworfQorCitzdGF0aWMgaW50IHBpbl8yX2lycShpbnQgaWR4LCBpbnQgYXBpYywgaW50IHBpbikKK3sKKwlpbnQgaXJxLCBpOworCWludCBidXMgPSBtcF9pcnFzW2lkeF0ubXBjX3NyY2J1czsKKworCS8qCisJICogRGVidWdnaW5nIGNoZWNrLCB3ZSBhcmUgaW4gYmlnIHRyb3VibGUgaWYgdGhpcyBtZXNzYWdlIHBvcHMgdXAhCisJICovCisJaWYgKG1wX2lycXNbaWR4XS5tcGNfZHN0aXJxICE9IHBpbikKKwkJcHJpbnRrKEtFUk5fRVJSICJicm9rZW4gQklPUyBvciBNUFRBQkxFIHBhcnNlciwgYXlpZWUhIVxuIik7CisKKwlzd2l0Y2ggKG1wX2J1c19pZF90b190eXBlW2J1c10pCisJeworCQljYXNlIE1QX0JVU19JU0E6IC8qIElTQSBwaW4gKi8KKwkJY2FzZSBNUF9CVVNfRUlTQToKKwkJY2FzZSBNUF9CVVNfTUNBOgorCQljYXNlIE1QX0JVU19ORUM5ODoKKwkJeworCQkJaXJxID0gbXBfaXJxc1tpZHhdLm1wY19zcmNidXNpcnE7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE1QX0JVU19QQ0k6IC8qIFBDSSBwaW4gKi8KKwkJeworCQkJLyoKKwkJCSAqIFBDSSBJUlFzIGFyZSBtYXBwZWQgaW4gb3JkZXIKKwkJCSAqLworCQkJaSA9IGlycSA9IDA7CisJCQl3aGlsZSAoaSA8IGFwaWMpCisJCQkJaXJxICs9IG5yX2lvYXBpY19yZWdpc3RlcnNbaSsrXTsKKwkJCWlycSArPSBwaW47CisKKwkJCS8qCisJCQkgKiBGb3IgTVBTIG1vZGUsIHNvIGZhciBvbmx5IG5lZWRlZCBieSBFUzcwMDAgcGxhdGZvcm0KKwkJCSAqLworCQkJaWYgKGlvYXBpY19yZW51bWJlcl9pcnEpCisJCQkJaXJxID0gaW9hcGljX3JlbnVtYmVyX2lycShhcGljLCBpcnEpOworCisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgInVua25vd24gYnVzIHR5cGUgJWQuXG4iLGJ1cyk7IAorCQkJaXJxID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBQQ0kgSVJRIGNvbW1hbmQgbGluZSByZWRpcmVjdGlvbi4gWWVzLCBsaW1pdHMgYXJlIGhhcmRjb2RlZC4KKwkgKi8KKwlpZiAoKHBpbiA+PSAxNikgJiYgKHBpbiA8PSAyMykpIHsKKwkJaWYgKHBpcnFfZW50cmllc1twaW4tMTZdICE9IC0xKSB7CisJCQlpZiAoIXBpcnFfZW50cmllc1twaW4tMTZdKSB7CisJCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHCisJCQkJCQkiZGlzYWJsaW5nIFBJUlElZFxuIiwgcGluLTE2KTsKKwkJCX0gZWxzZSB7CisJCQkJaXJxID0gcGlycV9lbnRyaWVzW3Bpbi0xNl07CisJCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHCisJCQkJCQkidXNpbmcgUElSUSVkIC0+IElSUSAlZFxuIiwKKwkJCQkJCXBpbi0xNiwgaXJxKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gaXJxOworfQorCitzdGF0aWMgaW5saW5lIGludCBJT19BUElDX2lycV90cmlnZ2VyKGludCBpcnEpCit7CisJaW50IGFwaWMsIGlkeCwgcGluOworCisJZm9yIChhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykgeworCQlmb3IgKHBpbiA9IDA7IHBpbiA8IG5yX2lvYXBpY19yZWdpc3RlcnNbYXBpY107IHBpbisrKSB7CisJCQlpZHggPSBmaW5kX2lycV9lbnRyeShhcGljLHBpbixtcF9JTlQpOworCQkJaWYgKChpZHggIT0gLTEpICYmIChpcnEgPT0gcGluXzJfaXJxKGlkeCxhcGljLHBpbikpKQorCQkJCXJldHVybiBpcnFfdHJpZ2dlcihpZHgpOworCQl9CisJfQorCS8qCisJICogbm9uZXhpc3RlbnQgSVJRcyBhcmUgZWRnZSBkZWZhdWx0CisJICovCisJcmV0dXJuIDA7Cit9CisKKy8qIGlycV92ZWN0b3JzIGlzIGluZGV4ZWQgYnkgdGhlIHN1bSBvZiBhbGwgUlRFcyBpbiBhbGwgSS9PIEFQSUNzLiAqLwordTggaXJxX3ZlY3RvcltOUl9JUlFfVkVDVE9SU10gPSB7IEZJUlNUX0RFVklDRV9WRUNUT1IgLCAwIH07CisKK2ludCBhc3NpZ25faXJxX3ZlY3RvcihpbnQgaXJxKQoreworCXN0YXRpYyBpbnQgY3VycmVudF92ZWN0b3IgPSBGSVJTVF9ERVZJQ0VfVkVDVE9SLCBvZmZzZXQgPSAwOworCisJQlVHX09OKGlycSA+PSBOUl9JUlFfVkVDVE9SUyk7CisJaWYgKGlycSAhPSBBVVRPX0FTU0lHTiAmJiBJT19BUElDX1ZFQ1RPUihpcnEpID4gMCkKKwkJcmV0dXJuIElPX0FQSUNfVkVDVE9SKGlycSk7CituZXh0OgorCWN1cnJlbnRfdmVjdG9yICs9IDg7CisJaWYgKGN1cnJlbnRfdmVjdG9yID09IFNZU0NBTExfVkVDVE9SKQorCQlnb3RvIG5leHQ7CisKKwlpZiAoY3VycmVudF92ZWN0b3IgPj0gRklSU1RfU1lTVEVNX1ZFQ1RPUikgeworCQlvZmZzZXQrKzsKKwkJaWYgKCEob2Zmc2V0JTgpKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCWN1cnJlbnRfdmVjdG9yID0gRklSU1RfREVWSUNFX1ZFQ1RPUiArIG9mZnNldDsKKwl9CisKKwl2ZWN0b3JfaXJxW2N1cnJlbnRfdmVjdG9yXSA9IGlycTsKKwlpZiAoaXJxICE9IEFVVE9fQVNTSUdOKQorCQlJT19BUElDX1ZFQ1RPUihpcnEpID0gY3VycmVudF92ZWN0b3I7CisKKwlyZXR1cm4gY3VycmVudF92ZWN0b3I7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2xldmVsX3R5cGU7CitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlvYXBpY19lZGdlX3R5cGU7CisKKyNkZWZpbmUgSU9BUElDX0FVVE8JLTEKKyNkZWZpbmUgSU9BUElDX0VER0UJMAorI2RlZmluZSBJT0FQSUNfTEVWRUwJMQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW9hcGljX3JlZ2lzdGVyX2ludHIoaW50IGlycSwgaW50IHZlY3RvciwgdW5zaWduZWQgbG9uZyB0cmlnZ2VyKQoreworCWlmICh1c2VfcGNpX3ZlY3RvcigpICYmICFwbGF0Zm9ybV9sZWdhY3lfaXJxKGlycSkpIHsKKwkJaWYgKCh0cmlnZ2VyID09IElPQVBJQ19BVVRPICYmIElPX0FQSUNfaXJxX3RyaWdnZXIoaXJxKSkgfHwKKwkJCQl0cmlnZ2VyID09IElPQVBJQ19MRVZFTCkKKwkJCWlycV9kZXNjW3ZlY3Rvcl0uaGFuZGxlciA9ICZpb2FwaWNfbGV2ZWxfdHlwZTsKKwkJZWxzZQorCQkJaXJxX2Rlc2NbdmVjdG9yXS5oYW5kbGVyID0gJmlvYXBpY19lZGdlX3R5cGU7CisJCXNldF9pbnRyX2dhdGUodmVjdG9yLCBpbnRlcnJ1cHRbdmVjdG9yXSk7CisJfSBlbHNlCXsKKwkJaWYgKCh0cmlnZ2VyID09IElPQVBJQ19BVVRPICYmIElPX0FQSUNfaXJxX3RyaWdnZXIoaXJxKSkgfHwKKwkJCQl0cmlnZ2VyID09IElPQVBJQ19MRVZFTCkKKwkJCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZpb2FwaWNfbGV2ZWxfdHlwZTsKKwkJZWxzZQorCQkJaXJxX2Rlc2NbaXJxXS5oYW5kbGVyID0gJmlvYXBpY19lZGdlX3R5cGU7CisJCXNldF9pbnRyX2dhdGUodmVjdG9yLCBpbnRlcnJ1cHRbaXJxXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfSU9fQVBJQ19pcnFzKHZvaWQpCit7CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisJaW50IGFwaWMsIHBpbiwgaWR4LCBpcnEsIGZpcnN0X25vdGNvbiA9IDEsIHZlY3RvcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHICJpbml0IElPX0FQSUMgSVJRc1xuIik7CisKKwlmb3IgKGFwaWMgPSAwOyBhcGljIDwgbnJfaW9hcGljczsgYXBpYysrKSB7CisJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNdOyBwaW4rKykgeworCisJCS8qCisJCSAqIGFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKKwkJICovCisJCW1lbXNldCgmZW50cnksMCxzaXplb2YoZW50cnkpKTsKKworCQllbnRyeS5kZWxpdmVyeV9tb2RlID0gSU5UX0RFTElWRVJZX01PREU7CisJCWVudHJ5LmRlc3RfbW9kZSA9IElOVF9ERVNUX01PREU7CisJCWVudHJ5Lm1hc2sgPSAwOwkJCQkvKiBlbmFibGUgSVJRICovCisJCWVudHJ5LmRlc3QubG9naWNhbC5sb2dpY2FsX2Rlc3QgPSAKKwkJCQkJY3B1X21hc2tfdG9fYXBpY2lkKFRBUkdFVF9DUFVTKTsKKworCQlpZHggPSBmaW5kX2lycV9lbnRyeShhcGljLHBpbixtcF9JTlQpOworCQlpZiAoaWR4ID09IC0xKSB7CisJCQlpZiAoZmlyc3Rfbm90Y29uKSB7CisJCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHCisJCQkJCQkiIElPLUFQSUMgKGFwaWNpZC1waW4pICVkLSVkIiwKKwkJCQkJCW1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCwKKwkJCQkJCXBpbik7CisJCQkJZmlyc3Rfbm90Y29uID0gMDsKKwkJCX0gZWxzZQorCQkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIiwgJWQtJWQiLAorCQkJCQltcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQsIHBpbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVudHJ5LnRyaWdnZXIgPSBpcnFfdHJpZ2dlcihpZHgpOworCQllbnRyeS5wb2xhcml0eSA9IGlycV9wb2xhcml0eShpZHgpOworCisJCWlmIChpcnFfdHJpZ2dlcihpZHgpKSB7CisJCQllbnRyeS50cmlnZ2VyID0gMTsKKwkJCWVudHJ5Lm1hc2sgPSAxOworCQl9CisKKwkJaXJxID0gcGluXzJfaXJxKGlkeCwgYXBpYywgcGluKTsKKwkJLyoKKwkJICogc2tpcCBhZGRpbmcgdGhlIHRpbWVyIGludCBvbiBzZWNvbmRhcnkgbm9kZXMsIHdoaWNoIGNhdXNlcworCQkgKiBhIHNtYWxsIGJ1dCBwYWluZnVsIHJpZnQgaW4gdGhlIHRpbWUtc3BhY2UgY29udGludXVtCisJCSAqLworCQlpZiAobXVsdGlfdGltZXJfY2hlY2soYXBpYywgaXJxKSkKKwkJCWNvbnRpbnVlOworCQllbHNlCisJCQlhZGRfcGluX3RvX2lycShpcnEsIGFwaWMsIHBpbik7CisKKwkJaWYgKCFhcGljICYmICFJT19BUElDX0lSUShpcnEpKQorCQkJY29udGludWU7CisKKwkJaWYgKElPX0FQSUNfSVJRKGlycSkpIHsKKwkJCXZlY3RvciA9IGFzc2lnbl9pcnFfdmVjdG9yKGlycSk7CisJCQllbnRyeS52ZWN0b3IgPSB2ZWN0b3I7CisJCQlpb2FwaWNfcmVnaXN0ZXJfaW50cihpcnEsIHZlY3RvciwgSU9BUElDX0FVVE8pOworCQkKKwkJCWlmICghYXBpYyAmJiAoaXJxIDwgMTYpKQorCQkJCWRpc2FibGVfODI1OUFfaXJxKGlycSk7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMSsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMSkpOworCQlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTArMipwaW4sICooKChpbnQgKikmZW50cnkpKzApKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwl9CisJfQorCisJaWYgKCFmaXJzdF9ub3Rjb24pCisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIiBub3QgY29ubmVjdGVkLlxuIik7Cit9CisKKy8qCisgKiBTZXQgdXAgdGhlIDgyNTlBLW1hc3RlciBvdXRwdXQgcGluOgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfRXh0SU5UX0lSUTBfcGluKHVuc2lnbmVkIGludCBwaW4sIGludCB2ZWN0b3IpCit7CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW1lbXNldCgmZW50cnksMCxzaXplb2YoZW50cnkpKTsKKworCWRpc2FibGVfODI1OUFfaXJxKDApOworCisJLyogbWFzayBMVlQwICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0xWVF9NQVNLRUQgfCBBUElDX0RNX0VYVElOVCk7CisKKwkvKgorCSAqIFdlIHVzZSBsb2dpY2FsIGRlbGl2ZXJ5IHRvIGdldCB0aGUgdGltZXIgSVJRCisJICogdG8gdGhlIGZpcnN0IENQVS4KKwkgKi8KKwllbnRyeS5kZXN0X21vZGUgPSBJTlRfREVTVF9NT0RFOworCWVudHJ5Lm1hc2sgPSAwOwkJCQkJLyogdW5tYXNrIElSUSBub3cgKi8KKwllbnRyeS5kZXN0LmxvZ2ljYWwubG9naWNhbF9kZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKFRBUkdFVF9DUFVTKTsKKwllbnRyeS5kZWxpdmVyeV9tb2RlID0gSU5UX0RFTElWRVJZX01PREU7CisJZW50cnkucG9sYXJpdHkgPSAwOworCWVudHJ5LnRyaWdnZXIgPSAwOworCWVudHJ5LnZlY3RvciA9IHZlY3RvcjsKKworCS8qCisJICogVGhlIHRpbWVyIElSUSBkb2Vzbid0IGhhdmUgdG8ga25vdyB0aGF0IGJlaGluZCB0aGUKKwkgKiBzY2VuZSB3ZSBoYXZlIGEgODI1OUEtbWFzdGVyIGluIEFFT0kgbW9kZSAuLi4KKwkgKi8KKwlpcnFfZGVzY1swXS5oYW5kbGVyID0gJmlvYXBpY19lZGdlX3R5cGU7CisKKwkvKgorCSAqIEFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlpb19hcGljX3dyaXRlKDAsIDB4MTErMipwaW4sICooKChpbnQgKikmZW50cnkpKzEpKTsKKwlpb19hcGljX3dyaXRlKDAsIDB4MTArMipwaW4sICooKChpbnQgKikmZW50cnkpKzApKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJZW5hYmxlXzgyNTlBX2lycSgwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFVORVhQRUNURURfSU9fQVBJQyh2b2lkKQoreworfQorCit2b2lkIF9faW5pdCBwcmludF9JT19BUElDKHZvaWQpCit7CisJaW50IGFwaWMsIGk7CisJdW5pb24gSU9fQVBJQ19yZWdfMDAgcmVnXzAwOworCXVuaW9uIElPX0FQSUNfcmVnXzAxIHJlZ18wMTsKKwl1bmlvbiBJT19BUElDX3JlZ18wMiByZWdfMDI7CisJdW5pb24gSU9fQVBJQ19yZWdfMDMgcmVnXzAzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKKwkJcmV0dXJuOworCisgCXByaW50ayhLRVJOX0RFQlVHICJudW1iZXIgb2YgTVAgSVJRIHNvdXJjZXM6ICVkLlxuIiwgbXBfaXJxX2VudHJpZXMpOworCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspCisJCXByaW50ayhLRVJOX0RFQlVHICJudW1iZXIgb2YgSU8tQVBJQyAjJWQgcmVnaXN0ZXJzOiAlZC5cbiIsCisJCSAgICAgICBtcF9pb2FwaWNzW2ldLm1wY19hcGljaWQsIG5yX2lvYXBpY19yZWdpc3RlcnNbaV0pOworCisJLyoKKwkgKiBXZSBhcmUgYSBiaXQgY29uc2VydmF0aXZlIGFib3V0IHdoYXQgd2UgZXhwZWN0LiAgV2UgaGF2ZSB0bworCSAqIGtub3cgYWJvdXQgZXZlcnkgaGFyZHdhcmUgY2hhbmdlIEFTQVAuCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAidGVzdGluZyB0aGUgSU8gQVBJQy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4iKTsKKworCWZvciAoYXBpYyA9IDA7IGFwaWMgPCBucl9pb2FwaWNzOyBhcGljKyspIHsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCXJlZ18wMC5yYXcgPSBpb19hcGljX3JlYWQoYXBpYywgMCk7CisJcmVnXzAxLnJhdyA9IGlvX2FwaWNfcmVhZChhcGljLCAxKTsKKwlpZiAocmVnXzAxLmJpdHMudmVyc2lvbiA+PSAweDEwKQorCQlyZWdfMDIucmF3ID0gaW9fYXBpY19yZWFkKGFwaWMsIDIpOworCWlmIChyZWdfMDEuYml0cy52ZXJzaW9uID49IDB4MjApCisJCXJlZ18wMy5yYXcgPSBpb19hcGljX3JlYWQoYXBpYywgMyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJJTyBBUElDICMlZC4uLi4uLlxuIiwgbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uLiByZWdpc3RlciAjMDA6ICUwOFhcbiIsIHJlZ18wMC5yYXcpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4uLi4uICAgIDogcGh5c2ljYWwgQVBJQyBpZDogJTAyWFxuIiwgcmVnXzAwLmJpdHMuSUQpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4uLi4uICAgIDogRGVsaXZlcnkgVHlwZTogJVhcbiIsIHJlZ18wMC5iaXRzLmRlbGl2ZXJ5X3R5cGUpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4uLi4uICAgIDogTFRTICAgICAgICAgIDogJVhcbiIsIHJlZ18wMC5iaXRzLkxUUyk7CisJaWYgKHJlZ18wMC5iaXRzLklEID49IGdldF9waHlzaWNhbF9icm9hZGNhc3QoKSkKKwkJVU5FWFBFQ1RFRF9JT19BUElDKCk7CisJaWYgKHJlZ18wMC5iaXRzLl9fcmVzZXJ2ZWRfMSB8fCByZWdfMDAuYml0cy5fX3Jlc2VydmVkXzIpCisJCVVORVhQRUNURURfSU9fQVBJQygpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4gcmVnaXN0ZXIgIzAxOiAlMDhYXG4iLCByZWdfMDEucmF3KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICAgOiBtYXggcmVkaXJlY3Rpb24gZW50cmllczogJTA0WFxuIiwgcmVnXzAxLmJpdHMuZW50cmllcyk7CisJaWYgKAkocmVnXzAxLmJpdHMuZW50cmllcyAhPSAweDBmKSAmJiAvKiBvbGRlciAoTmVwdHVuZSkgYm9hcmRzICovCisJCShyZWdfMDEuYml0cy5lbnRyaWVzICE9IDB4MTcpICYmIC8qIHR5cGljYWwgSVNBK1BDSSBib2FyZHMgKi8KKwkJKHJlZ18wMS5iaXRzLmVudHJpZXMgIT0gMHgxYikgJiYgLyogQ29tcGFxIFByb2xpYW50IGJvYXJkcyAqLworCQkocmVnXzAxLmJpdHMuZW50cmllcyAhPSAweDFmKSAmJiAvKiBkdWFsIFhlb24gYm9hcmRzICovCisJCShyZWdfMDEuYml0cy5lbnRyaWVzICE9IDB4MjIpICYmIC8qIGJpZ2dlciBYZW9uIGJvYXJkcyAqLworCQkocmVnXzAxLmJpdHMuZW50cmllcyAhPSAweDJFKSAmJgorCQkocmVnXzAxLmJpdHMuZW50cmllcyAhPSAweDNGKQorCSkKKwkJVU5FWFBFQ1RFRF9JT19BUElDKCk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICAgOiBQUlEgaW1wbGVtZW50ZWQ6ICVYXG4iLCByZWdfMDEuYml0cy5QUlEpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4uLi4uICAgICA6IElPIEFQSUMgdmVyc2lvbjogJTA0WFxuIiwgcmVnXzAxLmJpdHMudmVyc2lvbik7CisJaWYgKAkocmVnXzAxLmJpdHMudmVyc2lvbiAhPSAweDAxKSAmJiAvKiA4MjQ4OURYIElPLUFQSUNzICovCisJCShyZWdfMDEuYml0cy52ZXJzaW9uICE9IDB4MTApICYmIC8qIG9sZGVzdCBJTy1BUElDcyAqLworCQkocmVnXzAxLmJpdHMudmVyc2lvbiAhPSAweDExKSAmJiAvKiBQZW50aXVtL1BybyBJTy1BUElDcyAqLworCQkocmVnXzAxLmJpdHMudmVyc2lvbiAhPSAweDEzKSAmJiAvKiBYZW9uIElPLUFQSUNzICovCisJCShyZWdfMDEuYml0cy52ZXJzaW9uICE9IDB4MjApICAgIC8qIEludGVsIFA2NEggKDgyODA2IEFBKSAqLworCSkKKwkJVU5FWFBFQ1RFRF9JT19BUElDKCk7CisJaWYgKHJlZ18wMS5iaXRzLl9fcmVzZXJ2ZWRfMSB8fCByZWdfMDEuYml0cy5fX3Jlc2VydmVkXzIpCisJCVVORVhQRUNURURfSU9fQVBJQygpOworCisJLyoKKwkgKiBTb21lIEludGVsIGNoaXBzZXRzIHdpdGggSU8gQVBJQyBWRVJTSU9OIG9mIDB4MT8gZG9uJ3QgaGF2ZSByZWdfMDIsCisJICogYnV0IHRoZSB2YWx1ZSBvZiByZWdfMDIgaXMgcmVhZCBhcyB0aGUgcHJldmlvdXMgcmVhZCByZWdpc3RlcgorCSAqIHZhbHVlLCBzbyBpZ25vcmUgaXQgaWYgcmVnXzAyID09IHJlZ18wMS4KKwkgKi8KKwlpZiAocmVnXzAxLmJpdHMudmVyc2lvbiA+PSAweDEwICYmIHJlZ18wMi5yYXcgIT0gcmVnXzAxLnJhdykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uLiByZWdpc3RlciAjMDI6ICUwOFhcbiIsIHJlZ18wMi5yYXcpOworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICAgOiBhcmJpdHJhdGlvbjogJTAyWFxuIiwgcmVnXzAyLmJpdHMuYXJiaXRyYXRpb24pOworCQlpZiAocmVnXzAyLmJpdHMuX19yZXNlcnZlZF8xIHx8IHJlZ18wMi5iaXRzLl9fcmVzZXJ2ZWRfMikKKwkJCVVORVhQRUNURURfSU9fQVBJQygpOworCX0KKworCS8qCisJICogU29tZSBJbnRlbCBjaGlwc2V0cyB3aXRoIElPIEFQSUMgVkVSU0lPTiBvZiAweDI/IGRvbid0IGhhdmUgcmVnXzAyCisJICogb3IgcmVnXzAzLCBidXQgdGhlIHZhbHVlIG9mIHJlZ18wWzIzXSBpcyByZWFkIGFzIHRoZSBwcmV2aW91cyByZWFkCisJICogcmVnaXN0ZXIgdmFsdWUsIHNvIGlnbm9yZSBpdCBpZiByZWdfMDMgPT0gcmVnXzBbMTJdLgorCSAqLworCWlmIChyZWdfMDEuYml0cy52ZXJzaW9uID49IDB4MjAgJiYgcmVnXzAzLnJhdyAhPSByZWdfMDIucmF3ICYmCisJICAgIHJlZ18wMy5yYXcgIT0gcmVnXzAxLnJhdykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uLiByZWdpc3RlciAjMDM6ICUwOFhcbiIsIHJlZ18wMy5yYXcpOworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uLi4uLiAgICAgOiBCb290IERUICAgIDogJVhcbiIsIHJlZ18wMy5iaXRzLmJvb3RfRFQpOworCQlpZiAocmVnXzAzLmJpdHMuX19yZXNlcnZlZF8xKQorCQkJVU5FWFBFQ1RFRF9JT19BUElDKCk7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLi4gSVJRIHJlZGlyZWN0aW9uIHRhYmxlOlxuIik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiIE5SIExvZyBQaHkgTWFzayBUcmlnIElSUiBQb2wiCisJCQkgICIgU3RhdCBEZXN0IERlbGkgVmVjdDogICBcbiIpOworCisJZm9yIChpID0gMDsgaSA8PSByZWdfMDEuYml0cy5lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCSooKChpbnQgKikmZW50cnkpKzApID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTAraSoyKTsKKwkJKigoKGludCAqKSZlbnRyeSkrMSkgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMStpKjIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJCXByaW50ayhLRVJOX0RFQlVHICIgJTAyeCAlMDNYICUwMlggICIsCisJCQlpLAorCQkJZW50cnkuZGVzdC5sb2dpY2FsLmxvZ2ljYWxfZGVzdCwKKwkJCWVudHJ5LmRlc3QucGh5c2ljYWwucGh5c2ljYWxfZGVzdAorCQkpOworCisJCXByaW50aygiJTFkICAgICUxZCAgICAlMWQgICAlMWQgICAlMWQgICAgJTFkICAgICUxZCAgICAlMDJYXG4iLAorCQkJZW50cnkubWFzaywKKwkJCWVudHJ5LnRyaWdnZXIsCisJCQllbnRyeS5pcnIsCisJCQllbnRyeS5wb2xhcml0eSwKKwkJCWVudHJ5LmRlbGl2ZXJ5X3N0YXR1cywKKwkJCWVudHJ5LmRlc3RfbW9kZSwKKwkJCWVudHJ5LmRlbGl2ZXJ5X21vZGUsCisJCQllbnRyeS52ZWN0b3IKKwkJKTsKKwl9CisJfQorCWlmICh1c2VfcGNpX3ZlY3RvcigpKQorCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyB2ZWN0b3ItYmFzZWQgaW5kZXhpbmdcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJJUlEgdG8gcGluIG1hcHBpbmdzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgeworCQlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeSA9IGlycV8yX3BpbiArIGk7CisJCWlmIChlbnRyeS0+cGluIDwgMCkKKwkJCWNvbnRpbnVlOworIAkJaWYgKHVzZV9wY2lfdmVjdG9yKCkgJiYgIXBsYXRmb3JtX2xlZ2FjeV9pcnEoaSkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiSVJRJWQgIiwgSU9fQVBJQ19WRUNUT1IoaSkpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9ERUJVRyAiSVJRJWQgIiwgaSk7CisJCWZvciAoOzspIHsKKwkJCXByaW50aygiLT4gJWQ6JWQiLCBlbnRyeS0+YXBpYywgZW50cnktPnBpbik7CisJCQlpZiAoIWVudHJ5LT5uZXh0KQorCQkJCWJyZWFrOworCQkJZW50cnkgPSBpcnFfMl9waW4gKyBlbnRyeS0+bmV4dDsKKwkJfQorCQlwcmludGsoIlxuIik7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIGRvbmUuXG4iKTsKKworCXJldHVybjsKK30KKworI2lmIDAKKworc3RhdGljIHZvaWQgcHJpbnRfQVBJQ19iaXRmaWVsZCAoaW50IGJhc2UpCit7CisJdW5zaWduZWQgaW50IHY7CisJaW50IGksIGo7CisKKwlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fREVCVUcgIjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmXG4iIEtFUk5fREVCVUcpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJdiA9IGFwaWNfcmVhZChiYXNlICsgaSoweDEwKTsKKwkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKKwkJCWlmICh2ICYgKDE8PGopKQorCQkJCXByaW50aygiMSIpOworCQkJZWxzZQorCQkJCXByaW50aygiMCIpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisKK3ZvaWQgLypfX2luaXQqLyBwcmludF9sb2NhbF9BUElDKHZvaWQgKiBkdW1teSkKK3sKKwl1bnNpZ25lZCBpbnQgdiwgdmVyLCBtYXhsdnQ7CisKKwlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKKwkJcmV0dXJuOworCisJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAicHJpbnRpbmcgbG9jYWwgQVBJQyBjb250ZW50cyBvbiBDUFUjJWQvJWQ6XG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfSUQpOworCXByaW50ayhLRVJOX0lORk8gIi4uLiBBUElDIElEOiAgICAgICUwOHggKCUwMXgpXG4iLCB2LCBHRVRfQVBJQ19JRCh2KSk7CisJdiA9IGFwaWNfcmVhZChBUElDX0xWUik7CisJcHJpbnRrKEtFUk5fSU5GTyAiLi4uIEFQSUMgVkVSU0lPTjogJTA4eFxuIiwgdik7CisJdmVyID0gR0VUX0FQSUNfVkVSU0lPTih2KTsKKwltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisKKwl2ID0gYXBpY19yZWFkKEFQSUNfVEFTS1BSSSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIFRBU0tQUkk6ICUwOHggKCUwMngpXG4iLCB2LCB2ICYgQVBJQ19UUFJJX01BU0spOworCisJaWYgKEFQSUNfSU5URUdSQVRFRCh2ZXIpKSB7CQkJLyogITgyNDg5RFggKi8KKwkJdiA9IGFwaWNfcmVhZChBUElDX0FSQlBSSSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBBUkJQUkk6ICUwOHggKCUwMngpXG4iLCB2LAorCQkJdiAmIEFQSUNfQVJCUFJJX01BU0spOworCQl2ID0gYXBpY19yZWFkKEFQSUNfUFJPQ1BSSSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBQUk9DUFJJOiAlMDh4XG4iLCB2KTsKKwl9CisKKwl2ID0gYXBpY19yZWFkKEFQSUNfRU9JKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgRU9JOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfUlJSKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgUlJSOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfTERSKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgTERSOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfREZSKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgREZSOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfU1BJVik7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIFNQSVY6ICUwOHhcbiIsIHYpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIElTUiBmaWVsZDpcbiIpOworCXByaW50X0FQSUNfYml0ZmllbGQoQVBJQ19JU1IpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBUTVIgZmllbGQ6XG4iKTsKKwlwcmludF9BUElDX2JpdGZpZWxkKEFQSUNfVE1SKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgSVJSIGZpZWxkOlxuIik7CisJcHJpbnRfQVBJQ19iaXRmaWVsZChBUElDX0lSUik7CisKKwlpZiAoQVBJQ19JTlRFR1JBVEVEKHZlcikpIHsJCS8qICE4MjQ4OURYICovCisJCWlmIChtYXhsdnQgPiAzKQkJLyogRHVlIHRvIHRoZSBQZW50aXVtIGVycmF0dW0gM0FQLiAqLworCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCXYgPSBhcGljX3JlYWQoQVBJQ19FU1IpOworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgRVNSOiAlMDh4XG4iLCB2KTsKKwl9CisKKwl2ID0gYXBpY19yZWFkKEFQSUNfSUNSKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgSUNSOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfSUNSMik7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIElDUjI6ICUwOHhcbiIsIHYpOworCisJdiA9IGFwaWNfcmVhZChBUElDX0xWVFQpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBMVlRUOiAlMDh4XG4iLCB2KTsKKworCWlmIChtYXhsdnQgPiAzKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQQyBpcyBMVlQjNC4gKi8KKwkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFBDKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIExWVFBDOiAlMDh4XG4iLCB2KTsKKwl9CisJdiA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBMVlQwOiAlMDh4XG4iLCB2KTsKKwl2ID0gYXBpY19yZWFkKEFQSUNfTFZUMSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIExWVDE6ICUwOHhcbiIsIHYpOworCisJaWYgKG1heGx2dCA+IDIpIHsJCQkvKiBFUlIgaXMgTFZUIzMuICovCisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRFUlIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgTFZURVJSOiAlMDh4XG4iLCB2KTsKKwl9CisKKwl2ID0gYXBpY19yZWFkKEFQSUNfVE1JQ1QpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBUTUlDVDogJTA4eFxuIiwgdik7CisJdiA9IGFwaWNfcmVhZChBUElDX1RNQ0NUKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgVE1DQ1Q6ICUwOHhcbiIsIHYpOworCXYgPSBhcGljX3JlYWQoQVBJQ19URENSKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgVERDUjogJTA4eFxuIiwgdik7CisJcHJpbnRrKCJcbiIpOworfQorCit2b2lkIHByaW50X2FsbF9sb2NhbF9BUElDcyAodm9pZCkKK3sKKwlvbl9lYWNoX2NwdShwcmludF9sb2NhbF9BUElDLCBOVUxMLCAxLCAxKTsKK30KKwordm9pZCAvKl9faW5pdCovIHByaW50X1BJQyh2b2lkKQoreworCWV4dGVybiBzcGlubG9ja190IGk4MjU5QV9sb2NrOworCXVuc2lnbmVkIGludCB2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fREVCVUcgIlxucHJpbnRpbmcgUElDIGNvbnRlbnRzXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCisJdiA9IGluYigweGExKSA8PCA4IHwgaW5iKDB4MjEpOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gUElDICBJTVI6ICUwNHhcbiIsIHYpOworCisJdiA9IGluYigweGEwKSA8PCA4IHwgaW5iKDB4MjApOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gUElDICBJUlI6ICUwNHhcbiIsIHYpOworCisJb3V0YigweDBiLDB4YTApOworCW91dGIoMHgwYiwweDIwKTsKKwl2ID0gaW5iKDB4YTApIDw8IDggfCBpbmIoMHgyMCk7CisJb3V0YigweDBhLDB4YTApOworCW91dGIoMHgwYSwweDIwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjU5QV9sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiLi4uIFBJQyAgSVNSOiAlMDR4XG4iLCB2KTsKKworCXYgPSBpbmIoMHg0ZDEpIDw8IDggfCBpbmIoMHg0ZDApOworCXByaW50ayhLRVJOX0RFQlVHICIuLi4gUElDIEVMQ1I6ICUwNHhcbiIsIHYpOworfQorCisjZW5kaWYgIC8qICAwICAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgZW5hYmxlX0lPX0FQSUModm9pZCkKK3sKKwl1bmlvbiBJT19BUElDX3JlZ18wMSByZWdfMDE7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvciAoaSA9IDA7IGkgPCBQSU5fTUFQX1NJWkU7IGkrKykgeworCQlpcnFfMl9waW5baV0ucGluID0gLTE7CisJCWlycV8yX3BpbltpXS5uZXh0ID0gMDsKKwl9CisJaWYgKCFwaXJxc19lbmFibGVkKQorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BJUlFTOyBpKyspCisJCQlwaXJxX2VudHJpZXNbaV0gPSAtMTsKKworCS8qCisJICogVGhlIG51bWJlciBvZiBJTy1BUElDIElSUSByZWdpc3RlcnMgKD09ICNwaW5zKToKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQlyZWdfMDEucmF3ID0gaW9fYXBpY19yZWFkKGksIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQlucl9pb2FwaWNfcmVnaXN0ZXJzW2ldID0gcmVnXzAxLmJpdHMuZW50cmllcysxOworCX0KKworCS8qCisJICogRG8gbm90IHRydXN0IHRoZSBJTy1BUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cAorCSAqLworCWNsZWFyX0lPX0FQSUMoKTsKK30KKworLyoKKyAqIE5vdCBhbiBfX2luaXQsIG5lZWRlZCBieSB0aGUgcmVib290IGNvZGUKKyAqLwordm9pZCBkaXNhYmxlX0lPX0FQSUModm9pZCkKK3sKKwkvKgorCSAqIENsZWFyIHRoZSBJTy1BUElDIGJlZm9yZSByZWJvb3Rpbmc6CisJICovCisJY2xlYXJfSU9fQVBJQygpOworCisJZGlzY29ubmVjdF9ic3BfQVBJQygpOworfQorCisvKgorICogZnVuY3Rpb24gdG8gc2V0IHRoZSBJTy1BUElDIHBoeXNpY2FsIElEcyBiYXNlZCBvbiB0aGUKKyAqIHZhbHVlcyBzdG9yZWQgaW4gdGhlIE1QQyB0YWJsZS4KKyAqCisgKiBieSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+ICBUdWUgRGVjIDIxIDEyOjI1OjA1IENTVCAxOTk5CisgKi8KKworI2lmbmRlZiBDT05GSUdfWDg2X05VTUFRCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfaW9hcGljX2lkc19mcm9tX21wYyh2b2lkKQoreworCXVuaW9uIElPX0FQSUNfcmVnXzAwIHJlZ18wMDsKKwlwaHlzaWRfbWFza190IHBoeXNfaWRfcHJlc2VudF9tYXA7CisJaW50IGFwaWM7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBvbGRfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogVGhpcyBpcyBicm9rZW47IGFueXRoaW5nIHdpdGggYSByZWFsIGNwdSBjb3VudCBoYXMgdG8KKwkgKiBjaXJjdW12ZW50IHRoaXMgaWRpb2N5IHJlZ2FyZGxlc3MuCisJICovCisJcGh5c19pZF9wcmVzZW50X21hcCA9IGlvYXBpY19waHlzX2lkX21hcChwaHlzX2NwdV9wcmVzZW50X21hcCk7CisKKwkvKgorCSAqIFNldCB0aGUgSU9BUElDIElEIHRvIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIE1QQyB0YWJsZS4KKwkgKi8KKwlmb3IgKGFwaWMgPSAwOyBhcGljIDwgbnJfaW9hcGljczsgYXBpYysrKSB7CisKKwkJLyogUmVhZCB0aGUgcmVnaXN0ZXIgMCB2YWx1ZSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJcmVnXzAwLnJhdyA9IGlvX2FwaWNfcmVhZChhcGljLCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJCisJCW9sZF9pZCA9IG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZDsKKworCQlpZiAobXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkID49IGdldF9waHlzaWNhbF9icm9hZGNhc3QoKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1ZywgSU8tQVBJQyMlZCBJRCBpcyAlZCBpbiB0aGUgTVBDIHRhYmxlIS4uLlxuIiwKKwkJCQlhcGljLCBtcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQpOworCQkJcHJpbnRrKEtFUk5fRVJSICIuLi4gZml4aW5nIHVwIHRvICVkLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIsCisJCQkJcmVnXzAwLmJpdHMuSUQpOworCQkJbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkID0gcmVnXzAwLmJpdHMuSUQ7CisJCX0KKworCQkvKiBEb24ndCBjaGVjayBJL08gQVBJQyBJRHMgZm9yIHNvbWUgeEFQSUMgc3lzdGVtcy4gIFRoZXkgaGF2ZQorCQkgKiBubyBtZWFuaW5nIHdpdGhvdXQgdGhlIHNlcmlhbCBBUElDIGJ1cy4gKi8KKwkJaWYgKE5PX0lPQVBJQ19DSEVDSykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBTYW5pdHkgY2hlY2ssIGlzIHRoZSBJRCByZWFsbHkgZnJlZT8gRXZlcnkgQVBJQyBpbiBhCisJCSAqIHN5c3RlbSBtdXN0IGhhdmUgYSB1bmlxdWUgSUQgb3Igd2UgZ2V0IGxvdHMgb2YgbmljZQorCQkgKiAnc3R1Y2sgb24gc21wX2ludmFsaWRhdGVfbmVlZGVkIElQSSB3YWl0JyBtZXNzYWdlcy4KKwkJICovCisJCWlmIChjaGVja19hcGljaWRfdXNlZChwaHlzX2lkX3ByZXNlbnRfbWFwLAorCQkJCQltcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBJTy1BUElDIyVkIElEICVkIGlzIGFscmVhZHkgdXNlZCEuLi5cbiIsCisJCQkJYXBpYywgbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KCk7IGkrKykKKwkJCQlpZiAoIXBoeXNpZF9pc3NldChpLCBwaHlzX2lkX3ByZXNlbnRfbWFwKSkKKwkJCQkJYnJlYWs7CisJCQlpZiAoaSA+PSBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KCkpCisJCQkJcGFuaWMoIk1heCBBUElDIElEIGV4Y2VlZGVkIVxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgIi4uLiBmaXhpbmcgdXAgdG8gJWQuICh0ZWxsIHlvdXIgaHcgdmVuZG9yKVxuIiwKKwkJCQlpKTsKKwkJCXBoeXNpZF9zZXQoaSwgcGh5c19pZF9wcmVzZW50X21hcCk7CisJCQltcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQgPSBpOworCQl9IGVsc2UgeworCQkJcGh5c2lkX21hc2tfdCB0bXA7CisJCQl0bXAgPSBhcGljaWRfdG9fY3B1X3ByZXNlbnQobXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKTsKKwkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIlNldHRpbmcgJWQgaW4gdGhlICIKKwkJCQkJInBoeXNfaWRfcHJlc2VudF9tYXBcbiIsCisJCQkJCW1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCk7CisJCQlwaHlzaWRzX29yKHBoeXNfaWRfcHJlc2VudF9tYXAsIHBoeXNfaWRfcHJlc2VudF9tYXAsIHRtcCk7CisJCX0KKworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBJUlEgcm91dGluZyB0YWJsZQorCQkgKiBpZiB0aGUgSUQgY2hhbmdlZC4KKwkJICovCisJCWlmIChvbGRfaWQgIT0gbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKQorCQkJZm9yIChpID0gMDsgaSA8IG1wX2lycV9lbnRyaWVzOyBpKyspCisJCQkJaWYgKG1wX2lycXNbaV0ubXBjX2RzdGFwaWMgPT0gb2xkX2lkKQorCQkJCQltcF9pcnFzW2ldLm1wY19kc3RhcGljCisJCQkJCQk9IG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZDsKKworCQkvKgorCQkgKiBSZWFkIHRoZSByaWdodCB2YWx1ZSBmcm9tIHRoZSBNUEMgdGFibGUgYW5kCisJCSAqIHdyaXRlIGl0IGludG8gdGhlIElEIHJlZ2lzdGVyLgorCSAJICovCisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgS0VSTl9JTkZPCisJCQkiLi4uY2hhbmdpbmcgSU8tQVBJQyBwaHlzaWNhbCBBUElDIElEIHRvICVkIC4uLiIsCisJCQltcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQpOworCisJCXJlZ18wMC5iaXRzLklEID0gbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwkJaW9fYXBpY193cml0ZShhcGljLCAwLCByZWdfMDAucmF3KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCQkvKgorCQkgKiBTYW5pdHkgY2hlY2sKKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQlyZWdfMDAucmF3ID0gaW9fYXBpY19yZWFkKGFwaWMsIDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQlpZiAocmVnXzAwLmJpdHMuSUQgIT0gbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKQorCQkJcHJpbnRrKCJjb3VsZCBub3Qgc2V0IElEIVxuIik7CisJCWVsc2UKKwkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIiBvay5cbiIpOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfaW9hcGljX2lkc19mcm9tX21wYyh2b2lkKSB7IH0KKyNlbmRpZgorCisvKgorICogVGhlcmUgaXMgYSBuYXN0eSBidWcgaW4gc29tZSBvbGRlciBTTVAgYm9hcmRzLCB0aGVpciBtcHRhYmxlIGxpZXMKKyAqIGFib3V0IHRoZSB0aW1lciBJUlEuIFdlIGRvIHRoZSBmb2xsb3dpbmcgdG8gd29yayBhcm91bmQgdGhlIHNpdHVhdGlvbjoKKyAqCisgKgktIHRpbWVyIElSUSBkZWZhdWx0cyB0byBJTy1BUElDIElSUQorICoJLSBpZiB0aGlzIGZ1bmN0aW9uIGRldGVjdHMgdGhhdCB0aW1lciBJUlFzIGFyZSBkZWZ1bmN0LCB0aGVuIHdlIGZhbGwKKyAqCSAgYmFjayB0byBJU0EgdGltZXIgSVJRcworICovCitzdGF0aWMgaW50IF9faW5pdCB0aW1lcl9pcnFfd29ya3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHQxID0gamlmZmllczsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKwkvKiBMZXQgdGVuIHRpY2tzIHBhc3MuLi4gKi8KKwltZGVsYXkoKDEwICogMTAwMCkgLyBIWik7CisKKwkvKgorCSAqIEV4cGVjdCBhIGZldyB0aWNrcyBhdCBsZWFzdCwgdG8gYmUgc3VyZSBzb21lIHBvc3NpYmxlCisJICogZ2x1ZSBsb2dpYyBkb2VzIG5vdCBsb2NrIHVwIGFmdGVyIG9uZSBvciB0d28gZmlyc3QKKwkgKiB0aWNrcyBpbiBhIG5vbi1FeHRJTlQgbW9kZS4gIEFsc28gdGhlIGxvY2FsIEFQSUMKKwkgKiBtaWdodCBoYXZlIGNhY2hlZCBvbmUgRXh0SU5UIGludGVycnVwdC4gIEZpbmFsbHksIGF0CisJICogbGVhc3Qgb25lIHRpY2sgbWF5IGJlIGxvc3QgZHVlIHRvIGRlbGF5cy4KKwkgKi8KKwlpZiAoamlmZmllcyAtIHQxID4gNCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluIHRoZSBTTVArSU9BUElDIGNhc2UgaXQgbWlnaHQgaGFwcGVuIHRoYXQgdGhlcmUgYXJlIGFuIHVuc3BlY2lmaWVkCisgKiBudW1iZXIgb2YgcGVuZGluZyBJUlEgZXZlbnRzIHVuaGFuZGxlZC4gVGhlc2UgY2FzZXMgYXJlIHZlcnkgcmFyZSwKKyAqIHNvIHdlICdyZXNlbmQnIHRoZXNlIElSUXMgdmlhIElQSXMsIHRvIHRoZSBzYW1lIENQVS4gSXQncyBtdWNoCisgKiBiZXR0ZXIgdG8gZG8gaXQgdGhpcyB3YXkgYXMgdGh1cyB3ZSBkbyBub3QgaGF2ZSB0byBiZSBhd2FyZSBvZgorICogJ3BlbmRpbmcnIGludGVycnVwdHMgaW4gdGhlIElSUSBwYXRoLCBleGNlcHQgYXQgdGhpcyBwb2ludC4KKyAqLworLyoKKyAqIEVkZ2UgdHJpZ2dlcmVkIG5lZWRzIHRvIHJlc2VuZCBhbnkgaW50ZXJydXB0CisgKiB0aGF0IHdhcyBkZWxheWVkIGJ1dCB0aGlzIGlzIG5vdyBoYW5kbGVkIGluIHRoZSBkZXZpY2UKKyAqIGluZGVwZW5kZW50IGNvZGUuCisgKi8KKworLyoKKyAqIFN0YXJ0aW5nIHVwIGEgZWRnZS10cmlnZ2VyZWQgSU8tQVBJQyBpbnRlcnJ1cHQgaXMKKyAqIG5hc3R5IC0gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBnZXQgdGhlIGVkZ2UuCisgKiBJZiBpdCBpcyBhbHJlYWR5IGFzc2VydGVkIGZvciBzb21lIHJlYXNvbiwgd2UgbmVlZAorICogcmV0dXJuIDEgdG8gaW5kaWNhdGUgdGhhdCBpcyB3YXMgcGVuZGluZy4KKyAqCisgKiBUaGlzIGlzIG5vdCBjb21wbGV0ZSAtIHdlIHNob3VsZCBiZSBhYmxlIHRvIGZha2UKKyAqIGFuIGVkZ2UgZXZlbiBpZiBpdCBpc24ndCBvbiB0aGUgODI1OUEuLi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2VkZ2VfaW9hcGljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCB3YXNfcGVuZGluZyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWlmIChpcnEgPCAxNikgeworCQlkaXNhYmxlXzgyNTlBX2lycShpcnEpOworCQlpZiAoaTgyNTlBX2lycV9wZW5kaW5nKGlycSkpCisJCQl3YXNfcGVuZGluZyA9IDE7CisJfQorCV9fdW5tYXNrX0lPX0FQSUNfaXJxKGlycSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiB3YXNfcGVuZGluZzsKK30KKworLyoKKyAqIE9uY2Ugd2UgaGF2ZSByZWNvcmRlZCBJUlFfUEVORElORyBhbHJlYWR5LCB3ZSBjYW4gbWFzayB0aGUKKyAqIGludGVycnVwdCBmb3IgcmVhbC4gVGhpcyBwcmV2ZW50cyBJUlEgc3Rvcm1zIGZyb20gdW5oYW5kbGVkCisgKiBkZXZpY2VzLgorICovCitzdGF0aWMgdm9pZCBhY2tfZWRnZV9pb2FwaWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJbW92ZV9pcnEoaXJxKTsKKwlpZiAoKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9QRU5ESU5HIHwgSVJRX0RJU0FCTEVEKSkKKwkJCQkJPT0gKElSUV9QRU5ESU5HIHwgSVJRX0RJU0FCTEVEKSkKKwkJbWFza19JT19BUElDX2lycShpcnEpOworCWFja19BUElDX2lycSgpOworfQorCisvKgorICogTGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMgY2FuIGp1c3QgYmUgbWFza2VkLAorICogYW5kIHNodXR0aW5nIGRvd24gYW5kIHN0YXJ0aW5nIHVwIHRoZSBpbnRlcnJ1cHQKKyAqIGlzIHRoZSBzYW1lIGFzIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgdGhlbSAtLSBleGNlcHQKKyAqIHdpdGggYSBzdGFydHVwIG5lZWQgdG8gcmV0dXJuIGEgIndhcyBwZW5kaW5nIiB2YWx1ZS4KKyAqCisgKiBMZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlCisgKiBkbyBub3QgdG91Y2ggYW55IElPLUFQSUMgcmVnaXN0ZXIgd2hpbGUgaGFuZGxpbmcKKyAqIHRoZW0uIFdlIGFjayB0aGUgQVBJQyBpbiB0aGUgZW5kLUlSUSBoYW5kbGVyLCBub3QKKyAqIGluIHRoZSBzdGFydC1JUlEtaGFuZGxlci4gUHJvdGVjdGlvbiBhZ2FpbnN0IHJlZW50cmFuY2UKKyAqIGZyb20gdGhlIHNhbWUgaW50ZXJydXB0IGlzIHN0aWxsIHByb3ZpZGVkLCBib3RoIGJ5IHRoZQorICogZ2VuZXJpYyBJUlEgbGF5ZXIgYW5kIGJ5IHRoZSBmYWN0IHRoYXQgYW4gdW5hY2tlZCBsb2NhbAorICogQVBJQyBkb2VzIG5vdCBhY2NlcHQgSVJRcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX2xldmVsX2lvYXBpY19pcnEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5tYXNrX0lPX0FQSUNfaXJxKGlycSk7CisKKwlyZXR1cm4gMDsgLyogZG9uJ3QgY2hlY2sgZm9yIHBlbmRpbmcgKi8KK30KKworc3RhdGljIHZvaWQgZW5kX2xldmVsX2lvYXBpY19pcnEgKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyB2OworCWludCBpOworCisJbW92ZV9pcnEoaXJxKTsKKy8qCisgKiBJdCBhcHBlYXJzIHRoZXJlIGlzIGFuIGVycmF0dW0gd2hpY2ggYWZmZWN0cyBhdCBsZWFzdCB2ZXJzaW9uIDB4MTEKKyAqIG9mIEkvTyBBUElDICh0aGF0J3MgdGhlIDgyMDkzQUEgYW5kIGNvcmVzIGludGVncmF0ZWQgaW50byB2YXJpb3VzCisgKiBjaGlwc2V0cykuICBVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgYSBsZXZlbC10cmlnZ2VyZWQgaW50ZXJydXB0IGlzCisgKiBlcnJvbmVvdXNseSBkZWxpdmVyZWQgYXMgZWRnZS10cmlnZ2VyZWQgb25lIGJ1dCB0aGUgcmVzcGVjdGl2ZSBJUlIKKyAqIGJpdCBnZXRzIHNldCBuZXZlcnRoZWxlc3MuICBBcyBhIHJlc3VsdCB0aGUgSS9PIHVuaXQgZXhwZWN0cyBhbiBFT0kKKyAqIG1lc3NhZ2UgYnV0IGl0IHdpbGwgbmV2ZXIgYXJyaXZlIGFuZCBmdXJ0aGVyIGludGVycnVwdHMgYXJlIGJsb2NrZWQKKyAqIGZyb20gdGhlIHNvdXJjZS4gIFRoZSBleGFjdCByZWFzb24gaXMgc28gZmFyIHVua25vd24sIGJ1dCB0aGUKKyAqIHBoZW5vbWVub24gd2FzIG9ic2VydmVkIHdoZW4gdHdvIGNvbnNlY3V0aXZlIGludGVycnVwdCByZXF1ZXN0cworICogZnJvbSBhIGdpdmVuIHNvdXJjZSBnZXQgZGVsaXZlcmVkIHRvIHRoZSBzYW1lIENQVSBhbmQgdGhlIHNvdXJjZSBpcworICogdGVtcG9yYXJpbHkgZGlzYWJsZWQgaW4gYmV0d2Vlbi4KKyAqCisgKiBBIHdvcmthcm91bmQgaXMgdG8gc2ltdWxhdGUgYW4gRU9JIG1lc3NhZ2UgbWFudWFsbHkuICBXZSBhY2hpZXZlIGl0CisgKiBieSBzZXR0aW5nIHRoZSB0cmlnZ2VyIG1vZGUgdG8gZWRnZSBhbmQgdGhlbiB0byBsZXZlbCB3aGVuIHRoZSBlZGdlCisgKiB0cmlnZ2VyIG1vZGUgZ2V0cyBkZXRlY3RlZCBpbiB0aGUgVE1SIG9mIGEgbG9jYWwgQVBJQyBmb3IgYQorICogbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdC4gIFdlIG1hc2sgdGhlIHNvdXJjZSBmb3IgdGhlIHRpbWUgb2YgdGhlCisgKiBvcGVyYXRpb24gdG8gcHJldmVudCBhbiBlZGdlLXRyaWdnZXJlZCBpbnRlcnJ1cHQgZXNjYXBpbmcgbWVhbndoaWxlLgorICogVGhlIGlkZWEgaXMgZnJvbSBNYW5mcmVkIFNwcmF1bC4gIC0tbWFjcm8KKyAqLworCWkgPSBJT19BUElDX1ZFQ1RPUihpcnEpOworCisJdiA9IGFwaWNfcmVhZChBUElDX1RNUiArICgoaSAmIH4weDFmKSA+PiAxKSk7CisKKwlhY2tfQVBJQ19pcnEoKTsKKworCWlmICghKHYgJiAoMSA8PCAoaSAmIDB4MWYpKSkpIHsKKwkJYXRvbWljX2luYygmaXJxX21pc19jb3VudCk7CisJCXNwaW5fbG9jaygmaW9hcGljX2xvY2spOworCQlfX21hc2tfYW5kX2VkZ2VfSU9fQVBJQ19pcnEoaXJxKTsKKwkJX191bm1hc2tfYW5kX2xldmVsX0lPX0FQSUNfaXJxKGlycSk7CisJCXNwaW5fdW5sb2NrKCZpb2FwaWNfbG9jayk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9lZGdlX2lvYXBpY192ZWN0b3IodW5zaWduZWQgaW50IHZlY3RvcikKK3sKKwlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOworCisJcmV0dXJuIHN0YXJ0dXBfZWRnZV9pb2FwaWNfaXJxKGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGFja19lZGdlX2lvYXBpY192ZWN0b3IodW5zaWduZWQgaW50IHZlY3RvcikKK3sKKwlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOworCisJYWNrX2VkZ2VfaW9hcGljX2lycShpcnEpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfbGV2ZWxfaW9hcGljX3ZlY3RvciAodW5zaWduZWQgaW50IHZlY3RvcikKK3sKKwlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOworCisJcmV0dXJuIHN0YXJ0dXBfbGV2ZWxfaW9hcGljX2lycSAoaXJxKTsKK30KKworc3RhdGljIHZvaWQgZW5kX2xldmVsX2lvYXBpY192ZWN0b3IgKHVuc2lnbmVkIGludCB2ZWN0b3IpCit7CisJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKKworCWVuZF9sZXZlbF9pb2FwaWNfaXJxKGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tfSU9fQVBJQ192ZWN0b3IgKHVuc2lnbmVkIGludCB2ZWN0b3IpCit7CisJaW50IGlycSA9IHZlY3Rvcl90b19pcnEodmVjdG9yKTsKKworCW1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKK30KKworc3RhdGljIHZvaWQgdW5tYXNrX0lPX0FQSUNfdmVjdG9yICh1bnNpZ25lZCBpbnQgdmVjdG9yKQoreworCWludCBpcnEgPSB2ZWN0b3JfdG9faXJxKHZlY3Rvcik7CisKKwl1bm1hc2tfSU9fQVBJQ19pcnEoaXJxKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2lvYXBpY19hZmZpbml0eV92ZWN0b3IgKHVuc2lnbmVkIGludCB2ZWN0b3IsCisJCQkJCWNwdW1hc2tfdCBjcHVfbWFzaykKK3sKKwlpbnQgaXJxID0gdmVjdG9yX3RvX2lycSh2ZWN0b3IpOworCisJc2V0X2lvYXBpY19hZmZpbml0eV9pcnEoaXJxLCBjcHVfbWFzayk7Cit9CisjZW5kaWYKKworLyoKKyAqIExldmVsIGFuZCBlZGdlIHRyaWdnZXJlZCBJTy1BUElDIGludGVycnVwdHMgbmVlZCBkaWZmZXJlbnQgaGFuZGxpbmcsCisgKiBzbyB3ZSB1c2UgdHdvIHNlcGFyYXRlIElSUSBkZXNjcmlwdG9ycy4gRWRnZSB0cmlnZ2VyZWQgSVJRcyBjYW4gYmUKKyAqIGhhbmRsZWQgd2l0aCB0aGUgbGV2ZWwtdHJpZ2dlcmVkIGRlc2NyaXB0b3IsIGJ1dCB0aGF0IG9uZSBoYXMgc2xpZ2h0bHkKKyAqIG1vcmUgb3ZlcmhlYWQuIExldmVsLXRyaWdnZXJlZCBpbnRlcnJ1cHRzIGNhbm5vdCBiZSBoYW5kbGVkIHdpdGggdGhlCisgKiBlZGdlLXRyaWdnZXJlZCBoYW5kbGVyLCB3aXRob3V0IHJpc2tpbmcgSVJRIHN0b3JtcyBhbmQgb3RoZXIgdWdseQorICogcmFjZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2VkZ2VfdHlwZSA9IHsKKwkudHlwZW5hbWUgCT0gIklPLUFQSUMtZWRnZSIsCisJLnN0YXJ0dXAgCT0gc3RhcnR1cF9lZGdlX2lvYXBpYywKKwkuc2h1dGRvd24gCT0gc2h1dGRvd25fZWRnZV9pb2FwaWMsCisJLmVuYWJsZSAJPSBlbmFibGVfZWRnZV9pb2FwaWMsCisJLmRpc2FibGUgCT0gZGlzYWJsZV9lZGdlX2lvYXBpYywKKwkuYWNrIAkJPSBhY2tfZWRnZV9pb2FwaWMsCisJLmVuZCAJCT0gZW5kX2VkZ2VfaW9hcGljLAorCS5zZXRfYWZmaW5pdHkgCT0gc2V0X2lvYXBpY19hZmZpbml0eSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW9hcGljX2xldmVsX3R5cGUgPSB7CisJLnR5cGVuYW1lIAk9ICJJTy1BUElDLWxldmVsIiwKKwkuc3RhcnR1cCAJPSBzdGFydHVwX2xldmVsX2lvYXBpYywKKwkuc2h1dGRvd24gCT0gc2h1dGRvd25fbGV2ZWxfaW9hcGljLAorCS5lbmFibGUgCT0gZW5hYmxlX2xldmVsX2lvYXBpYywKKwkuZGlzYWJsZSAJPSBkaXNhYmxlX2xldmVsX2lvYXBpYywKKwkuYWNrIAkJPSBtYXNrX2FuZF9hY2tfbGV2ZWxfaW9hcGljLAorCS5lbmQgCQk9IGVuZF9sZXZlbF9pb2FwaWMsCisJLnNldF9hZmZpbml0eSAJPSBzZXRfaW9hcGljX2FmZmluaXR5LAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfSU9fQVBJQ190cmFwcyh2b2lkKQoreworCWludCBpcnE7CisKKwkvKgorCSAqIE5PVEUhIFRoZSBsb2NhbCBBUElDIGlzbid0IHZlcnkgZ29vZCBhdCBoYW5kbGluZworCSAqIG11bHRpcGxlIGludGVycnVwdHMgYXQgdGhlIHNhbWUgaW50ZXJydXB0IGxldmVsLgorCSAqIEFzIHRoZSBpbnRlcnJ1cHQgbGV2ZWwgaXMgZGV0ZXJtaW5lZCBieSB0YWtpbmcgdGhlCisJICogdmVjdG9yIG51bWJlciBhbmQgc2hpZnRpbmcgdGhhdCByaWdodCBieSA0LCB3ZQorCSAqIHdhbnQgdG8gc3ByZWFkIHRoZXNlIG91dCBhIGJpdCBzbyB0aGF0IHRoZXkgZG9uJ3QKKwkgKiBhbGwgZmFsbCBpbiB0aGUgc2FtZSBpbnRlcnJ1cHQgbGV2ZWwuCisJICoKKwkgKiBBbHNvLCB3ZSd2ZSBnb3QgdG8gYmUgY2FyZWZ1bCBub3QgdG8gdHJhc2ggZ2F0ZQorCSAqIDB4ODAsIGJlY2F1c2UgaW50IDB4ODAgaXMgaG0sIGtpbmQgb2YgaW1wb3J0YW50aXNoLiA7KQorCSAqLworCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfSVJRUyA7IGlycSsrKSB7CisJCWludCB0bXAgPSBpcnE7CisJCWlmICh1c2VfcGNpX3ZlY3RvcigpKSB7CisJCQlpZiAoIXBsYXRmb3JtX2xlZ2FjeV9pcnEodG1wKSkKKwkJCQlpZiAoKHRtcCA9IHZlY3Rvcl90b19pcnEodG1wKSkgPT0gLTEpCisJCQkJCWNvbnRpbnVlOworCQl9CisJCWlmIChJT19BUElDX0lSUSh0bXApICYmICFJT19BUElDX1ZFQ1RPUih0bXApKSB7CisJCQkvKgorCQkJICogSG1tLi4gV2UgZG9uJ3QgaGF2ZSBhbiBlbnRyeSBmb3IgdGhpcywKKwkJCSAqIHNvIGRlZmF1bHQgdG8gYW4gb2xkLWZhc2hpb25lZCA4MjU5CisJCQkgKiBpbnRlcnJ1cHQgaWYgd2UgY2FuLi4KKwkJCSAqLworCQkJaWYgKGlycSA8IDE2KQorCQkJCW1ha2VfODI1OUFfaXJxKGlycSk7CisJCQllbHNlCisJCQkJLyogU3RyYW5nZS4gT2gsIHdlbGwuLiAqLworCQkJCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZub19pcnFfdHlwZTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2xhcGljX2lycSAodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIHY7CisKKwl2ID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2ICYgfkFQSUNfTFZUX01BU0tFRCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfbGFwaWNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKworCXYgPSBhcGljX3JlYWQoQVBJQ19MVlQwKTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIHYgfCBBUElDX0xWVF9NQVNLRUQpOworfQorCitzdGF0aWMgdm9pZCBhY2tfbGFwaWNfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQoreworCWFja19BUElDX2lycSgpOworfQorCitzdGF0aWMgdm9pZCBlbmRfbGFwaWNfaXJxICh1bnNpZ25lZCBpbnQgaSkgeyAvKiBub3RoaW5nICovIH0KKworc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBsYXBpY19pcnFfdHlwZSA9IHsKKwkudHlwZW5hbWUgCT0gImxvY2FsLUFQSUMtZWRnZSIsCisJLnN0YXJ0dXAgCT0gTlVMTCwgLyogc3RhcnR1cF9pcnEoKSBub3QgdXNlZCBmb3IgSVJRMCAqLworCS5zaHV0ZG93biAJPSBOVUxMLCAvKiBzaHV0ZG93bl9pcnEoKSBub3QgdXNlZCBmb3IgSVJRMCAqLworCS5lbmFibGUgCT0gZW5hYmxlX2xhcGljX2lycSwKKwkuZGlzYWJsZSAJPSBkaXNhYmxlX2xhcGljX2lycSwKKwkuYWNrIAkJPSBhY2tfbGFwaWNfaXJxLAorCS5lbmQgCQk9IGVuZF9sYXBpY19pcnEKK307CisKK3N0YXRpYyB2b2lkIHNldHVwX25taSAodm9pZCkKK3sKKwkvKgorIAkgKiBEaXJ0eSB0cmljayB0byBlbmFibGUgdGhlIE5NSSB3YXRjaGRvZyAuLi4KKwkgKiBXZSBwdXQgdGhlIDgyNTlBIG1hc3RlciBpbnRvIEFFT0kgbW9kZSBhbmQKKwkgKiB1bm1hc2sgb24gYWxsIGxvY2FsIEFQSUNzIExWVDAgYXMgTk1JLgorCSAqCisJICogVGhlIGlkZWEgdG8gdXNlIHRoZSA4MjU5QSBpbiBBRU9JIG1vZGUgKCc4MjU5QSBWaXJ0dWFsIFdpcmUnKQorCSAqIGlzIGZyb20gTWFjaWVqIFcuIFJvenlja2kgLSBzbyB3ZSBkbyBub3QgaGF2ZSB0byBFT0kgZnJvbQorCSAqIHRoZSBOTUkgaGFuZGxlciBvciB0aGUgdGltZXIgaW50ZXJydXB0LgorCSAqLyAKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIEtFUk5fSU5GTyAiYWN0aXZhdGluZyBOTUkgV2F0Y2hkb2cgLi4uIik7CisKKwlvbl9lYWNoX2NwdShlbmFibGVfTk1JX3Rocm91Z2hfTFZUMCwgTlVMTCwgMSwgMSk7CisKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIgZG9uZS5cbiIpOworfQorCisvKgorICogVGhpcyBsb29rcyBhIGJpdCBoYWNraXNoIGJ1dCBpdCdzIGFib3V0IHRoZSBvbmx5IG9uZSB3YXkgb2Ygc2VuZGluZworICogYSBmZXcgSU5UQSBjeWNsZXMgdG8gODI1OUFzIGFuZCBhbnkgYXNzb2NpYXRlZCBnbHVlIGxvZ2ljLiAgSUNSIGRvZXMKKyAqIG5vdCBzdXBwb3J0IHRoZSBFeHRJTlQgbW9kZSwgdW5mb3J0dW5hdGVseS4gIFdlIG5lZWQgdG8gc2VuZCB0aGVzZQorICogY3ljbGVzIGFzIHNvbWUgaTgyNDg5RFgtYmFzZWQgYm9hcmRzIGhhdmUgZ2x1ZSBsb2dpYyB0aGF0IGtlZXBzIHRoZQorICogODI1OUEgaW50ZXJydXB0IGxpbmUgYXNzZXJ0ZWQgdW50aWwgSU5UQS4gIC0tbWFjcm8KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVubG9ja19FeHRJTlRfbG9naWModm9pZCkKK3sKKwlpbnQgcGluLCBpOworCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5MCwgZW50cnkxOworCXVuc2lnbmVkIGNoYXIgc2F2ZV9jb250cm9sLCBzYXZlX2ZyZXFfc2VsZWN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwaW4gPSBmaW5kX2lzYV9pcnFfcGluKDgsIG1wX0lOVCk7CisJaWYgKHBpbiA9PSAtMSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJKigoKGludCAqKSZlbnRyeTApICsgMSkgPSBpb19hcGljX3JlYWQoMCwgMHgxMSArIDIgKiBwaW4pOworCSooKChpbnQgKikmZW50cnkwKSArIDApID0gaW9fYXBpY19yZWFkKDAsIDB4MTAgKyAyICogcGluKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWNsZWFyX0lPX0FQSUNfcGluKDAsIHBpbik7CisKKwltZW1zZXQoJmVudHJ5MSwgMCwgc2l6ZW9mKGVudHJ5MSkpOworCisJZW50cnkxLmRlc3RfbW9kZSA9IDA7CQkJLyogcGh5c2ljYWwgZGVsaXZlcnkgKi8KKwllbnRyeTEubWFzayA9IDA7CQkJLyogdW5tYXNrIElSUSBub3cgKi8KKwllbnRyeTEuZGVzdC5waHlzaWNhbC5waHlzaWNhbF9kZXN0ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJZW50cnkxLmRlbGl2ZXJ5X21vZGUgPSBkZXN0X0V4dElOVDsKKwllbnRyeTEucG9sYXJpdHkgPSBlbnRyeTAucG9sYXJpdHk7CisJZW50cnkxLnRyaWdnZXIgPSAwOworCWVudHJ5MS52ZWN0b3IgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9fYXBpY193cml0ZSgwLCAweDExICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeTEpICsgMSkpOworCWlvX2FwaWNfd3JpdGUoMCwgMHgxMCArIDIgKiBwaW4sICooKChpbnQgKikmZW50cnkxKSArIDApKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJc2F2ZV9jb250cm9sID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsKKwlzYXZlX2ZyZXFfc2VsZWN0ID0gQ01PU19SRUFEKFJUQ19GUkVRX1NFTEVDVCk7CisJQ01PU19XUklURSgoc2F2ZV9mcmVxX3NlbGVjdCAmIH5SVENfUkFURV9TRUxFQ1QpIHwgMHg2LAorCQkgICBSVENfRlJFUV9TRUxFQ1QpOworCUNNT1NfV1JJVEUoc2F2ZV9jb250cm9sIHwgUlRDX1BJRSwgUlRDX0NPTlRST0wpOworCisJaSA9IDEwMDsKKwl3aGlsZSAoaS0tID4gMCkgeworCQltZGVsYXkoMTApOworCQlpZiAoKENNT1NfUkVBRChSVENfSU5UUl9GTEFHUykgJiBSVENfUEYpID09IFJUQ19QRikKKwkJCWkgLT0gMTA7CisJfQorCisJQ01PU19XUklURShzYXZlX2NvbnRyb2wsIFJUQ19DT05UUk9MKTsKKwlDTU9TX1dSSVRFKHNhdmVfZnJlcV9zZWxlY3QsIFJUQ19GUkVRX1NFTEVDVCk7CisJY2xlYXJfSU9fQVBJQ19waW4oMCwgcGluKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWlvX2FwaWNfd3JpdGUoMCwgMHgxMSArIDIgKiBwaW4sICooKChpbnQgKikmZW50cnkwKSArIDEpKTsKKwlpb19hcGljX3dyaXRlKDAsIDB4MTAgKyAyICogcGluLCAqKCgoaW50ICopJmVudHJ5MCkgKyAwKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFRoaXMgY29kZSBtYXkgbG9vayBhIGJpdCBwYXJhbm9pZCwgYnV0IGl0J3Mgc3VwcG9zZWQgdG8gY29vcGVyYXRlIHdpdGgKKyAqIGEgd2lkZSByYW5nZSBvZiBib2FyZHMgYW5kIEJJT1MgYnVncy4gIEZvcnR1bmF0ZWx5IG9ubHkgdGhlIHRpbWVyIElSUQorICogaXMgc28gc2NyZXd5LiAgVGhhbmtzIHRvIEJyaWFuIFBlcmtpbnMgZm9yIHRlc3RpbmcvaGFja2luZyB0aGlzIGJlYXN0CisgKiBmYW5hdGljYWxseSBvbiBoaXMgdHJ1bHkgYnVnZ3kgYm9hcmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja190aW1lcih2b2lkKQoreworCWludCBwaW4xLCBwaW4yOworCWludCB2ZWN0b3I7CisKKwkvKgorCSAqIGdldC9zZXQgdGhlIHRpbWVyIElSUSB2ZWN0b3I6CisJICovCisJZGlzYWJsZV84MjU5QV9pcnEoMCk7CisJdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoMCk7CisJc2V0X2ludHJfZ2F0ZSh2ZWN0b3IsIGludGVycnVwdFswXSk7CisKKwkvKgorCSAqIFN1YnRsZSwgY29kZSBpbiBkb190aW1lcl9pbnRlcnJ1cHQoKSBleHBlY3RzIGFuIEFFT0kKKwkgKiBtb2RlIGZvciB0aGUgODI1OUEgd2hlbmV2ZXIgaW50ZXJydXB0cyBhcmUgcm91dGVkCisJICogdGhyb3VnaCBJL08gQVBJQ3MuICBBbHNvIElSUTAgaGFzIHRvIGJlIGVuYWJsZWQgaW4KKwkgKiB0aGUgODI1OUEgd2hpY2ggaW1wbGllcyB0aGUgdmlydHVhbCB3aXJlIGhhcyB0byBiZQorCSAqIGRpc2FibGVkIGluIHRoZSBsb2NhbCBBUElDLgorCSAqLworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEIHwgQVBJQ19ETV9FWFRJTlQpOworCWluaXRfODI1OUEoMSk7CisJdGltZXJfYWNrID0gMTsKKwllbmFibGVfODI1OUFfaXJxKDApOworCisJcGluMSA9IGZpbmRfaXNhX2lycV9waW4oMCwgbXBfSU5UKTsKKwlwaW4yID0gZmluZF9pc2FfaXJxX3BpbigwLCBtcF9FeHRJTlQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiLi5USU1FUjogdmVjdG9yPTB4JTAyWCBwaW4xPSVkIHBpbjI9JWRcbiIsIHZlY3RvciwgcGluMSwgcGluMik7CisKKwlpZiAocGluMSAhPSAtMSkgeworCQkvKgorCQkgKiBPaywgZG9lcyBJUlEwIHRocm91Z2ggdGhlIElPQVBJQyB3b3JrPworCQkgKi8KKwkJdW5tYXNrX0lPX0FQSUNfaXJxKDApOworCQlpZiAodGltZXJfaXJxX3dvcmtzKCkpIHsKKwkJCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKKwkJCQlkaXNhYmxlXzgyNTlBX2lycSgwKTsKKwkJCQlzZXR1cF9ubWkoKTsKKwkJCQllbmFibGVfODI1OUFfaXJxKDApOworCQkJCWNoZWNrX25taV93YXRjaGRvZygpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCWNsZWFyX0lPX0FQSUNfcGluKDAsIHBpbjEpOworCQlwcmludGsoS0VSTl9FUlIgIi4uTVAtQklPUyBidWc6IDgyNTQgdGltZXIgbm90IGNvbm5lY3RlZCB0byBJTy1BUElDXG4iKTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIuLi50cnlpbmcgdG8gc2V0IHVwIHRpbWVyIChJUlEwKSB0aHJvdWdoIHRoZSA4MjU5QSAuLi4gIik7CisJaWYgKHBpbjIgIT0gLTEpIHsKKwkJcHJpbnRrKCJcbi4uLi4uIChmb3VuZCBwaW4gJWQpIC4uLiIsIHBpbjIpOworCQkvKgorCQkgKiBsZWdhY3kgZGV2aWNlcyBzaG91bGQgYmUgY29ubmVjdGVkIHRvIElPIEFQSUMgIzAKKwkJICovCisJCXNldHVwX0V4dElOVF9JUlEwX3BpbihwaW4yLCB2ZWN0b3IpOworCQlpZiAodGltZXJfaXJxX3dvcmtzKCkpIHsKKwkJCXByaW50aygid29ya3MuXG4iKTsKKwkJCWlmIChwaW4xICE9IC0xKQorCQkJCXJlcGxhY2VfcGluX2F0X2lycSgwLCAwLCBwaW4xLCAwLCBwaW4yKTsKKwkJCWVsc2UKKwkJCQlhZGRfcGluX3RvX2lycSgwLCAwLCBwaW4yKTsKKwkJCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKKwkJCQlzZXR1cF9ubWkoKTsKKwkJCQljaGVja19ubWlfd2F0Y2hkb2coKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQkvKgorCQkgKiBDbGVhbnVwLCBqdXN0IGluIGNhc2UgLi4uCisJCSAqLworCQljbGVhcl9JT19BUElDX3BpbigwLCBwaW4yKTsKKwl9CisJcHJpbnRrKCIgZmFpbGVkLlxuIik7CisKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9JT19BUElDKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInRpbWVyIGRvZXNuJ3Qgd29yayB0aHJvdWdoIHRoZSBJTy1BUElDIC0gZGlzYWJsaW5nIE5NSSBXYXRjaGRvZyFcbiIpOworCQlubWlfd2F0Y2hkb2cgPSAwOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIi4uLnRyeWluZyB0byBzZXQgdXAgdGltZXIgYXMgVmlydHVhbCBXaXJlIElSUS4uLiIpOworCisJZGlzYWJsZV84MjU5QV9pcnEoMCk7CisJaXJxX2Rlc2NbMF0uaGFuZGxlciA9ICZsYXBpY19pcnFfdHlwZTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfRE1fRklYRUQgfCB2ZWN0b3IpOwkvKiBGaXhlZCBtb2RlICovCisJZW5hYmxlXzgyNTlBX2lycSgwKTsKKworCWlmICh0aW1lcl9pcnFfd29ya3MoKSkgeworCQlwcmludGsoIiB3b3Jrcy5cbiIpOworCQlyZXR1cm47CisJfQorCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEIHwgQVBJQ19ETV9GSVhFRCB8IHZlY3Rvcik7CisJcHJpbnRrKCIgZmFpbGVkLlxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICIuLi50cnlpbmcgdG8gc2V0IHVwIHRpbWVyIGFzIEV4dElOVCBJUlEuLi4iKTsKKworCXRpbWVyX2FjayA9IDA7CisJaW5pdF84MjU5QSgwKTsKKwltYWtlXzgyNTlBX2lycSgwKTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfRE1fRVhUSU5UKTsKKworCXVubG9ja19FeHRJTlRfbG9naWMoKTsKKworCWlmICh0aW1lcl9pcnFfd29ya3MoKSkgeworCQlwcmludGsoIiB3b3Jrcy5cbiIpOworCQlyZXR1cm47CisJfQorCXByaW50aygiIGZhaWxlZCA6KC5cbiIpOworCXBhbmljKCJJTy1BUElDICsgdGltZXIgZG9lc24ndCB3b3JrISAgQm9vdCB3aXRoIGFwaWM9ZGVidWcgYW5kIHNlbmQgYSAiCisJCSJyZXBvcnQuICBUaGVuIHRyeSBib290aW5nIHdpdGggdGhlICdub2FwaWMnIG9wdGlvbiIpOworfQorCisvKgorICoKKyAqIElSUSdzIHRoYXQgYXJlIGhhbmRsZWQgYnkgdGhlIFBJQyBpbiB0aGUgTVBTIElPQVBJQyBjYXNlLgorICogLSBJUlEyIGlzIHRoZSBjYXNjYWRlIElSUSwgYW5kIGNhbm5vdCBiZSBhIGlvLWFwaWMgSVJRLgorICogICBMaW51eCBkb2Vzbid0IHJlYWxseSBjYXJlLCBhcyBpdCdzIG5vdCBhY3R1YWxseSB1c2VkCisgKiAgIGZvciBhbnkgaW50ZXJydXB0IGhhbmRsaW5nIGFueXdheS4KKyAqLworI2RlZmluZSBQSUNfSVJRUwkoMSA8PCBQSUNfQ0FTQ0FERV9JUikKKwordm9pZCBfX2luaXQgc2V0dXBfSU9fQVBJQyh2b2lkKQoreworCWVuYWJsZV9JT19BUElDKCk7CisKKwlpZiAoYWNwaV9pb2FwaWMpCisJCWlvX2FwaWNfaXJxcyA9IH4wOwkvKiBhbGwgSVJRcyBnbyB0aHJvdWdoIElPQVBJQyAqLworCWVsc2UKKwkJaW9fYXBpY19pcnFzID0gflBJQ19JUlFTOworCisJcHJpbnRrKCJFTkFCTElORyBJTy1BUElDIElSUXNcbiIpOworCisJLyoKKwkgKiBTZXQgdXAgSU8tQVBJQyBJUlEgcm91dGluZy4KKwkgKi8KKwlpZiAoIWFjcGlfaW9hcGljKQorCQlzZXR1cF9pb2FwaWNfaWRzX2Zyb21fbXBjKCk7CisJc3luY19BcmJfSURzKCk7CisJc2V0dXBfSU9fQVBJQ19pcnFzKCk7CisJaW5pdF9JT19BUElDX3RyYXBzKCk7CisJY2hlY2tfdGltZXIoKTsKKwlpZiAoIWFjcGlfaW9hcGljKQorCQlwcmludF9JT19BUElDKCk7Cit9CisKKy8qCisgKglDYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lLiBJZiB3ZSBkaWRudCBmaW5kIGFueQorICoJQVBJQyBidWdzIHRoZW4gd2UgY2FuIGFsbG93IHRoZSBtb2RpZnkgZmFzdCBwYXRoCisgKi8KKyAKK3N0YXRpYyBpbnQgX19pbml0IGlvX2FwaWNfYnVnX2ZpbmFsaXplKHZvaWQpCit7CisJaWYoc2lzX2FwaWNfYnVnID09IC0xKQorCQlzaXNfYXBpY19idWcgPSAwOworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKGlvX2FwaWNfYnVnX2ZpbmFsaXplKTsKKworc3RydWN0IHN5c2ZzX2lvYXBpY19kYXRhIHsKKwlzdHJ1Y3Qgc3lzX2RldmljZSBkZXY7CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnlbMF07Cit9Oworc3RhdGljIHN0cnVjdCBzeXNmc19pb2FwaWNfZGF0YSAqIG1wX2lvYXBpY19kYXRhW01BWF9JT19BUElDU107CisKK3N0YXRpYyBpbnQgaW9hcGljX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3Qgc3lzZnNfaW9hcGljX2RhdGEgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwkKKwlkYXRhID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHN5c2ZzX2lvYXBpY19kYXRhLCBkZXYpOworCWVudHJ5ID0gZGF0YS0+ZW50cnk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY19yZWdpc3RlcnNbZGV2LT5pZF07IGkgKyssIGVudHJ5ICsrICkgeworCQkqKCgoaW50ICopZW50cnkpICsgMSkgPSBpb19hcGljX3JlYWQoZGV2LT5pZCwgMHgxMSArIDIgKiBpKTsKKwkJKigoKGludCAqKWVudHJ5KSArIDApID0gaW9fYXBpY19yZWFkKGRldi0+aWQsIDB4MTAgKyAyICogaSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb2FwaWNfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgKmVudHJ5OworCXN0cnVjdCBzeXNmc19pb2FwaWNfZGF0YSAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuaW9uIElPX0FQSUNfcmVnXzAwIHJlZ18wMDsKKwlpbnQgaTsKKwkKKwlkYXRhID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHN5c2ZzX2lvYXBpY19kYXRhLCBkZXYpOworCWVudHJ5ID0gZGF0YS0+ZW50cnk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlyZWdfMDAucmF3ID0gaW9fYXBpY19yZWFkKGRldi0+aWQsIDApOworCWlmIChyZWdfMDAuYml0cy5JRCAhPSBtcF9pb2FwaWNzW2Rldi0+aWRdLm1wY19hcGljaWQpIHsKKwkJcmVnXzAwLmJpdHMuSUQgPSBtcF9pb2FwaWNzW2Rldi0+aWRdLm1wY19hcGljaWQ7CisJCWlvX2FwaWNfd3JpdGUoZGV2LT5pZCwgMCwgcmVnXzAwLnJhdyk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2Rldi0+aWRdOyBpICsrLCBlbnRyeSArKyApIHsKKwkJaW9fYXBpY193cml0ZShkZXYtPmlkLCAweDExKzIqaSwgKigoKGludCAqKWVudHJ5KSsxKSk7CisJCWlvX2FwaWNfd3JpdGUoZGV2LT5pZCwgMHgxMCsyKmksICooKChpbnQgKillbnRyeSkrMCkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGlvYXBpY19zeXNkZXZfY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgiaW9hcGljIiksCisJLnN1c3BlbmQgPSBpb2FwaWNfc3VzcGVuZCwKKwkucmVzdW1lID0gaW9hcGljX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlvYXBpY19pbml0X3N5c2ZzKHZvaWQpCit7CisJc3RydWN0IHN5c19kZXZpY2UgKiBkZXY7CisJaW50IGksIHNpemUsIGVycm9yID0gMDsKKworCWVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZpb2FwaWNfc3lzZGV2X2NsYXNzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKysgKSB7CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IHN5c19kZXZpY2UpICsgbnJfaW9hcGljX3JlZ2lzdGVyc1tpXSAKKwkJCSogc2l6ZW9mKHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5KTsKKwkJbXBfaW9hcGljX2RhdGFbaV0gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1wX2lvYXBpY19kYXRhW2ldKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHN1c3BlbmQvcmVzdW1lIElPQVBJQyAlZFxuIiwgaSk7CisJCQljb250aW51ZTsKKwkJfQorCQltZW1zZXQobXBfaW9hcGljX2RhdGFbaV0sIDAsIHNpemUpOworCQlkZXYgPSAmbXBfaW9hcGljX2RhdGFbaV0tPmRldjsKKwkJZGV2LT5pZCA9IGk7IAorCQlkZXYtPmNscyA9ICZpb2FwaWNfc3lzZGV2X2NsYXNzOworCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcihkZXYpOworCQlpZiAoZXJyb3IpIHsKKwkJCWtmcmVlKG1wX2lvYXBpY19kYXRhW2ldKTsKKwkJCW1wX2lvYXBpY19kYXRhW2ldID0gTlVMTDsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3Qgc3VzcGVuZC9yZXN1bWUgSU9BUElDICVkXG4iLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2RldmljZV9pbml0Y2FsbChpb2FwaWNfaW5pdF9zeXNmcyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUEktYmFzZWQgSU9BUElDIENvbmZpZ3VyYXRpb24KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisKK2ludCBfX2luaXQgaW9fYXBpY19nZXRfdW5pcXVlX2lkIChpbnQgaW9hcGljLCBpbnQgYXBpY19pZCkKK3sKKwl1bmlvbiBJT19BUElDX3JlZ18wMCByZWdfMDA7CisJc3RhdGljIHBoeXNpZF9tYXNrX3QgYXBpY19pZF9tYXAgPSBQSFlTSURfTUFTS19OT05FOworCXBoeXNpZF9tYXNrX3QgdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGkgPSAwOworCisJLyoKKwkgKiBUaGUgUDQgcGxhdGZvcm0gc3VwcG9ydHMgdXAgdG8gMjU2IEFQSUMgSURzIG9uIHR3byBzZXBhcmF0ZSBBUElDIAorCSAqIGJ1c2VzIChvbmUgZm9yIExBUElDcywgb25lIGZvciBJT0FQSUNzKSwgd2hlcmUgcHJlZGVjZXNzb3JzIG9ubHkgCisJICogc3VwcG9ydHMgdXAgdG8gMTYgb24gb25lIHNoYXJlZCBBUElDIGJ1cy4KKwkgKiAKKwkgKiBUQkQ6IEV4cGFuZCBMQVBJQy9JT0FQSUMgc3VwcG9ydCBvbiBQNC1jbGFzcyBzeXN0ZW1zIHRvIHRha2UgZnVsbAorCSAqICAgICAgYWR2YW50YWdlIG9mIG5ldyBBUElDIGJ1cyBhcmNoaXRlY3R1cmUuCisJICovCisKKwlpZiAocGh5c2lkc19lbXB0eShhcGljX2lkX21hcCkpCisJCWFwaWNfaWRfbWFwID0gaW9hcGljX3BoeXNfaWRfbWFwKHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCXJlZ18wMC5yYXcgPSBpb19hcGljX3JlYWQoaW9hcGljLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJaWYgKGFwaWNfaWQgPj0gZ2V0X3BoeXNpY2FsX2Jyb2FkY2FzdCgpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIklPQVBJQ1slZF06IEludmFsaWQgYXBpY19pZCAlZCwgdHJ5aW5nICIKKwkJCSIlZFxuIiwgaW9hcGljLCBhcGljX2lkLCByZWdfMDAuYml0cy5JRCk7CisJCWFwaWNfaWQgPSByZWdfMDAuYml0cy5JRDsKKwl9CisKKwkvKgorCSAqIEV2ZXJ5IEFQSUMgaW4gYSBzeXN0ZW0gbXVzdCBoYXZlIGEgdW5pcXVlIElEIG9yIHdlIGdldCBsb3RzIG9mIG5pY2UgCisJICogJ3N0dWNrIG9uIHNtcF9pbnZhbGlkYXRlX25lZWRlZCBJUEkgd2FpdCcgbWVzc2FnZXMuCisJICovCisJaWYgKGNoZWNrX2FwaWNpZF91c2VkKGFwaWNfaWRfbWFwLCBhcGljX2lkKSkgeworCisJCWZvciAoaSA9IDA7IGkgPCBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KCk7IGkrKykgeworCQkJaWYgKCFjaGVja19hcGljaWRfdXNlZChhcGljX2lkX21hcCwgaSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA9PSBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KCkpCisJCQlwYW5pYygiTWF4IGFwaWNfaWQgZXhjZWVkZWQhXG4iKTsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJT0FQSUNbJWRdOiBhcGljX2lkICVkIGFscmVhZHkgdXNlZCwgIgorCQkJInRyeWluZyAlZFxuIiwgaW9hcGljLCBhcGljX2lkLCBpKTsKKworCQlhcGljX2lkID0gaTsKKwl9IAorCisJdG1wID0gYXBpY2lkX3RvX2NwdV9wcmVzZW50KGFwaWNfaWQpOworCXBoeXNpZHNfb3IoYXBpY19pZF9tYXAsIGFwaWNfaWRfbWFwLCB0bXApOworCisJaWYgKHJlZ18wMC5iaXRzLklEICE9IGFwaWNfaWQpIHsKKwkJcmVnXzAwLmJpdHMuSUQgPSBhcGljX2lkOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQlpb19hcGljX3dyaXRlKGlvYXBpYywgMCwgcmVnXzAwLnJhdyk7CisJCXJlZ18wMC5yYXcgPSBpb19hcGljX3JlYWQoaW9hcGljLCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCQkvKiBTYW5pdHkgY2hlY2sgKi8KKwkJaWYgKHJlZ18wMC5iaXRzLklEICE9IGFwaWNfaWQpCisJCQlwYW5pYygiSU9BUElDWyVkXTogVW5hYmxlIGNoYW5nZSBhcGljX2lkIVxuIiwgaW9hcGljKTsKKwl9CisKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsIEtFUk5fSU5GTworCQkJIklPQVBJQ1slZF06IEFzc2lnbmVkIGFwaWNfaWQgJWRcbiIsIGlvYXBpYywgYXBpY19pZCk7CisKKwlyZXR1cm4gYXBpY19pZDsKK30KKworCitpbnQgX19pbml0IGlvX2FwaWNfZ2V0X3ZlcnNpb24gKGludCBpb2FwaWMpCit7CisJdW5pb24gSU9fQVBJQ19yZWdfMDEJcmVnXzAxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlyZWdfMDEucmF3ID0gaW9fYXBpY19yZWFkKGlvYXBpYywgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZWdfMDEuYml0cy52ZXJzaW9uOworfQorCisKK2ludCBfX2luaXQgaW9fYXBpY19nZXRfcmVkaXJfZW50cmllcyAoaW50IGlvYXBpYykKK3sKKwl1bmlvbiBJT19BUElDX3JlZ18wMQlyZWdfMDE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCXJlZ18wMS5yYXcgPSBpb19hcGljX3JlYWQoaW9hcGljLCAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJlZ18wMS5iaXRzLmVudHJpZXM7Cit9CisKKworaW50IGlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nIChpbnQgaW9hcGljLCBpbnQgcGluLCBpbnQgaXJxLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdykKK3sKKwlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFJT19BUElDX0lSUShpcnEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSU9BUElDWyVkXTogSW52YWxpZCByZWZlcmVuY2UgdG8gSVJRIDBcbiIsCisJCQlpb2FwaWMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEdlbmVyYXRlIGEgUENJIElSUSByb3V0aW5nIGVudHJ5IGFuZCBwcm9ncmFtIHRoZSBJT0FQSUMgYWNjb3JkaW5nbHkuCisJICogTm90ZSB0aGF0IHdlIG1hc2sgKGRpc2FibGUpIElSUXMgbm93IC0tIHRoZXNlIGdldCBlbmFibGVkIHdoZW4gdGhlCisJICogY29ycmVzcG9uZGluZyBkZXZpY2UgZHJpdmVyIHJlZ2lzdGVycyBmb3IgdGhpcyBJUlEuCisJICovCisKKwltZW1zZXQoJmVudHJ5LDAsc2l6ZW9mKGVudHJ5KSk7CisKKwllbnRyeS5kZWxpdmVyeV9tb2RlID0gSU5UX0RFTElWRVJZX01PREU7CisJZW50cnkuZGVzdF9tb2RlID0gSU5UX0RFU1RfTU9ERTsKKwllbnRyeS5kZXN0LmxvZ2ljYWwubG9naWNhbF9kZXN0ID0gY3B1X21hc2tfdG9fYXBpY2lkKFRBUkdFVF9DUFVTKTsKKwllbnRyeS50cmlnZ2VyID0gZWRnZV9sZXZlbDsKKwllbnRyeS5wb2xhcml0eSA9IGFjdGl2ZV9oaWdoX2xvdzsKKwllbnRyeS5tYXNrICA9IDE7CisKKwkvKgorCSAqIElSUXMgPCAxNiBhcmUgYWxyZWFkeSBpbiB0aGUgaXJxXzJfcGluW10gbWFwCisJICovCisJaWYgKGlycSA+PSAxNikKKwkJYWRkX3Bpbl90b19pcnEoaXJxLCBpb2FwaWMsIHBpbik7CisKKwllbnRyeS52ZWN0b3IgPSBhc3NpZ25faXJxX3ZlY3RvcihpcnEpOworCisJYXBpY19wcmludGsoQVBJQ19ERUJVRywgS0VSTl9ERUJVRyAiSU9BUElDWyVkXTogU2V0IFBDSSByb3V0aW5nIGVudHJ5ICIKKwkJIiglZC0lZCAtPiAweCV4IC0+IElSUSAlZCBNb2RlOiVpIEFjdGl2ZTolaSlcbiIsIGlvYXBpYywKKwkJbXBfaW9hcGljc1tpb2FwaWNdLm1wY19hcGljaWQsIHBpbiwgZW50cnkudmVjdG9yLCBpcnEsCisJCWVkZ2VfbGV2ZWwsIGFjdGl2ZV9oaWdoX2xvdyk7CisKKwlpb2FwaWNfcmVnaXN0ZXJfaW50cihpcnEsIGVudHJ5LnZlY3RvciwgZWRnZV9sZXZlbCk7CisKKwlpZiAoIWlvYXBpYyAmJiAoaXJxIDwgMTYpKQorCQlkaXNhYmxlXzgyNTlBX2lycShpcnEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9fYXBpY193cml0ZShpb2FwaWMsIDB4MTErMipwaW4sICooKChpbnQgKikmZW50cnkpKzEpKTsKKwlpb19hcGljX3dyaXRlKGlvYXBpYywgMHgxMCsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qQ09ORklHX0FDUElfQk9PVCovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lvcG9ydC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI1MTYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb3BvcnQuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqCWxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvaW9wb3J0LmMKKyAqCisgKiBUaGlzIGNvbnRhaW5zIHRoZSBpby1wZXJtaXNzaW9uIGJpdG1hcCBjb2RlIC0gd3JpdHRlbiBieSBvYnosIHdpdGggY2hhbmdlcworICogYnkgTGludXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisKKy8qIFNldCBFWFRFTlQgYml0cyBzdGFydGluZyBhdCBCQVNFIGluIEJJVE1BUCB0byB2YWx1ZSBUVVJOX09OLiAqLworc3RhdGljIHZvaWQgc2V0X2JpdG1hcCh1bnNpZ25lZCBsb25nICpiaXRtYXAsIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgZXh0ZW50LCBpbnQgbmV3X3ZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwl1bnNpZ25lZCBsb25nICpiaXRtYXBfYmFzZSA9IGJpdG1hcCArIChiYXNlIC8gQklUU19QRVJfTE9ORyk7CisJdW5zaWduZWQgaW50IGxvd19pbmRleCA9IGJhc2UgJiAoQklUU19QRVJfTE9ORy0xKTsKKwlpbnQgbGVuZ3RoID0gbG93X2luZGV4ICsgZXh0ZW50OworCisJaWYgKGxvd19pbmRleCAhPSAwKSB7CisJCW1hc2sgPSAofjBVTCA8PCBsb3dfaW5kZXgpOworCQlpZiAobGVuZ3RoIDwgQklUU19QRVJfTE9ORykKKwkJCW1hc2sgJj0gfih+MFVMIDw8IGxlbmd0aCk7CisJCWlmIChuZXdfdmFsdWUpCisJCQkqYml0bWFwX2Jhc2UrKyB8PSBtYXNrOworCQllbHNlCisJCQkqYml0bWFwX2Jhc2UrKyAmPSB+bWFzazsKKwkJbGVuZ3RoIC09IEJJVFNfUEVSX0xPTkc7CisJfQorCisJbWFzayA9IChuZXdfdmFsdWUgPyB+MFVMIDogMFVMKTsKKwl3aGlsZSAobGVuZ3RoID49IEJJVFNfUEVSX0xPTkcpIHsKKwkJKmJpdG1hcF9iYXNlKysgPSBtYXNrOworCQlsZW5ndGggLT0gQklUU19QRVJfTE9ORzsKKwl9CisKKwlpZiAobGVuZ3RoID4gMCkgeworCQltYXNrID0gfih+MFVMIDw8IGxlbmd0aCk7CisJCWlmIChuZXdfdmFsdWUpCisJCQkqYml0bWFwX2Jhc2UrKyB8PSBtYXNrOworCQllbHNlCisJCQkqYml0bWFwX2Jhc2UrKyAmPSB+bWFzazsKKwl9Cit9CisKKworLyoKKyAqIHRoaXMgY2hhbmdlcyB0aGUgaW8gcGVybWlzc2lvbnMgYml0bWFwIGluIHRoZSBjdXJyZW50IHRhc2suCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9wZXJtKHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyBudW0sIGludCB0dXJuX29uKQoreworCXVuc2lnbmVkIGxvbmcgaSwgbWF4X2xvbmcsIGJ5dGVzLCBieXRlc191cGRhdGVkOworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICogdCA9ICZjdXJyZW50LT50aHJlYWQ7CisJc3RydWN0IHRzc19zdHJ1Y3QgKiB0c3M7CisJdW5zaWduZWQgbG9uZyAqYml0bWFwOworCisJaWYgKChmcm9tICsgbnVtIDw9IGZyb20pIHx8IChmcm9tICsgbnVtID4gSU9fQklUTUFQX0JJVFMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodHVybl9vbiAmJiAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogSWYgaXQncyB0aGUgZmlyc3QgaW9wZXJtKCkgY2FsbCBpbiB0aGlzIHRocmVhZCdzIGxpZmV0aW1lLCBzZXQgdGhlCisJICogSU8gYml0bWFwIHVwLiBpb3Blcm0oKSBpcyBtdWNoIGxlc3MgdGltaW5nIGNyaXRpY2FsIHRoYW4gY2xvbmUoKSwKKwkgKiB0aGlzIGlzIHdoeSB3ZSBkZWxheSB0aGlzIG9wZXJhdGlvbiB1bnRpbCBub3c6CisJICovCisJaWYgKCF0LT5pb19iaXRtYXBfcHRyKSB7CisJCWJpdG1hcCA9IGttYWxsb2MoSU9fQklUTUFQX0JZVEVTLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFiaXRtYXApCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltZW1zZXQoYml0bWFwLCAweGZmLCBJT19CSVRNQVBfQllURVMpOworCQl0LT5pb19iaXRtYXBfcHRyID0gYml0bWFwOworCX0KKworCS8qCisJICogZG8gaXQgaW4gdGhlIHBlci10aHJlYWQgY29weSBhbmQgaW4gdGhlIFRTUyAuLi4KKwkgKgorCSAqIERpc2FibGUgcHJlZW1wdGlvbiB2aWEgZ2V0X2NwdSgpIC0gd2UgbXVzdCBub3Qgc3dpdGNoIGF3YXkKKwkgKiBiZWNhdXNlIHRoZSAtPmlvX2JpdG1hcF9tYXggdmFsdWUgbXVzdCBtYXRjaCB0aGUgYml0bWFwCisJICogY29udGVudHM6CisJICovCisJdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGdldF9jcHUoKSk7CisKKwlzZXRfYml0bWFwKHQtPmlvX2JpdG1hcF9wdHIsIGZyb20sIG51bSwgIXR1cm5fb24pOworCisJLyoKKwkgKiBTZWFyY2ggZm9yIGEgKHBvc3NpYmx5IG5ldykgbWF4aW11bS4gVGhpcyBpcyBzaW1wbGUgYW5kIHN0dXBpZCwKKwkgKiB0byBrZWVwIGl0IG9idmlvdXNseSBjb3JyZWN0OgorCSAqLworCW1heF9sb25nID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgSU9fQklUTUFQX0xPTkdTOyBpKyspCisJCWlmICh0LT5pb19iaXRtYXBfcHRyW2ldICE9IH4wVUwpCisJCQltYXhfbG9uZyA9IGk7CisKKwlieXRlcyA9IChtYXhfbG9uZyArIDEpICogc2l6ZW9mKGxvbmcpOworCWJ5dGVzX3VwZGF0ZWQgPSBtYXgoYnl0ZXMsIHQtPmlvX2JpdG1hcF9tYXgpOworCisJdC0+aW9fYml0bWFwX21heCA9IGJ5dGVzOworCisJLyoKKwkgKiBTZXRzIHRoZSBsYXp5IHRyaWdnZXIgc28gdGhhdCB0aGUgbmV4dCBJL08gb3BlcmF0aW9uIHdpbGwKKwkgKiByZWxvYWQgdGhlIGNvcnJlY3QgYml0bWFwLgorCSAqLworCXRzcy0+aW9fYml0bWFwX2Jhc2UgPSBJTlZBTElEX0lPX0JJVE1BUF9PRkZTRVRfTEFaWTsKKworCXB1dF9jcHUoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogc3lzX2lvcGwgaGFzIHRvIGJlIHVzZWQgd2hlbiB5b3Ugd2FudCB0byBhY2Nlc3MgdGhlIElPIHBvcnRzCisgKiBiZXlvbmQgdGhlIDB4M2ZmIHJhbmdlOiB0byBnZXQgdGhlIGZ1bGwgNjU1MzYgcG9ydHMgYml0bWFwcGVkCisgKiB5b3UnZCBuZWVkIDhrQiBvZiBiaXRtYXBzL3Byb2Nlc3MsIHdoaWNoIGlzIGEgYml0IGV4Y2Vzc2l2ZS4KKyAqCisgKiBIZXJlIHdlIGp1c3QgY2hhbmdlIHRoZSBlZmxhZ3MgdmFsdWUgb24gdGhlIHN0YWNrOiB3ZSBhbGxvdworICogb25seSB0aGUgc3VwZXItdXNlciB0byBkbyBpdC4gVGhpcyBkZXBlbmRzIG9uIHRoZSBzdGFjay1sYXlvdXQKKyAqIG9uIHN5c3RlbS1jYWxsIGVudHJ5IC0gc2VlIGFsc28gZm9yaygpIGFuZCB0aGUgc2lnbmFsIGhhbmRsaW5nCisgKiBjb2RlLgorICovCisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9wbCh1bnNpZ25lZCBsb25nIHVudXNlZCkKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgJnVudXNlZDsKKwl1bnNpZ25lZCBpbnQgbGV2ZWwgPSByZWdzLT5lYng7CisJdW5zaWduZWQgaW50IG9sZCA9IChyZWdzLT5lZmxhZ3MgPj4gMTIpICYgMzsKKworCWlmIChsZXZlbCA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCS8qIFRyeWluZyB0byBnYWluIG1vcmUgcHJpdmlsZWdlcz8gKi8KKwlpZiAobGV2ZWwgPiBvbGQpIHsKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwl9CisJcmVncy0+ZWZsYWdzID0gKHJlZ3MtPmVmbGFncyAmfiAweDMwMDBVTCkgfCAobGV2ZWwgPDwgMTIpOworCS8qIE1ha2Ugc3VyZSB3ZSByZXR1cm4gdGhlIGxvbmcgd2F5IChub3Qgc3lzZW50ZXIpICovCisJc2V0X3RocmVhZF9mbGFnKFRJRl9JUkVUKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOTQ1YTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICoJbGludXgvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYworICoKKyAqCUNvcHlyaWdodCAoQykgMTk5MiwgMTk5OCBMaW51cyBUb3J2YWxkcywgSW5nbyBNb2xuYXIKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGxvd2VzdCBsZXZlbCB4ODYtc3BlY2lmaWMgaW50ZXJydXB0CisgKiBlbnRyeSwgaXJxLXN0YWNrcyBhbmQgaXJxIHN0YXRpc3RpY3MgY29kZS4gQWxsIHRoZSByZW1haW5pbmcKKyAqIGlycSBsb2dpYyBpcyBkb25lIGJ5IHRoZSBnZW5lcmljIGtlcm5lbC9pcnEvIGNvZGUgYW5kCisgKiBieSB0aGUgeDg2LXNwZWNpZmljIGlycSBjb250cm9sbGVyIGNvZGUuIChlLmcuIGk4MjU5LmMgYW5kCisgKiBpb19hcGljLmMuKQorICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKworREVGSU5FX1BFUl9DUFUoaXJxX2NwdXN0YXRfdCwgaXJxX3N0YXQpIF9fX19jYWNoZWxpbmVfbWF4YWxpZ25lZF9pbl9zbXA7CitFWFBPUlRfUEVSX0NQVV9TWU1CT0woaXJxX3N0YXQpOworCisjaWZuZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworLyoKKyAqICd3aGF0IHNob3VsZCB3ZSBkbyBpZiB3ZSBnZXQgYSBodyBpcnEgZXZlbnQgb24gYW4gaWxsZWdhbCB2ZWN0b3InLgorICogZWFjaCBhcmNoaXRlY3R1cmUgaGFzIHRvIGFuc3dlciB0aGlzIHRoZW1zZWx2ZXMuCisgKi8KK3ZvaWQgYWNrX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlwcmludGsoInVuZXhwZWN0ZWQgSVJRIHRyYXAgYXQgdmVjdG9yICUwMnhcbiIsIGlycSk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR180S1NUQUNLUworLyoKKyAqIHBlci1DUFUgSVJRIGhhbmRsaW5nIGNvbnRleHRzICh0aHJlYWQgaW5mb3JtYXRpb24gYW5kIHN0YWNrKQorICovCit1bmlvbiBpcnFfY3R4IHsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gICAgICB0aW5mbzsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBzdGFja1tUSFJFQURfU0laRS9zaXplb2YodTMyKV07Cit9OworCitzdGF0aWMgdW5pb24gaXJxX2N0eCAqaGFyZGlycV9jdHhbTlJfQ1BVU107CitzdGF0aWMgdW5pb24gaXJxX2N0eCAqc29mdGlycV9jdHhbTlJfQ1BVU107CisjZW5kaWYKKworLyoKKyAqIGRvX0lSUSBoYW5kbGVzIGFsbCBub3JtYWwgZGV2aWNlIElSUSdzICh0aGUgc3BlY2lhbAorICogU01QIGNyb3NzLUNQVSBpbnRlcnJ1cHRzIGhhdmUgdGhlaXIgb3duIHNwZWNpZmljCisgKiBoYW5kbGVycykuCisgKi8KK2Zhc3RjYWxsIHVuc2lnbmVkIGludCBkb19JUlEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CQorCS8qIGhpZ2ggYml0cyB1c2VkIGluIHJldF9mcm9tXyBjb2RlICovCisJaW50IGlycSA9IHJlZ3MtPm9yaWdfZWF4ICYgMHhmZjsKKyNpZmRlZiBDT05GSUdfNEtTVEFDS1MKKwl1bmlvbiBpcnFfY3R4ICpjdXJjdHgsICppcnFjdHg7CisJdTMyICppc3A7CisjZW5kaWYKKworCWlycV9lbnRlcigpOworI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XCisJLyogRGVidWdnaW5nIGNoZWNrIGZvciBzdGFjayBvdmVyZmxvdzogaXMgdGhlcmUgbGVzcyB0aGFuIDFLQiBmcmVlPyAqLworCXsKKwkJbG9uZyBlc3A7CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oImFuZGwgJSVlc3AsJTAiIDoKKwkJCQkJIj1yIiAoZXNwKSA6ICIwIiAoVEhSRUFEX1NJWkUgLSAxKSk7CisJCWlmICh1bmxpa2VseShlc3AgPCAoc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykgKyBTVEFDS19XQVJOKSkpIHsKKwkJCXByaW50aygiZG9fSVJROiBzdGFjayBvdmVyZmxvdzogJWxkXG4iLAorCQkJCWVzcCAtIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKTsKKwkJCWR1bXBfc3RhY2soKTsKKwkJfQorCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHXzRLU1RBQ0tTCisKKwljdXJjdHggPSAodW5pb24gaXJxX2N0eCAqKSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CisJaXJxY3R4ID0gaGFyZGlycV9jdHhbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKworCS8qCisJICogdGhpcyBpcyB3aGVyZSB3ZSBzd2l0Y2ggdG8gdGhlIElSUSBzdGFjay4gSG93ZXZlciwgaWYgd2UgYXJlCisJICogYWxyZWFkeSB1c2luZyB0aGUgSVJRIHN0YWNrIChiZWNhdXNlIHdlIGludGVycnVwdGVkIGEgaGFyZGlycQorCSAqIGhhbmRsZXIpIHdlIGNhbid0IGRvIHRoYXQgYW5kIGp1c3QgaGF2ZSB0byBrZWVwIHVzaW5nIHRoZQorCSAqIGN1cnJlbnQgc3RhY2sgKHdoaWNoIGlzIHRoZSBpcnEgc3RhY2sgYWxyZWFkeSBhZnRlciBhbGwpCisJICovCisJaWYgKGN1cmN0eCAhPSBpcnFjdHgpIHsKKwkJaW50IGFyZzEsIGFyZzIsIGVieDsKKworCQkvKiBidWlsZCB0aGUgc3RhY2sgZnJhbWUgb24gdGhlIElSUSBzdGFjayAqLworCQlpc3AgPSAodTMyKikgKChjaGFyKilpcnFjdHggKyBzaXplb2YoKmlycWN0eCkpOworCQlpcnFjdHgtPnRpbmZvLnRhc2sgPSBjdXJjdHgtPnRpbmZvLnRhc2s7CisJCWlycWN0eC0+dGluZm8ucHJldmlvdXNfZXNwID0gY3VycmVudF9zdGFja19wb2ludGVyOworCisJCWFzbSB2b2xhdGlsZSgKKwkJCSIgICAgICAgeGNoZ2wgICAlJWVieCwlJWVzcCAgICAgIFxuIgorCQkJIiAgICAgICBjYWxsICAgIF9fZG9fSVJRICAgICAgICAgXG4iCisJCQkiICAgICAgIG1vdmwgICAlJWVieCwlJWVzcCAgICAgIFxuIgorCQkJOiAiPWEiIChhcmcxKSwgIj1kIiAoYXJnMiksICI9YiIgKGVieCkKKwkJCTogICIwIiAoaXJxKSwgICAiMSIgKHJlZ3MpLCAgIjIiIChpc3ApCisJCQk6ICJtZW1vcnkiLCAiY2MiLCAiZWN4IgorCQkpOworCX0gZWxzZQorI2VuZGlmCisJCV9fZG9fSVJRKGlycSwgcmVncyk7CisKKwlpcnFfZXhpdCgpOworCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBDT05GSUdfNEtTVEFDS1MKKworLyoKKyAqIFRoZXNlIHNob3VsZCByZWFsbHkgYmUgX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikgYXMgd2VsbCwgYnV0CisgKiBnY2MncyAzLjAgYW5kIGVhcmxpZXIgZG9uJ3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LgorICovCitzdGF0aWMgY2hhciBzb2Z0aXJxX3N0YWNrW05SX0NQVVMgKiBUSFJFQURfU0laRV0KKwkJX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oVEhSRUFEX1NJWkUpKSk7CisKK3N0YXRpYyBjaGFyIGhhcmRpcnFfc3RhY2tbTlJfQ1BVUyAqIFRIUkVBRF9TSVpFXQorCQlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhUSFJFQURfU0laRSkpKTsKKworLyoKKyAqIGFsbG9jYXRlIHBlci1jcHUgc3RhY2tzIGZvciBoYXJkaXJxIGFuZCBmb3Igc29mdGlycSBwcm9jZXNzaW5nCisgKi8KK3ZvaWQgaXJxX2N0eF9pbml0KGludCBjcHUpCit7CisJdW5pb24gaXJxX2N0eCAqaXJxY3R4OworCisJaWYgKGhhcmRpcnFfY3R4W2NwdV0pCisJCXJldHVybjsKKworCWlycWN0eCA9ICh1bmlvbiBpcnFfY3R4KikgJmhhcmRpcnFfc3RhY2tbY3B1KlRIUkVBRF9TSVpFXTsKKwlpcnFjdHgtPnRpbmZvLnRhc2sgICAgICAgICAgICAgID0gTlVMTDsKKwlpcnFjdHgtPnRpbmZvLmV4ZWNfZG9tYWluICAgICAgID0gTlVMTDsKKwlpcnFjdHgtPnRpbmZvLmNwdSAgICAgICAgICAgICAgID0gY3B1OworCWlycWN0eC0+dGluZm8ucHJlZW1wdF9jb3VudCAgICAgPSBIQVJESVJRX09GRlNFVDsKKwlpcnFjdHgtPnRpbmZvLmFkZHJfbGltaXQgICAgICAgID0gTUFLRV9NTV9TRUcoMCk7CisKKwloYXJkaXJxX2N0eFtjcHVdID0gaXJxY3R4OworCisJaXJxY3R4ID0gKHVuaW9uIGlycV9jdHgqKSAmc29mdGlycV9zdGFja1tjcHUqVEhSRUFEX1NJWkVdOworCWlycWN0eC0+dGluZm8udGFzayAgICAgICAgICAgICAgPSBOVUxMOworCWlycWN0eC0+dGluZm8uZXhlY19kb21haW4gICAgICAgPSBOVUxMOworCWlycWN0eC0+dGluZm8uY3B1ICAgICAgICAgICAgICAgPSBjcHU7CisJaXJxY3R4LT50aW5mby5wcmVlbXB0X2NvdW50ICAgICA9IFNPRlRJUlFfT0ZGU0VUOworCWlycWN0eC0+dGluZm8uYWRkcl9saW1pdCAgICAgICAgPSBNQUtFX01NX1NFRygwKTsKKworCXNvZnRpcnFfY3R4W2NwdV0gPSBpcnFjdHg7CisKKwlwcmludGsoIkNQVSAldSBpcnFzdGFja3MsIGhhcmQ9JXAgc29mdD0lcFxuIiwKKwkJY3B1LGhhcmRpcnFfY3R4W2NwdV0sc29mdGlycV9jdHhbY3B1XSk7Cit9CisKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgX19kb19zb2Z0aXJxKHZvaWQpOworCithc21saW5rYWdlIHZvaWQgZG9fc29mdGlycSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHRocmVhZF9pbmZvICpjdXJjdHg7CisJdW5pb24gaXJxX2N0eCAqaXJxY3R4OworCXUzMiAqaXNwOworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAobG9jYWxfc29mdGlycV9wZW5kaW5nKCkpIHsKKwkJY3VyY3R4ID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCQlpcnFjdHggPSBzb2Z0aXJxX2N0eFtzbXBfcHJvY2Vzc29yX2lkKCldOworCQlpcnFjdHgtPnRpbmZvLnRhc2sgPSBjdXJjdHgtPnRhc2s7CisJCWlycWN0eC0+dGluZm8ucHJldmlvdXNfZXNwID0gY3VycmVudF9zdGFja19wb2ludGVyOworCisJCS8qIGJ1aWxkIHRoZSBzdGFjayBmcmFtZSBvbiB0aGUgc29mdGlycSBzdGFjayAqLworCQlpc3AgPSAodTMyKikgKChjaGFyKilpcnFjdHggKyBzaXplb2YoKmlycWN0eCkpOworCisJCWFzbSB2b2xhdGlsZSgKKwkJCSIgICAgICAgeGNoZ2wgICAlJWVieCwlJWVzcCAgICAgXG4iCisJCQkiICAgICAgIGNhbGwgICAgX19kb19zb2Z0aXJxICAgIFxuIgorCQkJIiAgICAgICBtb3ZsICAgICUlZWJ4LCUlZXNwICAgICBcbiIKKwkJCTogIj1iIihpc3ApCisJCQk6ICIwIihpc3ApCisJCQk6ICJtZW1vcnkiLCAiY2MiLCAiZWR4IiwgImVjeCIsICJlYXgiCisJCSk7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitFWFBPUlRfU1lNQk9MKGRvX3NvZnRpcnEpOworI2VuZGlmCisKKy8qCisgKiBJbnRlcnJ1cHQgc3RhdGlzdGljczoKKyAqLworCithdG9taWNfdCBpcnFfZXJyX2NvdW50OworCisvKgorICogL3Byb2MvaW50ZXJydXB0cyBwcmludGluZzoKKyAqLworCitpbnQgc2hvd19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKK3sKKwlpbnQgaSA9ICoobG9mZl90ICopIHYsIGo7CisJc3RydWN0IGlycWFjdGlvbiAqIGFjdGlvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGkgPT0gMCkgeworCQlzZXFfcHJpbnRmKHAsICIgICAgICAgICAgICIpOworCQlmb3IgKGo9MDsgajxOUl9DUFVTOyBqKyspCisJCQlpZiAoY3B1X29ubGluZShqKSkKKwkJCQlzZXFfcHJpbnRmKHAsICJDUFUlZCAgICAgICAiLGopOworCQlzZXFfcHV0YyhwLCAnXG4nKTsKKwl9CisKKwlpZiAoaSA8IE5SX0lSUVMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9kZXNjW2ldLmxvY2ssIGZsYWdzKTsKKwkJYWN0aW9uID0gaXJxX2Rlc2NbaV0uYWN0aW9uOworCQlpZiAoIWFjdGlvbikKKwkJCWdvdG8gc2tpcDsKKwkJc2VxX3ByaW50ZihwLCAiJTNkOiAiLGkpOworI2lmbmRlZiBDT05GSUdfU01QCisJCXNlcV9wcmludGYocCwgIiUxMHUgIiwga3N0YXRfaXJxcyhpKSk7CisjZWxzZQorCQlmb3IgKGogPSAwOyBqIDwgTlJfQ1BVUzsgaisrKQorCQkJaWYgKGNwdV9vbmxpbmUoaikpCisJCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9jcHUoaikuaXJxc1tpXSk7CisjZW5kaWYKKwkJc2VxX3ByaW50ZihwLCAiICUxNHMiLCBpcnFfZGVzY1tpXS5oYW5kbGVyLT50eXBlbmFtZSk7CisJCXNlcV9wcmludGYocCwgIiAgJXMiLCBhY3Rpb24tPm5hbWUpOworCisJCWZvciAoYWN0aW9uPWFjdGlvbi0+bmV4dDsgYWN0aW9uOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpCisJCQlzZXFfcHJpbnRmKHAsICIsICVzIiwgYWN0aW9uLT5uYW1lKTsKKworCQlzZXFfcHV0YyhwLCAnXG4nKTsKK3NraXA6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9kZXNjW2ldLmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgaWYgKGkgPT0gTlJfSVJRUykgeworCQlzZXFfcHJpbnRmKHAsICJOTUk6ICIpOworCQlmb3IgKGogPSAwOyBqIDwgTlJfQ1BVUzsgaisrKQorCQkJaWYgKGNwdV9vbmxpbmUoaikpCisJCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBubWlfY291bnQoaikpOworCQlzZXFfcHV0YyhwLCAnXG4nKTsKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwkJc2VxX3ByaW50ZihwLCAiTE9DOiAiKTsKKwkJZm9yIChqID0gMDsgaiA8IE5SX0NQVVM7IGorKykKKwkJCWlmIChjcHVfb25saW5lKGopKQorCQkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwKKwkJCQkJcGVyX2NwdShpcnFfc3RhdCxqKS5hcGljX3RpbWVyX2lycXMpOworCQlzZXFfcHV0YyhwLCAnXG4nKTsKKyNlbmRpZgorCQlzZXFfcHJpbnRmKHAsICJFUlI6ICUxMHVcbiIsIGF0b21pY19yZWFkKCZpcnFfZXJyX2NvdW50KSk7CisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpCisJCXNlcV9wcmludGYocCwgIk1JUzogJTEwdVxuIiwgYXRvbWljX3JlYWQoJmlycV9taXNfY291bnQpKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxNjgxNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogIEtlcm5lbCBQcm9iZXMgKEtQcm9iZXMpCisgKiAgYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDAyLCAyMDA0CisgKgorICogMjAwMi1PY3QJQ3JlYXRlZCBieSBWYW1zaSBLcmlzaG5hIFMgPHZhbXNpX2tyaXNobmFAaW4uaWJtLmNvbT4gS2VybmVsCisgKgkJUHJvYmVzIGluaXRpYWwgaW1wbGVtZW50YXRpb24gKCBpbmNsdWRlcyBjb250cmlidXRpb25zIGZyb20KKyAqCQlSdXN0eSBSdXNzZWxsKS4KKyAqIDIwMDQtSnVseQlTdXBhcm5hIEJoYXR0YWNoYXJ5YSA8c3VwYXJuYUBpbi5pYm0uY29tPiBhZGRlZCBqdW1wZXIgcHJvYmVzCisgKgkJaW50ZXJmYWNlIHRvIGFjY2VzcyBmdW5jdGlvbiBhcmd1bWVudHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KKyNpbmNsdWRlIDxhc20va2RlYnVnLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKworLyoga3Byb2JlX3N0YXR1cyBzZXR0aW5ncyAqLworI2RlZmluZSBLUFJPQkVfSElUX0FDVElWRQkweDAwMDAwMDAxCisjZGVmaW5lIEtQUk9CRV9ISVRfU1MJCTB4MDAwMDAwMDIKKworc3RhdGljIHN0cnVjdCBrcHJvYmUgKmN1cnJlbnRfa3Byb2JlOworc3RhdGljIHVuc2lnbmVkIGxvbmcga3Byb2JlX3N0YXR1cywga3Byb2JlX29sZF9lZmxhZ3MsIGtwcm9iZV9zYXZlZF9lZmxhZ3M7CitzdGF0aWMgc3RydWN0IHB0X3JlZ3MganByb2JlX3NhdmVkX3JlZ3M7CitzdGF0aWMgbG9uZyAqanByb2JlX3NhdmVkX2VzcDsKKy8qIGNvcHkgb2YgdGhlIGtlcm5lbCBzdGFjayBhdCB0aGUgcHJvYmUgZmlyZSB0aW1lICovCitzdGF0aWMga3Byb2JlX29wY29kZV90IGpwcm9iZXNfc3RhY2tbTUFYX1NUQUNLX1NJWkVdOwordm9pZCBqcHJvYmVfcmV0dXJuX2VuZCh2b2lkKTsKKworLyoKKyAqIHJldHVybnMgbm9uLXplcm8gaWYgb3Bjb2RlIG1vZGlmaWVzIHRoZSBpbnRlcnJ1cHQgZmxhZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfSUZfbW9kaWZpZXIoa3Byb2JlX29wY29kZV90IG9wY29kZSkKK3sKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgMHhmYToJCS8qIGNsaSAqLworCWNhc2UgMHhmYjoJCS8qIHN0aSAqLworCWNhc2UgMHhjZjoJCS8qIGlyZXQvaXJldGQgKi8KKwljYXNlIDB4OWQ6CQkvKiBwb3BmL3BvcGZkICovCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhcmNoX2NvcHlfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit7CisJbWVtY3B5KHAtPmFpbnNuLmluc24sIHAtPmFkZHIsIE1BWF9JTlNOX1NJWkUgKiBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7Cit9CisKK3ZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCSpwLT5hZGRyID0gcC0+b3Bjb2RlOworCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX3NpbmdsZXN0ZXAoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmVncy0+ZWZsYWdzIHw9IFRGX01BU0s7CisJcmVncy0+ZWZsYWdzICY9IH5JRl9NQVNLOworCS8qc2luZ2xlIHN0ZXAgaW5saW5lIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhbiBpbnQzKi8KKwlpZiAocC0+b3Bjb2RlID09IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04pCisJCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7CisJZWxzZQorCQlyZWdzLT5laXAgPSAodW5zaWduZWQgbG9uZykmcC0+YWluc24uaW5zbjsKK30KKworLyoKKyAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAzIGlzIGFuIGludGVycnVwdCBnYXRlIGFuZCB0aGV5CisgKiByZW1haW4gZGlzYWJsZWQgdGhvcm91Z2ggb3V0IHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQga3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGtwcm9iZSAqcDsKKwlpbnQgcmV0ID0gMDsKKwlrcHJvYmVfb3Bjb2RlX3QgKmFkZHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgKmxwOworCisJLyogV2UncmUgaW4gYW4gaW50ZXJydXB0LCBidXQgdGhpcyBpcyBjbGVhciBhbmQgQlVHKCktc2FmZS4gKi8KKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwkvKiBDaGVjayBpZiB0aGUgYXBwbGljYXRpb24gaXMgdXNpbmcgTERUIGVudHJ5IGZvciBpdHMgY29kZSBzZWdtZW50IGFuZAorCSAqIGNhbGN1bGF0ZSB0aGUgYWRkcmVzcyBieSByZWFkaW5nIHRoZSBiYXNlIGFkZHJlc3MgZnJvbSB0aGUgTERUIGVudHJ5LgorCSAqLworCWlmICgocmVncy0+eGNzICYgNCkgJiYgKGN1cnJlbnQtPm1tKSkgeworCQlscCA9ICh1bnNpZ25lZCBsb25nICopICgodW5zaWduZWQgbG9uZykoKHJlZ3MtPnhjcyA+PiAzKSAqIDgpCisJCQkJCSsgKGNoYXIgKikgY3VycmVudC0+bW0tPmNvbnRleHQubGR0KTsKKwkJYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKikgKGdldF9kZXNjX2Jhc2UobHApICsgcmVncy0+ZWlwIC0KKwkJCQkJCXNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKKwl9IGVsc2UgeworCQlhZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKShyZWdzLT5laXAgLSBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CisJfQorCS8qIENoZWNrIHdlJ3JlIG5vdCBhY3R1YWxseSByZWN1cnNpbmcgKi8KKwlpZiAoa3Byb2JlX3J1bm5pbmcoKSkgeworCQkvKiBXZSAqYXJlKiBob2xkaW5nIGxvY2sgaGVyZSwgc28gdGhpcyBpcyBzYWZlLgorCQkgICBEaXNhcm0gdGhlIHByb2JlIHdlIGp1c3QgaGl0LCBhbmQgaWdub3JlIGl0LiAqLworCQlwID0gZ2V0X2twcm9iZShhZGRyKTsKKwkJaWYgKHApIHsKKwkJCWlmIChrcHJvYmVfc3RhdHVzID09IEtQUk9CRV9ISVRfU1MpIHsKKwkJCQlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CisJCQkJcmVncy0+ZWZsYWdzIHw9IGtwcm9iZV9zYXZlZF9lZmxhZ3M7CisJCQkJdW5sb2NrX2twcm9iZXMoKTsKKwkJCQlnb3RvIG5vX2twcm9iZTsKKwkJCX0KKwkJCWRpc2FybV9rcHJvYmUocCwgcmVncyk7CisJCQlyZXQgPSAxOworCQl9IGVsc2UgeworCQkJcCA9IGN1cnJlbnRfa3Byb2JlOworCQkJaWYgKHAtPmJyZWFrX2hhbmRsZXIgJiYgcC0+YnJlYWtfaGFuZGxlcihwLCByZWdzKSkgeworCQkJCWdvdG8gc3NfcHJvYmU7CisJCQl9CisJCX0KKwkJLyogSWYgaXQncyBub3Qgb3VycywgY2FuJ3QgYmUgZGVsZXRlIHJhY2UsICh3ZSBob2xkIGxvY2spLiAqLworCQlnb3RvIG5vX2twcm9iZTsKKwl9CisKKwlsb2NrX2twcm9iZXMoKTsKKwlwID0gZ2V0X2twcm9iZShhZGRyKTsKKwlpZiAoIXApIHsKKwkJdW5sb2NrX2twcm9iZXMoKTsKKwkJaWYgKHJlZ3MtPmVmbGFncyAmIFZNX01BU0spIHsKKwkJCS8qIFdlIGFyZSBpbiB2aXJ0dWFsLTgwODYgbW9kZS4gUmV0dXJuIDAgKi8KKwkJCWdvdG8gbm9fa3Byb2JlOworCQl9CisKKwkJaWYgKCphZGRyICE9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT04pIHsKKwkJCS8qCisJCQkgKiBUaGUgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiB3YXMgcmVtb3ZlZCByaWdodAorCQkJICogYWZ0ZXIgd2UgaGl0IGl0LiAgQW5vdGhlciBjcHUgaGFzIHJlbW92ZWQKKwkJCSAqIGVpdGhlciBhIHByb2JlcG9pbnQgb3IgYSBkZWJ1Z2dlciBicmVha3BvaW50CisJCQkgKiBhdCB0aGlzIGFkZHJlc3MuICBJbiBlaXRoZXIgY2FzZSwgbm8gZnVydGhlcgorCQkJICogaGFuZGxpbmcgb2YgdGhpcyBpbnRlcnJ1cHQgaXMgYXBwcm9wcmlhdGUuCisJCQkgKi8KKwkJCXJldCA9IDE7CisJCX0KKwkJLyogTm90IG9uZSBvZiBvdXJzOiBsZXQga2VybmVsIGhhbmRsZSBpdCAqLworCQlnb3RvIG5vX2twcm9iZTsKKwl9CisKKwlrcHJvYmVfc3RhdHVzID0gS1BST0JFX0hJVF9BQ1RJVkU7CisJY3VycmVudF9rcHJvYmUgPSBwOworCWtwcm9iZV9zYXZlZF9lZmxhZ3MgPSBrcHJvYmVfb2xkX2VmbGFncworCSAgICA9IChyZWdzLT5lZmxhZ3MgJiAoVEZfTUFTSyB8IElGX01BU0spKTsKKwlpZiAoaXNfSUZfbW9kaWZpZXIocC0+b3Bjb2RlKSkKKwkJa3Byb2JlX3NhdmVkX2VmbGFncyAmPSB+SUZfTUFTSzsKKworCWlmIChwLT5wcmVfaGFuZGxlciAmJiBwLT5wcmVfaGFuZGxlcihwLCByZWdzKSkKKwkJLyogaGFuZGxlciBoYXMgYWxyZWFkeSBzZXQgdGhpbmdzIHVwLCBzbyBza2lwIHNzIHNldHVwICovCisJCXJldHVybiAxOworCitzc19wcm9iZToKKwlwcmVwYXJlX3NpbmdsZXN0ZXAocCwgcmVncyk7CisJa3Byb2JlX3N0YXR1cyA9IEtQUk9CRV9ISVRfU1M7CisJcmV0dXJuIDE7CisKK25vX2twcm9iZToKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENhbGxlZCBhZnRlciBzaW5nbGUtc3RlcHBpbmcuICBwLT5hZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQorICogaW5zdHJ1Y3Rpb24gd2hvc2UgZmlyc3QgYnl0ZSBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgImludCAzIgorICogaW5zdHJ1Y3Rpb24uICBUbyBhdm9pZCB0aGUgU01QIHByb2JsZW1zIHRoYXQgY2FuIG9jY3VyIHdoZW4gd2UKKyAqIHRlbXBvcmFyaWx5IHB1dCBiYWNrIHRoZSBvcmlnaW5hbCBvcGNvZGUgdG8gc2luZ2xlLXN0ZXAsIHdlCisgKiBzaW5nbGUtc3RlcHBlZCBhIGNvcHkgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGFkZHJlc3Mgb2YgdGhpcworICogY29weSBpcyBwLT5haW5zbi5pbnNuLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdG8gcmV0dXJuIGZyb20gdGhlIHBvc3Qtc2luZ2xlLXN0ZXAKKyAqIGludGVycnVwdC4gIFdlIGhhdmUgdG8gZml4IHVwIHRoZSBzdGFjayBhcyBmb2xsb3dzOgorICoKKyAqIDApIEV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBhYnNvbHV0ZSBvciBpbmRpcmVjdCBqdW1wIG9yIGNhbGwgaW5zdHJ1Y3Rpb25zLAorICogdGhlIG5ldyBlaXAgaXMgcmVsYXRpdmUgdG8gdGhlIGNvcGllZCBpbnN0cnVjdGlvbi4gIFdlIG5lZWQgdG8gbWFrZQorICogaXQgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgorICoKKyAqIDEpIElmIHRoZSBzaW5nbGUtc3RlcHBlZCBpbnN0cnVjdGlvbiB3YXMgcHVzaGZsLCB0aGVuIHRoZSBURiBhbmQgSUYKKyAqIGZsYWdzIGFyZSBzZXQgaW4gdGhlIGp1c3QtcHVzaGVkIGVmbGFncywgYW5kIG1heSBuZWVkIHRvIGJlIGNsZWFyZWQuCisgKgorICogMikgSWYgdGhlIHNpbmdsZS1zdGVwcGVkIGluc3RydWN0aW9uIHdhcyBhIGNhbGwsIHRoZSByZXR1cm4gYWRkcmVzcworICogdGhhdCBpcyBhdG9wIHRoZSBzdGFjayBpcyB0aGUgYWRkcmVzcyBmb2xsb3dpbmcgdGhlIGNvcGllZCBpbnN0cnVjdGlvbi4KKyAqIFdlIG5lZWQgdG8gbWFrZSBpdCB0aGUgYWRkcmVzcyBmb2xsb3dpbmcgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgorICovCitzdGF0aWMgdm9pZCByZXN1bWVfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgKnRvcyA9ICh1bnNpZ25lZCBsb25nICopJnJlZ3MtPmVzcDsKKwl1bnNpZ25lZCBsb25nIG5leHRfZWlwID0gMDsKKwl1bnNpZ25lZCBsb25nIGNvcHlfZWlwID0gKHVuc2lnbmVkIGxvbmcpJnAtPmFpbnNuLmluc247CisJdW5zaWduZWQgbG9uZyBvcmlnX2VpcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7CisKKwlzd2l0Y2ggKHAtPmFpbnNuLmluc25bMF0pIHsKKwljYXNlIDB4OWM6CQkvKiBwdXNoZmwgKi8KKwkJKnRvcyAmPSB+KFRGX01BU0sgfCBJRl9NQVNLKTsKKwkJKnRvcyB8PSBrcHJvYmVfb2xkX2VmbGFnczsKKwkJYnJlYWs7CisJY2FzZSAweGU4OgkJLyogY2FsbCByZWxhdGl2ZSAtIEZpeCByZXR1cm4gYWRkciAqLworCQkqdG9zID0gb3JpZ19laXAgKyAoKnRvcyAtIGNvcHlfZWlwKTsKKwkJYnJlYWs7CisJY2FzZSAweGZmOgorCQlpZiAoKHAtPmFpbnNuLmluc25bMV0gJiAweDMwKSA9PSAweDEwKSB7CisJCQkvKiBjYWxsIGFic29sdXRlLCBpbmRpcmVjdCAqLworCQkJLyogRml4IHJldHVybiBhZGRyOyBlaXAgaXMgY29ycmVjdC4gKi8KKwkJCW5leHRfZWlwID0gcmVncy0+ZWlwOworCQkJKnRvcyA9IG9yaWdfZWlwICsgKCp0b3MgLSBjb3B5X2VpcCk7CisJCX0gZWxzZSBpZiAoKChwLT5haW5zbi5pbnNuWzFdICYgMHgzMSkgPT0gMHgyMCkgfHwJLyogam1wIG5lYXIsIGFic29sdXRlIGluZGlyZWN0ICovCisJCQkgICAoKHAtPmFpbnNuLmluc25bMV0gJiAweDMxKSA9PSAweDIxKSkgewkvKiBqbXAgZmFyLCBhYnNvbHV0ZSBpbmRpcmVjdCAqLworCQkJLyogZWlwIGlzIGNvcnJlY3QuICovCisJCQluZXh0X2VpcCA9IHJlZ3MtPmVpcDsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4ZWE6CQkvKiBqbXAgYWJzb2x1dGUgLS0gZWlwIGlzIGNvcnJlY3QgKi8KKwkJbmV4dF9laXAgPSByZWdzLT5laXA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKKwlpZiAobmV4dF9laXApIHsKKwkJcmVncy0+ZWlwID0gbmV4dF9laXA7CisJfSBlbHNlIHsKKwkJcmVncy0+ZWlwID0gb3JpZ19laXAgKyAocmVncy0+ZWlwIC0gY29weV9laXApOworCX0KK30KKworLyoKKyAqIEludGVycnVwdHMgYXJlIGRpc2FibGVkIG9uIGVudHJ5IGFzIHRyYXAxIGlzIGFuIGludGVycnVwdCBnYXRlIGFuZCB0aGV5CisgKiByZW1haW4gZGlzYWJsZWQgdGhvcm91Z2hvdXQgdGhpcyBmdW5jdGlvbi4gIEFuZCB3ZSBob2xkIGtwcm9iZSBsb2NrLgorICovCitzdGF0aWMgaW5saW5lIGludCBwb3N0X2twcm9iZV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICgha3Byb2JlX3J1bm5pbmcoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY3VycmVudF9rcHJvYmUtPnBvc3RfaGFuZGxlcikKKwkJY3VycmVudF9rcHJvYmUtPnBvc3RfaGFuZGxlcihjdXJyZW50X2twcm9iZSwgcmVncywgMCk7CisKKwlyZXN1bWVfZXhlY3V0aW9uKGN1cnJlbnRfa3Byb2JlLCByZWdzKTsKKwlyZWdzLT5lZmxhZ3MgfD0ga3Byb2JlX3NhdmVkX2VmbGFnczsKKworCXVubG9ja19rcHJvYmVzKCk7CisJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCisJLyoKKwkgKiBpZiBzb21lYm9keSBlbHNlIGlzIHNpbmdsZXN0ZXBwaW5nIGFjcm9zcyBhIHByb2JlIHBvaW50LCBlZmxhZ3MKKwkgKiB3aWxsIGhhdmUgVEYgc2V0LCBpbiB3aGljaCBjYXNlLCBjb250aW51ZSB0aGUgcmVtYWluaW5nIHByb2Nlc3NpbmcKKwkgKiBvZiBkb19kZWJ1ZywgYXMgaWYgdGhpcyBpcyBub3QgYSBwcm9iZSBoaXQuCisJICovCisJaWYgKHJlZ3MtPmVmbGFncyAmIFRGX01BU0spCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qIEludGVycnVwdHMgZGlzYWJsZWQsIGtwcm9iZV9sb2NrIGhlbGQuICovCitzdGF0aWMgaW5saW5lIGludCBrcHJvYmVfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucikKK3sKKwlpZiAoY3VycmVudF9rcHJvYmUtPmZhdWx0X2hhbmRsZXIKKwkgICAgJiYgY3VycmVudF9rcHJvYmUtPmZhdWx0X2hhbmRsZXIoY3VycmVudF9rcHJvYmUsIHJlZ3MsIHRyYXBucikpCisJCXJldHVybiAxOworCisJaWYgKGtwcm9iZV9zdGF0dXMgJiBLUFJPQkVfSElUX1NTKSB7CisJCXJlc3VtZV9leGVjdXRpb24oY3VycmVudF9rcHJvYmUsIHJlZ3MpOworCQlyZWdzLT5lZmxhZ3MgfD0ga3Byb2JlX29sZF9lZmxhZ3M7CisKKwkJdW5sb2NrX2twcm9iZXMoKTsKKwkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyYXBwZXIgcm91dGluZSB0byBmb3IgaGFuZGxpbmcgZXhjZXB0aW9ucy4KKyAqLworaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IChzdHJ1Y3QgZGllX2FyZ3MgKilkYXRhOworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBESUVfSU5UMzoKKwkJaWYgKGtwcm9iZV9oYW5kbGVyKGFyZ3MtPnJlZ3MpKQorCQkJcmV0dXJuIE5PVElGWV9TVE9QOworCQlicmVhazsKKwljYXNlIERJRV9ERUJVRzoKKwkJaWYgKHBvc3Rfa3Byb2JlX2hhbmRsZXIoYXJncy0+cmVncykpCisJCQlyZXR1cm4gTk9USUZZX1NUT1A7CisJCWJyZWFrOworCWNhc2UgRElFX0dQRjoKKwkJaWYgKGtwcm9iZV9ydW5uaW5nKCkgJiYKKwkJICAgIGtwcm9iZV9mYXVsdF9oYW5kbGVyKGFyZ3MtPnJlZ3MsIGFyZ3MtPnRyYXBucikpCisJCQlyZXR1cm4gTk9USUZZX1NUT1A7CisJCWJyZWFrOworCWNhc2UgRElFX1BBR0VfRkFVTFQ6CisJCWlmIChrcHJvYmVfcnVubmluZygpICYmCisJCSAgICBrcHJvYmVfZmF1bHRfaGFuZGxlcihhcmdzLT5yZWdzLCBhcmdzLT50cmFwbnIpKQorCQkJcmV0dXJuIE5PVElGWV9TVE9QOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitpbnQgc2V0am1wX3ByZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBqcHJvYmUgKmpwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBqcHJvYmUsIGtwKTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlqcHJvYmVfc2F2ZWRfcmVncyA9ICpyZWdzOworCWpwcm9iZV9zYXZlZF9lc3AgPSAmcmVncy0+ZXNwOworCWFkZHIgPSAodW5zaWduZWQgbG9uZylqcHJvYmVfc2F2ZWRfZXNwOworCisJLyoKKwkgKiBUQkQ6IEFzIExpbnVzIHBvaW50ZWQgb3V0LCBnY2MgYXNzdW1lcyB0aGF0IHRoZSBjYWxsZWUKKwkgKiBvd25zIHRoZSBhcmd1bWVudCBzcGFjZSBhbmQgY291bGQgb3ZlcndyaXRlIGl0LCBlLmcuCisJICogdGFpbGNhbGwgb3B0aW1pemF0aW9uLiBTbywgdG8gYmUgYWJzb2x1dGVseSBzYWZlCisJICogd2UgYWxzbyBzYXZlIGFuZCByZXN0b3JlIGVub3VnaCBzdGFjayBieXRlcyB0byBjb3ZlcgorCSAqIHRoZSBhcmd1bWVudCBhcmVhLgorCSAqLworCW1lbWNweShqcHJvYmVzX3N0YWNrLCAoa3Byb2JlX29wY29kZV90ICopIGFkZHIsIE1JTl9TVEFDS19TSVpFKGFkZHIpKTsKKwlyZWdzLT5lZmxhZ3MgJj0gfklGX01BU0s7CisJcmVncy0+ZWlwID0gKHVuc2lnbmVkIGxvbmcpKGpwLT5lbnRyeSk7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQganByb2JlX3JldHVybih2b2lkKQoreworCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKwlhc20gdm9sYXRpbGUgKCIgICAgICAgeGNoZ2wgICAlJWVieCwlJWVzcCAgICAgXG4iCisJCSAgICAgICIgICAgICAgaW50MwkJCVxuIgorCQkgICAgICAiICAgICAgIC5nbG9ibCBqcHJvYmVfcmV0dXJuX2VuZAlcbiIKKwkJICAgICAgIiAgICAgICBqcHJvYmVfcmV0dXJuX2VuZDoJXG4iCisJCSAgICAgICIgICAgICAgbm9wCQkJXG4iOjoiYiIKKwkJICAgICAgKGpwcm9iZV9zYXZlZF9lc3ApOiJtZW1vcnkiKTsKK30KKworaW50IGxvbmdqbXBfYnJlYWtfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1OCAqYWRkciA9ICh1OCAqKSAocmVncy0+ZWlwIC0gMSk7CisJdW5zaWduZWQgbG9uZyBzdGFja19hZGRyID0gKHVuc2lnbmVkIGxvbmcpanByb2JlX3NhdmVkX2VzcDsKKwlzdHJ1Y3QganByb2JlICpqcCA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QganByb2JlLCBrcCk7CisKKwlpZiAoKGFkZHIgPiAodTggKikganByb2JlX3JldHVybikgJiYgKGFkZHIgPCAodTggKikganByb2JlX3JldHVybl9lbmQpKSB7CisJCWlmICgmcmVncy0+ZXNwICE9IGpwcm9iZV9zYXZlZF9lc3ApIHsKKwkJCXN0cnVjdCBwdF9yZWdzICpzYXZlZF9yZWdzID0KKwkJCSAgICBjb250YWluZXJfb2YoanByb2JlX3NhdmVkX2VzcCwgc3RydWN0IHB0X3JlZ3MsIGVzcCk7CisJCQlwcmludGsoImN1cnJlbnQgZXNwICVwIGRvZXMgbm90IG1hdGNoIHNhdmVkIGVzcCAlcFxuIiwKKwkJCSAgICAgICAmcmVncy0+ZXNwLCBqcHJvYmVfc2F2ZWRfZXNwKTsKKwkJCXByaW50aygiU2F2ZWQgcmVnaXN0ZXJzIGZvciBqcHJvYmUgJXBcbiIsIGpwKTsKKwkJCXNob3dfcmVnaXN0ZXJzKHNhdmVkX3JlZ3MpOworCQkJcHJpbnRrKCJDdXJyZW50IHJlZ2lzdGVyc1xuIik7CisJCQlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKwkJCUJVRygpOworCQl9CisJCSpyZWdzID0ganByb2JlX3NhdmVkX3JlZ3M7CisJCW1lbWNweSgoa3Byb2JlX29wY29kZV90ICopIHN0YWNrX2FkZHIsIGpwcm9iZXNfc3RhY2ssCisJCSAgICAgICBNSU5fU1RBQ0tfU0laRShzdGFja19hZGRyKSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbGR0LmMgYi9hcmNoL2kzODYva2VybmVsL2xkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNTBhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2xkdC5jCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogbGludXgva2VybmVsL2xkdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyIEtyaXNobmEgQmFsYXN1YnJhbWFuaWFuIGFuZCBMaW51cyBUb3J2YWxkcworICogQ29weXJpZ2h0IChDKSAxOTk5IEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbGR0Lmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKworI2lmZGVmIENPTkZJR19TTVAgLyogYXZvaWRzICJkZWZpbmVkIGJ1dCBub3QgdXNlZCIgd2FybmlnICovCitzdGF0aWMgdm9pZCBmbHVzaF9sZHQodm9pZCAqbnVsbCkKK3sKKwlpZiAoY3VycmVudC0+YWN0aXZlX21tKQorCQlsb2FkX0xEVCgmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFsbG9jX2xkdChtbV9jb250ZXh0X3QgKnBjLCBpbnQgbWluY291bnQsIGludCByZWxvYWQpCit7CisJdm9pZCAqb2xkbGR0OworCXZvaWQgKm5ld2xkdDsKKwlpbnQgb2xkc2l6ZTsKKworCWlmIChtaW5jb3VudCA8PSBwYy0+c2l6ZSkKKwkJcmV0dXJuIDA7CisJb2xkc2l6ZSA9IHBjLT5zaXplOworCW1pbmNvdW50ID0gKG1pbmNvdW50KzUxMSkmKH41MTEpOworCWlmIChtaW5jb3VudCpMRFRfRU5UUllfU0laRSA+IFBBR0VfU0laRSkKKwkJbmV3bGR0ID0gdm1hbGxvYyhtaW5jb3VudCpMRFRfRU5UUllfU0laRSk7CisJZWxzZQorCQluZXdsZHQgPSBrbWFsbG9jKG1pbmNvdW50KkxEVF9FTlRSWV9TSVpFLCBHRlBfS0VSTkVMKTsKKworCWlmICghbmV3bGR0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChvbGRzaXplKQorCQltZW1jcHkobmV3bGR0LCBwYy0+bGR0LCBvbGRzaXplKkxEVF9FTlRSWV9TSVpFKTsKKwlvbGRsZHQgPSBwYy0+bGR0OworCW1lbXNldChuZXdsZHQrb2xkc2l6ZSpMRFRfRU5UUllfU0laRSwgMCwgKG1pbmNvdW50LW9sZHNpemUpKkxEVF9FTlRSWV9TSVpFKTsKKwlwYy0+bGR0ID0gbmV3bGR0OworCXdtYigpOworCXBjLT5zaXplID0gbWluY291bnQ7CisJd21iKCk7CisKKwlpZiAocmVsb2FkKSB7CisjaWZkZWYgQ09ORklHX1NNUAorCQljcHVtYXNrX3QgbWFzazsKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCWxvYWRfTERUKHBjKTsKKwkJbWFzayA9IGNwdW1hc2tfb2ZfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCWlmICghY3B1c19lcXVhbChjdXJyZW50LT5tbS0+Y3B1X3ZtX21hc2ssIG1hc2spKQorCQkJc21wX2NhbGxfZnVuY3Rpb24oZmx1c2hfbGR0LCBOVUxMLCAxLCAxKTsKKwkJcHJlZW1wdF9lbmFibGUoKTsKKyNlbHNlCisJCWxvYWRfTERUKHBjKTsKKyNlbmRpZgorCX0KKwlpZiAob2xkc2l6ZSkgeworCQlpZiAob2xkc2l6ZSpMRFRfRU5UUllfU0laRSA+IFBBR0VfU0laRSkKKwkJCXZmcmVlKG9sZGxkdCk7CisJCWVsc2UKKwkJCWtmcmVlKG9sZGxkdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjb3B5X2xkdChtbV9jb250ZXh0X3QgKm5ldywgbW1fY29udGV4dF90ICpvbGQpCit7CisJaW50IGVyciA9IGFsbG9jX2xkdChuZXcsIG9sZC0+c2l6ZSwgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJbWVtY3B5KG5ldy0+bGR0LCBvbGQtPmxkdCwgb2xkLT5zaXplKkxEVF9FTlRSWV9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdlIGRvIG5vdCBoYXZlIHRvIG11Y2sgd2l0aCBkZXNjcmlwdG9ycyBoZXJlLCB0aGF0IGlzCisgKiBkb25lIGluIHN3aXRjaF9tbSgpIGFzIG5lZWRlZC4KKyAqLworaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKiBvbGRfbW07CisJaW50IHJldHZhbCA9IDA7CisKKwlpbml0X01VVEVYKCZtbS0+Y29udGV4dC5zZW0pOworCW1tLT5jb250ZXh0LnNpemUgPSAwOworCW9sZF9tbSA9IGN1cnJlbnQtPm1tOworCWlmIChvbGRfbW0gJiYgb2xkX21tLT5jb250ZXh0LnNpemUgPiAwKSB7CisJCWRvd24oJm9sZF9tbS0+Y29udGV4dC5zZW0pOworCQlyZXR2YWwgPSBjb3B5X2xkdCgmbW0tPmNvbnRleHQsICZvbGRfbW0tPmNvbnRleHQpOworCQl1cCgmb2xkX21tLT5jb250ZXh0LnNlbSk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBObyBuZWVkIHRvIGxvY2sgdGhlIE1NIGFzIHdlIGFyZSB0aGUgbGFzdCB1c2VyCisgKi8KK3ZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWlmIChtbS0+Y29udGV4dC5zaXplKSB7CisJCWlmIChtbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pCisJCQljbGVhcl9MRFQoKTsKKwkJaWYgKG1tLT5jb250ZXh0LnNpemUqTERUX0VOVFJZX1NJWkUgPiBQQUdFX1NJWkUpCisJCQl2ZnJlZShtbS0+Y29udGV4dC5sZHQpOworCQllbHNlCisJCQlrZnJlZShtbS0+Y29udGV4dC5sZHQpOworCQltbS0+Y29udGV4dC5zaXplID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9sZHQodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSA9IGN1cnJlbnQtPm1tOworCisJaWYgKCFtbS0+Y29udGV4dC5zaXplKQorCQlyZXR1cm4gMDsKKwlpZiAoYnl0ZWNvdW50ID4gTERUX0VOVFJZX1NJWkUqTERUX0VOVFJJRVMpCisJCWJ5dGVjb3VudCA9IExEVF9FTlRSWV9TSVpFKkxEVF9FTlRSSUVTOworCisJZG93bigmbW0tPmNvbnRleHQuc2VtKTsKKwlzaXplID0gbW0tPmNvbnRleHQuc2l6ZSpMRFRfRU5UUllfU0laRTsKKwlpZiAoc2l6ZSA+IGJ5dGVjb3VudCkKKwkJc2l6ZSA9IGJ5dGVjb3VudDsKKworCWVyciA9IDA7CisJaWYgKGNvcHlfdG9fdXNlcihwdHIsIG1tLT5jb250ZXh0LmxkdCwgc2l6ZSkpCisJCWVyciA9IC1FRkFVTFQ7CisJdXAoJm1tLT5jb250ZXh0LnNlbSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCWlmIChzaXplICE9IGJ5dGVjb3VudCkgeworCQkvKiB6ZXJvLWZpbGwgdGhlIHJlc3QgKi8KKwkJaWYgKGNsZWFyX3VzZXIocHRyK3NpemUsIGJ5dGVjb3VudC1zaXplKSAhPSAwKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwl9CisJcmV0dXJuIGJ5dGVjb3VudDsKK2Vycm9yX3JldHVybjoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJlYWRfZGVmYXVsdF9sZHQodm9pZCBfX3VzZXIgKiBwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXZvaWQgKmFkZHJlc3M7CisKKwllcnIgPSAwOworCWFkZHJlc3MgPSAmZGVmYXVsdF9sZHRbMF07CisJc2l6ZSA9IDUqc2l6ZW9mKHN0cnVjdCBkZXNjX3N0cnVjdCk7CisJaWYgKHNpemUgPiBieXRlY291bnQpCisJCXNpemUgPSBieXRlY291bnQ7CisKKwllcnIgPSBzaXplOworCWlmIChjb3B5X3RvX3VzZXIocHRyLCBhZGRyZXNzLCBzaXplKSkKKwkJZXJyID0gLUVGQVVMVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfbGR0KHZvaWQgX191c2VyICogcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCwgaW50IG9sZG1vZGUpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqIG1tID0gY3VycmVudC0+bW07CisJX191MzIgZW50cnlfMSwgZW50cnlfMiwgKmxwOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgdXNlcl9kZXNjIGxkdF9pbmZvOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChieXRlY291bnQgIT0gc2l6ZW9mKGxkdF9pbmZvKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSAtRUZBVUxUOyAJCisJaWYgKGNvcHlfZnJvbV91c2VyKCZsZHRfaW5mbywgcHRyLCBzaXplb2YobGR0X2luZm8pKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKGxkdF9pbmZvLmVudHJ5X251bWJlciA+PSBMRFRfRU5UUklFUykKKwkJZ290byBvdXQ7CisJaWYgKGxkdF9pbmZvLmNvbnRlbnRzID09IDMpIHsKKwkJaWYgKG9sZG1vZGUpCisJCQlnb3RvIG91dDsKKwkJaWYgKGxkdF9pbmZvLnNlZ19ub3RfcHJlc2VudCA9PSAwKQorCQkJZ290byBvdXQ7CisJfQorCisJZG93bigmbW0tPmNvbnRleHQuc2VtKTsKKwlpZiAobGR0X2luZm8uZW50cnlfbnVtYmVyID49IG1tLT5jb250ZXh0LnNpemUpIHsKKwkJZXJyb3IgPSBhbGxvY19sZHQoJmN1cnJlbnQtPm1tLT5jb250ZXh0LCBsZHRfaW5mby5lbnRyeV9udW1iZXIrMSwgMSk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJbHAgPSAoX191MzIgKikgKChsZHRfaW5mby5lbnRyeV9udW1iZXIgPDwgMykgKyAoY2hhciAqKSBtbS0+Y29udGV4dC5sZHQpOworCisgICAJLyogQWxsb3cgTERUcyB0byBiZSBjbGVhcmVkIGJ5IHRoZSB1c2VyLiAqLworICAgCWlmIChsZHRfaW5mby5iYXNlX2FkZHIgPT0gMCAmJiBsZHRfaW5mby5saW1pdCA9PSAwKSB7CisJCWlmIChvbGRtb2RlIHx8IExEVF9lbXB0eSgmbGR0X2luZm8pKSB7CisJCQllbnRyeV8xID0gMDsKKwkJCWVudHJ5XzIgPSAwOworCQkJZ290byBpbnN0YWxsOworCQl9CisJfQorCisJZW50cnlfMSA9IExEVF9lbnRyeV9hKCZsZHRfaW5mbyk7CisJZW50cnlfMiA9IExEVF9lbnRyeV9iKCZsZHRfaW5mbyk7CisJaWYgKG9sZG1vZGUpCisJCWVudHJ5XzIgJj0gfigxIDw8IDIwKTsKKworCS8qIEluc3RhbGwgdGhlIG5ldyBlbnRyeSAuLi4gICovCitpbnN0YWxsOgorCSpscAk9IGVudHJ5XzE7CisJKihscCsxKQk9IGVudHJ5XzI7CisJZXJyb3IgPSAwOworCitvdXRfdW5sb2NrOgorCXVwKCZtbS0+Y29udGV4dC5zZW0pOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBpbnQgc3lzX21vZGlmeV9sZHQoaW50IGZ1bmMsIHZvaWQgX191c2VyICpwdHIsIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50KQoreworCWludCByZXQgPSAtRU5PU1lTOworCisJc3dpdGNoIChmdW5jKSB7CisJY2FzZSAwOgorCQlyZXQgPSByZWFkX2xkdChwdHIsIGJ5dGVjb3VudCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcmV0ID0gd3JpdGVfbGR0KHB0ciwgYnl0ZWNvdW50LCAxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlyZXQgPSByZWFkX2RlZmF1bHRfbGR0KHB0ciwgYnl0ZWNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSAweDExOgorCQlyZXQgPSB3cml0ZV9sZHQocHRyLCBieXRlY291bnQsIDApOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbWNhLmMgYi9hcmNoL2kzODYva2VybmVsL21jYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDBmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL21jYS5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvbWNhLmMKKyAqICBXcml0dGVuIGJ5IE1hcnRpbiBLb2xpbmVrLCBGZWJydWFyeSAxOTk2CisgKgorICogQ2hhbmdlczoKKyAqCisgKglDaHJpcyBCZWF1cmVnYXJkIEp1bHkgMjh0aCwgMTk5NgorICoJLSBGaXhlZCB1cCBpbnRlZ3JhdGVkIFNDU0kgZGV0ZWN0aW9uCisgKgorICoJQ2hyaXMgQmVhdXJlZ2FyZCBBdWd1c3QgM3JkLCAxOTk2CisgKgktIE1hZGUgbWNhX2luZm8gbG9jYWwKKyAqCS0gTWFkZSBpbnRlZ3JhdGVkIHJlZ2lzdGVycyBhY2Nlc3NpYmxlIHRocm91Z2ggc3RhbmRhcmQgZnVuY3Rpb24gY2FsbHMKKyAqCS0gQWRkZWQgbmFtZSBmaWVsZAorICoJLSBNb3JlIHNhbml0eSBjaGVja2luZworICoKKyAqCUNocmlzIEJlYXVyZWdhcmQgQXVndXN0IDl0aCwgMTk5NgorICoJLSBSZXdyb3RlIC9wcm9jL21jYQorICoKKyAqCUNocmlzIEJlYXVyZWdhcmQgSmFudWFyeSA3dGgsIDE5OTcKKyAqCS0gQWRkZWQgYmFzaWMgTk1JLXByb2Nlc3NpbmcKKyAqCS0gQWRkZWQgbW9yZSBpbmZvcm1hdGlvbiB0byBtY2FfaW5mbyBzdHJ1Y3R1cmUKKyAqCisgKglEYXZpZCBXZWluZWhhbGwgT2N0b2JlciAxMnRoLCAxOTk4CisgKgktIE1hZGUgYSBsb3Qgb2YgY2xlYW5pbmcgdXAgaW4gdGhlIHNvdXJjZQorICoJLSBBZGRlZCB1c2Ugb2Ygc2F2ZV9mbGFncyAvIHJlc3RvcmVfZmxhZ3MKKyAqCS0gQWRkZWQgdGhlICdkcml2ZXJfbG9hZGVkJyBmbGFnIGluIE1DQV9hZGFwdGVyCisgKgktIEFkZGVkIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGlvbiBvZiBaUCBHdSdzIG1jYV9maW5kX3VudXNlZF9hZGFwdGVyCisgKgorICoJRGF2aWQgV2VpbmVoYWxsIE1hcmNoIDI0dGgsIDE5OTkKKyAqCS0gRml4ZWQgdGhlIG91dHB1dCBvZiAnRHJpdmVyIEluc3RhbGxlZCcgaW4gL3Byb2MvbWNhL3BvcworICoJLSBNYWRlIHRoZSBJbnRlZ3JhdGVkIFZpZGVvICYgU0NTSSBzaG93IHVwIGV2ZW4gaWYgdGhleSBoYXZlIGlkIDAwMDAKKyAqCisgKglBbGV4YW5kZXIgVmlybyBOb3ZlbWJlciA5dGgsIDE5OTkKKyAqCS0gU3dpdGNoZWQgdG8gcmVndWxhciBwcm9jZnMgbWV0aG9kcworICoKKyAqCUFsZnJlZCBBcm5vbGQgJiBEYXZpZCBXZWluZWhhbGwgQXVndXN0IDIzcmQsIDIwMDAKKyAqCS0gQWRkZWQgc3VwcG9ydCBmb3IgUGxhbmFyIFBPUy1yZWdpc3RlcnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdoaWNoX3Njc2kgPSAwOworCitpbnQgTUNBX2J1cyA9IDA7CitFWFBPUlRfU1lNQk9MKE1DQV9idXMpOworCisvKgorICogTW90aGVyYm9hcmQgcmVnaXN0ZXIgc3BpbmxvY2suIFVudGVzdGVkIG9uIFNNUCBhdCB0aGUgbW9tZW50LCBidXQKKyAqIGFyZSB0aGVyZSBhbnkgTUNBIFNNUCBib3hlcz8KKyAqCisgKiBZZXMgLSBBbGFuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWNhX2xvY2spOworCisvKiBCdWlsZCB0aGUgc3RhdHVzIGluZm8gZm9yIHRoZSBhZGFwdGVyICovCisKK3N0YXRpYyB2b2lkIG1jYV9jb25maWd1cmVfYWRhcHRlcl9zdGF0dXMoc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYpIHsKKwltY2FfZGV2LT5zdGF0dXMgPSBNQ0FfQURBUFRFUl9OT05FOworCisJbWNhX2Rldi0+cG9zX2lkID0gbWNhX2Rldi0+cG9zWzBdCisJCSsgKG1jYV9kZXYtPnBvc1sxXSA8PCA4KTsKKworCWlmKCFtY2FfZGV2LT5wb3NfaWQgJiYgbWNhX2Rldi0+c2xvdCA8IE1DQV9NQVhfU0xPVF9OUikgeworCisJCS8qIGlkID0gMHgwMDAwIHVzdWFsbHkgaW5kaWNhdGVzIGhhcmR3YXJlIGZhaWx1cmUsCisJCSAqIGhvd2V2ZXIsIFpQIEd1ICh6cGdAY2FzdGxlLm5ldD4gcmVwb3J0cyB0aGF0IGhpcyA5NTU2CisJCSAqIGhhcyAweDAwMDAgYXMgaWQgYW5kIGV2ZXJ5dGhpbmcgc3RpbGwgd29ya3MuIFRoZXJlCisJCSAqIGFsc28gc2VlbSB0byBiZSBhbiBhZGFwdGVyIHdpdGggaWQgPSAweDAwMDA7IHRoZQorCQkgKiBOQ1IgUGFyYWxsZWwgQnVzIE1lbW9yeSBDYXJkLiBVbnRpbCB0aGlzIGlzIGNvbmZpcm1lZCwKKwkJICogaG93ZXZlciwgdGhpcyBjb2RlIHdpbGwgc3RheS4KKwkJICovCisKKwkJbWNhX2Rldi0+c3RhdHVzID0gTUNBX0FEQVBURVJfRVJST1I7CisKKwkJcmV0dXJuOworCX0gZWxzZSBpZihtY2FfZGV2LT5wb3NfaWQgIT0gMHhmZmZmKSB7CisKKwkJLyogMHhmZmZmIHVzdWFsbHkgaW5kaWNhdGVzIHRoYXQgdGhlcmUncyBubyBhZGFwdGVyLAorCQkgKiBob3dldmVyLCBzb21lIGludGVncmF0ZWQgYWRhcHRlcnMgbWF5IGhhdmUgMHhmZmZmIGFzCisJCSAqIHRoZWlyIGlkIGFuZCBzdGlsbCBiZSB2YWxpZC4gRXhhbXBsZXMgYXJlIG9uLWJvYXJkCisJCSAqIFZHQSBvZiB0aGUgNTVzeCwgdGhlIGludGVncmF0ZWQgU0NTSSBvZiB0aGUgNTYgJiA1NywKKwkJICogYW5kIHBvc3NpYmx5IGFsc28gdGhlIDk1IFVMVElNRURJQS4KKwkJICovCisKKwkJbWNhX2Rldi0+c3RhdHVzID0gTUNBX0FEQVBURVJfTk9STUFMOworCX0KKworCWlmKChtY2FfZGV2LT5wb3NfaWQgPT0gMHhmZmZmIHx8CisJICAgIG1jYV9kZXYtPnBvc19pZCA9PSAweDAwMDApICYmIG1jYV9kZXYtPnNsb3QgPj0gTUNBX01BWF9TTE9UX05SKSB7CisJCWludCBqOworCisJCWZvcihqID0gMjsgaiA8IDg7IGorKykgeworCQkJaWYobWNhX2Rldi0+cG9zW2pdICE9IDB4ZmYpIHsKKwkJCQltY2FfZGV2LT5zdGF0dXMgPSBNQ0FfQURBUFRFUl9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZighKG1jYV9kZXYtPnBvc1syXSAmIE1DQV9FTkFCTEVEKSkgeworCisJCS8qIGVuYWJsZWQgYml0IGlzIGluIFBPUyAyICovCisKKwkJbWNhX2Rldi0+c3RhdHVzID0gTUNBX0FEQVBURVJfRElTQUJMRUQ7CisJfQorfSAvKiBtY2FfY29uZmlndXJlX2FkYXB0ZXJfc3RhdHVzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG1jYV9zdGFuZGFyZF9yZXNvdXJjZXNbXSA9IHsKKwl7IC5zdGFydCA9IDB4NjAsIC5lbmQgPSAweDYwLCAubmFtZSA9ICJzeXN0ZW0gY29udHJvbCBwb3J0IEIgKE1DQSkiIH0sCisJeyAuc3RhcnQgPSAweDkwLCAuZW5kID0gMHg5MCwgLm5hbWUgPSAiYXJiaXRyYXRpb24gKE1DQSkiIH0sCisJeyAuc3RhcnQgPSAweDkxLCAuZW5kID0gMHg5MSwgLm5hbWUgPSAiY2FyZCBTZWxlY3QgRmVlZGJhY2sgKE1DQSkiIH0sCisJeyAuc3RhcnQgPSAweDkyLCAuZW5kID0gMHg5MiwgLm5hbWUgPSAic3lzdGVtIENvbnRyb2wgcG9ydCBBIChNQ0EpIiB9LAorCXsgLnN0YXJ0ID0gMHg5NCwgLmVuZCA9IDB4OTQsIC5uYW1lID0gInN5c3RlbSBib2FyZCBzZXR1cCAoTUNBKSIgfSwKKwl7IC5zdGFydCA9IDB4OTYsIC5lbmQgPSAweDk3LCAubmFtZSA9ICJQT1MgKE1DQSkiIH0sCisJeyAuc3RhcnQgPSAweDEwMCwgLmVuZCA9IDB4MTA3LCAubmFtZSA9ICJQT1MgKE1DQSkiIH0KK307CisKKyNkZWZpbmUgTUNBX1NUQU5EQVJEX1JFU09VUkNFUwkoc2l6ZW9mKG1jYV9zdGFuZGFyZF9yZXNvdXJjZXMpL3NpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKQorCisvKioKKyAqCW1jYV9yZWFkX2FuZF9zdG9yZV9wb3MgLSByZWFkIHRoZSBQT1MgcmVnaXN0ZXJzIGludG8gYSBtZW1vcnkgYnVmZmVyCisgKiAgICAgIEBwb3M6IGEgY2hhciBwb2ludGVyIHRvIDggYnl0ZXMsIGNvbnRhaW5zIHRoZSBQT1MgcmVnaXN0ZXIgdmFsdWUgb24KKyAqICAgICAgICAgICAgc3VjY2Vzc2Z1bCByZXR1cm4KKyAqCisgKglSZXR1cm5zIDEgaWYgYSBjYXJkIGFjdHVhbGx5IGV4aXN0cyAoaS5lLiB0aGUgcG9zIGlzbid0CisgKglhbGwgMHhmZikgb3IgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBtY2FfcmVhZF9hbmRfc3RvcmVfcG9zKHVuc2lnbmVkIGNoYXIgKnBvcykgeworCWludCBqOworCWludCBmb3VuZCA9IDA7CisKKwlmb3Ioaj0wOyBqPDg7IGorKykgeworCQlpZigocG9zW2pdID0gaW5iX3AoTUNBX1BPU19SRUcoaikpKSAhPSAweGZmKSB7CisJCQkvKiAweGZmIGFsbCBhY3Jvc3MgbWVhbnMgbm8gZGV2aWNlLiAweDAwIG1lYW5zCisJCQkgKiBzb21ldGhpbmcncyBicm9rZW4sIGJ1dCBhIGRldmljZSBpcworCQkJICogcHJvYmFibHkgdGhlcmUuICBIb3dldmVyLCBpZiB5b3UgZ2V0IDB4MDAKKwkJCSAqIGZyb20gYSBtb3RoZXJib2FyZCByZWdpc3RlciBpdCB3b24ndCBtYXR0ZXIKKwkJCSAqIHdoYXQgd2UgZmluZC4gIEZvciB0aGUgcmVjb3JkLCBvbiB0aGUKKwkJCSAqIDU3U0xDLCB0aGUgaW50ZWdyYXRlZCBTQ1NJIGFkYXB0ZXIgaGFzCisJCQkgKiAweGZmZmYgZm9yIHRoZSBhZGFwdGVyIElELCBidXQgbm9uemVybyBmb3IKKwkJCSAqIG90aGVyIHJlZ2lzdGVycy4gICovCisKKwkJCWZvdW5kID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1jYV9wY19yZWFkX3BvcyhzdHJ1Y3QgbWNhX2RldmljZSAqbWNhX2RldiwgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ5dGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmKHJlZyA8IDAgfHwgcmVnID49IDgpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1jYV9sb2NrLCBmbGFncyk7CisJaWYobWNhX2Rldi0+cG9zX3JlZ2lzdGVyKSB7CisJCS8qIERpc2FibGUgYWRhcHRlciBzZXR1cCwgZW5hYmxlIG1vdGhlcmJvYXJkIHNldHVwICovCisKKwkJb3V0Yl9wKDAsIE1DQV9BREFQVEVSX1NFVFVQX1JFRyk7CisJCW91dGJfcChtY2FfZGV2LT5wb3NfcmVnaXN0ZXIsIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcpOworCisJCWJ5dGUgPSBpbmJfcChNQ0FfUE9TX1JFRyhyZWcpKTsKKwkJb3V0Yl9wKDB4ZmYsIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcpOworCX0gZWxzZSB7CisKKwkJLyogTWFrZSBzdXJlIG1vdGhlcmJvYXJkIHNldHVwIGlzIG9mZiAqLworCisJCW91dGJfcCgweGZmLCBNQ0FfTU9USEVSQk9BUkRfU0VUVVBfUkVHKTsKKworCQkvKiBSZWFkIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAqLworCisJCW91dGJfcCgweDh8KG1jYV9kZXYtPnNsb3QgJiAweGYpLCBNQ0FfQURBUFRFUl9TRVRVUF9SRUcpOworCQlieXRlID0gaW5iX3AoTUNBX1BPU19SRUcocmVnKSk7CisJCW91dGJfcCgwLCBNQ0FfQURBUFRFUl9TRVRVUF9SRUcpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FfbG9jaywgZmxhZ3MpOworCisJbWNhX2Rldi0+cG9zW3JlZ10gPSBieXRlOworCisJcmV0dXJuIGJ5dGU7Cit9CisKK3N0YXRpYyB2b2lkIG1jYV9wY193cml0ZV9wb3Moc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYsIGludCByZWcsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgYnl0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYocmVnIDwgMCB8fCByZWcgPj0gOCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1jYV9sb2NrLCBmbGFncyk7CisKKwkvKiBNYWtlIHN1cmUgbW90aGVyYm9hcmQgc2V0dXAgaXMgb2ZmICovCisKKwlvdXRiX3AoMHhmZiwgTUNBX01PVEhFUkJPQVJEX1NFVFVQX1JFRyk7CisKKwkvKiBSZWFkIGluIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAqLworCisJb3V0Yl9wKDB4OHwobWNhX2Rldi0+c2xvdCYweGYpLCBNQ0FfQURBUFRFUl9TRVRVUF9SRUcpOworCW91dGJfcChieXRlLCBNQ0FfUE9TX1JFRyhyZWcpKTsKKwlvdXRiX3AoMCwgTUNBX0FEQVBURVJfU0VUVVBfUkVHKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jYV9sb2NrLCBmbGFncyk7CisKKwkvKiBVcGRhdGUgdGhlIGdsb2JhbCByZWdpc3RlciBsaXN0LCB3aGlsZSB3ZSBoYXZlIHRoZSBieXRlICovCisKKwltY2FfZGV2LT5wb3NbcmVnXSA9IGJ5dGU7CisKK30KKworLyogZm9yIHRoZSBwcmltYXJ5IE1DQSBidXMsIHdlIGhhdmUgaWRlbnRpdHkgdHJhbnNmb3JtcyAqLworc3RhdGljIGludCBtY2FfZHVtbXlfdHJhbnNmb3JtX2lycShzdHJ1Y3QgbWNhX2RldmljZSAqIG1jYV9kZXYsIGludCBpcnEpCit7CisJcmV0dXJuIGlycTsKK30KKworc3RhdGljIGludCBtY2FfZHVtbXlfdHJhbnNmb3JtX2lvcG9ydChzdHJ1Y3QgbWNhX2RldmljZSAqIG1jYV9kZXYsIGludCBwb3J0KQoreworCXJldHVybiBwb3J0OworfQorCitzdGF0aWMgdm9pZCAqbWNhX2R1bW15X3RyYW5zZm9ybV9tZW1vcnkoc3RydWN0IG1jYV9kZXZpY2UgKiBtY2FfZGV2LCB2b2lkICptZW0pCit7CisJcmV0dXJuIG1lbTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBtY2FfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCXN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2OworCXVuc2lnbmVkIGNoYXIgcG9zWzhdOworCXNob3J0IG1jYV9idWlsdGluX3Njc2lfcG9ydHNbXSA9IHsweGY3LCAweGZkLCAweDAwfTsKKwlzdHJ1Y3QgbWNhX2J1cyAqYnVzOworCisJLyogV0FSTklORzogQmUgY2FyZWZ1bCB3aGVuIG1ha2luZyBjaGFuZ2VzIGhlcmUuIFB1dHRpbmcgYW4gYWRhcHRlcgorCSAqIGFuZCB0aGUgbW90aGVyYm9hcmQgc2ltdWx0YW5lb3VzbHkgaW50byBzZXR1cCBtb2RlIG1heSByZXN1bHQgaW4KKwkgKiBkYW1hZ2UgdG8gY2hpcHMgKGFjY29yZGluZyB0byBUaGUgSW5kaXNwZW5zaWJsZSBQQyBIYXJkd2FyZSBCb29rCisJICogYnkgSGFucy1QZXRlciBNZXNzbWVyKS4gQWxzbywgd2UgZGlzYWJsZSBzeXN0ZW0gaW50ZXJydXB0cyAoc28KKwkgKiB0aGF0IHdlIGFyZSBub3QgZGlzdHVyYmVkIGluIHRoZSBtaWRkbGUgb2YgdGhpcykuCisJICovCisKKwkvKiBNYWtlIHN1cmUgdGhlIE1DQSBidXMgaXMgcHJlc2VudCAqLworCisJaWYgKG1jYV9zeXN0ZW1faW5pdCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTUNBIGJ1cyBzeXN0ZW0gaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFNQ0FfYnVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaW50ayhLRVJOX0lORk8gIk1pY3JvIENoYW5uZWwgYnVzIGRldGVjdGVkLlxuIik7CisKKwkvKiBBbGwgTUNBIHN5c3RlbXMgaGF2ZSBhdCBsZWFzdCBhIHByaW1hcnkgYnVzICovCisJYnVzID0gbWNhX2F0dGFjaF9idXMoTUNBX1BSSU1BUllfQlVTKTsKKwlpZiAoIWJ1cykKKwkJZ290byBvdXRfbm9tZW07CisJYnVzLT5kZWZhdWx0X2RtYV9tYXNrID0gMHhmZmZmZmZmZkxMOworCWJ1cy0+Zi5tY2Ffd3JpdGVfcG9zID0gbWNhX3BjX3dyaXRlX3BvczsKKwlidXMtPmYubWNhX3JlYWRfcG9zID0gbWNhX3BjX3JlYWRfcG9zOworCWJ1cy0+Zi5tY2FfdHJhbnNmb3JtX2lycSA9IG1jYV9kdW1teV90cmFuc2Zvcm1faXJxOworCWJ1cy0+Zi5tY2FfdHJhbnNmb3JtX2lvcG9ydCA9IG1jYV9kdW1teV90cmFuc2Zvcm1faW9wb3J0OworCWJ1cy0+Zi5tY2FfdHJhbnNmb3JtX21lbW9yeSA9IG1jYV9kdW1teV90cmFuc2Zvcm1fbWVtb3J5OworCisJLyogZ2V0IHRoZSBtb3RoZXJib2FyZCBkZXZpY2UgKi8KKwltY2FfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZih1bmxpa2VseSghbWNhX2RldikpCisJCWdvdG8gb3V0X25vbWVtOworCW1lbXNldChtY2FfZGV2LCAwLCBzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpKTsKKworCS8qCisJICogV2UgZG8gbm90IGV4cGVjdCBtYW55IE1DQSBpbnRlcnJ1cHRzIGR1cmluZyBpbml0aWFsaXphdGlvbiwKKwkgKiBidXQgbGV0IHVzIGJlIHNhZmU6CisJICovCisJc3Bpbl9sb2NrX2lycSgmbWNhX2xvY2spOworCisJLyogTWFrZSBzdXJlIGFkYXB0ZXIgc2V0dXAgaXMgb2ZmICovCisKKwlvdXRiX3AoMCwgTUNBX0FEQVBURVJfU0VUVVBfUkVHKTsKKworCS8qIFJlYWQgbW90aGVyYm9hcmQgUE9TIHJlZ2lzdGVycyAqLworCisJbWNhX2Rldi0+cG9zX3JlZ2lzdGVyID0gMHg3ZjsKKwlvdXRiX3AobWNhX2Rldi0+cG9zX3JlZ2lzdGVyLCBNQ0FfTU9USEVSQk9BUkRfU0VUVVBfUkVHKTsKKwltY2FfZGV2LT5uYW1lWzBdID0gMDsKKwltY2FfcmVhZF9hbmRfc3RvcmVfcG9zKG1jYV9kZXYtPnBvcyk7CisJbWNhX2NvbmZpZ3VyZV9hZGFwdGVyX3N0YXR1cyhtY2FfZGV2KTsKKwkvKiBmYWtlIFBPUyBhbmQgc2xvdCBmb3IgYSBtb3RoZXJib2FyZCAqLworCW1jYV9kZXYtPnBvc19pZCA9IE1DQV9NT1RIRVJCT0FSRF9QT1M7CisJbWNhX2Rldi0+c2xvdCA9IE1DQV9NT1RIRVJCT0FSRDsKKwltY2FfcmVnaXN0ZXJfZGV2aWNlKE1DQV9QUklNQVJZX0JVUywgbWNhX2Rldik7CisKKwltY2FfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKKwlpZih1bmxpa2VseSghbWNhX2RldikpCisJCWdvdG8gb3V0X3VubG9ja19ub21lbTsKKwltZW1zZXQobWNhX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSk7CisKKworCS8qIFB1dCBtb3RoZXJib2FyZCBpbnRvIHZpZGVvIHNldHVwIG1vZGUsIHJlYWQgaW50ZWdyYXRlZCB2aWRlbworCSAqIFBPUyByZWdpc3RlcnMsIGFuZCB0dXJuIG1vdGhlcmJvYXJkIHNldHVwIG9mZi4KKwkgKi8KKworCW1jYV9kZXYtPnBvc19yZWdpc3RlciA9IDB4ZGY7CisJb3V0Yl9wKG1jYV9kZXYtPnBvc19yZWdpc3RlciwgTUNBX01PVEhFUkJPQVJEX1NFVFVQX1JFRyk7CisJbWNhX2Rldi0+bmFtZVswXSA9IDA7CisJbWNhX3JlYWRfYW5kX3N0b3JlX3BvcyhtY2FfZGV2LT5wb3MpOworCW1jYV9jb25maWd1cmVfYWRhcHRlcl9zdGF0dXMobWNhX2Rldik7CisJLyogZmFrZSBQT1MgYW5kIHNsb3QgZm9yIHRoZSBpbnRlZ3JhdGVkIHZpZGVvICovCisJbWNhX2Rldi0+cG9zX2lkID0gTUNBX0lOVEVHVklERU9fUE9TOworCW1jYV9kZXYtPnNsb3QgPSBNQ0FfSU5URUdWSURFTzsKKwltY2FfcmVnaXN0ZXJfZGV2aWNlKE1DQV9QUklNQVJZX0JVUywgbWNhX2Rldik7CisKKwkvKiBQdXQgbW90aGVyYm9hcmQgaW50byBzY3NpIHNldHVwIG1vZGUsIHJlYWQgaW50ZWdyYXRlZCBzY3NpCisJICogUE9TIHJlZ2lzdGVycywgYW5kIHR1cm4gbW90aGVyYm9hcmQgc2V0dXAgb2ZmLgorCSAqCisJICogSXQgc2VlbXMgdGhlcmUgYXJlIHR3byBwb3NzaWJsZSBTQ1NJIHJlZ2lzdGVycy4gTWFydGluIHNheXMgdGhhdAorCSAqIGZvciB0aGUgNTYsNTcsIDB4ZjcgaXMgdGhlIG9uZSwgYnV0IGZhaWxzIG9uIHRoZSA3Ni4KKwkgKiBBbGZyZWRvIChhcGVuYUB2bmV0LmlibS5jb20pIHNheXMKKwkgKiAweGZkIHdvcmtzIG9uIGhpcyBtYWNoaW5lLiBXZSdsbCB0cnkgYm90aCBvZiB0aGVtLiBJIGZpZ3VyZSBpdCdzCisJICogYSBnb29kIGJldCB0aGF0IG9ubHkgb25lIGNvdWxkIGJlIHZhbGlkIGF0IGEgdGltZS4gVGhpcyBjb3VsZAorCSAqIHNjcmV3IHVwIHRob3VnaCBpZiBvbmUgaXMgdXNlZCBmb3Igc29tZXRoaW5nIGVsc2Ugb24gdGhlIG90aGVyCisJICogbWFjaGluZS4KKwkgKi8KKworCWZvcihpID0gMDsgKHdoaWNoX3Njc2kgPSBtY2FfYnVpbHRpbl9zY3NpX3BvcnRzW2ldKSAhPSAwOyBpKyspIHsKKwkJb3V0Yl9wKHdoaWNoX3Njc2ksIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcpOworCQlpZihtY2FfcmVhZF9hbmRfc3RvcmVfcG9zKHBvcykpCisJCQlicmVhazsKKwl9CisJaWYod2hpY2hfc2NzaSkgeworCQkvKiBmb3VuZCBhIHNjc2kgY2FyZCAqLworCQltY2FfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1jYV9kZXZpY2UpLCBHRlBfQVRPTUlDKTsKKwkJaWYodW5saWtlbHkoIW1jYV9kZXYpKQorCQkJZ290byBvdXRfdW5sb2NrX25vbWVtOworCQltZW1zZXQobWNhX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSk7CisKKwkJZm9yKGogPSAwOyBqIDwgODsgaisrKQorCQkJbWNhX2Rldi0+cG9zW2pdID0gcG9zW2pdOworCisJCW1jYV9jb25maWd1cmVfYWRhcHRlcl9zdGF0dXMobWNhX2Rldik7CisJCS8qIGZha2UgUE9TIGFuZCBzbG90IGZvciBpbnRlZ3JhdGVkIFNDU0kgY29udHJvbGxlciAqLworCQltY2FfZGV2LT5wb3NfaWQgPSBNQ0FfSU5URUdTQ1NJX1BPUzsKKwkJbWNhX2Rldi0+c2xvdCA9IE1DQV9JTlRFR1NDU0k7CisJCW1jYV9kZXYtPnBvc19yZWdpc3RlciA9IHdoaWNoX3Njc2k7CisJCW1jYV9yZWdpc3Rlcl9kZXZpY2UoTUNBX1BSSU1BUllfQlVTLCBtY2FfZGV2KTsKKwl9CisKKwkvKiBUdXJuIG9mZiBtb3RoZXJib2FyZCBzZXR1cCAqLworCisJb3V0Yl9wKDB4ZmYsIE1DQV9NT1RIRVJCT0FSRF9TRVRVUF9SRUcpOworCisJLyogTm93IGxvb3Agb3ZlciBNQ0Egc2xvdHM6IHB1dCBlYWNoIGFkYXB0ZXIgaW50byBzZXR1cCBtb2RlLCBhbmQKKwkgKiByZWFkIGl0cyBQT1MgcmVnaXN0ZXJzLiBUaGVuIHB1dCBhZGFwdGVyIHNldHVwIG9mZi4KKwkgKi8KKworCWZvcihpPTA7IGk8TUNBX01BWF9TTE9UX05SOyBpKyspIHsKKwkJb3V0Yl9wKDB4OHwoaSYweGYpLCBNQ0FfQURBUFRFUl9TRVRVUF9SRUcpOworCQlpZighbWNhX3JlYWRfYW5kX3N0b3JlX3Bvcyhwb3MpKQorCQkJY29udGludWU7CisKKwkJbWNhX2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtY2FfZGV2aWNlKSwgR0ZQX0FUT01JQyk7CisJCWlmKHVubGlrZWx5KCFtY2FfZGV2KSkKKwkJCWdvdG8gb3V0X3VubG9ja19ub21lbTsKKwkJbWVtc2V0KG1jYV9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgbWNhX2RldmljZSkpOworCisJCWZvcihqPTA7IGo8ODsgaisrKQorCQkJbWNhX2Rldi0+cG9zW2pdPXBvc1tqXTsKKworCQltY2FfZGV2LT5kcml2ZXJfbG9hZGVkID0gMDsKKwkJbWNhX2Rldi0+c2xvdCA9IGk7CisJCW1jYV9kZXYtPnBvc19yZWdpc3RlciA9IDA7CisJCW1jYV9jb25maWd1cmVfYWRhcHRlcl9zdGF0dXMobWNhX2Rldik7CisJCW1jYV9yZWdpc3Rlcl9kZXZpY2UoTUNBX1BSSU1BUllfQlVTLCBtY2FfZGV2KTsKKwl9CisJb3V0Yl9wKDAsIE1DQV9BREFQVEVSX1NFVFVQX1JFRyk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmV0dXJuIG1lbW9yeSBzdGFydCAqLworCXNwaW5fdW5sb2NrX2lycSgmbWNhX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IE1DQV9TVEFOREFSRF9SRVNPVVJDRVM7IGkrKykKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCBtY2Ffc3RhbmRhcmRfcmVzb3VyY2VzICsgaSk7CisKKwltY2FfZG9fcHJvY19pbml0KCk7CisKKwlyZXR1cm4gMDsKKworIG91dF91bmxvY2tfbm9tZW06CisJc3Bpbl91bmxvY2tfaXJxKCZtY2FfbG9jayk7Cisgb3V0X25vbWVtOgorCXByaW50ayhLRVJOX0VNRVJHICJGYWlsZWQgbWVtb3J5IGFsbG9jYXRpb24gaW4gTUNBIHNldHVwIVxuIik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N1YnN5c19pbml0Y2FsbChtY2FfaW5pdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBtY2FfaGFuZGxlX25taV9kZXZpY2Uoc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYsIGludCBjaGVja19mbGFnKQoreworCWludCBzbG90ID0gbWNhX2Rldi0+c2xvdDsKKworCWlmKHNsb3QgPT0gTUNBX0lOVEVHU0NTSSkgeworCQlwcmludGsoS0VSTl9DUklUICJOTUk6IGNhdXNlZCBieSBNQ0EgaW50ZWdyYXRlZCBTQ1NJIGFkYXB0ZXIgKCVzKVxuIiwKKwkJCW1jYV9kZXYtPm5hbWUpOworCX0gZWxzZSBpZihzbG90ID09IE1DQV9JTlRFR1ZJREVPKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIk5NSTogY2F1c2VkIGJ5IE1DQSBpbnRlZ3JhdGVkIHZpZGVvIGFkYXB0ZXIgKCVzKVxuIiwKKwkJCW1jYV9kZXYtPm5hbWUpOworCX0gZWxzZSBpZihzbG90ID09IE1DQV9NT1RIRVJCT0FSRCkgeworCQlwcmludGsoS0VSTl9DUklUICJOTUk6IGNhdXNlZCBieSBtb3RoZXJib2FyZCAoJXMpXG4iLAorCQkJbWNhX2Rldi0+bmFtZSk7CisJfQorCisJLyogTW9yZSBpbmZvIGF2YWlsYWJsZSBpbiBQT1MgNiBhbmQgNz8gKi8KKworCWlmKGNoZWNrX2ZsYWcpIHsKKwkJdW5zaWduZWQgY2hhciBwb3M2LCBwb3M3OworCisJCXBvczYgPSBtY2FfZGV2aWNlX3JlYWRfcG9zKG1jYV9kZXYsIDYpOworCQlwb3M3ID0gbWNhX2RldmljZV9yZWFkX3BvcyhtY2FfZGV2LCA3KTsKKworCQlwcmludGsoS0VSTl9DUklUICJOTUk6IFBPUyA2ID0gMHgleCwgUE9TIDcgPSAweCV4XG4iLCBwb3M2LCBwb3M3KTsKKwl9CisKK30gLyogbWNhX2hhbmRsZV9ubWlfc2xvdCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBtY2FfaGFuZGxlX25taV9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYgPSB0b19tY2FfZGV2aWNlKGRldik7CisJdW5zaWduZWQgY2hhciBwb3M1OworCisJcG9zNSA9IG1jYV9kZXZpY2VfcmVhZF9wb3MobWNhX2RldiwgNSk7CisKKwlpZighKHBvczUgJiAweDgwKSkgeworCQkvKiBCaXQgNyBvZiBQT1MgNSBpcyByZXNldCB3aGVuIHRoaXMgYWRhcHRlciBoYXMgYSBoYXJkd2FyZQorCQkgKiBlcnJvci4gQml0IDcgaXQgcmVzZXQgaWYgdGhlcmUncyBlcnJvciBpbmZvcm1hdGlvbgorCQkgKiBhdmFpbGFibGUgaW4gUE9TIDYgYW5kIDcuCisJCSAqLworCQltY2FfaGFuZGxlX25taV9kZXZpY2UobWNhX2RldiwgIShwb3M1ICYgMHg0MCkpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWNhX2hhbmRsZV9ubWkodm9pZCkKK3sKKwkvKiBGaXJzdCB0cnkgLSBzY2FuIHRoZSB2YXJpb3VzIGFkYXB0ZXJzIGFuZCBzZWUgaWYgYSBzcGVjaWZpYworCSAqIGFkYXB0ZXIgd2FzIHJlc3BvbnNpYmxlIGZvciB0aGUgZXJyb3IuCisJICovCisJYnVzX2Zvcl9lYWNoX2RldigmbWNhX2J1c190eXBlLCBOVUxMLCBOVUxMLCBtY2FfaGFuZGxlX25taV9jYWxsYmFjayk7CisKKwltY2Ffbm1pX2hvb2soKTsKK30gLyogbWNhX2hhbmRsZV9ubWkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbWljcm9jb2RlLmMgYi9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3N2M2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jCkBAIC0wLDAgKzEsNTEyIEBACisvKgorICoJSW50ZWwgQ1BVIE1pY3JvY29kZSBVcGRhdGUgRHJpdmVyIGZvciBMaW51eAorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwMC0yMDA0IFRpZ3JhbiBBaXZhemlhbgorICoKKyAqCVRoaXMgZHJpdmVyIGFsbG93cyB0byB1cGdyYWRlIG1pY3JvY29kZSBvbiBJbnRlbCBwcm9jZXNzb3JzCisgKgliZWxvbmdpbmcgdG8gSUEtMzIgZmFtaWx5IC0gUGVudGl1bVBybywgUGVudGl1bSBJSSwgCisgKglQZW50aXVtIElJSSwgWGVvbiwgUGVudGl1bSA0LCBldGMuCisgKgorICoJUmVmZXJlbmNlOiBTZWN0aW9uIDguMTAgb2YgVm9sdW1lIElJSSwgSW50ZWwgUGVudGl1bSA0IE1hbnVhbCwgCisgKglPcmRlciBOdW1iZXIgMjQ1NDcyIG9yIGZyZWUgZG93bmxvYWQgZnJvbToKKyAqCQkKKyAqCWh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9wZW50aXVtNC9tYW51YWxzLzI0NTQ3Mi5odG0KKyAqCisgKglGb3IgbW9yZSBpbmZvcm1hdGlvbiwgZ28gdG8gaHR0cDovL3d3dy51cmJhbm15dGgub3JnL21pY3JvY29kZQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJMS4wCTE2IEZlYiAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBzY28uY29tPgorICoJCUluaXRpYWwgcmVsZWFzZS4KKyAqCTEuMDEJMTggRmViIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+CisgKgkJQWRkZWQgcmVhZCgpIHN1cHBvcnQgKyBjbGVhbnVwcy4KKyAqCTEuMDIJMjEgRmViIDIwMDAsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+CisgKgkJQWRkZWQgJ2RldmljZSB0cmltbWluZycgc3VwcG9ydC4gb3BlbihPX1dST05MWSkgemVyb2VzCisgKgkJYW5kIGZyZWVzIHRoZSBzYXZlZCBjb3B5IG9mIGFwcGxpZWQgbWljcm9jb2RlLgorICoJMS4wMwkyOSBGZWIgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5Ac2NvLmNvbT4KKyAqCQlNYWRlIHRvIHVzZSBkZXZmcyAoL2Rldi9jcHUvbWljcm9jb2RlKSArIGNsZWFudXBzLgorICoJMS4wNAkwNiBKdW4gMjAwMCwgU2ltb24gVHJpbW1lciA8c2ltb25AdmVyaXRhcy5jb20+CisgKgkJQWRkZWQgbWlzYyBkZXZpY2Ugc3VwcG9ydCAobm93IHVzZXMgYm90aCBkZXZmcyBhbmQgbWlzYykuCisgKgkJQWRkZWQgTUlDUk9DT0RFX0lPQ0ZSRUUgaW9jdGwgdG8gY2xlYXIgbWVtb3J5LgorICoJMS4wNQkwOSBKdW4gMjAwMCwgU2ltb24gVHJpbW1lciA8c2ltb25AdmVyaXRhcy5jb20+CisgKgkJTWVzc2FnZXMgZm9yIGVycm9yIGNhc2VzIChub24gSW50ZWwgJiBubyBzdWl0YWJsZSBtaWNyb2NvZGUpLgorICoJMS4wNgkwMyBBdWcgMjAwMCwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJUmVtb3ZlZCAtPnJlbGVhc2UoKS4gUmVtb3ZlZCBleGNsdXNpdmUgb3BlbiBhbmQgc3RhdHVzIGJpdG1hcC4KKyAqCQlBZGRlZCBtaWNyb2NvZGVfcndzZW0gdG8gc2VyaWFsaXplIHJlYWQoKS93cml0ZSgpL2lvY3RsKCkuCisgKgkJUmVtb3ZlZCBnbG9iYWwga2VybmVsIGxvY2sgdXNhZ2UuCisgKgkxLjA3CTA3IFNlcCAyMDAwLCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqCQlXcml0ZSAwIHRvIDB4OEIgbXNyIGFuZCB0aGVuIGNwdWlkIGJlZm9yZSByZWFkaW5nIHJldmlzaW9uLAorICoJCXNvIHRoYXQgaXQgd29ya3MgZXZlbiBpZiB0aGVyZSB3ZXJlIG5vIHVwZGF0ZSBkb25lIGJ5IHRoZQorICoJCUJJT1MuIE90aGVyd2lzZSwgcmVhZGluZyBmcm9tIDB4OEIgZ2l2ZXMganVuayAod2hpY2ggaGFwcGVuZWQKKyAqCQl0byBiZSAwIG9uIG15IG1hY2hpbmUgd2hpY2ggaXMgd2h5IGl0IHdvcmtlZCBldmVuIHdoZW4gSQorICoJCWRpc2FibGVkIHVwZGF0ZSBieSB0aGUgQklPUykKKyAqCQlUaGFua3MgdG8gRXJpYyBXLiBCaWVkZXJtYW4gPGViaWVkZXJtYW5AbG54aS5jb20+IGZvciB0aGUgZml4LgorICoJMS4wOAkxMSBEZWMgMjAwMCwgUmljaGFyZCBTY2hhYWwgPHJpY2hhcmQuc2NoYWFsQGludGVsLmNvbT4gYW5kCisgKgkJCSAgICAgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJSW50ZWwgUGVudGl1bSA0IHByb2Nlc3NvciBzdXBwb3J0IGFuZCBidWdmaXhlcy4KKyAqCTEuMDkJMzAgT2N0IDIwMDEsIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgorICoJCUJ1Z2ZpeCBmb3IgSFQgKEh5cGVyLVRocmVhZGluZykgZW5hYmxlZCBwcm9jZXNzb3JzCisgKgkJd2hlcmVieSBwcm9jZXNzb3IgcmVzb3VyY2VzIGFyZSBzaGFyZWQgYnkgYWxsIGxvZ2ljYWwgcHJvY2Vzc29ycworICoJCWluIGEgc2luZ2xlIENQVSBwYWNrYWdlLgorICoJMS4xMAkyOCBGZWIgMjAwMiBBc2l0IEsgTWFsbGljayA8YXNpdC5rLm1hbGxpY2tAaW50ZWwuY29tPiBhbmQKKyAqCQlUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4sCisgKgkJU2VyaWFsaXplIHVwZGF0ZXMgYXMgcmVxdWlyZWQgb24gSFQgcHJvY2Vzc29ycyBkdWUgdG8gc3BlY3VsYXRpdmUKKyAqCQluYXR1cmUgb2YgaW1wbGVtZW50YXRpb24uCisgKgkxLjExCTIyIE1hciAyMDAyIFRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHZlcml0YXMuY29tPgorICoJCUZpeCB0aGUgcGFuaWMgd2hlbiB3cml0aW5nIHplcm8tbGVuZ3RoIG1pY3JvY29kZSBjaHVuay4KKyAqCTEuMTIJMjkgU2VwIDIwMDMgTml0aW4gS2FtYmxlIDxuaXRpbi5hLmthbWJsZUBpbnRlbC5jb20+LCAKKyAqCQlKdW4gTmFrYWppbWEgPGp1bi5uYWthamltYUBpbnRlbC5jb20+CisgKgkJU3VwcG9ydCBmb3IgdGhlIG1pY3JvY29kZSB1cGRhdGVzIGluIHRoZSBuZXcgZm9ybWF0LgorICoJMS4xMwkxMCBPY3QgMjAwMyBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqCQlSZW1vdmVkIC0+cmVhZCgpIG1ldGhvZCBhbmQgb2Jzb2xldGVkIE1JQ1JPQ09ERV9JT0NGUkVFIGlvY3RsCisgKgkJYmVjYXVzZSB3ZSBubyBsb25nZXIgaG9sZCBhIGNvcHkgb2YgYXBwbGllZCBtaWNyb2NvZGUgCisgKgkJaW4ga2VybmVsIG1lbW9yeS4KKyAqCTEuMTQJMjUgSnVuIDIwMDQgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKgkJRml4IHNpZ21hdGNoKCkgbWFjcm8gdG8gaGFuZGxlIG9sZCBDUFVzIHdpdGggcGYgPT0gMC4KKyAqCQlUaGFua3MgdG8gU3R1YXJ0IFN3YWxlcyBmb3IgcG9pbnRpbmcgb3V0IHRoaXMgYnVnLgorICovCisKKy8vI2RlZmluZSBERUJVRyAvKiBwcl9kZWJ1ZyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGFzbS9tc3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBDUFUgKElBLTMyKSBNaWNyb2NvZGUgVXBkYXRlIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgTUlDUk9DT0RFX1ZFUlNJT04gCSIxLjE0IgorCisjZGVmaW5lIERFRkFVTFRfVUNPREVfREFUQVNJWkUgCSgyMDAwKSAJICAvKiAyMDAwIGJ5dGVzICovCisjZGVmaW5lIE1DX0hFQURFUl9TSVpFCQkoc2l6ZW9mIChtaWNyb2NvZGVfaGVhZGVyX3QpKSAgCSAgLyogNDggYnl0ZXMgKi8KKyNkZWZpbmUgREVGQVVMVF9VQ09ERV9UT1RBTFNJWkUgKERFRkFVTFRfVUNPREVfREFUQVNJWkUgKyBNQ19IRUFERVJfU0laRSkgLyogMjA0OCBieXRlcyAqLworI2RlZmluZSBFWFRfSEVBREVSX1NJWkUJCShzaXplb2YgKHN0cnVjdCBleHRlbmRlZF9zaWd0YWJsZSkpIC8qIDIwIGJ5dGVzICovCisjZGVmaW5lIEVYVF9TSUdOQVRVUkVfU0laRQkoc2l6ZW9mIChzdHJ1Y3QgZXh0ZW5kZWRfc2lnbmF0dXJlKSkgLyogMTIgYnl0ZXMgKi8KKyNkZWZpbmUgRFdTSVpFCQkJKHNpemVvZiAodTMyKSkKKyNkZWZpbmUgZ2V0X3RvdGFsc2l6ZShtYykgXAorCSgoKG1pY3JvY29kZV90ICopbWMpLT5oZHIudG90YWxzaXplID8gXAorCSAoKG1pY3JvY29kZV90ICopbWMpLT5oZHIudG90YWxzaXplIDogREVGQVVMVF9VQ09ERV9UT1RBTFNJWkUpCisjZGVmaW5lIGdldF9kYXRhc2l6ZShtYykgXAorCSgoKG1pY3JvY29kZV90ICopbWMpLT5oZHIuZGF0YXNpemUgPyBcCisJICgobWljcm9jb2RlX3QgKiltYyktPmhkci5kYXRhc2l6ZSA6IERFRkFVTFRfVUNPREVfREFUQVNJWkUpCisKKyNkZWZpbmUgc2lnbWF0Y2goczEsIHMyLCBwMSwgcDIpIFwKKwkoKChzMSkgPT0gKHMyKSkgJiYgKCgocDEpICYgKHAyKSkgfHwgKCgocDEpID09IDApICYmICgocDIpID09IDApKSkpCisKKyNkZWZpbmUgZXh0dGFibGVfc2l6ZShldCkgKChldCktPmNvdW50ICogRVhUX1NJR05BVFVSRV9TSVpFICsgRVhUX0hFQURFUl9TSVpFKQorCisvKiBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBwaHlzaWNhbCB3cml0ZSB0byBNU1IgMHg3OSAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhtaWNyb2NvZGVfdXBkYXRlX2xvY2spOworCisvKiBubyBjb25jdXJyZW50IC0+d3JpdGUoKXMgYXJlIGFsbG93ZWQgb24gL2Rldi9jcHUvbWljcm9jb2RlICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChtaWNyb2NvZGVfc2VtKTsKKworc3RhdGljIHZvaWQgX191c2VyICp1c2VyX2J1ZmZlcjsJLyogdXNlciBhcmVhIG1pY3JvY29kZSBkYXRhIGJ1ZmZlciAqLworc3RhdGljIHVuc2lnbmVkIGludCB1c2VyX2J1ZmZlcl9zaXplOwkvKiBpdCdzIHNpemUgKi8KKwordHlwZWRlZiBlbnVtIG1jX2Vycm9yX2NvZGUgeworCU1DX1NVQ0NFU1MgCT0gMCwKKwlNQ19OT1RGT1VORCAJPSAxLAorCU1DX01BUktFRCAJPSAyLAorCU1DX0FMTE9DQVRFRCAJPSAzLAorfSBtY19lcnJvcl9jb2RlX3Q7CisKK3N0YXRpYyBzdHJ1Y3QgdWNvZGVfY3B1X2luZm8geworCXVuc2lnbmVkIGludCBzaWc7CisJdW5zaWduZWQgaW50IHBmOworCXVuc2lnbmVkIGludCByZXY7CisJdW5zaWduZWQgaW50IGNrc3VtOworCW1jX2Vycm9yX2NvZGVfdCBlcnI7CisJbWljcm9jb2RlX3QgKm1jOworfSB1Y29kZV9jcHVfaW5mb1tOUl9DUFVTXTsKKwkJCQkKK3N0YXRpYyBpbnQgbWljcm9jb2RlX29wZW4gKHN0cnVjdCBpbm9kZSAqdW51c2VkMSwgc3RydWN0IGZpbGUgKnVudXNlZDIpCit7CisJcmV0dXJuIGNhcGFibGUoQ0FQX1NZU19SQVdJTykgPyAwIDogLUVQRVJNOworfQorCitzdGF0aWMgdm9pZCBjb2xsZWN0X2NwdV9pbmZvICh2b2lkICp1bnVzZWQpCit7CisJaW50IGNwdV9udW0gPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHVfbnVtOworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHVfbnVtOworCXVuc2lnbmVkIGludCB2YWxbMl07CisKKwl1Y2ktPnNpZyA9IHVjaS0+cGYgPSB1Y2ktPnJldiA9IHVjaS0+Y2tzdW0gPSAwOworCXVjaS0+ZXJyID0gTUNfTk9URk9VTkQ7IAorCXVjaS0+bWMgPSBOVUxMOworCisJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fCBjLT54ODYgPCA2IHx8CisJICAgIAljcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0lBNjQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBDUFUlZCBub3QgYSBjYXBhYmxlIEludGVsIHByb2Nlc3NvclxuIiwgY3B1X251bSk7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQl1Y2ktPnNpZyA9IGNwdWlkX2VheCgweDAwMDAwMDAxKTsKKworCQlpZiAoKGMtPng4Nl9tb2RlbCA+PSA1KSB8fCAoYy0+eDg2ID4gNikpIHsKKwkJCS8qIGdldCBwcm9jZXNzb3IgZmxhZ3MgZnJvbSBNU1IgMHgxNyAqLworCQkJcmRtc3IoTVNSX0lBMzJfUExBVEZPUk1fSUQsIHZhbFswXSwgdmFsWzFdKTsKKwkJCXVjaS0+cGYgPSAxIDw8ICgodmFsWzFdID4+IDE4KSAmIDcpOworCQl9CisJfQorCisJd3Jtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCAwLCAwKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNwdWlkIiA6IDogOiAiYXgiLCAiYngiLCAiY3giLCAiZHgiKTsKKwkvKiBnZXQgdGhlIGN1cnJlbnQgcmV2aXNpb24gZnJvbSBNU1IgMHg4QiAqLworCXJkbXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgdmFsWzBdLCB1Y2ktPnJldik7CisJcHJfZGVidWcoIm1pY3JvY29kZTogY29sbGVjdF9jcHVfaW5mbyA6IHNpZz0weCV4LCBwZj0weCV4LCByZXY9MHgleFxuIiwKKwkJCXVjaS0+c2lnLCB1Y2ktPnBmLCB1Y2ktPnJldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX21pY3JvY29kZV91cGRhdGUgKGludCBjcHVfbnVtLCBtaWNyb2NvZGVfaGVhZGVyX3QgKm1jX2hlYWRlciwgaW50IHNpZywgaW50IHBmLCBpbnQgY2tzdW0pCit7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CisKKwlwcl9kZWJ1ZygiTWljcm9jb2RlIEZvdW5kLlxuIik7CisJcHJfZGVidWcoIiAgIEhlYWRlciBSZXZpc2lvbiAweCV4XG4iLCBtY19oZWFkZXItPmhkcnZlcik7CisJcHJfZGVidWcoIiAgIExvYWRlciBSZXZpc2lvbiAweCV4XG4iLCBtY19oZWFkZXItPmxkcnZlcik7CisJcHJfZGVidWcoIiAgIFJldmlzaW9uIDB4JXggXG4iLCBtY19oZWFkZXItPnJldik7CisJcHJfZGVidWcoIiAgIERhdGUgJXgvJXgvJXhcbiIsCisJCSgobWNfaGVhZGVyLT5kYXRlID4+IDI0ICkgJiAweGZmKSwKKwkJKChtY19oZWFkZXItPmRhdGUgPj4gMTYgKSAmIDB4ZmYpLAorCQkobWNfaGVhZGVyLT5kYXRlICYgMHhGRkZGKSk7CisJcHJfZGVidWcoIiAgIFNpZ25hdHVyZSAweCV4XG4iLCBzaWcpOworCXByX2RlYnVnKCIgICBUeXBlIDB4JXggRmFtaWx5IDB4JXggTW9kZWwgMHgleCBTdGVwcGluZyAweCV4XG4iLAorCQkoKHNpZyA+PiAxMikgJiAweDMpLAorCQkoKHNpZyA+PiA4KSAmIDB4ZiksCisJCSgoc2lnID4+IDQpICYgMHhmKSwKKwkJKChzaWcgJiAweGYpKSk7CisJcHJfZGVidWcoIiAgIFByb2Nlc3NvciBGbGFncyAweCV4XG4iLCBwZik7CisJcHJfZGVidWcoIiAgIENoZWNrc3VtIDB4JXhcbiIsIGNrc3VtKTsKKworCWlmIChtY19oZWFkZXItPnJldiA8IHVjaS0+cmV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBDUFUlZCBub3QgJ3VwZ3JhZGluZycgdG8gZWFybGllciByZXZpc2lvbiIKKwkJICAgICAgICIgMHgleCAoY3VycmVudD0weCV4KVxuIiwgY3B1X251bSwgbWNfaGVhZGVyLT5yZXYsIHVjaS0+cmV2KTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChtY19oZWFkZXItPnJldiA9PSB1Y2ktPnJldikgeworCQkvKiBub3RpZnkgdGhlIGNhbGxlciBvZiBzdWNjZXNzIG9uIHRoaXMgY3B1ICovCisJCXVjaS0+ZXJyID0gTUNfU1VDQ0VTUzsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIGFscmVhZHkgYXQgcmV2aXNpb24iCisJCQkiIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsIGNwdV9udW0sIG1jX2hlYWRlci0+cmV2LCB1Y2ktPnJldik7CisJCWdvdG8gb3V0OworCX0KKworCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIGZvdW5kIGEgbWF0Y2hpbmcgbWljcm9jb2RlIHVwZGF0ZSB3aXRoICIKKwkJIiByZXZpc2lvbiAweCV4IChjdXJyZW50PTB4JXgpXG4iLCBjcHVfbnVtLCBtY19oZWFkZXItPnJldiwgdWNpLT5yZXYpOworCXVjaS0+Y2tzdW0gPSBja3N1bTsKKwl1Y2ktPnBmID0gcGY7IC8qIGtlZXAgdGhlIG9yaWdpbmFsIG1jIHBmIGZvciBja3N1bSBjYWxjdWxhdGlvbiAqLworCXVjaS0+ZXJyID0gTUNfTUFSS0VEOyAvKiBmb3VuZCB0aGUgbWF0Y2ggKi8KK291dDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZmluZF9tYXRjaGluZ191Y29kZXMgKHZvaWQpIAoreworCWludCBjdXJzb3IgPSAwOworCWludCBlcnJvciA9IDA7CisKKwl3aGlsZSAoY3Vyc29yICsgTUNfSEVBREVSX1NJWkUgPCB1c2VyX2J1ZmZlcl9zaXplKSB7CisJCW1pY3JvY29kZV9oZWFkZXJfdCBtY19oZWFkZXI7CisJCXZvaWQgKm5ld21jID0gTlVMTDsKKwkJaW50IGksIHN1bSwgY3B1X251bSwgYWxsb2NhdGVkX2ZsYWcsIHRvdGFsX3NpemUsIGRhdGFfc2l6ZSwgZXh0X3RhYmxlX3NpemU7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtY19oZWFkZXIsIHVzZXJfYnVmZmVyICsgY3Vyc29yLCBNQ19IRUFERVJfU0laRSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQ2FuIG5vdCByZWFkIHVzZXIgZGF0YVxuIik7CisJCQllcnJvciA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXRvdGFsX3NpemUgPSBnZXRfdG90YWxzaXplKCZtY19oZWFkZXIpOworCQlpZiAoKGN1cnNvciArIHRvdGFsX3NpemUgPiB1c2VyX2J1ZmZlcl9zaXplKSB8fCAodG90YWxfc2l6ZSA8IERFRkFVTFRfVUNPREVfVE9UQUxTSVpFKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBCYWQgZGF0YSBpbiBtaWNyb2NvZGUgZGF0YSBmaWxlXG4iKTsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZGF0YV9zaXplID0gZ2V0X2RhdGFzaXplKCZtY19oZWFkZXIpOworCQlpZiAoKGRhdGFfc2l6ZSArIE1DX0hFQURFUl9TSVpFID4gdG90YWxfc2l6ZSkgfHwgKGRhdGFfc2l6ZSA8IERFRkFVTFRfVUNPREVfREFUQVNJWkUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIEJhZCBkYXRhIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOworCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobWNfaGVhZGVyLmxkcnZlciAhPSAxIHx8IG1jX2hlYWRlci5oZHJ2ZXIgIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBVbmtub3duIG1pY3JvY29kZSB1cGRhdGUgZm9ybWF0XG4iKTsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCQorCQlmb3IgKGNwdV9udW0gPSAwOyBjcHVfbnVtIDwgbnVtX29ubGluZV9jcHVzKCk7IGNwdV9udW0rKykgeworCQkJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CisJCQlpZiAodWNpLT5lcnIgIT0gTUNfTk9URk9VTkQpIC8qIGFscmVhZHkgZm91bmQgYSBtYXRjaCBvciBub3QgYW4gb25saW5lIGNwdSovCisJCQkJY29udGludWU7CisKKwkJCWlmIChzaWdtYXRjaChtY19oZWFkZXIuc2lnLCB1Y2ktPnNpZywgbWNfaGVhZGVyLnBmLCB1Y2ktPnBmKSkKKwkJCQltYXJrX21pY3JvY29kZV91cGRhdGUoY3B1X251bSwgJm1jX2hlYWRlciwgbWNfaGVhZGVyLnNpZywgbWNfaGVhZGVyLnBmLCBtY19oZWFkZXIuY2tzdW0pOworCQl9CisKKwkJZXh0X3RhYmxlX3NpemUgPSB0b3RhbF9zaXplIC0gKE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplKTsKKwkJaWYgKGV4dF90YWJsZV9zaXplKSB7CisJCQlzdHJ1Y3QgZXh0ZW5kZWRfc2lndGFibGUgZXh0X2hlYWRlcjsKKwkJCXN0cnVjdCBleHRlbmRlZF9zaWduYXR1cmUgZXh0X3NpZzsKKwkJCWludCBleHRfc2lnY291bnQ7CisKKwkJCWlmICgoZXh0X3RhYmxlX3NpemUgPCBFWFRfSEVBREVSX1NJWkUpIAorCQkJCQl8fCAoKGV4dF90YWJsZV9zaXplIC0gRVhUX0hFQURFUl9TSVpFKSAlIEVYVF9TSUdOQVRVUkVfU0laRSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIEJhZCBkYXRhIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOworCQkJCWVycm9yID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZXh0X2hlYWRlciwgdXNlcl9idWZmZXIgKyBjdXJzb3IgCisJCQkJCSsgTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUsIEVYVF9IRUFERVJfU0laRSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIENhbiBub3QgcmVhZCB1c2VyIGRhdGFcbiIpOworCQkJCWVycm9yID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChleHRfdGFibGVfc2l6ZSAhPSBleHR0YWJsZV9zaXplKCZleHRfaGVhZGVyKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQmFkIGRhdGEgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CisJCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlleHRfc2lnY291bnQgPSBleHRfaGVhZGVyLmNvdW50OworCQkJCisJCQlmb3IgKGkgPSAwOyBpIDwgZXh0X3NpZ2NvdW50OyBpKyspIHsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJmV4dF9zaWcsIHVzZXJfYnVmZmVyICsgY3Vyc29yICsgTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUgKyBFWFRfSEVBREVSX1NJWkUgCisJCQkJCQkrIEVYVF9TSUdOQVRVUkVfU0laRSAqIGksIEVYVF9TSUdOQVRVUkVfU0laRSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBDYW4gbm90IHJlYWQgdXNlciBkYXRhXG4iKTsKKwkJCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJZm9yIChjcHVfbnVtID0gMDsgY3B1X251bSA8IG51bV9vbmxpbmVfY3B1cygpOyBjcHVfbnVtKyspIHsKKwkJCQkJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CisJCQkJCWlmICh1Y2ktPmVyciAhPSBNQ19OT1RGT1VORCkgLyogYWxyZWFkeSBmb3VuZCBhIG1hdGNoIG9yIG5vdCBhbiBvbmxpbmUgY3B1Ki8KKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoc2lnbWF0Y2goZXh0X3NpZy5zaWcsIHVjaS0+c2lnLCBleHRfc2lnLnBmLCB1Y2ktPnBmKSkgeworCQkJCQkJbWFya19taWNyb2NvZGVfdXBkYXRlKGNwdV9udW0sICZtY19oZWFkZXIsIGV4dF9zaWcuc2lnLCBleHRfc2lnLnBmLCBleHRfc2lnLmNrc3VtKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBub3cgY2hlY2sgaWYgYW55IGNwdSBoYXMgbWF0Y2hlZCAqLworCQlmb3IgKGNwdV9udW0gPSAwLCBhbGxvY2F0ZWRfZmxhZyA9IDAsIHN1bSA9IDA7IGNwdV9udW0gPCBudW1fb25saW5lX2NwdXMoKTsgY3B1X251bSsrKSB7CisJCQlpZiAodWNvZGVfY3B1X2luZm9bY3B1X251bV0uZXJyID09IE1DX01BUktFRCkgeyAKKwkJCQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKKwkJCQlpZiAoIWFsbG9jYXRlZF9mbGFnKSB7CisJCQkJCWFsbG9jYXRlZF9mbGFnID0gMTsKKwkJCQkJbmV3bWMgPSB2bWFsbG9jKHRvdGFsX3NpemUpOworCQkJCQlpZiAoIW5ld21jKSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIENhbiBub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJCQkJCWVycm9yID0gLUVOT01FTTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisJCQkJCWlmIChjb3B5X2Zyb21fdXNlcihuZXdtYyArIE1DX0hFQURFUl9TSVpFLCAKKwkJCQkJCQkJdXNlcl9idWZmZXIgKyBjdXJzb3IgKyBNQ19IRUFERVJfU0laRSwgCisJCQkJCQkJCXRvdGFsX3NpemUgLSBNQ19IRUFERVJfU0laRSkpIHsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQ2FuIG5vdCByZWFkIHVzZXIgZGF0YVxuIik7CisJCQkJCQl2ZnJlZShuZXdtYyk7CisJCQkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQltZW1jcHkobmV3bWMsICZtY19oZWFkZXIsIE1DX0hFQURFUl9TSVpFKTsKKwkJCQkJLyogY2hlY2sgZXh0ZW5kZWQgdGFibGUgY2hlY2tzdW0gKi8KKwkJCQkJaWYgKGV4dF90YWJsZV9zaXplKSB7CisJCQkJCQlpbnQgZXh0X3RhYmxlX3N1bSA9IDA7CisJCQkJCQlpbnQgKiBleHRfdGFibGVwID0gKCgodm9pZCAqKSBuZXdtYykgKyBNQ19IRUFERVJfU0laRSArIGRhdGFfc2l6ZSk7CisJCQkJCQlpID0gZXh0X3RhYmxlX3NpemUgLyBEV1NJWkU7CisJCQkJCQl3aGlsZSAoaS0tKSBleHRfdGFibGVfc3VtICs9IGV4dF90YWJsZXBbaV07CisJCQkJCQlpZiAoZXh0X3RhYmxlX3N1bSkgeworCQkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pY3JvY29kZTogYWJvcnRpbmcsIGJhZCBleHRlbmRlZCBzaWduYXR1cmUgdGFibGUgY2hlY2tzdW1cbiIpOworCQkJCQkJCXZmcmVlKG5ld21jKTsKKwkJCQkJCQllcnJvciA9IC1FSU5WQUw7CisJCQkJCQkJZ290byBvdXQ7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvKiBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtICovCisJCQkJCWkgPSAoTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUpIC8gRFdTSVpFOworCQkJCQl3aGlsZSAoaS0tKSBzdW0gKz0gKChpbnQgKiluZXdtYylbaV07CisJCQkJCXN1bSAtPSAobWNfaGVhZGVyLnNpZyArIG1jX2hlYWRlci5wZiArIG1jX2hlYWRlci5ja3N1bSk7CisJCQkJfQorCQkJCXVjb2RlX2NwdV9pbmZvW2NwdV9udW1dLm1jID0gbmV3bWM7CisJCQkJdWNvZGVfY3B1X2luZm9bY3B1X251bV0uZXJyID0gTUNfQUxMT0NBVEVEOyAvKiBtYyB1cGRhdGVkICovCisJCQkJaWYgKHN1bSArIHVjaS0+c2lnICsgdWNpLT5wZiArIHVjaS0+Y2tzdW0gIT0gMCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQgYWJvcnRpbmcsIGJhZCBjaGVja3N1bVxuIiwgY3B1X251bSk7CisJCQkJCWVycm9yID0gLUVJTlZBTDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CisJCWN1cnNvciArPSB0b3RhbF9zaXplOyAvKiBnb3RvIHRoZSBuZXh0IHVwZGF0ZSBwYXRjaCAqLworCX0gLyogZW5kIG9mIHdoaWxlICovCitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBkb191cGRhdGVfb25lICh2b2lkICogdW51c2VkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHZhbFsyXTsKKwlpbnQgY3B1X251bSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKKworCWlmICh1Y2ktPm1jID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibWljcm9jb2RlOiBObyBuZXcgbWljcm9jb2RlIGRhdGEgZm9yIENQVSVkXG4iLCBjcHVfbnVtKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBoeXNpY2FsIHdyaXRlIHRvIE1TUiAweDc5ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1pY3JvY29kZV91cGRhdGVfbG9jaywgZmxhZ3MpOyAgICAgICAgICAKKworCS8qIHdyaXRlIG1pY3JvY29kZSB2aWEgTVNSIDB4NzkgKi8KKwl3cm1zcihNU1JfSUEzMl9VQ09ERV9XUklURSwKKwkJKHVuc2lnbmVkIGxvbmcpIHVjaS0+bWMtPmJpdHMsIAorCQkodW5zaWduZWQgbG9uZykgdWNpLT5tYy0+Yml0cyA+PiAxNiA+PiAxNik7CisJd3Jtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCAwLCAwKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiY3B1aWQiIDogOiA6ICJheCIsICJieCIsICJjeCIsICJkeCIpOworCS8qIGdldCB0aGUgY3VycmVudCByZXZpc2lvbiBmcm9tIE1TUiAweDhCICovCisJcmRtc3IoTVNSX0lBMzJfVUNPREVfUkVWLCB2YWxbMF0sIHZhbFsxXSk7CisKKwkvKiBub3RpZnkgdGhlIGNhbGxlciBvZiBzdWNjZXNzIG9uIHRoaXMgY3B1ICovCisJdWNpLT5lcnIgPSBNQ19TVUNDRVNTOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pY3JvY29kZV91cGRhdGVfbG9jaywgZmxhZ3MpOworCXByaW50ayhLRVJOX0lORk8gIm1pY3JvY29kZTogQ1BVJWQgdXBkYXRlZCBmcm9tIHJldmlzaW9uICIKKwkgICAgICAgIjB4JXggdG8gMHgleCwgZGF0ZSA9ICUwOHggXG4iLCAKKwkgICAgICAgY3B1X251bSwgdWNpLT5yZXYsIHZhbFsxXSwgdWNpLT5tYy0+aGRyLmRhdGUpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBkb19taWNyb2NvZGVfdXBkYXRlICh2b2lkKQoreworCWludCBpLCBlcnJvcjsKKworCWlmIChvbl9lYWNoX2NwdShjb2xsZWN0X2NwdV9pbmZvLCBOVUxMLCAxLCAxKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBFcnJvciEgQ291bGQgbm90IHJ1biBvbiBhbGwgcHJvY2Vzc29yc1xuIik7CisJCWVycm9yID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChlcnJvciA9IGZpbmRfbWF0Y2hpbmdfdWNvZGVzKCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBFcnJvciBpbiB0aGUgbWljcm9jb2RlIGRhdGFcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWlmIChvbl9lYWNoX2NwdShkb191cGRhdGVfb25lLCBOVUxMLCAxLCAxKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBFcnJvciEgQ291bGQgbm90IHJ1biBvbiBhbGwgcHJvY2Vzc29yc1xuIik7CisJCWVycm9yID0gLUVJTzsKKwl9CisKK291dF9mcmVlOgorCWZvciAoaSA9IDA7IGkgPCBudW1fb25saW5lX2NwdXMoKTsgaSsrKSB7CisJCWlmICh1Y29kZV9jcHVfaW5mb1tpXS5tYykgeworCQkJaW50IGo7CisJCQl2b2lkICp0bXAgPSB1Y29kZV9jcHVfaW5mb1tpXS5tYzsKKwkJCXZmcmVlKHRtcCk7CisJCQlmb3IgKGogPSBpOyBqIDwgbnVtX29ubGluZV9jcHVzKCk7IGorKykgeworCQkJCWlmICh1Y29kZV9jcHVfaW5mb1tqXS5tYyA9PSB0bXApCisJCQkJCXVjb2RlX2NwdV9pbmZvW2pdLm1jID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1pY3JvY29kZV93cml0ZSAoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IHJldDsKKworCWlmIChsZW4gPCBERUZBVUxUX1VDT0RFX1RPVEFMU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogbm90IGVub3VnaCBkYXRhXG4iKTsgCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgobGVuID4+IFBBR0VfU0hJRlQpID4gbnVtX3BoeXNwYWdlcykgeworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogdG9vIG11Y2ggZGF0YSAobWF4ICVsZCBwYWdlcylcbiIsIG51bV9waHlzcGFnZXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkb3duKCZtaWNyb2NvZGVfc2VtKTsKKworCXVzZXJfYnVmZmVyID0gKHZvaWQgX191c2VyICopIGJ1ZjsKKwl1c2VyX2J1ZmZlcl9zaXplID0gKGludCkgbGVuOworCisJcmV0ID0gZG9fbWljcm9jb2RlX3VwZGF0ZSgpOworCWlmICghcmV0KQorCQlyZXQgPSAoc3NpemVfdClsZW47CisKKwl1cCgmbWljcm9jb2RlX3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1pY3JvY29kZV9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkgeworCQkvKiAKKwkJICogIFhYWDogd2lsbCBiZSByZW1vdmVkIGFmdGVyIG1pY3JvY29kZV9jdGwgCisJCSAqICBpcyB1cGRhdGVkIHRvIGlnbm9yZSBmYWlsdXJlIG9mIHRoaXMgaW9jdGwoKQorCQkgKi8KKwkJY2FzZSBNSUNST0NPREVfSU9DRlJFRToKKwkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtaWNyb2NvZGVfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLndyaXRlCQk9IG1pY3JvY29kZV93cml0ZSwKKwkuaW9jdGwJCT0gbWljcm9jb2RlX2lvY3RsLAorCS5vcGVuCQk9IG1pY3JvY29kZV9vcGVuLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIG1pY3JvY29kZV9kZXYgPSB7CisJLm1pbm9yCQk9IE1JQ1JPQ09ERV9NSU5PUiwKKwkubmFtZQkJPSAibWljcm9jb2RlIiwKKwkuZGV2ZnNfbmFtZQk9ICJjcHUvbWljcm9jb2RlIiwKKwkuZm9wcwkJPSAmbWljcm9jb2RlX2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtaWNyb2NvZGVfaW5pdCAodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IG1pc2NfcmVnaXN0ZXIoJm1pY3JvY29kZV9kZXYpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJtaWNyb2NvZGU6IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCisJCQlNSUNST0NPREVfTUlOT1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAKKwkJIklBLTMyIE1pY3JvY29kZSBVcGRhdGUgRHJpdmVyOiB2IiBNSUNST0NPREVfVkVSU0lPTiAiIDx0aWdyYW5AdmVyaXRhcy5jb20+XG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1pY3JvY29kZV9leGl0ICh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmbWljcm9jb2RlX2Rldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiSUEtMzIgTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXIgdiIgTUlDUk9DT0RFX1ZFUlNJT04gIiB1bnJlZ2lzdGVyZWRcbiIpOworfQorCittb2R1bGVfaW5pdChtaWNyb2NvZGVfaW5pdCkKK21vZHVsZV9leGl0KG1pY3JvY29kZV9leGl0KQorTU9EVUxFX0FMSUFTX01JU0NERVYoTUlDUk9DT0RFX01JTk9SKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2kzODYva2VybmVsL21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDljOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL21vZHVsZS5jCkBAIC0wLDAgKzEsMTI5IEBACisvKiAgS2VybmVsIG1vZHVsZSBoZWxwIGZvciBpMzg2LgorICAgIENvcHlyaWdodCAoQykgMjAwMSBSdXN0eSBSdXNzZWxsLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2lmIDAKKyNkZWZpbmUgREVCVUdQIHByaW50aworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKGZtdC4uLikKKyNlbmRpZgorCit2b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChzaXplID09IDApCisJCXJldHVybiBOVUxMOworCXJldHVybiB2bWFsbG9jX2V4ZWMoc2l6ZSk7Cit9CisKKworLyogRnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfYWxsb2MgKi8KK3ZvaWQgbW9kdWxlX2ZyZWUoc3RydWN0IG1vZHVsZSAqbW9kLCB2b2lkICptb2R1bGVfcmVnaW9uKQoreworCXZmcmVlKG1vZHVsZV9yZWdpb24pOworCS8qIEZJWE1FOiBJZiBtb2R1bGVfcmVnaW9uID09IG1vZC0+aW5pdF9yZWdpb24sIHRyaW0gZXhjZXB0aW9uCisgICAgICAgICAgIHRhYmxlIGVudHJpZXMuICovCit9CisKKy8qIFdlIGRvbid0IG5lZWQgYW55dGhpbmcgc3BlY2lhbC4gKi8KK2ludCBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsCisJCQkgICAgICBFbGZfU2hkciAqc2VjaGRycywKKwkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsCisJCQkgICAgICBzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhcHBseV9yZWxvY2F0ZShFbGYzMl9TaGRyICpzZWNoZHJzLAorCQkgICBjb25zdCBjaGFyICpzdHJ0YWIsCisJCSAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKKwkJICAgdW5zaWduZWQgaW50IHJlbHNlYywKKwkJICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisJdW5zaWduZWQgaW50IGk7CisJRWxmMzJfUmVsICpyZWwgPSAodm9pZCAqKXNlY2hkcnNbcmVsc2VjXS5zaF9hZGRyOworCUVsZjMyX1N5bSAqc3ltOworCXVpbnQzMl90ICpsb2NhdGlvbjsKKworCURFQlVHUCgiQXBwbHlpbmcgcmVsb2NhdGUgc2VjdGlvbiAldSB0byAldVxuIiwgcmVsc2VjLAorCSAgICAgICBzZWNoZHJzW3JlbHNlY10uc2hfaW5mbyk7CisJZm9yIChpID0gMDsgaSA8IHNlY2hkcnNbcmVsc2VjXS5zaF9zaXplIC8gc2l6ZW9mKCpyZWwpOyBpKyspIHsKKwkJLyogVGhpcyBpcyB3aGVyZSB0byBtYWtlIHRoZSBjaGFuZ2UgKi8KKwkJbG9jYXRpb24gPSAodm9pZCAqKXNlY2hkcnNbc2VjaGRyc1tyZWxzZWNdLnNoX2luZm9dLnNoX2FkZHIKKwkJCSsgcmVsW2ldLnJfb2Zmc2V0OworCQkvKiBUaGlzIGlzIHRoZSBzeW1ib2wgaXQgaXMgcmVmZXJyaW5nIHRvLiAgTm90ZSB0aGF0IGFsbAorCQkgICB1bmRlZmluZWQgc3ltYm9scyBoYXZlIGJlZW4gcmVzb2x2ZWQuICAqLworCQlzeW0gPSAoRWxmMzJfU3ltICopc2VjaGRyc1tzeW1pbmRleF0uc2hfYWRkcgorCQkJKyBFTEYzMl9SX1NZTShyZWxbaV0ucl9pbmZvKTsKKworCQlzd2l0Y2ggKEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSkgeworCQljYXNlIFJfMzg2XzMyOgorCQkJLyogV2UgYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBsb2NhdGlvbiBnaXZlbiAqLworCQkJKmxvY2F0aW9uICs9IHN5bS0+c3RfdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBSXzM4Nl9QQzMyOgorCQkJLyogQWRkIHRoZSB2YWx1ZSwgc3VidHJhY3QgaXRzIHBvc3RpdGlvbiAqLworCQkJKmxvY2F0aW9uICs9IHN5bS0+c3RfdmFsdWUgLSAodWludDMyX3QpbG9jYXRpb247CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBVbmtub3duIHJlbG9jYXRpb246ICV1XG4iLAorCQkJICAgICAgIG1lLT5uYW1lLCBFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpOworCQkJcmV0dXJuIC1FTk9FWEVDOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgYXBwbHlfcmVsb2NhdGVfYWRkKEVsZjMyX1NoZHIgKnNlY2hkcnMsCisJCSAgICAgICBjb25zdCBjaGFyICpzdHJ0YWIsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsc2VjLAorCQkgICAgICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IEFERCBSRUxPQ0FUSU9OIHVuc3VwcG9ydGVkXG4iLAorCSAgICAgICBtZS0+bmFtZSk7CisJcmV0dXJuIC1FTk9FWEVDOworfQorCitleHRlcm4gdm9pZCBhcHBseV9hbHRlcm5hdGl2ZXModm9pZCAqc3RhcnQsIHZvaWQgKmVuZCk7IAorCitpbnQgbW9kdWxlX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICpoZHIsCisJCSAgICBjb25zdCBFbGZfU2hkciAqc2VjaGRycywKKwkJICAgIHN0cnVjdCBtb2R1bGUgKm1lKQoreworCWNvbnN0IEVsZl9TaGRyICpzOworCWNoYXIgKnNlY3N0cmluZ3MgPSAodm9pZCAqKWhkciArIHNlY2hkcnNbaGRyLT5lX3Noc3RybmR4XS5zaF9vZmZzZXQ7CisKKwkvKiBsb29rIGZvciAuYWx0aW5zdHJ1Y3Rpb25zIHRvIHBhdGNoICovIAorCWZvciAocyA9IHNlY2hkcnM7IHMgPCBzZWNoZHJzICsgaGRyLT5lX3NobnVtOyBzKyspIHsgCisJCXZvaWQgKnNlZzsgCQkKKwkJaWYgKHN0cmNtcCgiLmFsdGluc3RydWN0aW9ucyIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKSkKKwkJCWNvbnRpbnVlOworCQlzZWcgPSAodm9pZCAqKXMtPnNoX2FkZHI7IAorCQlhcHBseV9hbHRlcm5hdGl2ZXMoc2VnLCBzZWcgKyBzLT5zaF9zaXplKTsgCisJfSAJCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpCit7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbXBwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDdhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYwpAQCAtMCwwICsxLDExMDkgQEAKKy8qCisgKglJbnRlbCBNdWx0aXByb2Nlc3NvciBTcGVjaWZpY2F0aW9uIDEuMSBhbmQgMS40CisgKgljb21wbGlhbnQgTVAtdGFibGUgcGFyc2luZyByb3V0aW5lcy4KKyAqCisgKgkoYykgMTk5NSBBbGFuIENveCwgQnVpbGRpbmcgIzMgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCShjKSAxOTk4LCAxOTk5LCAyMDAwIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICoKKyAqCUZpeGVzCisgKgkJRXJpY2ggQm9sZXluCToJTVAgdjEuNCBhbmQgYWRkaXRpb25hbCBjaGFuZ2VzLgorICoJCUFsYW4gQ294CToJQWRkZWQgRUJEQSBzY2FubmluZworICoJCUluZ28gTW9sbmFyCToJdmFyaW91cyBjbGVhbnVwcyBhbmQgcmV3cml0ZXMKKyAqCQlNYWNpZWogVy4gUm96eWNraToJQml0cyBmb3IgZGVmYXVsdCBNUCBjb25maWd1cmF0aW9ucworICoJCVBhdWwgRGllZmVuYmF1Z2g6CUFkZGVkIGZ1bGwgQUNQSSBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CisKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKyNpbmNsdWRlIDxtYWNoX21wcGFyc2UuaD4KKyNpbmNsdWRlIDxiaW9zX2ViZGEuaD4KKworLyogSGF2ZSB3ZSBmb3VuZCBhbiBNUCB0YWJsZSAqLworaW50IHNtcF9mb3VuZF9jb25maWc7Cit1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBtYXhjcHVzID0gTlJfQ1BVUzsKKworLyoKKyAqIFZhcmlvdXMgTGludXgtaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGNyZWF0ZWQgZnJvbSB0aGUKKyAqIE1QLXRhYmxlLgorICovCitpbnQgYXBpY192ZXJzaW9uIFtNQVhfQVBJQ1NdOworaW50IG1wX2J1c19pZF90b190eXBlIFtNQVhfTVBfQlVTU0VTXTsKK2ludCBtcF9idXNfaWRfdG9fbm9kZSBbTUFYX01QX0JVU1NFU107CitpbnQgbXBfYnVzX2lkX3RvX2xvY2FsIFtNQVhfTVBfQlVTU0VTXTsKK2ludCBxdWFkX2xvY2FsX3RvX21wX2J1c19pZCBbTlJfQ1BVUy80XVs0XTsKK2ludCBtcF9idXNfaWRfdG9fcGNpX2J1cyBbTUFYX01QX0JVU1NFU10gPSB7IFswIC4uLiBNQVhfTVBfQlVTU0VTLTFdID0gLTEgfTsKK3N0YXRpYyBpbnQgbXBfY3VycmVudF9wY2lfaWQ7CisKKy8qIEkvTyBBUElDIGVudHJpZXMgKi8KK3N0cnVjdCBtcGNfY29uZmlnX2lvYXBpYyBtcF9pb2FwaWNzW01BWF9JT19BUElDU107CisKKy8qICMgb2YgTVAgSVJRIHNvdXJjZSBlbnRyaWVzICovCitzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgbXBfaXJxc1tNQVhfSVJRX1NPVVJDRVNdOworCisvKiBNUCBJUlEgc291cmNlIGVudHJpZXMgKi8KK2ludCBtcF9pcnFfZW50cmllczsKKworaW50IG5yX2lvYXBpY3M7CisKK2ludCBwaWNfbW9kZTsKK3Vuc2lnbmVkIGxvbmcgbXBfbGFwaWNfYWRkcjsKKworLyogUHJvY2Vzc29yIHRoYXQgaXMgZG9pbmcgdGhlIGJvb3QgdXAgKi8KK3Vuc2lnbmVkIGludCBib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSAtMVU7Cit1bnNpZ25lZCBpbnQgYm9vdF9jcHVfbG9naWNhbF9hcGljaWQgPSAtMVU7CisvKiBJbnRlcm5hbCBwcm9jZXNzb3IgY291bnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBudW1fcHJvY2Vzc29yczsKKworLyogQml0bWFzayBvZiBwaHlzaWNhbGx5IGV4aXN0aW5nIENQVXMgKi8KK3BoeXNpZF9tYXNrX3QgcGh5c19jcHVfcHJlc2VudF9tYXA7CisKK3U4IGJpb3NfY3B1X2FwaWNpZFtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSBCQURfQVBJQ0lEIH07CisKKy8qCisgKiBJbnRlbCBNUCBCSU9TIHRhYmxlIHBhcnNpbmcgcm91dGluZXM6CisgKi8KKworCisvKgorICogQ2hlY2tzdW0gYW4gTVAgY29uZmlndXJhdGlvbiBibG9jay4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBtcGZfY2hlY2tzdW0odW5zaWduZWQgY2hhciAqbXAsIGludCBsZW4pCit7CisJaW50IHN1bSA9IDA7CisKKwl3aGlsZSAobGVuLS0pCisJCXN1bSArPSAqbXArKzsKKworCXJldHVybiBzdW0gJiAweEZGOworfQorCisvKgorICogSGF2ZSB0byBtYXRjaCB0cmFuc2xhdGlvbiB0YWJsZSBlbnRyaWVzIHRvIG1haW4gdGFibGUgZW50cmllcyBieSBjb3VudGVyCisgKiBoZW5jZSB0aGUgbXBjX3JlY29yZCB2YXJpYWJsZSAuLi4uIGNhbid0IHNlZSBhIGxlc3MgZGlzZ3VzdGluZyB3YXkgb2YKKyAqIGRvaW5nIHRoaXMgLi4uLgorICovCisKK3N0YXRpYyBpbnQgbXBjX3JlY29yZDsgCitzdGF0aWMgc3RydWN0IG1wY19jb25maWdfdHJhbnNsYXRpb24gKnRyYW5zbGF0aW9uX3RhYmxlW01BWF9NUENfRU5UUlldIF9faW5pdGRhdGE7CisKKyNpZmRlZiBDT05GSUdfWDg2X05VTUFRCitzdGF0aWMgaW50IE1QX3ZhbGlkX2FwaWNpZChpbnQgYXBpY2lkLCBpbnQgdmVyc2lvbikKK3sKKwlyZXR1cm4gaHdlaWdodF9sb25nKGFwaWNpZCAmIDB4ZikgPT0gMSAmJiAoYXBpY2lkID4+IDQpICE9IDB4ZjsKK30KKyNlbHNlCitzdGF0aWMgaW50IE1QX3ZhbGlkX2FwaWNpZChpbnQgYXBpY2lkLCBpbnQgdmVyc2lvbikKK3sKKwlpZiAodmVyc2lvbiA+PSAweDE0KQorCQlyZXR1cm4gYXBpY2lkIDwgMHhmZjsKKwllbHNlCisJCXJldHVybiBhcGljaWQgPCAweGY7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IE1QX3Byb2Nlc3Nvcl9pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKm0pCit7CisgCWludCB2ZXIsIGFwaWNpZDsKKwlwaHlzaWRfbWFza190IHRtcDsKKyAJCisJaWYgKCEobS0+bXBjX2NwdWZsYWcgJiBDUFVfRU5BQkxFRCkpCisJCXJldHVybjsKKworCWFwaWNpZCA9IG1wY19hcGljX2lkKG0sIHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdKTsKKworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDApKQorCQlEcHJpbnRrKCIgICAgRmxvYXRpbmcgcG9pbnQgdW5pdCBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8NykpCisJCURwcmludGsoIiAgICBNYWNoaW5lIEV4Y2VwdGlvbiBzdXBwb3J0ZWQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDw4KSkKKwkJRHByaW50aygiICAgIDY0IGJpdCBjb21wYXJlICYgZXhjaGFuZ2Ugc3VwcG9ydGVkLlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8OSkpCisJCURwcmludGsoIiAgICBJbnRlcm5hbCBBUElDIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwxMSkpCisJCURwcmludGsoIiAgICBTRVAgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDEyKSkKKwkJRHByaW50aygiICAgIE1UUlIgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwxMykpCisJCURwcmludGsoIiAgICBQR0UgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwxNCkpCisJCURwcmludGsoIiAgICBNQ0EgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwxNSkpCisJCURwcmludGsoIiAgICBDTU9WICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTYpKQorCQlEcHJpbnRrKCIgICAgUEFUICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTcpKQorCQlEcHJpbnRrKCIgICAgUFNFICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTgpKQorCQlEcHJpbnRrKCIgICAgUFNOICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MTkpKQorCQlEcHJpbnRrKCIgICAgQ2FjaGUgTGluZSBGbHVzaCBJbnN0cnVjdGlvbiBwcmVzZW50LlxuIik7CisJLyogMjAgUmVzZXJ2ZWQgKi8KKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyMSkpCisJCURwcmludGsoIiAgICBEZWJ1ZyBUcmFjZSBhbmQgRU1PTiBTdG9yZSBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MjIpKQorCQlEcHJpbnRrKCIgICAgQUNQSSBUaGVybWFsIFRocm90dGxlIFJlZ2lzdGVycyAgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDIzKSkKKwkJRHByaW50aygiICAgIE1NWCAgcHJlc2VudC5cbiIpOworCWlmIChtLT5tcGNfZmVhdHVyZWZsYWcmKDE8PDI0KSkKKwkJRHByaW50aygiICAgIEZYU1IgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyNSkpCisJCURwcmludGsoIiAgICBYTU0gIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyNikpCisJCURwcmludGsoIiAgICBXaWxsYW1ldHRlIE5ldyBJbnN0cnVjdGlvbnMgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyNykpCisJCURwcmludGsoIiAgICBTZWxmIFNub29wICBwcmVzZW50LlxuIik7CisJaWYgKG0tPm1wY19mZWF0dXJlZmxhZyYoMTw8MjgpKQorCQlEcHJpbnRrKCIgICAgSFQgIHByZXNlbnQuXG4iKTsKKwlpZiAobS0+bXBjX2ZlYXR1cmVmbGFnJigxPDwyOSkpCisJCURwcmludGsoIiAgICBUaGVybWFsIE1vbml0b3IgcHJlc2VudC5cbiIpOworCS8qIDMwLCAzMSBSZXNlcnZlZCAqLworCisKKwlpZiAobS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUikgeworCQlEcHJpbnRrKCIgICAgQm9vdHVwIENQVVxuIik7CisJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IG0tPm1wY19hcGljaWQ7CisJCWJvb3RfY3B1X2xvZ2ljYWxfYXBpY2lkID0gYXBpY2lkOworCX0KKworCWlmIChudW1fcHJvY2Vzc29ycyA+PSBOUl9DUFVTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldBUk5JTkc6IE5SX0NQVVMgbGltaXQgb2YgJWkgcmVhY2hlZC4iCisJCQkiICBQcm9jZXNzb3IgaWdub3JlZC5cbiIsIE5SX0NQVVMpOyAKKwkJcmV0dXJuOworCX0KKworCWlmIChudW1fcHJvY2Vzc29ycyA+PSBtYXhjcHVzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldBUk5JTkc6IG1heGNwdXMgbGltaXQgb2YgJWkgcmVhY2hlZC4iCisJCQkiIFByb2Nlc3NvciBpZ25vcmVkLlxuIiwgbWF4Y3B1cyk7IAorCQlyZXR1cm47CisJfQorCW51bV9wcm9jZXNzb3JzKys7CisJdmVyID0gbS0+bXBjX2FwaWN2ZXI7CisKKwlpZiAoIU1QX3ZhbGlkX2FwaWNpZChhcGljaWQsIHZlcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUHJvY2Vzc29yICMlZCBJTlZBTElELiAoTWF4IElEOiAlZCkuXG4iLAorCQkJbS0+bXBjX2FwaWNpZCwgTUFYX0FQSUNTKTsKKwkJLS1udW1fcHJvY2Vzc29yczsKKwkJcmV0dXJuOworCX0KKworCXRtcCA9IGFwaWNpZF90b19jcHVfcHJlc2VudChhcGljaWQpOworCXBoeXNpZHNfb3IocGh5c19jcHVfcHJlc2VudF9tYXAsIHBoeXNfY3B1X3ByZXNlbnRfbWFwLCB0bXApOworCQorCS8qCisJICogVmFsaWRhdGUgdmVyc2lvbgorCSAqLworCWlmICh2ZXIgPT0gMHgwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJJT1MgYnVnLCBBUElDIHZlcnNpb24gaXMgMCBmb3IgQ1BVIyVkISBmaXhpbmcgdXAgdG8gMHgxMC4gKHRlbGwgeW91ciBodyB2ZW5kb3IpXG4iLCBtLT5tcGNfYXBpY2lkKTsKKwkJdmVyID0gMHgxMDsKKwl9CisJYXBpY192ZXJzaW9uW20tPm1wY19hcGljaWRdID0gdmVyOworCWJpb3NfY3B1X2FwaWNpZFtudW1fcHJvY2Vzc29ycyAtIDFdID0gbS0+bXBjX2FwaWNpZDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IE1QX2J1c19pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19idXMgKm0pCit7CisJY2hhciBzdHJbN107CisKKwltZW1jcHkoc3RyLCBtLT5tcGNfYnVzdHlwZSwgNik7CisJc3RyWzZdID0gMDsKKworCW1wY19vZW1fYnVzX2luZm8obSwgc3RyLCB0cmFuc2xhdGlvbl90YWJsZVttcGNfcmVjb3JkXSk7CisKKwlpZiAoc3RybmNtcChzdHIsIEJVU1RZUEVfSVNBLCBzaXplb2YoQlVTVFlQRV9JU0EpLTEpID09IDApIHsKKwkJbXBfYnVzX2lkX3RvX3R5cGVbbS0+bXBjX2J1c2lkXSA9IE1QX0JVU19JU0E7CisJfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgQlVTVFlQRV9FSVNBLCBzaXplb2YoQlVTVFlQRV9FSVNBKS0xKSA9PSAwKSB7CisJCW1wX2J1c19pZF90b190eXBlW20tPm1wY19idXNpZF0gPSBNUF9CVVNfRUlTQTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoc3RyLCBCVVNUWVBFX1BDSSwgc2l6ZW9mKEJVU1RZUEVfUENJKS0xKSA9PSAwKSB7CisJCW1wY19vZW1fcGNpX2J1cyhtLCB0cmFuc2xhdGlvbl90YWJsZVttcGNfcmVjb3JkXSk7CisJCW1wX2J1c19pZF90b190eXBlW20tPm1wY19idXNpZF0gPSBNUF9CVVNfUENJOworCQltcF9idXNfaWRfdG9fcGNpX2J1c1ttLT5tcGNfYnVzaWRdID0gbXBfY3VycmVudF9wY2lfaWQ7CisJCW1wX2N1cnJlbnRfcGNpX2lkKys7CisJfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgQlVTVFlQRV9NQ0EsIHNpemVvZihCVVNUWVBFX01DQSktMSkgPT0gMCkgeworCQltcF9idXNfaWRfdG9fdHlwZVttLT5tcGNfYnVzaWRdID0gTVBfQlVTX01DQTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoc3RyLCBCVVNUWVBFX05FQzk4LCBzaXplb2YoQlVTVFlQRV9ORUM5OCktMSkgPT0gMCkgeworCQltcF9idXNfaWRfdG9fdHlwZVttLT5tcGNfYnVzaWRdID0gTVBfQlVTX05FQzk4OworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVua25vd24gYnVzdHlwZSAlcyAtIGlnbm9yaW5nXG4iLCBzdHIpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IE1QX2lvYXBpY19pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19pb2FwaWMgKm0pCit7CisJaWYgKCEobS0+bXBjX2ZsYWdzICYgTVBDX0FQSUNfVVNBQkxFKSkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSS9PIEFQSUMgIyVkIFZlcnNpb24gJWQgYXQgMHglbFguXG4iLAorCQltLT5tcGNfYXBpY2lkLCBtLT5tcGNfYXBpY3ZlciwgbS0+bXBjX2FwaWNhZGRyKTsKKwlpZiAobnJfaW9hcGljcyA+PSBNQVhfSU9fQVBJQ1MpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTWF4ICMgb2YgSS9PIEFQSUNzICglZCkgZXhjZWVkZWQgKGZvdW5kICVkKS5cbiIsCisJCQlNQVhfSU9fQVBJQ1MsIG5yX2lvYXBpY3MpOworCQlwYW5pYygiUmVjb21waWxlIGtlcm5lbCB3aXRoIGJpZ2dlciBNQVhfSU9fQVBJQ1MhLlxuIik7CisJfQorCWlmICghbS0+bXBjX2FwaWNhZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiV0FSTklORzogYm9ndXMgemVybyBJL08gQVBJQyBhZGRyZXNzIgorCQkJIiBmb3VuZCBpbiBNUCB0YWJsZSwgc2tpcHBpbmchXG4iKTsKKwkJcmV0dXJuOworCX0KKwltcF9pb2FwaWNzW25yX2lvYXBpY3NdID0gKm07CisJbnJfaW9hcGljcysrOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgTVBfaW50c3JjX2luZm8gKHN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyAqbSkKK3sKKwltcF9pcnFzIFttcF9pcnFfZW50cmllc10gPSAqbTsKKwlEcHJpbnRrKCJJbnQ6IHR5cGUgJWQsIHBvbCAlZCwgdHJpZyAlZCwgYnVzICVkLCIKKwkJIiBJUlEgJTAyeCwgQVBJQyBJRCAleCwgQVBJQyBJTlQgJTAyeFxuIiwKKwkJCW0tPm1wY19pcnF0eXBlLCBtLT5tcGNfaXJxZmxhZyAmIDMsCisJCQkobS0+bXBjX2lycWZsYWcgPj4gMikgJiAzLCBtLT5tcGNfc3JjYnVzLAorCQkJbS0+bXBjX3NyY2J1c2lycSwgbS0+bXBjX2RzdGFwaWMsIG0tPm1wY19kc3RpcnEpOworCWlmICgrK21wX2lycV9lbnRyaWVzID09IE1BWF9JUlFfU09VUkNFUykKKwkJcGFuaWMoIk1heCAjIG9mIGlycSBzb3VyY2VzIGV4Y2VlZGVkISFcbiIpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgTVBfbGludHNyY19pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19saW50c3JjICptKQoreworCURwcmludGsoIkxpbnQ6IHR5cGUgJWQsIHBvbCAlZCwgdHJpZyAlZCwgYnVzICVkLCIKKwkJIiBJUlEgJTAyeCwgQVBJQyBJRCAleCwgQVBJQyBMSU5UICUwMnhcbiIsCisJCQltLT5tcGNfaXJxdHlwZSwgbS0+bXBjX2lycWZsYWcgJiAzLAorCQkJKG0tPm1wY19pcnFmbGFnID4+IDIpICYzLCBtLT5tcGNfc3JjYnVzaWQsCisJCQltLT5tcGNfc3JjYnVzaXJxLCBtLT5tcGNfZGVzdGFwaWMsIG0tPm1wY19kZXN0YXBpY2xpbnQpOworCS8qCisJICogV2VsbCBpdCBzZWVtcyBhbGwgU01QIGJvYXJkcyBpbiBleGlzdGVuY2UKKwkgKiB1c2UgRXh0SU5UL0xWVDEgPT0gTElOVDAgYW5kCisJICogTk1JL0xWVDIgPT0gTElOVDEgLSB0aGUgZm9sbG93aW5nIGNoZWNrCisJICogd2lsbCBzaG93IHVzIGlmIHRoaXMgYXNzdW1wdGlvbnMgaXMgZmFsc2UuCisJICogVW50aWwgdGhlbiB3ZSBkbyBub3QgaGF2ZSB0byBhZGQgYmFnZ2FnZS4KKwkgKi8KKwlpZiAoKG0tPm1wY19pcnF0eXBlID09IG1wX0V4dElOVCkgJiYKKwkJKG0tPm1wY19kZXN0YXBpY2xpbnQgIT0gMCkpCisJCQlCVUcoKTsKKwlpZiAoKG0tPm1wY19pcnF0eXBlID09IG1wX05NSSkgJiYKKwkJKG0tPm1wY19kZXN0YXBpY2xpbnQgIT0gMSkpCisJCQlCVUcoKTsKK30KKworI2lmZGVmIENPTkZJR19YODZfTlVNQVEKK3N0YXRpYyB2b2lkIF9faW5pdCBNUF90cmFuc2xhdGlvbl9pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ190cmFuc2xhdGlvbiAqbSkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJUcmFuc2xhdGlvbjogcmVjb3JkICVkLCB0eXBlICVkLCBxdWFkICVkLCBnbG9iYWwgJWQsIGxvY2FsICVkXG4iLCBtcGNfcmVjb3JkLCBtLT50cmFuc190eXBlLCBtLT50cmFuc19xdWFkLCBtLT50cmFuc19nbG9iYWwsIG0tPnRyYW5zX2xvY2FsKTsKKworCWlmIChtcGNfcmVjb3JkID49IE1BWF9NUENfRU5UUlkpIAorCQlwcmludGsoS0VSTl9FUlIgIk1BWF9NUENfRU5UUlkgZXhjZWVkZWQhXG4iKTsKKwllbHNlCisJCXRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdID0gbTsgLyogc3Rhc2ggdGhpcyBmb3IgbGF0ZXIgKi8KKwlpZiAobS0+dHJhbnNfcXVhZCA8IE1BWF9OVU1OT0RFUyAmJiAhbm9kZV9vbmxpbmUobS0+dHJhbnNfcXVhZCkpCisJCW5vZGVfc2V0X29ubGluZShtLT50cmFuc19xdWFkKTsKK30KKworLyoKKyAqIFJlYWQvcGFyc2UgdGhlIE1QQyBvZW0gdGFibGVzCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IHNtcF9yZWFkX21wY19vZW0oc3RydWN0IG1wX2NvbmZpZ19vZW10YWJsZSAqb2VtdGFibGUsIFwKKwl1bnNpZ25lZCBzaG9ydCBvZW1zaXplKQoreworCWludCBjb3VudCA9IHNpemVvZiAoKm9lbXRhYmxlKTsgLyogdGhlIGhlYWRlciBzaXplICovCisJdW5zaWduZWQgY2hhciAqb2VtcHRyID0gKCh1bnNpZ25lZCBjaGFyICopb2VtdGFibGUpK2NvdW50OworCQorCW1wY19yZWNvcmQgPSAwOworCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIGFuIE9FTSBNUEMgdGFibGUgYXQgJThwIC0gcGFyc2luZyBpdCAuLi4gXG4iLCBvZW10YWJsZSk7CisJaWYgKG1lbWNtcChvZW10YWJsZS0+b2VtX3NpZ25hdHVyZSxNUENfT0VNX1NJR05BVFVSRSw0KSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNNUCBtcGMgb2VtdGFibGU6IGJhZCBzaWduYXR1cmUgWyVjJWMlYyVjXSFcbiIsCisJCQlvZW10YWJsZS0+b2VtX3NpZ25hdHVyZVswXSwKKwkJCW9lbXRhYmxlLT5vZW1fc2lnbmF0dXJlWzFdLAorCQkJb2VtdGFibGUtPm9lbV9zaWduYXR1cmVbMl0sCisJCQlvZW10YWJsZS0+b2VtX3NpZ25hdHVyZVszXSk7CisJCXJldHVybjsKKwl9CisJaWYgKG1wZl9jaGVja3N1bSgodW5zaWduZWQgY2hhciAqKW9lbXRhYmxlLG9lbXRhYmxlLT5vZW1fbGVuZ3RoKSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNNUCBvZW0gbXB0YWJsZTogY2hlY2tzdW0gZXJyb3IhXG4iKTsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAoY291bnQgPCBvZW10YWJsZS0+b2VtX2xlbmd0aCkgeworCQlzd2l0Y2ggKCpvZW1wdHIpIHsKKwkJCWNhc2UgTVBfVFJBTlNMQVRJT046CisJCQl7CisJCQkJc3RydWN0IG1wY19jb25maWdfdHJhbnNsYXRpb24gKm09CisJCQkJCShzdHJ1Y3QgbXBjX2NvbmZpZ190cmFuc2xhdGlvbiAqKW9lbXB0cjsKKwkJCQlNUF90cmFuc2xhdGlvbl9pbmZvKG0pOworCQkJCW9lbXB0ciArPSBzaXplb2YoKm0pOworCQkJCWNvdW50ICs9IHNpemVvZigqbSk7CisJCQkJKyttcGNfcmVjb3JkOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbnJlY29nbmlzZWQgT0VNIHRhYmxlIGVudHJ5IHR5cGUhIC0gJWRcbiIsIChpbnQpICpvZW1wdHIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorICAgICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG1wc19vZW1fY2hlY2soc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCBjaGFyICpvZW0sCisJCWNoYXIgKnByb2R1Y3RpZCkKK3sKKwlpZiAoc3RybmNtcChvZW0sICJJQk0gTlVNQSIsIDgpKQorCQlwcmludGsoIldhcm5pbmchICBNYXkgbm90IGJlIGEgTlVNQS1RIHN5c3RlbSFcbiIpOworCWlmIChtcGMtPm1wY19vZW1wdHIpCisJCXNtcF9yZWFkX21wY19vZW0oKHN0cnVjdCBtcF9jb25maWdfb2VtdGFibGUgKikgbXBjLT5tcGNfb2VtcHRyLAorCQkJCW1wYy0+bXBjX29lbXNpemUpOworfQorI2VuZGlmCS8qIENPTkZJR19YODZfTlVNQVEgKi8KKworLyoKKyAqIFJlYWQvcGFyc2UgdGhlIE1QQworICovCisKK3N0YXRpYyBpbnQgX19pbml0IHNtcF9yZWFkX21wYyhzdHJ1Y3QgbXBfY29uZmlnX3RhYmxlICptcGMpCit7CisJY2hhciBzdHJbMTZdOworCWNoYXIgb2VtWzEwXTsKKwlpbnQgY291bnQ9c2l6ZW9mKCptcGMpOworCXVuc2lnbmVkIGNoYXIgKm1wdD0oKHVuc2lnbmVkIGNoYXIgKiltcGMpK2NvdW50OworCisJaWYgKG1lbWNtcChtcGMtPm1wY19zaWduYXR1cmUsTVBDX1NJR05BVFVSRSw0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNNUCBtcHRhYmxlOiBiYWQgc2lnbmF0dXJlIFsweCV4XSFcbiIsCisJCQkqKHUzMiAqKW1wYy0+bXBjX3NpZ25hdHVyZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAobXBmX2NoZWNrc3VtKCh1bnNpZ25lZCBjaGFyICopbXBjLG1wYy0+bXBjX2xlbmd0aCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTTVAgbXB0YWJsZTogY2hlY2tzdW0gZXJyb3IhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChtcGMtPm1wY19zcGVjIT0weDAxICYmIG1wYy0+bXBjX3NwZWMhPTB4MDQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTTVAgbXB0YWJsZTogYmFkIHRhYmxlIHZlcnNpb24gKCVkKSEhXG4iLAorCQkJbXBjLT5tcGNfc3BlYyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIW1wYy0+bXBjX2xhcGljKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU01QIG1wdGFibGU6IG51bGwgbG9jYWwgQVBJQyBhZGRyZXNzIVxuIik7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkob2VtLG1wYy0+bXBjX29lbSw4KTsKKwlvZW1bOF09MDsKKwlwcmludGsoS0VSTl9JTkZPICJPRU0gSUQ6ICVzICIsb2VtKTsKKworCW1lbWNweShzdHIsbXBjLT5tcGNfcHJvZHVjdGlkLDEyKTsKKwlzdHJbMTJdPTA7CisJcHJpbnRrKCJQcm9kdWN0IElEOiAlcyAiLHN0cik7CisKKwltcHNfb2VtX2NoZWNrKG1wYywgb2VtLCBzdHIpOworCisJcHJpbnRrKCJBUElDIGF0OiAweCVsWFxuIixtcGMtPm1wY19sYXBpYyk7CisKKwkvKiAKKwkgKiBTYXZlIHRoZSBsb2NhbCBBUElDIGFkZHJlc3MgKGl0IG1pZ2h0IGJlIG5vbi1kZWZhdWx0KSAtLSBidXQgb25seQorCSAqIGlmIHdlJ3JlIG5vdCB1c2luZyBBQ1BJLgorCSAqLworCWlmICghYWNwaV9sYXBpYykKKwkJbXBfbGFwaWNfYWRkciA9IG1wYy0+bXBjX2xhcGljOworCisJLyoKKwkgKglOb3cgcHJvY2VzcyB0aGUgY29uZmlndXJhdGlvbiBibG9ja3MuCisJICovCisJbXBjX3JlY29yZCA9IDA7CisJd2hpbGUgKGNvdW50IDwgbXBjLT5tcGNfbGVuZ3RoKSB7CisJCXN3aXRjaCgqbXB0KSB7CisJCQljYXNlIE1QX1BST0NFU1NPUjoKKwkJCXsKKwkJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKm09CisJCQkJCShzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKiltcHQ7CisJCQkJLyogQUNQSSBtYXkgaGF2ZSBhbHJlYWR5IHByb3ZpZGVkIHRoaXMgZGF0YSAqLworCQkJCWlmICghYWNwaV9sYXBpYykKKwkJCQkJTVBfcHJvY2Vzc29yX2luZm8obSk7CisJCQkJbXB0ICs9IHNpemVvZigqbSk7CisJCQkJY291bnQgKz0gc2l6ZW9mKCptKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTVBfQlVTOgorCQkJeworCQkJCXN0cnVjdCBtcGNfY29uZmlnX2J1cyAqbT0KKwkJCQkJKHN0cnVjdCBtcGNfY29uZmlnX2J1cyAqKW1wdDsKKwkJCQlNUF9idXNfaW5mbyhtKTsKKwkJCQltcHQgKz0gc2l6ZW9mKCptKTsKKwkJCQljb3VudCArPSBzaXplb2YoKm0pOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBNUF9JT0FQSUM6CisJCQl7CisJCQkJc3RydWN0IG1wY19jb25maWdfaW9hcGljICptPQorCQkJCQkoc3RydWN0IG1wY19jb25maWdfaW9hcGljICopbXB0OworCQkJCU1QX2lvYXBpY19pbmZvKG0pOworCQkJCW1wdCs9c2l6ZW9mKCptKTsKKwkJCQljb3VudCs9c2l6ZW9mKCptKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTVBfSU5UU1JDOgorCQkJeworCQkJCXN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyAqbT0KKwkJCQkJKHN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyAqKW1wdDsKKworCQkJCU1QX2ludHNyY19pbmZvKG0pOworCQkJCW1wdCs9c2l6ZW9mKCptKTsKKwkJCQljb3VudCs9c2l6ZW9mKCptKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTVBfTElOVFNSQzoKKwkJCXsKKwkJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19saW50c3JjICptPQorCQkJCQkoc3RydWN0IG1wY19jb25maWdfbGludHNyYyAqKW1wdDsKKwkJCQlNUF9saW50c3JjX2luZm8obSk7CisJCQkJbXB0Kz1zaXplb2YoKm0pOworCQkJCWNvdW50Kz1zaXplb2YoKm0pOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQljb3VudCA9IG1wYy0+bXBjX2xlbmd0aDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkrK21wY19yZWNvcmQ7CisJfQorCWNsdXN0ZXJlZF9hcGljX2NoZWNrKCk7CisJaWYgKCFudW1fcHJvY2Vzc29ycykKKwkJcHJpbnRrKEtFUk5fRVJSICJTTVAgbXB0YWJsZTogbm8gcHJvY2Vzc29ycyByZWdpc3RlcmVkIVxuIik7CisJcmV0dXJuIG51bV9wcm9jZXNzb3JzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBFTENSX3RyaWdnZXIodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydDsKKworCXBvcnQgPSAweDRkMCArIChpcnEgPj4gMyk7CisJcmV0dXJuIChpbmIocG9ydCkgPj4gKGlycSAmIDcpKSAmIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBjb25zdHJ1Y3RfZGVmYXVsdF9pb2lycV9tcHRhYmxlKGludCBtcGNfZGVmYXVsdF90eXBlKQoreworCXN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyBpbnRzcmM7CisJaW50IGk7CisJaW50IEVMQ1JfZmFsbGJhY2sgPSAwOworCisJaW50c3JjLm1wY190eXBlID0gTVBfSU5UU1JDOworCWludHNyYy5tcGNfaXJxZmxhZyA9IDA7CQkJLyogY29uZm9ybWluZyAqLworCWludHNyYy5tcGNfc3JjYnVzID0gMDsKKwlpbnRzcmMubXBjX2RzdGFwaWMgPSBtcF9pb2FwaWNzWzBdLm1wY19hcGljaWQ7CisKKwlpbnRzcmMubXBjX2lycXR5cGUgPSBtcF9JTlQ7CisKKwkvKgorCSAqICBJZiB0cnVlLCB3ZSBoYXZlIGFuIElTQS9QQ0kgc3lzdGVtIHdpdGggbm8gSVJRIGVudHJpZXMKKwkgKiAgaW4gdGhlIE1QIHRhYmxlLiBUbyBwcmV2ZW50IHRoZSBQQ0kgaW50ZXJydXB0cyBmcm9tIGJlaW5nIHNldCB1cAorCSAqICBpbmNvcnJlY3RseSwgd2UgdHJ5IHRvIHVzZSB0aGUgRUxDUi4gVGhlIHNhbml0eSBjaGVjayB0byBzZWUgaWYKKwkgKiAgdGhlcmUgaXMgZ29vZCBFTENSIGRhdGEgaXMgdmVyeSBzaW1wbGUgLSBJUlEwLCAxLCAyIGFuZCAxMyBjYW4KKwkgKiAgbmV2ZXIgYmUgbGV2ZWwgc2Vuc2l0aXZlLCBzbyB3ZSBzaW1wbHkgc2VlIGlmIHRoZSBFTENSIGFncmVlcy4KKwkgKiAgSWYgaXQgZG9lcywgd2UgYXNzdW1lIGl0J3MgdmFsaWQuCisJICovCisJaWYgKG1wY19kZWZhdWx0X3R5cGUgPT0gNSkgeworCQlwcmludGsoS0VSTl9JTkZPICJJU0EvUENJIGJ1cyB0eXBlIHdpdGggbm8gSVJRIGluZm9ybWF0aW9uLi4uIGZhbGxpbmcgYmFjayB0byBFTENSXG4iKTsKKworCQlpZiAoRUxDUl90cmlnZ2VyKDApIHx8IEVMQ1JfdHJpZ2dlcigxKSB8fCBFTENSX3RyaWdnZXIoMikgfHwgRUxDUl90cmlnZ2VyKDEzKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVMQ1IgY29udGFpbnMgaW52YWxpZCBkYXRhLi4uIG5vdCB1c2luZyBFTENSXG4iKTsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBFTENSIHRvIGlkZW50aWZ5IFBDSSBpbnRlcnJ1cHRzXG4iKTsKKwkJCUVMQ1JfZmFsbGJhY2sgPSAxOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJc3dpdGNoIChtcGNfZGVmYXVsdF90eXBlKSB7CisJCWNhc2UgMjoKKwkJCWlmIChpID09IDAgfHwgaSA9PSAxMykKKwkJCQljb250aW51ZTsJLyogSVJRMCAmIElSUTEzIG5vdCBjb25uZWN0ZWQgKi8KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJaWYgKGkgPT0gMikKKwkJCQljb250aW51ZTsJLyogSVJRMiBpcyBuZXZlciBjb25uZWN0ZWQgKi8KKwkJfQorCisJCWlmIChFTENSX2ZhbGxiYWNrKSB7CisJCQkvKgorCQkJICogIElmIHRoZSBFTENSIGluZGljYXRlcyBhIGxldmVsLXNlbnNpdGl2ZSBpbnRlcnJ1cHQsIHdlCisJCQkgKiAgY29weSB0aGF0IGluZm9ybWF0aW9uIG92ZXIgdG8gdGhlIE1QIHRhYmxlIGluIHRoZQorCQkJICogIGlycWZsYWcgZmllbGQgKGxldmVsIHNlbnNpdGl2ZSwgYWN0aXZlIGhpZ2ggcG9sYXJpdHkpLgorCQkJICovCisJCQlpZiAoRUxDUl90cmlnZ2VyKGkpKQorCQkJCWludHNyYy5tcGNfaXJxZmxhZyA9IDEzOworCQkJZWxzZQorCQkJCWludHNyYy5tcGNfaXJxZmxhZyA9IDA7CisJCX0KKworCQlpbnRzcmMubXBjX3NyY2J1c2lycSA9IGk7CisJCWludHNyYy5tcGNfZHN0aXJxID0gaSA/IGkgOiAyOwkJLyogSVJRMCB0byBJTlRJTjIgKi8KKwkJTVBfaW50c3JjX2luZm8oJmludHNyYyk7CisJfQorCisJaW50c3JjLm1wY19pcnF0eXBlID0gbXBfRXh0SU5UOworCWludHNyYy5tcGNfc3JjYnVzaXJxID0gMDsKKwlpbnRzcmMubXBjX2RzdGlycSA9IDA7CQkJCS8qIDgyNTlBIHRvIElOVElOMCAqLworCU1QX2ludHNyY19pbmZvKCZpbnRzcmMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IGNvbnN0cnVjdF9kZWZhdWx0X0lTQV9tcHRhYmxlKGludCBtcGNfZGVmYXVsdF90eXBlKQoreworCXN0cnVjdCBtcGNfY29uZmlnX3Byb2Nlc3NvciBwcm9jZXNzb3I7CisJc3RydWN0IG1wY19jb25maWdfYnVzIGJ1czsKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19pb2FwaWMgaW9hcGljOworCXN0cnVjdCBtcGNfY29uZmlnX2xpbnRzcmMgbGludHNyYzsKKwlpbnQgbGludHR5cGVzWzJdID0geyBtcF9FeHRJTlQsIG1wX05NSSB9OworCWludCBpOworCisJLyoKKwkgKiBsb2NhbCBBUElDIGhhcyBkZWZhdWx0IGFkZHJlc3MKKwkgKi8KKwltcF9sYXBpY19hZGRyID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKKworCS8qCisJICogMiBDUFVzLCBudW1iZXJlZCAwICYgMS4KKwkgKi8KKwlwcm9jZXNzb3IubXBjX3R5cGUgPSBNUF9QUk9DRVNTT1I7CisJLyogRWl0aGVyIGFuIGludGVncmF0ZWQgQVBJQyBvciBhIGRpc2NyZXRlIDgyNDg5RFguICovCisJcHJvY2Vzc29yLm1wY19hcGljdmVyID0gbXBjX2RlZmF1bHRfdHlwZSA+IDQgPyAweDEwIDogMHgwMTsKKwlwcm9jZXNzb3IubXBjX2NwdWZsYWcgPSBDUFVfRU5BQkxFRDsKKwlwcm9jZXNzb3IubXBjX2NwdWZlYXR1cmUgPSAoYm9vdF9jcHVfZGF0YS54ODYgPDwgOCkgfAorCQkJCSAgIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA8PCA0KSB8CisJCQkJICAgYm9vdF9jcHVfZGF0YS54ODZfbWFzazsKKwlwcm9jZXNzb3IubXBjX2ZlYXR1cmVmbGFnID0gYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eVswXTsKKwlwcm9jZXNzb3IubXBjX3Jlc2VydmVkWzBdID0gMDsKKwlwcm9jZXNzb3IubXBjX3Jlc2VydmVkWzFdID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXByb2Nlc3Nvci5tcGNfYXBpY2lkID0gaTsKKwkJTVBfcHJvY2Vzc29yX2luZm8oJnByb2Nlc3Nvcik7CisJfQorCisJYnVzLm1wY190eXBlID0gTVBfQlVTOworCWJ1cy5tcGNfYnVzaWQgPSAwOworCXN3aXRjaCAobXBjX2RlZmF1bHRfdHlwZSkgeworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCI/Pz9cbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gJWRcbiIsCisJCQkJbXBjX2RlZmF1bHRfdHlwZSk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAxOgorCQljYXNlIDU6CisJCQltZW1jcHkoYnVzLm1wY19idXN0eXBlLCAiSVNBICAgIiwgNik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQljYXNlIDY6CisJCWNhc2UgMzoKKwkJCW1lbWNweShidXMubXBjX2J1c3R5cGUsICJFSVNBICAiLCA2KTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCWNhc2UgNzoKKwkJCW1lbWNweShidXMubXBjX2J1c3R5cGUsICJNQ0EgICAiLCA2KTsKKwl9CisJTVBfYnVzX2luZm8oJmJ1cyk7CisJaWYgKG1wY19kZWZhdWx0X3R5cGUgPiA0KSB7CisJCWJ1cy5tcGNfYnVzaWQgPSAxOworCQltZW1jcHkoYnVzLm1wY19idXN0eXBlLCAiUENJICAgIiwgNik7CisJCU1QX2J1c19pbmZvKCZidXMpOworCX0KKworCWlvYXBpYy5tcGNfdHlwZSA9IE1QX0lPQVBJQzsKKwlpb2FwaWMubXBjX2FwaWNpZCA9IDI7CisJaW9hcGljLm1wY19hcGljdmVyID0gbXBjX2RlZmF1bHRfdHlwZSA+IDQgPyAweDEwIDogMHgwMTsKKwlpb2FwaWMubXBjX2ZsYWdzID0gTVBDX0FQSUNfVVNBQkxFOworCWlvYXBpYy5tcGNfYXBpY2FkZHIgPSAweEZFQzAwMDAwOworCU1QX2lvYXBpY19pbmZvKCZpb2FwaWMpOworCisJLyoKKwkgKiBXZSBzZXQgdXAgbW9zdCBvZiB0aGUgbG93IDE2IElPLUFQSUMgcGlucyBhY2NvcmRpbmcgdG8gTVBTIHJ1bGVzLgorCSAqLworCWNvbnN0cnVjdF9kZWZhdWx0X2lvaXJxX21wdGFibGUobXBjX2RlZmF1bHRfdHlwZSk7CisKKwlsaW50c3JjLm1wY190eXBlID0gTVBfTElOVFNSQzsKKwlsaW50c3JjLm1wY19pcnFmbGFnID0gMDsJCS8qIGNvbmZvcm1pbmcgKi8KKwlsaW50c3JjLm1wY19zcmNidXNpZCA9IDA7CisJbGludHNyYy5tcGNfc3JjYnVzaXJxID0gMDsKKwlsaW50c3JjLm1wY19kZXN0YXBpYyA9IE1QX0FQSUNfQUxMOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJbGludHNyYy5tcGNfaXJxdHlwZSA9IGxpbnR0eXBlc1tpXTsKKwkJbGludHNyYy5tcGNfZGVzdGFwaWNsaW50ID0gaTsKKwkJTVBfbGludHNyY19pbmZvKCZsaW50c3JjKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfbXBfZmxvYXRpbmcgKm1wZl9mb3VuZDsKKworLyoKKyAqIFNjYW4gdGhlIG1lbW9yeSBibG9ja3MgZm9yIGFuIFNNUCBjb25maWd1cmF0aW9uIGJsb2NrLgorICovCit2b2lkIF9faW5pdCBnZXRfc21wX2NvbmZpZyAodm9pZCkKK3sKKwlzdHJ1Y3QgaW50ZWxfbXBfZmxvYXRpbmcgKm1wZiA9IG1wZl9mb3VuZDsKKworCS8qCisJICogQUNQSSBtYXkgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGVudGlyZSBTTVAgY29uZmlndXJhdGlvbiBvciBqdXN0IHRvIAorCSAqIGVudW1lcmF0ZS9jb25maWd1cmUgcHJvY2Vzc29ycyAoQ09ORklHX0FDUElfQk9PVCkuICBOb3RlIHRoYXQgCisJICogQUNQSSBzdXBwb3J0cyBib3RoIGxvZ2ljYWwgKGUuZy4gSHlwZXItVGhyZWFkaW5nKSBhbmQgcGh5c2ljYWwgCisJICogcHJvY2Vzc29ycywgd2hlcmUgTVBTIG9ubHkgc3VwcG9ydHMgcGh5c2ljYWwuCisJICovCisJaWYgKGFjcGlfbGFwaWMgJiYgYWNwaV9pb2FwaWMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgQUNQSSAoTUFEVCkgZm9yIFNNUCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uXG4iKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmIChhY3BpX2xhcGljKQorCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBBQ1BJIGZvciBwcm9jZXNzb3IgKExBUElDKSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uXG4iKTsKKworCXByaW50ayhLRVJOX0lORk8gIkludGVsIE11bHRpUHJvY2Vzc29yIFNwZWNpZmljYXRpb24gdjEuJWRcbiIsIG1wZi0+bXBmX3NwZWNpZmljYXRpb24pOworCWlmIChtcGYtPm1wZl9mZWF0dXJlMiAmICgxPDw3KSkgeworCQlwcmludGsoS0VSTl9JTkZPICIgICAgSU1DUiBhbmQgUElDIGNvbXBhdGliaWxpdHkgbW9kZS5cbiIpOworCQlwaWNfbW9kZSA9IDE7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgIFZpcnR1YWwgV2lyZSBjb21wYXRpYmlsaXR5IG1vZGUuXG4iKTsKKwkJcGljX21vZGUgPSAwOworCX0KKworCS8qCisJICogTm93IHNlZSBpZiB3ZSBuZWVkIHRvIHJlYWQgZnVydGhlci4KKwkgKi8KKwlpZiAobXBmLT5tcGZfZmVhdHVyZTEgIT0gMCkgeworCisJCXByaW50ayhLRVJOX0lORk8gIkRlZmF1bHQgTVAgY29uZmlndXJhdGlvbiAjJWRcbiIsIG1wZi0+bXBmX2ZlYXR1cmUxKTsKKwkJY29uc3RydWN0X2RlZmF1bHRfSVNBX21wdGFibGUobXBmLT5tcGZfZmVhdHVyZTEpOworCisJfSBlbHNlIGlmIChtcGYtPm1wZl9waHlzcHRyKSB7CisKKwkJLyoKKwkJICogUmVhZCB0aGUgcGh5c2ljYWwgaGFyZHdhcmUgdGFibGUuICBBbnl0aGluZyBoZXJlIHdpbGwKKwkJICogb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLgorCQkgKi8KKwkJaWYgKCFzbXBfcmVhZF9tcGMoKHZvaWQgKiltcGYtPm1wZl9waHlzcHRyKSkgeworCQkJc21wX2ZvdW5kX2NvbmZpZyA9IDA7CisJCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBNUCB0YWJsZSBlcnJvcnMgZGV0ZWN0ZWQhLi4uXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiLi4uIGRpc2FibGluZyBTTVAgc3VwcG9ydC4gKHRlbGwgeW91ciBodyB2ZW5kb3IpXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGVyZSBhcmUgbm8gZXhwbGljaXQgTVAgSVJRIGVudHJpZXMsIHRoZW4gd2UgYXJlCisJCSAqIGJyb2tlbi4gIFdlIHNldCB1cCBtb3N0IG9mIHRoZSBsb3cgMTYgSU8tQVBJQyBwaW5zIHRvCisJCSAqIElTQSBkZWZhdWx0cyBhbmQgaG9wZSBpdCB3aWxsIHdvcmsuCisJCSAqLworCQlpZiAoIW1wX2lycV9lbnRyaWVzKSB7CisJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19idXMgYnVzOworCisJCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBubyBleHBsaWNpdCBJUlEgZW50cmllcywgdXNpbmcgZGVmYXVsdCBtcHRhYmxlLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIpOworCisJCQlidXMubXBjX3R5cGUgPSBNUF9CVVM7CisJCQlidXMubXBjX2J1c2lkID0gMDsKKwkJCW1lbWNweShidXMubXBjX2J1c3R5cGUsICJJU0EgICAiLCA2KTsKKwkJCU1QX2J1c19pbmZvKCZidXMpOworCisJCQljb25zdHJ1Y3RfZGVmYXVsdF9pb2lycV9tcHRhYmxlKDApOworCQl9CisKKwl9IGVsc2UKKwkJQlVHKCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJQcm9jZXNzb3JzOiAlZFxuIiwgbnVtX3Byb2Nlc3NvcnMpOworCS8qCisJICogT25seSB1c2UgdGhlIGZpcnN0IGNvbmZpZ3VyYXRpb24gZm91bmQuCisJICovCit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtcF9zY2FuX2NvbmZpZyAodW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBsb25nICpicCA9IHBoeXNfdG9fdmlydChiYXNlKTsKKwlzdHJ1Y3QgaW50ZWxfbXBfZmxvYXRpbmcgKm1wZjsKKworCURwcmludGsoIlNjYW4gU01QIGZyb20gJXAgZm9yICVsZCBieXRlcy5cbiIsIGJwLGxlbmd0aCk7CisJaWYgKHNpemVvZigqbXBmKSAhPSAxNikKKwkJcHJpbnRrKCJFcnJvcjogTVBGIHNpemVcbiIpOworCisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJbXBmID0gKHN0cnVjdCBpbnRlbF9tcF9mbG9hdGluZyAqKWJwOworCQlpZiAoKCpicCA9PSBTTVBfTUFHSUNfSURFTlQpICYmCisJCQkobXBmLT5tcGZfbGVuZ3RoID09IDEpICYmCisJCQkhbXBmX2NoZWNrc3VtKCh1bnNpZ25lZCBjaGFyICopYnAsIDE2KSAmJgorCQkJKChtcGYtPm1wZl9zcGVjaWZpY2F0aW9uID09IDEpCisJCQkJfHwgKG1wZi0+bXBmX3NwZWNpZmljYXRpb24gPT0gNCkpICkgeworCisJCQlzbXBfZm91bmRfY29uZmlnID0gMTsKKwkJCXByaW50ayhLRVJOX0lORk8gImZvdW5kIFNNUCBNUC10YWJsZSBhdCAlMDhseFxuIiwKKwkJCQkJCXZpcnRfdG9fcGh5cyhtcGYpKTsKKwkJCXJlc2VydmVfYm9vdG1lbSh2aXJ0X3RvX3BoeXMobXBmKSwgUEFHRV9TSVpFKTsKKwkJCWlmIChtcGYtPm1wZl9waHlzcHRyKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBjYW5ub3QgYWNjZXNzIHRvIE1QQyB0YWJsZSB0byBjb21wdXRlCisJCQkJICogdGFibGUgc2l6ZSB5ZXQsIGFzIG9ubHkgZmV3IG1lZ2FieXRlcyBmcm9tCisJCQkJICogdGhlIGJvdHRvbSBpcyBtYXBwZWQgbm93LgorCQkJCSAqIFBDLTk4MDAncyBNUEMgdGFibGUgcGxhY2VzIG9uIHRoZSB2ZXJ5IGxhc3QKKwkJCQkgKiBvZiBwaHlzaWNhbCBtZW1vcnk7IHNvIHRoYXQgc2ltcGx5IHJlc2VydmluZworCQkJCSAqIFBBR0VfU0laRSBmcm9tIG1wZy0+bXBmX3BoeXNwdHIgeWllbGRzIEJVRygpCisJCQkJICogaW4gcmVzZXJ2ZV9ib290bWVtLgorCQkJCSAqLworCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IFBBR0VfU0laRTsKKwkJCQl1bnNpZ25lZCBsb25nIGVuZCA9IG1heF9sb3dfcGZuICogUEFHRV9TSVpFOworCQkJCWlmIChtcGYtPm1wZl9waHlzcHRyICsgc2l6ZSA+IGVuZCkKKwkJCQkJc2l6ZSA9IGVuZCAtIG1wZi0+bXBmX3BoeXNwdHI7CisJCQkJcmVzZXJ2ZV9ib290bWVtKG1wZi0+bXBmX3BoeXNwdHIsIHNpemUpOworCQkJfQorCisJCQltcGZfZm91bmQgPSBtcGY7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlicCArPSA0OworCQlsZW5ndGggLT0gMTY7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCBmaW5kX3NtcF9jb25maWcgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CisKKwkvKgorCSAqIEZJWE1FOiBMaW51eCBhc3N1bWVzIHlvdSBoYXZlIDY0MEsgb2YgYmFzZSByYW0uLgorCSAqIHRoaXMgY29udGludWVzIHRoZSBlcnJvci4uLgorCSAqCisJICogMSkgU2NhbiB0aGUgYm90dG9tIDFLIGZvciBhIHNpZ25hdHVyZQorCSAqIDIpIFNjYW4gdGhlIHRvcCAxSyBvZiBiYXNlIFJBTQorCSAqIDMpIFNjYW4gdGhlIDY0SyBvZiBiaW9zCisJICovCisJaWYgKHNtcF9zY2FuX2NvbmZpZygweDAsMHg0MDApIHx8CisJCXNtcF9zY2FuX2NvbmZpZyg2MzkqMHg0MDAsMHg0MDApIHx8CisJCQlzbXBfc2Nhbl9jb25maWcoMHhGMDAwMCwweDEwMDAwKSkKKwkJcmV0dXJuOworCS8qCisJICogSWYgaXQgaXMgYW4gU01QIG1hY2hpbmUgd2Ugc2hvdWxkIGtub3cgbm93LCB1bmxlc3MgdGhlCisJICogY29uZmlndXJhdGlvbiBpcyBpbiBhbiBFSVNBL01DQSBidXMgbWFjaGluZSB3aXRoIGFuCisJICogZXh0ZW5kZWQgYmlvcyBkYXRhIGFyZWEuCisJICoKKwkgKiB0aGVyZSBpcyBhIHJlYWwtbW9kZSBzZWdtZW50ZWQgcG9pbnRlciBwb2ludGluZyB0byB0aGUKKwkgKiA0SyBFQkRBIGFyZWEgYXQgMHg0MEUsIGNhbGN1bGF0ZSBhbmQgc2NhbiBpdCBoZXJlLgorCSAqCisJICogTk9URSEgVGhlcmUgYXJlIExpbnV4IGxvYWRlcnMgdGhhdCB3aWxsIGNvcnJ1cHQgdGhlIEVCREEKKwkgKiBhcmVhLCBhbmQgYXMgc3VjaCB0aGlzIGtpbmQgb2YgU01QIGNvbmZpZyBtYXkgYmUgbGVzcworCSAqIHRydXN0d29ydGh5LCBzaW1wbHkgYmVjYXVzZSB0aGUgU01QIHRhYmxlIG1heSBoYXZlIGJlZW4KKwkgKiBzdG9tcGVkIG9uIGR1cmluZyBlYXJseSBib290LiBUaGVzZSBsb2FkZXJzIGFyZSBidWdneSBhbmQKKwkgKiBzaG91bGQgYmUgZml4ZWQuCisJICoKKwkgKiBNUDEuNCBTUEVDIHN0YXRlcyB0byBvbmx5IHNjYW4gZmlyc3QgMUsgb2YgNEsgRUJEQS4KKwkgKi8KKworCWFkZHJlc3MgPSBnZXRfYmlvc19lYmRhKCk7CisJaWYgKGFkZHJlc3MpCisJCXNtcF9zY2FuX2NvbmZpZyhhZGRyZXNzLCAweDQwMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSS1iYXNlZCBNUCBDb25maWd1cmF0aW9uCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX0FDUElfQk9PVAorCit2b2lkIF9faW5pdCBtcF9yZWdpc3Rlcl9sYXBpY19hZGRyZXNzICgKKwl1NjQJCQlhZGRyZXNzKQoreworCW1wX2xhcGljX2FkZHIgPSAodW5zaWduZWQgbG9uZykgYWRkcmVzczsKKworCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQVBJQ19CQVNFLCBtcF9sYXBpY19hZGRyKTsKKworCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPT0gLTFVKQorCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpOworCisJRHByaW50aygiQm9vdCBDUFUgPSAlZFxuIiwgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKK30KKworCit2b2lkIF9faW5pdCBtcF9yZWdpc3Rlcl9sYXBpYyAoCisJdTgJCQlpZCwgCisJdTgJCQllbmFibGVkKQoreworCXN0cnVjdCBtcGNfY29uZmlnX3Byb2Nlc3NvciBwcm9jZXNzb3I7CisJaW50CQkJYm9vdF9jcHUgPSAwOworCQorCWlmIChNQVhfQVBJQ1MgLSBpZCA8PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlByb2Nlc3NvciAjJWQgaW52YWxpZCAobWF4ICVkKVxuIiwKKwkJCWlkLCBNQVhfQVBJQ1MpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlkID09IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCkKKwkJYm9vdF9jcHUgPSAxOworCisJcHJvY2Vzc29yLm1wY190eXBlID0gTVBfUFJPQ0VTU09SOworCXByb2Nlc3Nvci5tcGNfYXBpY2lkID0gaWQ7CisJcHJvY2Vzc29yLm1wY19hcGljdmVyID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKKwlwcm9jZXNzb3IubXBjX2NwdWZsYWcgPSAoZW5hYmxlZCA/IENQVV9FTkFCTEVEIDogMCk7CisJcHJvY2Vzc29yLm1wY19jcHVmbGFnIHw9IChib290X2NwdSA/IENQVV9CT09UUFJPQ0VTU09SIDogMCk7CisJcHJvY2Vzc29yLm1wY19jcHVmZWF0dXJlID0gKGJvb3RfY3B1X2RhdGEueDg2IDw8IDgpIHwgCisJCShib290X2NwdV9kYXRhLng4Nl9tb2RlbCA8PCA0KSB8IGJvb3RfY3B1X2RhdGEueDg2X21hc2s7CisJcHJvY2Vzc29yLm1wY19mZWF0dXJlZmxhZyA9IGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHlbMF07CisJcHJvY2Vzc29yLm1wY19yZXNlcnZlZFswXSA9IDA7CisJcHJvY2Vzc29yLm1wY19yZXNlcnZlZFsxXSA9IDA7CisKKwlNUF9wcm9jZXNzb3JfaW5mbygmcHJvY2Vzc29yKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9JT19BUElDKSAmJiAoZGVmaW5lZChDT05GSUdfQUNQSV9JTlRFUlBSRVRFUikgfHwgZGVmaW5lZChDT05GSUdfQUNQSV9CT09UKSkKKworI2RlZmluZSBNUF9JU0FfQlVTCQkwCisjZGVmaW5lIE1QX01BWF9JT0FQSUNfUElOCTEyNworCitzdGF0aWMgc3RydWN0IG1wX2lvYXBpY19yb3V0aW5nIHsKKwlpbnQJCQlhcGljX2lkOworCWludAkJCWdzaV9iYXNlOworCWludAkJCWdzaV9lbmQ7CisJdTMyCQkJcGluX3Byb2dyYW1tZWRbNF07Cit9IG1wX2lvYXBpY19yb3V0aW5nW01BWF9JT19BUElDU107CisKKworc3RhdGljIGludCBtcF9maW5kX2lvYXBpYyAoCisJaW50CQkJZ3NpKQoreworCWludAkJCWkgPSAwOworCisJLyogRmluZCB0aGUgSU9BUElDIHRoYXQgbWFuYWdlcyB0aGlzIEdTSS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfaW9hcGljczsgaSsrKSB7CisJCWlmICgoZ3NpID49IG1wX2lvYXBpY19yb3V0aW5nW2ldLmdzaV9iYXNlKQorCQkJJiYgKGdzaSA8PSBtcF9pb2FwaWNfcm91dGluZ1tpXS5nc2lfZW5kKSkKKwkJCXJldHVybiBpOworCX0KKworCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IFVuYWJsZSB0byBsb2NhdGUgSU9BUElDIGZvciBHU0kgJWRcbiIsIGdzaSk7CisKKwlyZXR1cm4gLTE7Cit9CisJCisKK3ZvaWQgX19pbml0IG1wX3JlZ2lzdGVyX2lvYXBpYyAoCisJdTgJCQlpZCwgCisJdTMyCQkJYWRkcmVzcywKKwl1MzIJCQlnc2lfYmFzZSkKK3sKKwlpbnQJCQlpZHggPSAwOworCisJaWYgKG5yX2lvYXBpY3MgPj0gTUFYX0lPX0FQSUNTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IE1heCAjIG9mIEkvTyBBUElDcyAoJWQpIGV4Y2VlZGVkICIKKwkJCSIoZm91bmQgJWQpXG4iLCBNQVhfSU9fQVBJQ1MsIG5yX2lvYXBpY3MpOworCQlwYW5pYygiUmVjb21waWxlIGtlcm5lbCB3aXRoIGJpZ2dlciBNQVhfSU9fQVBJQ1MhXG4iKTsKKwl9CisJaWYgKCFhZGRyZXNzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiV0FSTklORzogQm9ndXMgKHplcm8pIEkvTyBBUElDIGFkZHJlc3MiCisJCQkiIGZvdW5kIGluIE1BRFQgdGFibGUsIHNraXBwaW5nIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZHggPSBucl9pb2FwaWNzKys7CisKKwltcF9pb2FwaWNzW2lkeF0ubXBjX3R5cGUgPSBNUF9JT0FQSUM7CisJbXBfaW9hcGljc1tpZHhdLm1wY19mbGFncyA9IE1QQ19BUElDX1VTQUJMRTsKKwltcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNhZGRyID0gYWRkcmVzczsKKworCXNldF9maXhtYXBfbm9jYWNoZShGSVhfSU9fQVBJQ19CQVNFXzAgKyBpZHgsIGFkZHJlc3MpOworCW1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY2lkID0gaW9fYXBpY19nZXRfdW5pcXVlX2lkKGlkeCwgaWQpOworCW1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY3ZlciA9IGlvX2FwaWNfZ2V0X3ZlcnNpb24oaWR4KTsKKwkKKwkvKiAKKwkgKiBCdWlsZCBiYXNpYyBHU0kgbG9va3VwIHRhYmxlIHRvIGZhY2lsaXRhdGUgZ3NpLT5pb19hcGljIGxvb2t1cHMKKwkgKiBhbmQgdG8gcHJldmVudCByZXByb2dyYW1taW5nIG9mIElPQVBJQyBwaW5zIChQQ0kgR1NJcykuCisJICovCisJbXBfaW9hcGljX3JvdXRpbmdbaWR4XS5hcGljX2lkID0gbXBfaW9hcGljc1tpZHhdLm1wY19hcGljaWQ7CisJbXBfaW9hcGljX3JvdXRpbmdbaWR4XS5nc2lfYmFzZSA9IGdzaV9iYXNlOworCW1wX2lvYXBpY19yb3V0aW5nW2lkeF0uZ3NpX2VuZCA9IGdzaV9iYXNlICsgCisJCWlvX2FwaWNfZ2V0X3JlZGlyX2VudHJpZXMoaWR4KTsKKworCXByaW50aygiSU9BUElDWyVkXTogYXBpY19pZCAlZCwgdmVyc2lvbiAlZCwgYWRkcmVzcyAweCVseCwgIgorCQkiR1NJICVkLSVkXG4iLCBpZHgsIG1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY2lkLCAKKwkJbXBfaW9hcGljc1tpZHhdLm1wY19hcGljdmVyLCBtcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNhZGRyLAorCQltcF9pb2FwaWNfcm91dGluZ1tpZHhdLmdzaV9iYXNlLAorCQltcF9pb2FwaWNfcm91dGluZ1tpZHhdLmdzaV9lbmQpOworCisJcmV0dXJuOworfQorCisKK3ZvaWQgX19pbml0IG1wX292ZXJyaWRlX2xlZ2FjeV9pcnEgKAorCXU4CQkJYnVzX2lycSwKKwl1OAkJCXBvbGFyaXR5LCAKKwl1OAkJCXRyaWdnZXIsIAorCXUzMgkJCWdzaSkKK3sKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgaW50c3JjOworCWludAkJCWlvYXBpYyA9IC0xOworCWludAkJCXBpbiA9IC0xOworCisJLyogCisJICogQ29udmVydCAnZ3NpJyB0byAnaW9hcGljLnBpbicuCisJICovCisJaW9hcGljID0gbXBfZmluZF9pb2FwaWMoZ3NpKTsKKwlpZiAoaW9hcGljIDwgMCkKKwkJcmV0dXJuOworCXBpbiA9IGdzaSAtIG1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10uZ3NpX2Jhc2U7CisKKwkvKgorCSAqIFRCRDogVGhpcyBjaGVjayBpcyBmb3IgZmF1bHR5IHRpbWVyIGVudHJpZXMsIHdoZXJlIHRoZSBvdmVycmlkZQorCSAqICAgICAgZXJyb25lb3VzbHkgc2V0cyB0aGUgdHJpZ2dlciB0byBsZXZlbCwgcmVzdWx0aW5nIGluIGEgSFVHRSAKKwkgKiAgICAgIGluY3JlYXNlIG9mIHRpbWVyIGludGVycnVwdHMhCisJICovCisJaWYgKChidXNfaXJxID09IDApICYmICh0cmlnZ2VyID09IDMpKQorCQl0cmlnZ2VyID0gMTsKKworCWludHNyYy5tcGNfdHlwZSA9IE1QX0lOVFNSQzsKKwlpbnRzcmMubXBjX2lycXR5cGUgPSBtcF9JTlQ7CisJaW50c3JjLm1wY19pcnFmbGFnID0gKHRyaWdnZXIgPDwgMikgfCBwb2xhcml0eTsKKwlpbnRzcmMubXBjX3NyY2J1cyA9IE1QX0lTQV9CVVM7CisJaW50c3JjLm1wY19zcmNidXNpcnEgPSBidXNfaXJxOwkJCQkgICAgICAgLyogSVJRICovCisJaW50c3JjLm1wY19kc3RhcGljID0gbXBfaW9hcGljc1tpb2FwaWNdLm1wY19hcGljaWQ7CSAgIC8qIEFQSUMgSUQgKi8KKwlpbnRzcmMubXBjX2RzdGlycSA9IHBpbjsJCQkJICAgIC8qIElOVElOIyAqLworCisJRHByaW50aygiSW50OiB0eXBlICVkLCBwb2wgJWQsIHRyaWcgJWQsIGJ1cyAlZCwgaXJxICVkLCAlZC0lZFxuIiwKKwkJaW50c3JjLm1wY19pcnF0eXBlLCBpbnRzcmMubXBjX2lycWZsYWcgJiAzLCAKKwkJKGludHNyYy5tcGNfaXJxZmxhZyA+PiAyKSAmIDMsIGludHNyYy5tcGNfc3JjYnVzLCAKKwkJaW50c3JjLm1wY19zcmNidXNpcnEsIGludHNyYy5tcGNfZHN0YXBpYywgaW50c3JjLm1wY19kc3RpcnEpOworCisJbXBfaXJxc1ttcF9pcnFfZW50cmllc10gPSBpbnRzcmM7CisJaWYgKCsrbXBfaXJxX2VudHJpZXMgPT0gTUFYX0lSUV9TT1VSQ0VTKQorCQlwYW5pYygiTWF4ICMgb2YgaXJxIHNvdXJjZXMgZXhjZWVkZWQhXG4iKTsKKworCXJldHVybjsKK30KKworaW50IGVzNzAwMF9wbGF0OworCit2b2lkIF9faW5pdCBtcF9jb25maWdfYWNwaV9sZWdhY3lfaXJxcyAodm9pZCkKK3sKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgaW50c3JjOworCWludAkJCWkgPSAwOworCWludAkJCWlvYXBpYyA9IC0xOworCisJLyogCisJICogRmFicmljYXRlIHRoZSBsZWdhY3kgSVNBIGJ1cyAoYnVzICMzMSkuCisJICovCisJbXBfYnVzX2lkX3RvX3R5cGVbTVBfSVNBX0JVU10gPSBNUF9CVVNfSVNBOworCURwcmludGsoIkJ1cyAjJWQgaXMgSVNBXG4iLCBNUF9JU0FfQlVTKTsKKworCS8qCisJICogT2xkZXIgZ2VuZXJhdGlvbnMgb2YgRVM3MDAwIGhhdmUgbm8gbGVnYWN5IGlkZW50aXR5IG1hcHBpbmdzCisJICovCisJaWYgKGVzNzAwMF9wbGF0ID09IDEpCisJCXJldHVybjsKKworCS8qIAorCSAqIExvY2F0ZSB0aGUgSU9BUElDIHRoYXQgbWFuYWdlcyB0aGUgSVNBIElSUXMgKDAtMTUpLiAKKwkgKi8KKwlpb2FwaWMgPSBtcF9maW5kX2lvYXBpYygwKTsKKwlpZiAoaW9hcGljIDwgMCkKKwkJcmV0dXJuOworCisJaW50c3JjLm1wY190eXBlID0gTVBfSU5UU1JDOworCWludHNyYy5tcGNfaXJxZmxhZyA9IDA7CQkJCQkvKiBDb25mb3JtaW5nICovCisJaW50c3JjLm1wY19zcmNidXMgPSBNUF9JU0FfQlVTOworCWludHNyYy5tcGNfZHN0YXBpYyA9IG1wX2lvYXBpY3NbaW9hcGljXS5tcGNfYXBpY2lkOworCisJLyogCisJICogVXNlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBJUlFzIDAtMTUuICBVbmxlc3MKKwkgKiBvdmVycmlkZW4gYnkgKE1BRFQpIGludGVycnVwdCBzb3VyY2Ugb3ZlcnJpZGUgZW50cmllcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlpbnQgaWR4OworCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgbXBfaXJxX2VudHJpZXM7IGlkeCsrKSB7CisJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKmlycSA9IG1wX2lycXMgKyBpZHg7CisKKwkJCS8qIERvIHdlIGFscmVhZHkgaGF2ZSBhIG1hcHBpbmcgZm9yIHRoaXMgSVNBIElSUT8gKi8KKwkJCWlmIChpcnEtPm1wY19zcmNidXMgPT0gTVBfSVNBX0JVUyAmJiBpcnEtPm1wY19zcmNidXNpcnEgPT0gaSkKKwkJCQlicmVhazsKKworCQkJLyogRG8gd2UgYWxyZWFkeSBoYXZlIGEgbWFwcGluZyBmb3IgdGhpcyBJT0FQSUMgcGluICovCisJCQlpZiAoKGlycS0+bXBjX2RzdGFwaWMgPT0gaW50c3JjLm1wY19kc3RhcGljKSAmJgorCQkJCShpcnEtPm1wY19kc3RpcnEgPT0gaSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaWR4ICE9IG1wX2lycV9lbnRyaWVzKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQUNQSTogSVJRJWQgdXNlZCBieSBvdmVycmlkZS5cbiIsIGkpOworCQkJY29udGludWU7CQkJLyogSVJRIGFscmVhZHkgdXNlZCAqLworCQl9CisKKwkJaW50c3JjLm1wY19pcnF0eXBlID0gbXBfSU5UOworCQlpbnRzcmMubXBjX3NyY2J1c2lycSA9IGk7CQkgICAvKiBJZGVudGl0eSBtYXBwZWQgKi8KKwkJaW50c3JjLm1wY19kc3RpcnEgPSBpOworCisJCURwcmludGsoIkludDogdHlwZSAlZCwgcG9sICVkLCB0cmlnICVkLCBidXMgJWQsIGlycSAlZCwgIgorCQkJIiVkLSVkXG4iLCBpbnRzcmMubXBjX2lycXR5cGUsIGludHNyYy5tcGNfaXJxZmxhZyAmIDMsIAorCQkJKGludHNyYy5tcGNfaXJxZmxhZyA+PiAyKSAmIDMsIGludHNyYy5tcGNfc3JjYnVzLCAKKwkJCWludHNyYy5tcGNfc3JjYnVzaXJxLCBpbnRzcmMubXBjX2RzdGFwaWMsIAorCQkJaW50c3JjLm1wY19kc3RpcnEpOworCisJCW1wX2lycXNbbXBfaXJxX2VudHJpZXNdID0gaW50c3JjOworCQlpZiAoKyttcF9pcnFfZW50cmllcyA9PSBNQVhfSVJRX1NPVVJDRVMpCisJCQlwYW5pYygiTWF4ICMgb2YgaXJxIHNvdXJjZXMgZXhjZWVkZWQhXG4iKTsKKwl9Cit9CisKK2ludCBtcF9yZWdpc3Rlcl9nc2kgKHUzMiBnc2ksIGludCBlZGdlX2xldmVsLCBpbnQgYWN0aXZlX2hpZ2hfbG93KQoreworCWludAkJCWlvYXBpYyA9IC0xOworCWludAkJCWlvYXBpY19waW4gPSAwOworCWludAkJCWlkeCwgYml0ID0gMDsKKworI2lmZGVmIENPTkZJR19BQ1BJX0JVUworCS8qIERvbid0IHNldCB1cCB0aGUgQUNQSSBTQ0kgYmVjYXVzZSBpdCdzIGFscmVhZHkgc2V0IHVwICovCisJaWYgKGFjcGlfZmFkdC5zY2lfaW50ID09IGdzaSkKKwkJcmV0dXJuIGdzaTsKKyNlbmRpZgorCisJaW9hcGljID0gbXBfZmluZF9pb2FwaWMoZ3NpKTsKKwlpZiAoaW9hcGljIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBJT0FQSUMgZm9yIEdTSSAldVxuIiwgZ3NpKTsKKwkJcmV0dXJuIGdzaTsKKwl9CisKKwlpb2FwaWNfcGluID0gZ3NpIC0gbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5nc2lfYmFzZTsKKworCWlmIChpb2FwaWNfcmVudW1iZXJfaXJxKQorCQlnc2kgPSBpb2FwaWNfcmVudW1iZXJfaXJxKGlvYXBpYywgZ3NpKTsKKworCS8qIAorCSAqIEF2b2lkIHBpbiByZXByb2dyYW1taW5nLiAgUFJUcyB0eXBpY2FsbHkgaW5jbHVkZSBlbnRyaWVzICAKKwkgKiB3aXRoIHJlZHVuZGFudCBwaW4tPmdzaSBtYXBwaW5ncyAoYnV0IHVuaXF1ZSBQQ0kgZGV2aWNlcyk7CisJICogd2Ugb25seSBwcm9ncmFtIHRoZSBJT0FQSUMgb24gdGhlIGZpcnN0LgorCSAqLworCWJpdCA9IGlvYXBpY19waW4gJSAzMjsKKwlpZHggPSAoaW9hcGljX3BpbiA8IDMyKSA/IDAgOiAoaW9hcGljX3BpbiAvIDMyKTsKKwlpZiAoaWR4ID4gMykgeworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgcmVmZXJlbmNlIHRvIElPQVBJQyBwaW4gIgorCQkJIiVkLSVkXG4iLCBtcF9pb2FwaWNfcm91dGluZ1tpb2FwaWNdLmFwaWNfaWQsIAorCQkJaW9hcGljX3Bpbik7CisJCXJldHVybiBnc2k7CisJfQorCWlmICgoMTw8Yml0KSAmIG1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10ucGluX3Byb2dyYW1tZWRbaWR4XSkgeworCQlEcHJpbnRrKEtFUk5fREVCVUcgIlBpbiAlZC0lZCBhbHJlYWR5IHByb2dyYW1tZWRcbiIsCisJCQltcF9pb2FwaWNfcm91dGluZ1tpb2FwaWNdLmFwaWNfaWQsIGlvYXBpY19waW4pOworCQlyZXR1cm4gZ3NpOworCX0KKworCW1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10ucGluX3Byb2dyYW1tZWRbaWR4XSB8PSAoMTw8Yml0KTsKKworCWlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nKGlvYXBpYywgaW9hcGljX3BpbiwgZ3NpLAorCQkgICAgZWRnZV9sZXZlbCA9PSBBQ1BJX0VER0VfU0VOU0lUSVZFID8gMCA6IDEsCisJCSAgICBhY3RpdmVfaGlnaF9sb3cgPT0gQUNQSV9BQ1RJVkVfSElHSCA/IDAgOiAxKTsKKwlyZXR1cm4gZ3NpOworfQorCisjZW5kaWYgLypDT05GSUdfWDg2X0lPX0FQSUMgJiYgKENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSIHx8IENPTkZJR19BQ1BJX0JPT1QpKi8KKyNlbmRpZiAvKkNPTkZJR19BQ1BJX0JPT1QqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9tc3IuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbXNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkOWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvbXNyLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiAgIENvcHlyaWdodCAyMDAwIEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UgTUEgMDIxMzksCisgKiAgIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAqICAgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIG1zci5jCisgKgorICogeDg2IE1TUiBhY2Nlc3MgZGV2aWNlCisgKgorICogVGhpcyBkZXZpY2UgaXMgYWNjZXNzZWQgYnkgbHNlZWsoKSB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgbnVtYmVyCisgKiBhbmQgdGhlbiByZWFkL3dyaXRlIGluIGNodW5rcyBvZiA4IGJ5dGVzLiAgQSBsYXJnZXIgc2l6ZSBtZWFucyBtdWx0aXBsZQorICogcmVhZHMgb3Igd3JpdGVzIG9mIHRoZSBzYW1lIHJlZ2lzdGVyLgorICoKKyAqIFRoaXMgZHJpdmVyIHVzZXMgL2Rldi9jcHUvJWQvbXNyIHdoZXJlICVkIGlzIHRoZSBtaW5vciBudW1iZXIsIGFuZCBvbgorICogYW4gU01QIGJveCB3aWxsIGRpcmVjdCB0aGUgYWNjZXNzIHRvIENQVSAlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqbXNyX2NsYXNzOworCisvKiBOb3RlOiAiZXJyIiBpcyBoYW5kbGVkIGluIGEgZnVubnkgd2F5IGJlbG93LiAgT3RoZXJ3aXNlIG9uZSB2ZXJzaW9uCisgICBvZiBnY2Mgb3IgYW5vdGhlciBicmVha3MuICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHdybXNyX2Vpbyh1MzIgcmVnLCB1MzIgZWF4LCB1MzIgZWR4KQoreworCWludCBlcnI7CisKKwlhc20gdm9sYXRpbGUgKCIxOgl3cm1zclxuIgorCQkgICAgICAiMjpcbiIKKwkJICAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKKwkJICAgICAgIjM6CW1vdmwgJTQsJTBcbiIKKwkJICAgICAgIglqbXAgMmJcbiIKKwkJICAgICAgIi5wcmV2aW91c1xuIgorCQkgICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkgICAgICAiCS5hbGlnbiA0XG4iICIJLmxvbmcgMWIsM2JcbiIgIi5wcmV2aW91cyI6Ij0mYkRTIiAoZXJyKQorCQkgICAgICA6ImEiKGVheCksICJkIihlZHgpLCAiYyIocmVnKSwgImkiKC1FSU8pLCAiMCIoMCkpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmRtc3JfZWlvKHUzMiByZWcsIHUzMiAqZWF4LCB1MzIgKmVkeCkKK3sKKwlpbnQgZXJyOworCisJYXNtIHZvbGF0aWxlICgiMToJcmRtc3JcbiIKKwkJICAgICAgIjI6XG4iCisJCSAgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJCSAgICAgICIzOgltb3ZsICU0LCUwXG4iCisJCSAgICAgICIJam1wIDJiXG4iCisJCSAgICAgICIucHJldmlvdXNcbiIKKwkJICAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJICAgICAgIgkuYWxpZ24gNFxuIgorCQkgICAgICAiCS5sb25nIDFiLDNiXG4iCisJCSAgICAgICIucHJldmlvdXMiOiI9JmJEUyIgKGVyciksICI9YSIoKmVheCksICI9ZCIoKmVkeCkKKwkJICAgICAgOiJjIihyZWcpLCAiaSIoLUVJTyksICIwIigwKSk7CisKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX1NNUAorCitzdHJ1Y3QgbXNyX2NvbW1hbmQgeworCWludCBjcHU7CisJaW50IGVycjsKKwl1MzIgcmVnOworCXUzMiBkYXRhWzJdOworfTsKKworc3RhdGljIHZvaWQgbXNyX3NtcF93cm1zcih2b2lkICpjbWRfYmxvY2spCit7CisJc3RydWN0IG1zcl9jb21tYW5kICpjbWQgPSAoc3RydWN0IG1zcl9jb21tYW5kICopY21kX2Jsb2NrOworCisJaWYgKGNtZC0+Y3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJY21kLT5lcnIgPSB3cm1zcl9laW8oY21kLT5yZWcsIGNtZC0+ZGF0YVswXSwgY21kLT5kYXRhWzFdKTsKK30KKworc3RhdGljIHZvaWQgbXNyX3NtcF9yZG1zcih2b2lkICpjbWRfYmxvY2spCit7CisJc3RydWN0IG1zcl9jb21tYW5kICpjbWQgPSAoc3RydWN0IG1zcl9jb21tYW5kICopY21kX2Jsb2NrOworCisJaWYgKGNtZC0+Y3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJY21kLT5lcnIgPSByZG1zcl9laW8oY21kLT5yZWcsICZjbWQtPmRhdGFbMF0sICZjbWQtPmRhdGFbMV0pOworfQorCitzdGF0aWMgaW5saW5lIGludCBkb193cm1zcihpbnQgY3B1LCB1MzIgcmVnLCB1MzIgZWF4LCB1MzIgZWR4KQoreworCXN0cnVjdCBtc3JfY29tbWFuZCBjbWQ7CisJaW50IHJldDsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisJCXJldCA9IHdybXNyX2VpbyhyZWcsIGVheCwgZWR4KTsKKwl9IGVsc2UgeworCQljbWQuY3B1ID0gY3B1OworCQljbWQucmVnID0gcmVnOworCQljbWQuZGF0YVswXSA9IGVheDsKKwkJY21kLmRhdGFbMV0gPSBlZHg7CisKKwkJc21wX2NhbGxfZnVuY3Rpb24obXNyX3NtcF93cm1zciwgJmNtZCwgMSwgMSk7CisJCXJldCA9IGNtZC5lcnI7CisJfQorCXByZWVtcHRfZW5hYmxlKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG9fcmRtc3IoaW50IGNwdSwgdTMyIHJlZywgdTMyICogZWF4LCB1MzIgKiBlZHgpCit7CisJc3RydWN0IG1zcl9jb21tYW5kIGNtZDsKKwlpbnQgcmV0OworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJcmV0ID0gcmRtc3JfZWlvKHJlZywgZWF4LCBlZHgpOworCX0gZWxzZSB7CisJCWNtZC5jcHUgPSBjcHU7CisJCWNtZC5yZWcgPSByZWc7CisKKwkJc21wX2NhbGxfZnVuY3Rpb24obXNyX3NtcF9yZG1zciwgJmNtZCwgMSwgMSk7CisKKwkJKmVheCA9IGNtZC5kYXRhWzBdOworCQkqZWR4ID0gY21kLmRhdGFbMV07CisKKwkJcmV0ID0gY21kLmVycjsKKwl9CisJcHJlZW1wdF9lbmFibGUoKTsKKwlyZXR1cm4gcmV0OworfQorCisjZWxzZQkJCQkvKiAhIENPTkZJR19TTVAgKi8KKworc3RhdGljIGlubGluZSBpbnQgZG9fd3Jtc3IoaW50IGNwdSwgdTMyIHJlZywgdTMyIGVheCwgdTMyIGVkeCkKK3sKKwlyZXR1cm4gd3Jtc3JfZWlvKHJlZywgZWF4LCBlZHgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkb19yZG1zcihpbnQgY3B1LCB1MzIgcmVnLCB1MzIgKmVheCwgdTMyICplZHgpCit7CisJcmV0dXJuIHJkbXNyX2VpbyhyZWcsIGVheCwgZWR4KTsKK30KKworI2VuZGlmCQkJCS8qICEgQ09ORklHX1NNUCAqLworCitzdGF0aWMgbG9mZl90IG1zcl9zZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZykKK3sKKwlsb2ZmX3QgcmV0ID0gLUVJTlZBTDsKKworCWxvY2tfa2VybmVsKCk7CisJc3dpdGNoIChvcmlnKSB7CisJY2FzZSAwOgorCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJcmV0ID0gZmlsZS0+Zl9wb3M7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZmlsZS0+Zl9wb3MgKz0gb2Zmc2V0OworCQlyZXQgPSBmaWxlLT5mX3BvczsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1zcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwl1MzIgX191c2VyICp0bXAgPSAodTMyIF9fdXNlciAqKSBidWY7CisJdTMyIGRhdGFbMl07CisJc2l6ZV90IHJ2OworCXUzMiByZWcgPSAqcHBvczsKKwlpbnQgY3B1ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgZXJyOworCisJaWYgKGNvdW50ICUgOCkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIEludmFsaWQgY2h1bmsgc2l6ZSAqLworCisJZm9yIChydiA9IDA7IGNvdW50OyBjb3VudCAtPSA4KSB7CisJCWVyciA9IGRvX3JkbXNyKGNwdSwgcmVnLCAmZGF0YVswXSwgJmRhdGFbMV0pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKGNvcHlfdG9fdXNlcih0bXAsICZkYXRhLCA4KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl0bXAgKz0gMjsKKwl9CisKKwlyZXR1cm4gKChjaGFyIF9fdXNlciAqKXRtcCkgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1zcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljb25zdCB1MzIgX191c2VyICp0bXAgPSAoY29uc3QgdTMyIF9fdXNlciAqKWJ1ZjsKKwl1MzIgZGF0YVsyXTsKKwlzaXplX3QgcnY7CisJdTMyIHJlZyA9ICpwcG9zOworCWludCBjcHUgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWludCBlcnI7CisKKwlpZiAoY291bnQgJSA4KQorCQlyZXR1cm4gLUVJTlZBTDsJLyogSW52YWxpZCBjaHVuayBzaXplICovCisKKwlmb3IgKHJ2ID0gMDsgY291bnQ7IGNvdW50IC09IDgpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCB0bXAsIDgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWVyciA9IGRvX3dybXNyKGNwdSwgcmVnLCBkYXRhWzBdLCBkYXRhWzFdKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCXRtcCArPSAyOworCX0KKworCXJldHVybiAoKGNoYXIgX191c2VyICopdG1wKSAtIGJ1ZjsKK30KKworc3RhdGljIGludCBtc3Jfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmKGNwdV9kYXRhKVtjcHVdOworCisJaWYgKGNwdSA+PSBOUl9DUFVTIHx8ICFjcHVfb25saW5lKGNwdSkpCisJCXJldHVybiAtRU5YSU87CS8qIE5vIHN1Y2ggQ1BVICovCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01TUikpCisJCXJldHVybiAtRUlPOwkvKiBNU1Igbm90IHN1cHBvcnRlZCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaWxlIG9wZXJhdGlvbnMgd2Ugc3VwcG9ydAorICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtc3JfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbXNyX3NlZWssCisJLnJlYWQgPSBtc3JfcmVhZCwKKwkud3JpdGUgPSBtc3Jfd3JpdGUsCisJLm9wZW4gPSBtc3Jfb3BlbiwKK307CisKK3N0YXRpYyBpbnQgbXNyX2NsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGludCBpKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2VycjsKKworCWNsYXNzX2VyciA9IGNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKG1zcl9jbGFzcywgTUtERVYoTVNSX01BSk9SLCBpKSwgTlVMTCwgIm1zciVkIixpKTsKKwlpZiAoSVNfRVJSKGNsYXNzX2VycikpIAorCQllcnIgPSBQVFJfRVJSKGNsYXNzX2Vycik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbXNyX2NsYXNzX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX09OTElORToKKwkJbXNyX2NsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGNwdSk7CisJCWJyZWFrOworCWNhc2UgQ1BVX0RFQUQ6CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKE1TUl9NQUpPUiwgY3B1KSk7CQorCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtc3JfY2xhc3NfY3B1X25vdGlmaWVyID0KK3sKKwkubm90aWZpZXJfY2FsbCA9IG1zcl9jbGFzc19jcHVfY2FsbGJhY2ssCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc3JfaW5pdCh2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCWkgPSAwOworCisJaWYgKHJlZ2lzdGVyX2NocmRldihNU1JfTUFKT1IsICJjcHUvbXNyIiwgJm1zcl9mb3BzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1zcjogdW5hYmxlIHRvIGdldCBtYWpvciAlZCBmb3IgbXNyXG4iLAorCQkgICAgICAgTVNSX01BSk9SKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJbXNyX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgIm1zciIpOworCWlmIChJU19FUlIobXNyX2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKG1zcl9jbGFzcyk7CisJCWdvdG8gb3V0X2NocmRldjsKKwl9CisJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CisJCWVyciA9IG1zcl9jbGFzc19zaW1wbGVfZGV2aWNlX2FkZChpKTsKKwkJaWYgKGVyciAhPSAwKQorCQkJZ290byBvdXRfY2xhc3M7CisJfQorCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmbXNyX2NsYXNzX2NwdV9ub3RpZmllcik7CisKKwllcnIgPSAwOworCWdvdG8gb3V0OworCitvdXRfY2xhc3M6CisJaSA9IDA7CisJZm9yX2VhY2hfb25saW5lX2NwdShpKQorCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihNU1JfTUFKT1IsIGkpKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShtc3JfY2xhc3MpOworb3V0X2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldihNU1JfTUFKT1IsICJjcHUvbXNyIik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1zcl9leGl0KHZvaWQpCit7CisJaW50IGNwdSA9IDA7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKE1TUl9NQUpPUiwgY3B1KSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3kobXNyX2NsYXNzKTsKKwl1bnJlZ2lzdGVyX2NocmRldihNU1JfTUFKT1IsICJjcHUvbXNyIik7CisJdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJm1zcl9jbGFzc19jcHVfbm90aWZpZXIpOworfQorCittb2R1bGVfaW5pdChtc3JfaW5pdCk7Cittb2R1bGVfZXhpdChtc3JfZXhpdCkKKworTU9EVUxFX0FVVEhPUigiSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIng4NiBnZW5lcmljIE1TUiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMgYi9hcmNoL2kzODYva2VybmVsL25taS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjBjNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL25taS5jCkBAIC0wLDAgKzEsNTcwIEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9ubWkuYworICoKKyAqICBOTUkgd2F0Y2hkb2cgc3VwcG9ydCBvbiBBUElDIHN5c3RlbXMKKyAqCisgKiAgU3RhcnRlZCBieSBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKiAgRml4ZXM6CisgKiAgTWlrYWVsIFBldHRlcnNzb24JOiBBTUQgSzcgc3VwcG9ydCBmb3IgbG9jYWwgQVBJQyBOTUkgd2F0Y2hkb2cuCisgKiAgTWlrYWVsIFBldHRlcnNzb24JOiBQb3dlciBNYW5hZ2VtZW50IGZvciBsb2NhbCBBUElDIE5NSSB3YXRjaGRvZy4KKyAqICBNaWthZWwgUGV0dGVyc3Nvbgk6IFBlbnRpdW0gNCBzdXBwb3J0IGZvciBsb2NhbCBBUElDIE5NSSB3YXRjaGRvZy4KKyAqICBQYXZlbCBNYWNoZWsgYW5kCisgKiAgTWlrYWVsIFBldHRlcnNzb24JOiBQTSBjb252ZXJ0ZWQgdG8gZHJpdmVyIG1vZGVsLiBEaXNhYmxlL2VuYWJsZSBBUEkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbm1pLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisjaW5jbHVkZSA8YXNtL25taS5oPgorCisjaW5jbHVkZSAibWFjaF90cmFwcy5oIgorCit1bnNpZ25lZCBpbnQgbm1pX3dhdGNoZG9nID0gTk1JX05PTkU7CitleHRlcm4gaW50IHVua25vd25fbm1pX3BhbmljOworc3RhdGljIHVuc2lnbmVkIGludCBubWlfaHogPSBIWjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm1pX3BlcmZjdHJfbXNyOwkvKiB0aGUgTVNSIHRvIHJlc2V0IGluIE5NSSBoYW5kbGVyICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5taV9wNF9jY2NyX3ZhbDsKK2V4dGVybiB2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyoKKyAqIGxhcGljX25taV9vd25lciB0cmFja3MgdGhlIG93bmVyc2hpcCBvZiB0aGUgbGFwaWMgTk1JIGhhcmR3YXJlOgorICogLSBpdCBtYXkgYmUgcmVzZXJ2ZWQgYnkgc29tZSBvdGhlciBkcml2ZXIsIG9yIG5vdAorICogLSB3aGVuIG5vdCByZXNlcnZlZCBieSBzb21lIG90aGVyIGRyaXZlciwgaXQgbWF5IGJlIHVzZWQgZm9yCisgKiAgIHRoZSBOTUkgd2F0Y2hkb2csIG9yIG5vdAorICoKKyAqIFRoaXMgaXMgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5IGZyb20gbm1pX2FjdGl2ZSBiZWNhdXNlIHRoZSBOTUkKKyAqIHdhdGNoZG9nIG1heSBhbHNvIGJlIGRyaXZlbiBmcm9tIHRoZSBJL08gQVBJQyB0aW1lci4KKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhsYXBpY19ubWlfb3duZXJfbG9jayk7CitzdGF0aWMgdW5zaWduZWQgaW50IGxhcGljX25taV9vd25lcjsKKyNkZWZpbmUgTEFQSUNfTk1JX1dBVENIRE9HCSgxPDwwKQorI2RlZmluZSBMQVBJQ19OTUlfUkVTRVJWRUQJKDE8PDEpCisKKy8qIG5taV9hY3RpdmU6CisgKiArMTogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBpcyBhY3RpdmUsIGJ1dCBjYW4gYmUgZGlzYWJsZWQKKyAqICAwOiB0aGUgbGFwaWMgTk1JIHdhdGNoZG9nIGhhcyBub3QgYmVlbiBzZXQgdXAsIGFuZCBjYW5ub3QKKyAqICAgICBiZSBlbmFibGVkCisgKiAtMTogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBpcyBkaXNhYmxlZCwgYnV0IGNhbiBiZSBlbmFibGVkCisgKi8KK2ludCBubWlfYWN0aXZlOworCisjZGVmaW5lIEs3X0VWTlRTRUxfRU5BQkxFCSgxIDw8IDIyKQorI2RlZmluZSBLN19FVk5UU0VMX0lOVAkJKDEgPDwgMjApCisjZGVmaW5lIEs3X0VWTlRTRUxfT1MJCSgxIDw8IDE3KQorI2RlZmluZSBLN19FVk5UU0VMX1VTUgkJKDEgPDwgMTYpCisjZGVmaW5lIEs3X0VWRU5UX0NZQ0xFU19QUk9DRVNTT1JfSVNfUlVOTklORwkweDc2CisjZGVmaW5lIEs3X05NSV9FVkVOVAkJSzdfRVZFTlRfQ1lDTEVTX1BST0NFU1NPUl9JU19SVU5OSU5HCisKKyNkZWZpbmUgUDZfRVZOVFNFTDBfRU5BQkxFCSgxIDw8IDIyKQorI2RlZmluZSBQNl9FVk5UU0VMX0lOVAkJKDEgPDwgMjApCisjZGVmaW5lIFA2X0VWTlRTRUxfT1MJCSgxIDw8IDE3KQorI2RlZmluZSBQNl9FVk5UU0VMX1VTUgkJKDEgPDwgMTYpCisjZGVmaW5lIFA2X0VWRU5UX0NQVV9DTE9DS1NfTk9UX0hBTFRFRAkweDc5CisjZGVmaW5lIFA2X05NSV9FVkVOVAkJUDZfRVZFTlRfQ1BVX0NMT0NLU19OT1RfSEFMVEVECisKKyNkZWZpbmUgTVNSX1A0X01JU0NfRU5BQkxFCTB4MUEwCisjZGVmaW5lIE1TUl9QNF9NSVNDX0VOQUJMRV9QRVJGX0FWQUlMCSgxPDw3KQorI2RlZmluZSBNU1JfUDRfTUlTQ19FTkFCTEVfUEVCU19VTkFWQUlMCSgxPDwxMikKKyNkZWZpbmUgTVNSX1A0X1BFUkZDVFIwCQkweDMwMAorI2RlZmluZSBNU1JfUDRfQ0NDUjAJCTB4MzYwCisjZGVmaW5lIFA0X0VTQ1JfRVZFTlRfU0VMRUNUKE4pCSgoTik8PDI1KQorI2RlZmluZSBQNF9FU0NSX09TCQkoMTw8MykKKyNkZWZpbmUgUDRfRVNDUl9VU1IJCSgxPDwyKQorI2RlZmluZSBQNF9DQ0NSX09WRl9QTUkwCSgxPDwyNikKKyNkZWZpbmUgUDRfQ0NDUl9PVkZfUE1JMQkoMTw8MjcpCisjZGVmaW5lIFA0X0NDQ1JfVEhSRVNIT0xEKE4pCSgoTik8PDIwKQorI2RlZmluZSBQNF9DQ0NSX0NPTVBMRU1FTlQJKDE8PDE5KQorI2RlZmluZSBQNF9DQ0NSX0NPTVBBUkUJCSgxPDwxOCkKKyNkZWZpbmUgUDRfQ0NDUl9SRVFVSVJFRAkoMzw8MTYpCisjZGVmaW5lIFA0X0NDQ1JfRVNDUl9TRUxFQ1QoTikJKChOKTw8MTMpCisjZGVmaW5lIFA0X0NDQ1JfRU5BQkxFCQkoMTw8MTIpCisvKiBTZXQgdXAgSVFfQ09VTlRFUjAgdG8gYmVoYXZlIGxpa2UgYSBjbG9jaywgYnkgaGF2aW5nIElRX0NDQ1IwIGZpbHRlcgorICAgQ1JVX0VTQ1IwICh3aXRoIGFueSBub24tbnVsbCBldmVudCBzZWxlY3RvcikgdGhyb3VnaCBhIGNvbXBsZW1lbnRlZAorICAgbWF4IHRocmVzaG9sZC4gW0lBMzItVm9sMywgU2VjdGlvbiAxNC45LjldICovCisjZGVmaW5lIE1TUl9QNF9JUV9DT1VOVEVSMAkweDMwQworI2RlZmluZSBQNF9OTUlfQ1JVX0VTQ1IwCShQNF9FU0NSX0VWRU5UX1NFTEVDVCgweDNGKXxQNF9FU0NSX09TfFA0X0VTQ1JfVVNSKQorI2RlZmluZSBQNF9OTUlfSVFfQ0NDUjAJXAorCShQNF9DQ0NSX09WRl9QTUkwfFA0X0NDQ1JfVEhSRVNIT0xEKDE1KXxQNF9DQ0NSX0NPTVBMRU1FTlR8CVwKKwkgUDRfQ0NDUl9DT01QQVJFfFA0X0NDQ1JfUkVRVUlSRUR8UDRfQ0NDUl9FU0NSX1NFTEVDVCg0KXxQNF9DQ0NSX0VOQUJMRSkKKworaW50IF9faW5pdCBjaGVja19ubWlfd2F0Y2hkb2cgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHByZXZfbm1pX2NvdW50W05SX0NQVVNdOworCWludCBjcHU7CisKKwlwcmludGsoS0VSTl9JTkZPICJ0ZXN0aW5nIE5NSSB3YXRjaGRvZyAuLi4gIik7CisKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQorCQlwcmV2X25taV9jb3VudFtjcHVdID0gcGVyX2NwdShpcnFfc3RhdCwgY3B1KS5fX25taV9jb3VudDsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJbWRlbGF5KCgxMCoxMDAwKS9ubWlfaHopOyAvLyB3YWl0IDEwIHRpY2tzCisKKwkvKiBGSVhNRTogT25seSBib290IENQVSBpcyBvbmxpbmUgYXQgdGhpcyBzdGFnZS4gIENoZWNrIENQVXMKKyAgICAgICAgICAgYXMgdGhleSBjb21lIHVwLiAqLworCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKKyNpZmRlZiBDT05GSUdfU01QCisJCS8qIENoZWNrIGNwdV9jYWxsaW5fbWFwIGhlcmUgYmVjYXVzZSB0aGF0IGlzIHNldAorCQkgICBhZnRlciB0aGUgdGltZXIgaXMgc3RhcnRlZC4gKi8KKwkJaWYgKCFjcHVfaXNzZXQoY3B1LCBjcHVfY2FsbGluX21hcCkpCisJCQljb250aW51ZTsKKyNlbmRpZgorCQlpZiAobm1pX2NvdW50KGNwdSkgLSBwcmV2X25taV9jb3VudFtjcHVdIDw9IDUpIHsKKwkJCXByaW50aygiQ1BVIyVkOiBOTUkgYXBwZWFycyB0byBiZSBzdHVjayFcbiIsIGNwdSk7CisJCQlubWlfYWN0aXZlID0gMDsKKwkJCWxhcGljX25taV9vd25lciAmPSB+TEFQSUNfTk1JX1dBVENIRE9HOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXByaW50aygiT0suXG4iKTsKKworCS8qIG5vdyB0aGF0IHdlIGtub3cgaXQgd29ya3Mgd2UgY2FuIHJlZHVjZSBOTUkgZnJlcXVlbmN5IHRvCisJICAgc29tZXRoaW5nIG1vcmUgcmVhc29uYWJsZTsgbWFrZXMgYSBkaWZmZXJlbmNlIGluIHNvbWUgY29uZmlncyAqLworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCisJCW5taV9oeiA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfbm1pX3dhdGNoZG9nKGNoYXIgKnN0cikKK3sKKwlpbnQgbm1pOworCisJZ2V0X29wdGlvbigmc3RyLCAmbm1pKTsKKworCWlmIChubWkgPj0gTk1JX0lOVkFMSUQpCisJCXJldHVybiAwOworCWlmIChubWkgPT0gTk1JX05PTkUpCisJCW5taV93YXRjaGRvZyA9IG5taTsKKwkvKgorCSAqIElmIGFueSBvdGhlciB4ODYgQ1BVIGhhcyBhIGxvY2FsIEFQSUMsIHRoZW4KKwkgKiBwbGVhc2UgdGVzdCB0aGUgTk1JIHN0dWZmIHRoZXJlIGFuZCBzZW5kIG1lIHRoZQorCSAqIG1pc3NpbmcgYml0cy4gUmlnaHQgbm93IEludGVsIFA2L1A0IGFuZCBBTUQgSzcgb25seS4KKwkgKi8KKwlpZiAoKG5taSA9PSBOTUlfTE9DQUxfQVBJQykgJiYKKwkJCShib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgJiYKKwkJCShib290X2NwdV9kYXRhLng4NiA9PSA2IHx8IGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKKwkJbm1pX3dhdGNoZG9nID0gbm1pOworCWlmICgobm1pID09IE5NSV9MT0NBTF9BUElDKSAmJgorCQkJKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkgJiYKKwkgIAkJKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgfHwgYm9vdF9jcHVfZGF0YS54ODYgPT0gMTUpKQorCQlubWlfd2F0Y2hkb2cgPSBubWk7CisJLyoKKwkgKiBXZSBjYW4gZW5hYmxlIHRoZSBJTy1BUElDIHdhdGNoZG9nCisJICogdW5jb25kaXRpb25hbGx5LgorCSAqLworCWlmIChubWkgPT0gTk1JX0lPX0FQSUMpIHsKKwkJbm1pX2FjdGl2ZSA9IDE7CisJCW5taV93YXRjaGRvZyA9IG5taTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm5taV93YXRjaGRvZz0iLCBzZXR1cF9ubWlfd2F0Y2hkb2cpOworCitzdGF0aWMgdm9pZCBkaXNhYmxlX2xhcGljX25taV93YXRjaGRvZyh2b2lkKQoreworCWlmIChubWlfYWN0aXZlIDw9IDApCisJCXJldHVybjsKKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCXdybXNyKE1TUl9LN19FVk5UU0VMMCwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwkJc3dpdGNoIChib290X2NwdV9kYXRhLng4NikgeworCQljYXNlIDY6CisJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAweGQpCisJCQkJYnJlYWs7CisKKwkJCXdybXNyKE1TUl9QNl9FVk5UU0VMMCwgMCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAxNToKKwkJCWlmIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+IDB4MykKKwkJCQlicmVhazsKKworCQkJd3Jtc3IoTVNSX1A0X0lRX0NDQ1IwLCAwLCAwKTsKKwkJCXdybXNyKE1TUl9QNF9DUlVfRVNDUjAsIDAsIDApOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCW5taV9hY3RpdmUgPSAtMTsKKwkvKiB0ZWxsIGRvX25taSgpIGFuZCBvdGhlcnMgdGhhdCB3ZSdyZSBub3QgYWN0aXZlIGFueSBtb3JlICovCisJbm1pX3dhdGNoZG9nID0gMDsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2xhcGljX25taV93YXRjaGRvZyh2b2lkKQoreworCWlmIChubWlfYWN0aXZlIDwgMCkgeworCQlubWlfd2F0Y2hkb2cgPSBOTUlfTE9DQUxfQVBJQzsKKwkJc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2coKTsKKwl9Cit9CisKK2ludCByZXNlcnZlX2xhcGljX25taSh2b2lkKQoreworCXVuc2lnbmVkIGludCBvbGRfb3duZXI7CisKKwlzcGluX2xvY2soJmxhcGljX25taV9vd25lcl9sb2NrKTsKKwlvbGRfb3duZXIgPSBsYXBpY19ubWlfb3duZXI7CisJbGFwaWNfbm1pX293bmVyIHw9IExBUElDX05NSV9SRVNFUlZFRDsKKwlzcGluX3VubG9jaygmbGFwaWNfbm1pX293bmVyX2xvY2spOworCWlmIChvbGRfb3duZXIgJiBMQVBJQ19OTUlfUkVTRVJWRUQpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKG9sZF9vd25lciAmIExBUElDX05NSV9XQVRDSERPRykKKwkJZGlzYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCByZWxlYXNlX2xhcGljX25taSh2b2lkKQoreworCXVuc2lnbmVkIGludCBuZXdfb3duZXI7CisKKwlzcGluX2xvY2soJmxhcGljX25taV9vd25lcl9sb2NrKTsKKwluZXdfb3duZXIgPSBsYXBpY19ubWlfb3duZXIgJiB+TEFQSUNfTk1JX1JFU0VSVkVEOworCWxhcGljX25taV9vd25lciA9IG5ld19vd25lcjsKKwlzcGluX3VubG9jaygmbGFwaWNfbm1pX293bmVyX2xvY2spOworCWlmIChuZXdfb3duZXIgJiBMQVBJQ19OTUlfV0FUQ0hET0cpCisJCWVuYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKK30KKwordm9pZCBkaXNhYmxlX3RpbWVyX25taV93YXRjaGRvZyh2b2lkKQoreworCWlmICgobm1pX3dhdGNoZG9nICE9IE5NSV9JT19BUElDKSB8fCAobm1pX2FjdGl2ZSA8PSAwKSkKKwkJcmV0dXJuOworCisJdW5zZXRfbm1pX2NhbGxiYWNrKCk7CisJbm1pX2FjdGl2ZSA9IC0xOworCW5taV93YXRjaGRvZyA9IE5NSV9OT05FOworfQorCit2b2lkIGVuYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2codm9pZCkKK3sKKwlpZiAobm1pX2FjdGl2ZSA8IDApIHsKKwkJbm1pX3dhdGNoZG9nID0gTk1JX0lPX0FQSUM7CisJCXRvdWNoX25taV93YXRjaGRvZygpOworCQlubWlfYWN0aXZlID0gMTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBubWlfcG1fYWN0aXZlOyAvKiBubWlfYWN0aXZlIGJlZm9yZSBzdXNwZW5kICovCisKK3N0YXRpYyBpbnQgbGFwaWNfbm1pX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgdTMyIHN0YXRlKQoreworCW5taV9wbV9hY3RpdmUgPSBubWlfYWN0aXZlOworCWRpc2FibGVfbGFwaWNfbm1pX3dhdGNoZG9nKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFwaWNfbm1pX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoreworCWlmIChubWlfcG1fYWN0aXZlID4gMCkKKwkJZW5hYmxlX2xhcGljX25taV93YXRjaGRvZygpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIG5taV9zeXNjbGFzcyA9IHsKKwlzZXRfa3NldF9uYW1lKCJsYXBpY19ubWkiKSwKKwkucmVzdW1lCQk9IGxhcGljX25taV9yZXN1bWUsCisJLnN1c3BlbmQJPSBsYXBpY19ubWlfc3VzcGVuZCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfbGFwaWNfbm1pID0geworCS5pZAk9IDAsCisJLmNscwk9ICZubWlfc3lzY2xhc3MsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2xhcGljX25taV9zeXNmcyh2b2lkKQoreworCWludCBlcnJvcjsKKworCWlmIChubWlfYWN0aXZlID09IDAgfHwgbm1pX3dhdGNoZG9nICE9IE5NSV9MT0NBTF9BUElDKQorCQlyZXR1cm4gMDsKKworCWVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZubWlfc3lzY2xhc3MpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfbGFwaWNfbm1pKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisvKiBtdXN0IGNvbWUgYWZ0ZXIgdGhlIGxvY2FsIEFQSUMncyBkZXZpY2VfaW5pdGNhbGwoKSAqLworbGF0ZV9pbml0Y2FsbChpbml0X2xhcGljX25taV9zeXNmcyk7CisKKyNlbmRpZgkvKiBDT05GSUdfUE0gKi8KKworLyoKKyAqIEFjdGl2YXRlIHRoZSBOTUkgd2F0Y2hkb2cgdmlhIHRoZSBsb2NhbCBBUElDLgorICogT3JpZ2luYWwgY29kZSB3cml0dGVuIGJ5IEtlaXRoIE93ZW5zLgorICovCisKK3N0YXRpYyB2b2lkIGNsZWFyX21zcl9yYW5nZSh1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgaW50IG4pCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBuOyArK2kpCisJCXdybXNyKGJhc2UraSwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2s3X3dhdGNoZG9nKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGV2bnRzZWw7CisKKwlubWlfcGVyZmN0cl9tc3IgPSBNU1JfSzdfUEVSRkNUUjA7CisKKwljbGVhcl9tc3JfcmFuZ2UoTVNSX0s3X0VWTlRTRUwwLCA0KTsKKwljbGVhcl9tc3JfcmFuZ2UoTVNSX0s3X1BFUkZDVFIwLCA0KTsKKworCWV2bnRzZWwgPSBLN19FVk5UU0VMX0lOVAorCQl8IEs3X0VWTlRTRUxfT1MKKwkJfCBLN19FVk5UU0VMX1VTUgorCQl8IEs3X05NSV9FVkVOVDsKKworCXdybXNyKE1TUl9LN19FVk5UU0VMMCwgZXZudHNlbCwgMCk7CisJRHByaW50aygic2V0dGluZyBLN19QRVJGQ1RSMCB0byAlMDhseFxuIiwgLShjcHVfa2h6L25taV9oeioxMDAwKSk7CisJd3Jtc3IoTVNSX0s3X1BFUkZDVFIwLCAtKGNwdV9raHovbm1pX2h6KjEwMDApLCAtMSk7CisJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJZXZudHNlbCB8PSBLN19FVk5UU0VMX0VOQUJMRTsKKwl3cm1zcihNU1JfSzdfRVZOVFNFTDAsIGV2bnRzZWwsIDApOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9wNl93YXRjaGRvZyh2b2lkKQoreworCXVuc2lnbmVkIGludCBldm50c2VsOworCisJbm1pX3BlcmZjdHJfbXNyID0gTVNSX1A2X1BFUkZDVFIwOworCisJY2xlYXJfbXNyX3JhbmdlKE1TUl9QNl9FVk5UU0VMMCwgMik7CisJY2xlYXJfbXNyX3JhbmdlKE1TUl9QNl9QRVJGQ1RSMCwgMik7CisKKwlldm50c2VsID0gUDZfRVZOVFNFTF9JTlQKKwkJfCBQNl9FVk5UU0VMX09TCisJCXwgUDZfRVZOVFNFTF9VU1IKKwkJfCBQNl9OTUlfRVZFTlQ7CisKKwl3cm1zcihNU1JfUDZfRVZOVFNFTDAsIGV2bnRzZWwsIDApOworCURwcmludGsoInNldHRpbmcgUDZfUEVSRkNUUjAgdG8gJTA4bHhcbiIsIC0oY3B1X2toei9ubWlfaHoqMTAwMCkpOworCXdybXNyKE1TUl9QNl9QRVJGQ1RSMCwgLShjcHVfa2h6L25taV9oeioxMDAwKSwgMCk7CisJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJZXZudHNlbCB8PSBQNl9FVk5UU0VMMF9FTkFCTEU7CisJd3Jtc3IoTVNSX1A2X0VWTlRTRUwwLCBldm50c2VsLCAwKTsKK30KKworc3RhdGljIGludCBzZXR1cF9wNF93YXRjaGRvZyh2b2lkKQoreworCXVuc2lnbmVkIGludCBtaXNjX2VuYWJsZSwgZHVtbXk7CisKKwlyZG1zcihNU1JfUDRfTUlTQ19FTkFCTEUsIG1pc2NfZW5hYmxlLCBkdW1teSk7CisJaWYgKCEobWlzY19lbmFibGUgJiBNU1JfUDRfTUlTQ19FTkFCTEVfUEVSRl9BVkFJTCkpCisJCXJldHVybiAwOworCisJbm1pX3BlcmZjdHJfbXNyID0gTVNSX1A0X0lRX0NPVU5URVIwOworCW5taV9wNF9jY2NyX3ZhbCA9IFA0X05NSV9JUV9DQ0NSMDsKKyNpZmRlZiBDT05GSUdfU01QCisJaWYgKHNtcF9udW1fc2libGluZ3MgPT0gMikKKwkJbm1pX3A0X2NjY3JfdmFsIHw9IFA0X0NDQ1JfT1ZGX1BNSTE7CisjZW5kaWYKKworCWlmICghKG1pc2NfZW5hYmxlICYgTVNSX1A0X01JU0NfRU5BQkxFX1BFQlNfVU5BVkFJTCkpCisJCWNsZWFyX21zcl9yYW5nZSgweDNGMSwgMik7CisJLyogTVNSIDB4M0YwIHNlZW1zIHRvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIG9mIDB4RkMwMCwgYnV0IGN1cnJlbnQKKwkgICBkb2NzIGRvZXNuJ3QgZnVsbHkgZGVmaW5lIGl0LCBzbyBsZWF2ZSBpdCBhbG9uZSBmb3Igbm93LiAqLworCWlmIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+PSAweDMpIHsKKwkJLyogTVNSX1A0X0lRX0VTQ1IwLzEgKDB4M2JhLzB4M2JiKSByZW1vdmVkICovCisJCWNsZWFyX21zcl9yYW5nZSgweDNBMCwgMjYpOworCQljbGVhcl9tc3JfcmFuZ2UoMHgzQkMsIDMpOworCX0gZWxzZSB7CisJCWNsZWFyX21zcl9yYW5nZSgweDNBMCwgMzEpOworCX0KKwljbGVhcl9tc3JfcmFuZ2UoMHgzQzAsIDYpOworCWNsZWFyX21zcl9yYW5nZSgweDNDOCwgNik7CisJY2xlYXJfbXNyX3JhbmdlKDB4M0UwLCAyKTsKKwljbGVhcl9tc3JfcmFuZ2UoTVNSX1A0X0NDQ1IwLCAxOCk7CisJY2xlYXJfbXNyX3JhbmdlKE1TUl9QNF9QRVJGQ1RSMCwgMTgpOworCisJd3Jtc3IoTVNSX1A0X0NSVV9FU0NSMCwgUDRfTk1JX0NSVV9FU0NSMCwgMCk7CisJd3Jtc3IoTVNSX1A0X0lRX0NDQ1IwLCBQNF9OTUlfSVFfQ0NDUjAgJiB+UDRfQ0NDUl9FTkFCTEUsIDApOworCURwcmludGsoInNldHRpbmcgUDRfSVFfQ09VTlRFUjAgdG8gMHglMDhseFxuIiwgLShjcHVfa2h6L25taV9oeioxMDAwKSk7CisJd3Jtc3IoTVNSX1A0X0lRX0NPVU5URVIwLCAtKGNwdV9raHovbm1pX2h6KjEwMDApLCAtMSk7CisJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJd3Jtc3IoTVNSX1A0X0lRX0NDQ1IwLCBubWlfcDRfY2Njcl92YWwsIDApOworCXJldHVybiAxOworfQorCit2b2lkIHNldHVwX2FwaWNfbm1pX3dhdGNoZG9nICh2b2lkKQoreworCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7CisJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ICE9IDYgJiYgYm9vdF9jcHVfZGF0YS54ODYgIT0gMTUpCisJCQlyZXR1cm47CisJCXNldHVwX2s3X3dhdGNoZG9nKCk7CisJCWJyZWFrOworCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwkJc3dpdGNoIChib290X2NwdV9kYXRhLng4NikgeworCQljYXNlIDY6CisJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAweGQpCisJCQkJcmV0dXJuOworCisJCQlzZXR1cF9wNl93YXRjaGRvZygpOworCQkJYnJlYWs7CisJCWNhc2UgMTU6CisJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAweDMpCisJCQkJcmV0dXJuOworCisJCQlpZiAoIXNldHVwX3A0X3dhdGNoZG9nKCkpCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKwlsYXBpY19ubWlfb3duZXIgPSBMQVBJQ19OTUlfV0FUQ0hET0c7CisJbm1pX2FjdGl2ZSA9IDE7Cit9CisKKy8qCisgKiB0aGUgYmVzdCB3YXkgdG8gZGV0ZWN0IHdoZXRoZXIgYSBDUFUgaGFzIGEgJ2hhcmQgbG9ja3VwJyBwcm9ibGVtCisgKiBpcyB0byBjaGVjayBpdCdzIGxvY2FsIEFQSUMgdGltZXIgSVJRIGNvdW50cy4gSWYgdGhleSBhcmUgbm90CisgKiBjaGFuZ2luZyB0aGVuIHRoYXQgQ1BVIGhhcyBzb21lIHByb2JsZW0uCisgKgorICogYXMgdGhlc2Ugd2F0Y2hkb2cgTk1JIElSUXMgYXJlIGdlbmVyYXRlZCBvbiBldmVyeSBDUFUsIHdlIG9ubHkKKyAqIGhhdmUgdG8gY2hlY2sgdGhlIGN1cnJlbnQgcHJvY2Vzc29yLgorICoKKyAqIHNpbmNlIE5NSXMgZG9uJ3QgbGlzdGVuIHRvIF9hbnlfIGxvY2tzLCB3ZSBoYXZlIHRvIGJlIGV4dHJlbWVseQorICogY2FyZWZ1bCBub3QgdG8gcmVseSBvbiB1bnNhZmUgdmFyaWFibGVzLiBUaGUgcHJpbnRrIG1pZ2h0IGxvY2sKKyAqIHVwIHRob3VnaCwgc28gd2UgaGF2ZSB0byBicmVhayB1cCBhbnkgY29uc29sZSBsb2NrcyBmaXJzdCAuLi4KKyAqIFt3aGVuIHRoZXJlIHdpbGwgYmUgbW9yZSB0dHktcmVsYXRlZCBsb2NrcywgYnJlYWsgdGhlbSB1cAorICogIGhlcmUgdG9vIV0KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CisJbGFzdF9pcnFfc3VtcyBbTlJfQ1BVU10sCisJYWxlcnRfY291bnRlciBbTlJfQ1BVU107CisKK3ZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nICh2b2lkKQoreworCWludCBpOworCisJLyoKKwkgKiBKdXN0IHJlc2V0IHRoZSBhbGVydCBjb3VudGVycywgKG90aGVyIENQVXMgbWlnaHQgYmUKKwkgKiBzcGlubmluZyBvbiBsb2NrcyB3ZSBob2xkKToKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQorCQlhbGVydF9jb3VudGVyW2ldID0gMDsKK30KKworZXh0ZXJuIHZvaWQgZGllX25taShzdHJ1Y3QgcHRfcmVncyAqLCBjb25zdCBjaGFyICptc2cpOworCit2b2lkIG5taV93YXRjaGRvZ190aWNrIChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisKKwkvKgorCSAqIFNpbmNlIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+IGlzIGFsd2F5cyBvbiB0aGUgc3RhY2ssIGFuZCB3ZQorCSAqIGFsd2F5cyBzd2l0Y2ggdGhlIHN0YWNrIE5NSS1hdG9taWNhbGx5LCBpdCdzIHNhZmUgdG8gdXNlCisJICogc21wX3Byb2Nlc3Nvcl9pZCgpLgorCSAqLworCWludCBzdW0sIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXN1bSA9IHBlcl9jcHUoaXJxX3N0YXQsIGNwdSkuYXBpY190aW1lcl9pcnFzOworCisJaWYgKGxhc3RfaXJxX3N1bXNbY3B1XSA9PSBzdW0pIHsKKwkJLyoKKwkJICogQXlpZWUsIGxvb2tzIGxpa2UgdGhpcyBDUFUgaXMgc3R1Y2sgLi4uCisJCSAqIHdhaXQgYSBmZXcgSVJRcyAoNSBzZWNvbmRzKSBiZWZvcmUgZG9pbmcgdGhlIG9vcHMgLi4uCisJCSAqLworCQlhbGVydF9jb3VudGVyW2NwdV0rKzsKKwkJaWYgKGFsZXJ0X2NvdW50ZXJbY3B1XSA9PSA1Km5taV9oeikKKwkJCWRpZV9ubWkocmVncywgIk5NSSBXYXRjaGRvZyBkZXRlY3RlZCBMT0NLVVAiKTsKKwl9IGVsc2UgeworCQlsYXN0X2lycV9zdW1zW2NwdV0gPSBzdW07CisJCWFsZXJ0X2NvdW50ZXJbY3B1XSA9IDA7CisJfQorCWlmIChubWlfcGVyZmN0cl9tc3IpIHsKKwkJaWYgKG5taV9wZXJmY3RyX21zciA9PSBNU1JfUDRfSVFfQ09VTlRFUjApIHsKKwkJCS8qCisJCQkgKiBQNCBxdWlya3M6CisJCQkgKiAtIEFuIG92ZXJmbG93biBwZXJmY3RyIHdpbGwgYXNzZXJ0IGl0cyBpbnRlcnJ1cHQKKwkJCSAqICAgdW50aWwgdGhlIE9WRiBmbGFnIGluIGl0cyBDQ0NSIGlzIGNsZWFyZWQuCisJCQkgKiAtIExWVFBDIGlzIG1hc2tlZCBvbiBpbnRlcnJ1cHQgYW5kIG11c3QgYmUKKwkJCSAqICAgdW5tYXNrZWQgYnkgdGhlIExWVFBDIGhhbmRsZXIuCisJCQkgKi8KKwkJCXdybXNyKE1TUl9QNF9JUV9DQ0NSMCwgbm1pX3A0X2NjY3JfdmFsLCAwKTsKKwkJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCQl9CisJCWVsc2UgaWYgKG5taV9wZXJmY3RyX21zciA9PSBNU1JfUDZfUEVSRkNUUjApIHsKKwkJCS8qIE9ubHkgUDYgYmFzZWQgUGVudGl1bSBNIG5lZWQgdG8gcmUtdW5tYXNrCisJCQkgKiB0aGUgYXBpYyB2ZWN0b3IgYnV0IGl0IGRvZXNuJ3QgaHVydAorCQkJICogb3RoZXIgUDYgdmFyaWFudCAqLworCQkJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJCX0KKwkJd3Jtc3Iobm1pX3BlcmZjdHJfbXNyLCAtKGNwdV9raHovbm1pX2h6KjEwMDApLCAtMSk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCitzdGF0aWMgaW50IHVua25vd25fbm1pX3BhbmljX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGNoYXIgcmVhc29uID0gZ2V0X25taV9yZWFzb24oKTsKKwljaGFyIGJ1Zls2NF07CisKKwlpZiAoIShyZWFzb24gJiAweGMwKSkgeworCQlzcHJpbnRmKGJ1ZiwgIk5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24gJTAyeFxuIiwgcmVhc29uKTsKKwkJZGllX25taShyZWdzLCBidWYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHByb2MgaGFuZGxlciBmb3IgL3Byb2Mvc3lzL2tlcm5lbC91bmtub3duX25taV9wYW5pYworICovCitpbnQgcHJvY191bmtub3duX25taV9wYW5pYyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgb2xkX3N0YXRlOworCisJb2xkX3N0YXRlID0gdW5rbm93bl9ubWlfcGFuaWM7CisJcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlpZiAoISFvbGRfc3RhdGUgPT0gISF1bmtub3duX25taV9wYW5pYykKKwkJcmV0dXJuIDA7CisKKwlpZiAodW5rbm93bl9ubWlfcGFuaWMpIHsKKwkJaWYgKHJlc2VydmVfbGFwaWNfbm1pKCkgPCAwKSB7CisJCQl1bmtub3duX25taV9wYW5pYyA9IDA7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9IGVsc2UgeworCQkJc2V0X25taV9jYWxsYmFjayh1bmtub3duX25taV9wYW5pY19jYWxsYmFjayk7CisJCX0KKwl9IGVsc2UgeworCQlyZWxlYXNlX2xhcGljX25taSgpOworCQl1bnNldF9ubWlfY2FsbGJhY2soKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKG5taV9hY3RpdmUpOworRVhQT1JUX1NZTUJPTChubWlfd2F0Y2hkb2cpOworRVhQT1JUX1NZTUJPTChyZXNlcnZlX2xhcGljX25taSk7CitFWFBPUlRfU1lNQk9MKHJlbGVhc2VfbGFwaWNfbm1pKTsKK0VYUE9SVF9TWU1CT0woZGlzYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2cpOworRVhQT1JUX1NZTUJPTChlbmFibGVfdGltZXJfbm1pX3dhdGNoZG9nKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbnVtYXEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbnVtYXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTFlZGYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9udW1hcS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBXcml0dGVuIGJ5OiBQYXRyaWNpYSBHYXVnaGVuLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFNlbmQgZmVlZGJhY2sgdG8gPGdvbmVAdXMuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDxhc20vbnVtYXEuaD4KKyNpbmNsdWRlIDxhc20vdG9wb2xvZ3kuaD4KKworI2RlZmluZQlNQl9UT19QQUdFUyhhZGRyKSAoKGFkZHIpIDw8ICgyMCAtIFBBR0VfU0hJRlQpKQorCisvKgorICogRnVuY3Rpb246IHNtcF9kdW1wX3FjdCgpCisgKgorICogRGVzY3JpcHRpb246IGdldHMgbWVtb3J5IGxheW91dCBmcm9tIHRoZSBxdWFkIGNvbmZpZyB0YWJsZS4gIFRoaXMKKyAqIGZ1bmN0aW9uIGFsc28gdXBkYXRlcyBub2RlX29ubGluZV9tYXAgd2l0aCB0aGUgbm9kZXMgKHF1YWRzKSBwcmVzZW50LgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc21wX2R1bXBfcWN0KHZvaWQpCit7CisJaW50IG5vZGU7CisJc3RydWN0IGVhY2hxdWFkbWVtICplcTsKKwlzdHJ1Y3Qgc3lzX2NmZ19kYXRhICpzY2QgPQorCQkoc3RydWN0IHN5c19jZmdfZGF0YSAqKV9fdmEoU1lTX0NGR19EQVRBX1BSSVZfQUREUik7CisKKwlub2Rlc19jbGVhcihub2RlX29ubGluZV9tYXApOworCWZvcl9lYWNoX25vZGUobm9kZSkgeworCQlpZiAoc2NkLT5xdWFkc19wcmVzZW50MzFfMCAmICgxIDw8IG5vZGUpKSB7CisJCQlub2RlX3NldF9vbmxpbmUobm9kZSk7CisJCQllcSA9ICZzY2QtPmVxW25vZGVdOworCQkJLyogQ29udmVydCB0byBwYWdlcyAqLworCQkJbm9kZV9zdGFydF9wZm5bbm9kZV0gPSBNQl9UT19QQUdFUygKKwkJCQllcS0+aGlfc2hyZF9tZW1fc3RhcnQgLSBlcS0+cHJpdl9tZW1fc2l6ZSk7CisJCQlub2RlX2VuZF9wZm5bbm9kZV0gPSBNQl9UT19QQUdFUygKKwkJCQllcS0+aGlfc2hyZF9tZW1fc3RhcnQgKyBlcS0+aGlfc2hyZF9tZW1fc2l6ZSk7CisKKwkJCW1lbW9yeV9wcmVzZW50KG5vZGUsCisJCQkJbm9kZV9zdGFydF9wZm5bbm9kZV0sIG5vZGVfZW5kX3Bmbltub2RlXSk7CisJCQlub2RlX3JlbWFwX3NpemVbbm9kZV0gPSBub2RlX21lbW1hcF9zaXplX2J5dGVzKG5vZGUsCisJCQkJCQkJbm9kZV9zdGFydF9wZm5bbm9kZV0sCisJCQkJCQkJbm9kZV9lbmRfcGZuW25vZGVdKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFVubGlrZSBTdW1taXQsIHdlIGRvbid0IHJlYWxseSBjYXJlIHRvIGxldCB0aGUgTlVNQS1RCisgKiBmYWxsIGJhY2sgdG8gZmxhdCBtb2RlLiAgRG9uJ3QgY29tcGlsZSBmb3IgTlVNQS1RCisgKiB1bmxlc3MgeW91IHJlYWxseSBuZWVkIGl0IQorICovCitpbnQgX19pbml0IGdldF9tZW1jZmdfbnVtYXEodm9pZCkKK3sKKwlzbXBfZHVtcF9xY3QoKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcGNpLWRtYS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wY2ktZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlMmUwMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcGNpLWRtYS5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogRHluYW1pYyBETUEgbWFwcGluZyBzdXBwb3J0LgorICoKKyAqIE9uIGkzODYgdGhlcmUgaXMgbm8gaGFyZHdhcmUgZHluYW1pYyBETUEgYWRkcmVzcyB0cmFuc2xhdGlvbiwKKyAqIHNvIGNvbnNpc3RlbnQgYWxsb2MvZnJlZSBhcmUgbWVyZWx5IHBhZ2UgYWxsb2NhdGlvbi9mcmVlaW5nLgorICogVGhlIHJlc3Qgb2YgdGhlIGR5bmFtaWMgRE1BIG1hcHBpbmcgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkCisgKiBpbiBhc20vcGNpLmguCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RydWN0IGRtYV9jb2hlcmVudF9tZW0geworCXZvaWQJCSp2aXJ0X2Jhc2U7CisJdTMyCQlkZXZpY2VfYmFzZTsKKwlpbnQJCXNpemU7CisJaW50CQlmbGFnczsKKwl1bnNpZ25lZCBsb25nCSpiaXRtYXA7Cit9OworCit2b2lkICpkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCit7CisJdm9pZCAqcmV0OworCXN0cnVjdCBkbWFfY29oZXJlbnRfbWVtICptZW0gPSBkZXYgPyBkZXYtPmRtYV9tZW0gOiBOVUxMOworCWludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKwkvKiBpZ25vcmUgcmVnaW9uIHNwZWNpZmllcnMgKi8KKwlnZnAgJj0gfihfX0dGUF9ETUEgfCBfX0dGUF9ISUdITUVNKTsKKworCWlmIChtZW0pIHsKKwkJaW50IHBhZ2UgPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihtZW0tPmJpdG1hcCwgbWVtLT5zaXplLAorCQkJCQkJICAgICBvcmRlcik7CisJCWlmIChwYWdlID49IDApIHsKKwkJCSpkbWFfaGFuZGxlID0gbWVtLT5kZXZpY2VfYmFzZSArIChwYWdlIDw8IFBBR0VfU0hJRlQpOworCQkJcmV0ID0gbWVtLT52aXJ0X2Jhc2UgKyAocGFnZSA8PCBQQUdFX1NISUZUKTsKKwkJCW1lbXNldChyZXQsIDAsIHNpemUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAobWVtLT5mbGFncyAmIERNQV9NRU1PUllfRVhDTFVTSVZFKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGRldiA9PSBOVUxMIHx8IChkZXYtPmNvaGVyZW50X2RtYV9tYXNrIDwgMHhmZmZmZmZmZikpCisJCWdmcCB8PSBHRlBfRE1BOworCisJcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGdmcCwgb3JkZXIpOworCisJaWYgKHJldCAhPSBOVUxMKSB7CisJCW1lbXNldChyZXQsIDAsIHNpemUpOworCQkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fcGh5cyhyZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgZG1hX2NvaGVyZW50X21lbSAqbWVtID0gZGV2ID8gZGV2LT5kbWFfbWVtIDogTlVMTDsKKwlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisJCisJaWYgKG1lbSAmJiB2YWRkciA+PSBtZW0tPnZpcnRfYmFzZSAmJiB2YWRkciA8IChtZW0tPnZpcnRfYmFzZSArIChtZW0tPnNpemUgPDwgUEFHRV9TSElGVCkpKSB7CisJCWludCBwYWdlID0gKHZhZGRyIC0gbWVtLT52aXJ0X2Jhc2UpID4+IFBBR0VfU0hJRlQ7CisKKwkJYml0bWFwX3JlbGVhc2VfcmVnaW9uKG1lbS0+Yml0bWFwLCBwYWdlLCBvcmRlcik7CisJfSBlbHNlCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpdmFkZHIsIG9yZGVyKTsKK30KKworaW50IGRtYV9kZWNsYXJlX2NvaGVyZW50X21lbW9yeShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYnVzX2FkZHIsCisJCQkJZG1hX2FkZHJfdCBkZXZpY2VfYWRkciwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwl2b2lkIF9faW9tZW0gKm1lbV9iYXNlOworCWludCBwYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwlpbnQgYml0bWFwX3NpemUgPSAocGFnZXMgKyAzMSkvMzI7CisKKwlpZiAoKGZsYWdzICYgKERNQV9NRU1PUllfTUFQIHwgRE1BX01FTU9SWV9JTykpID09IDApCisJCWdvdG8gb3V0OworCWlmICghc2l6ZSkKKwkJZ290byBvdXQ7CisJaWYgKGRldi0+ZG1hX21lbSkKKwkJZ290byBvdXQ7CisKKwkvKiBGSVhNRTogdGhpcyByb3V0aW5lIGp1c3QgaWdub3JlcyBETUFfTUVNT1JZX0lOQ0xVREVTX0NISUxEUkVOICovCisKKwltZW1fYmFzZSA9IGlvcmVtYXAoYnVzX2FkZHIsIHNpemUpOworCWlmICghbWVtX2Jhc2UpCisJCWdvdG8gb3V0OworCisJZGV2LT5kbWFfbWVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRtYV9jb2hlcmVudF9tZW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+ZG1hX21lbSkKKwkJZ290byBvdXQ7CisJbWVtc2V0KGRldi0+ZG1hX21lbSwgMCwgc2l6ZW9mKHN0cnVjdCBkbWFfY29oZXJlbnRfbWVtKSk7CisJZGV2LT5kbWFfbWVtLT5iaXRtYXAgPSBrbWFsbG9jKGJpdG1hcF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+ZG1hX21lbS0+Yml0bWFwKQorCQlnb3RvIGZyZWUxX291dDsKKwltZW1zZXQoZGV2LT5kbWFfbWVtLT5iaXRtYXAsIDAsIGJpdG1hcF9zaXplKTsKKworCWRldi0+ZG1hX21lbS0+dmlydF9iYXNlID0gbWVtX2Jhc2U7CisJZGV2LT5kbWFfbWVtLT5kZXZpY2VfYmFzZSA9IGRldmljZV9hZGRyOworCWRldi0+ZG1hX21lbS0+c2l6ZSA9IHBhZ2VzOworCWRldi0+ZG1hX21lbS0+ZmxhZ3MgPSBmbGFnczsKKworCWlmIChmbGFncyAmIERNQV9NRU1PUllfTUFQKQorCQlyZXR1cm4gRE1BX01FTU9SWV9NQVA7CisKKwlyZXR1cm4gRE1BX01FTU9SWV9JTzsKKworIGZyZWUxX291dDoKKwlrZnJlZShkZXYtPmRtYV9tZW0tPmJpdG1hcCk7Cisgb3V0OgorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkbWFfZGVjbGFyZV9jb2hlcmVudF9tZW1vcnkpOworCit2b2lkIGRtYV9yZWxlYXNlX2RlY2xhcmVkX21lbW9yeShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbSA9IGRldi0+ZG1hX21lbTsKKwkKKwlpZighbWVtKQorCQlyZXR1cm47CisJZGV2LT5kbWFfbWVtID0gTlVMTDsKKwlpb3VubWFwKG1lbS0+dmlydF9iYXNlKTsKKwlrZnJlZShtZW0tPmJpdG1hcCk7CisJa2ZyZWUobWVtKTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3JlbGVhc2VfZGVjbGFyZWRfbWVtb3J5KTsKKwordm9pZCAqZG1hX21hcmtfZGVjbGFyZWRfbWVtb3J5X29jY3VwaWVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJZG1hX2FkZHJfdCBkZXZpY2VfYWRkciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbSA9IGRldi0+ZG1hX21lbTsKKwlpbnQgcGFnZXMgPSAoc2l6ZSArIChkZXZpY2VfYWRkciAmIH5QQUdFX01BU0spICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwlpbnQgcG9zLCBlcnI7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlwb3MgPSAoZGV2aWNlX2FkZHIgLSBtZW0tPmRldmljZV9iYXNlKSA+PiBQQUdFX1NISUZUOworCWVyciA9IGJpdG1hcF9hbGxvY2F0ZV9yZWdpb24obWVtLT5iaXRtYXAsIHBvcywgZ2V0X29yZGVyKHBhZ2VzKSk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCXJldHVybiBtZW0tPnZpcnRfYmFzZSArIChwb3MgPDwgUEFHRV9TSElGVCk7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9tYXJrX2RlY2xhcmVkX21lbW9yeV9vY2N1cGllZCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNmZlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtMCwwICsxLDg0OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCisgKgorICogIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0CisgKglHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+LCBNYXkgMjAwMAorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaGFuZGxlcyB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwYXJ0cyBvZiBwcm9jZXNzIGhhbmRsaW5nLi4KKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvdXNlci5oPgorI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2xkdC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaTM4Ny5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2lmZGVmIENPTkZJR19NQVRIX0VNVUxBVElPTgorI2luY2x1ZGUgPGFzbS9tYXRoX2VtdS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCkgX19hc21fXygicmV0X2Zyb21fZm9yayIpOworCitzdGF0aWMgaW50IGhsdF9jb3VudGVyOworCit1bnNpZ25lZCBsb25nIGJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPSAwOworRVhQT1JUX1NZTUJPTChib290X29wdGlvbl9pZGxlX292ZXJyaWRlKTsKKworLyoKKyAqIFJldHVybiBzYXZlZCBQQyBvZiBhIGJsb2NrZWQgdGhyZWFkLgorICovCit1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nICopdHNrLT50aHJlYWQuZXNwKVszXTsKK30KKworLyoKKyAqIFBvd2VybWFuYWdlbWVudCBpZGxlIGZ1bmN0aW9uLCBpZiBhbnkuLgorICovCit2b2lkICgqcG1faWRsZSkodm9pZCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCBjcHVfaWRsZV9zdGF0ZSk7CisKK3ZvaWQgZGlzYWJsZV9obHQodm9pZCkKK3sKKwlobHRfY291bnRlcisrOworfQorCitFWFBPUlRfU1lNQk9MKGRpc2FibGVfaGx0KTsKKwordm9pZCBlbmFibGVfaGx0KHZvaWQpCit7CisJaGx0X2NvdW50ZXItLTsKK30KKworRVhQT1JUX1NZTUJPTChlbmFibGVfaGx0KTsKKworLyoKKyAqIFdlIHVzZSB0aGlzIGlmIHdlIGRvbid0IGhhdmUgYW55IGJldHRlcgorICogaWRsZSByb3V0aW5lLi4KKyAqLwordm9pZCBkZWZhdWx0X2lkbGUodm9pZCkKK3sKKwlpZiAoIWhsdF9jb3VudGVyICYmIGJvb3RfY3B1X2RhdGEuaGx0X3dvcmtzX29rKSB7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCWlmICghbmVlZF9yZXNjaGVkKCkpCisJCQlzYWZlX2hhbHQoKTsKKwkJZWxzZQorCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCX0gZWxzZSB7CisJCWNwdV9yZWxheCgpOworCX0KK30KKworLyoKKyAqIE9uIFNNUCBpdCdzIHNsaWdodGx5IGZhc3RlciAoYnV0IG11Y2ggbW9yZSBwb3dlci1jb25zdW1pbmchKQorICogdG8gcG9sbCB0aGUgLT53b3JrLm5lZWRfcmVzY2hlZCBmbGFnIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlCisgKiBjcm9zcy1DUFUgSVBJIHRvIGFycml2ZS4gVXNlIHRoaXMgb3B0aW9uIHdpdGggY2F1dGlvbi4KKyAqLworc3RhdGljIHZvaWQgcG9sbF9pZGxlICh2b2lkKQoreworCWludCBvbGR2YWw7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkvKgorCSAqIERlYWwgd2l0aCBhbm90aGVyIENQVSBqdXN0IGhhdmluZyBjaG9zZW4gYSB0aHJlYWQgdG8KKwkgKiBydW4gaGVyZToKKwkgKi8KKwlvbGR2YWwgPSB0ZXN0X2FuZF9jbGVhcl90aHJlYWRfZmxhZyhUSUZfTkVFRF9SRVNDSEVEKTsKKworCWlmICghb2xkdmFsKSB7CisJCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQlhc20gdm9sYXRpbGUoCisJCQkiMjoiCisJCQkidGVzdGwgJTAsICUxOyIKKwkJCSJyZXA7IG5vcDsiCisJCQkiamUgMmI7IgorCQkJOiA6ICJpIihfVElGX05FRURfUkVTQ0hFRCksICJtIiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncykpOworCisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisJfSBlbHNlIHsKKwkJc2V0X25lZWRfcmVzY2hlZCgpOworCX0KK30KKworLyoKKyAqIFRoZSBpZGxlIHRocmVhZC4gVGhlcmUncyBubyB1c2VmdWwgd29yayB0byBiZQorICogZG9uZSwgc28ganVzdCB0cnkgdG8gY29uc2VydmUgcG93ZXIgYW5kIGhhdmUgYQorICogbG93IGV4aXQgbGF0ZW5jeSAoaWUgc2l0IGluIGEgbG9vcCB3YWl0aW5nIGZvcgorICogc29tZWJvZHkgdG8gc2F5IHRoYXQgdGhleSdkIGxpa2UgdG8gcmVzY2hlZHVsZSkKKyAqLwordm9pZCBjcHVfaWRsZSAodm9pZCkKK3sKKwkvKiBlbmRsZXNzIGlkbGUgbG9vcCB3aXRoIG5vIHByaW9yaXR5IGF0IGFsbCAqLworCXdoaWxlICgxKSB7CisJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJCXZvaWQgKCppZGxlKSh2b2lkKTsKKworCQkJaWYgKF9fZ2V0X2NwdV92YXIoY3B1X2lkbGVfc3RhdGUpKQorCQkJCV9fZ2V0X2NwdV92YXIoY3B1X2lkbGVfc3RhdGUpID0gMDsKKworCQkJcm1iKCk7CisJCQlpZGxlID0gcG1faWRsZTsKKworCQkJaWYgKCFpZGxlKQorCQkJCWlkbGUgPSBkZWZhdWx0X2lkbGU7CisKKwkJCV9fZ2V0X2NwdV92YXIoaXJxX3N0YXQpLmlkbGVfdGltZXN0YW1wID0gamlmZmllczsKKwkJCWlkbGUoKTsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KK30KKwordm9pZCBjcHVfaWRsZV93YWl0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdSwgdGhpc19jcHUgPSBnZXRfY3B1KCk7CisJY3B1bWFza190IG1hcDsKKworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUodGhpc19jcHUpKTsKKwlwdXRfY3B1KCk7CisKKwljcHVzX2NsZWFyKG1hcCk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJcGVyX2NwdShjcHVfaWRsZV9zdGF0ZSwgY3B1KSA9IDE7CisJCWNwdV9zZXQoY3B1LCBtYXApOworCX0KKworCV9fZ2V0X2NwdV92YXIoY3B1X2lkbGVfc3RhdGUpID0gMDsKKworCXdtYigpOworCWRvIHsKKwkJc3NsZWVwKDEpOworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQkJaWYgKGNwdV9pc3NldChjcHUsIG1hcCkgJiYgIXBlcl9jcHUoY3B1X2lkbGVfc3RhdGUsIGNwdSkpCisJCQkJY3B1X2NsZWFyKGNwdSwgbWFwKTsKKwkJfQorCQljcHVzX2FuZChtYXAsIG1hcCwgY3B1X29ubGluZV9tYXApOworCX0gd2hpbGUgKCFjcHVzX2VtcHR5KG1hcCkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3B1X2lkbGVfd2FpdCk7CisKKy8qCisgKiBUaGlzIHVzZXMgbmV3IE1PTklUT1IvTVdBSVQgaW5zdHJ1Y3Rpb25zIG9uIFA0IHByb2Nlc3NvcnMgd2l0aCBQTkksCisgKiB3aGljaCBjYW4gb2J2aWF0ZSBJUEkgdG8gdHJpZ2dlciBjaGVja2luZyBvZiBuZWVkX3Jlc2NoZWQuCisgKiBXZSBleGVjdXRlIE1PTklUT1IgYWdhaW5zdCBuZWVkX3Jlc2NoZWQgYW5kIGVudGVyIG9wdGltaXplZCB3YWl0IHN0YXRlCisgKiB0aHJvdWdoIE1XQUlULiBXaGVuZXZlciBzb21lb25lIGNoYW5nZXMgbmVlZF9yZXNjaGVkLCB3ZSB3b3VsZCBiZSB3b2tlbgorICogdXAgZnJvbSBNV0FJVCAod2l0aG91dCBhbiBJUEkpLgorICovCitzdGF0aWMgdm9pZCBtd2FpdF9pZGxlKHZvaWQpCit7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgeworCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwkJZG8geworCQkJX19tb25pdG9yKCh2b2lkICopJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MsIDAsIDApOworCQkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJCWJyZWFrOworCQkJX19td2FpdCgwLCAwKTsKKwkJfSB3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKTsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IHNlbGVjdF9pZGxlX3JvdXRpbmUoY29uc3Qgc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01XQUlUKSkgeworCQlwcmludGsoIm1vbml0b3IvbXdhaXQgZmVhdHVyZSBwcmVzZW50LlxuIik7CisJCS8qCisJCSAqIFNraXAsIGlmIHNldHVwIGhhcyBvdmVycmlkZGVuIGlkbGUuCisJCSAqIE9uZSBDUFUgc3VwcG9ydHMgbXdhaXQgPT4gQWxsIENQVXMgc3VwcG9ydHMgbXdhaXQKKwkJICovCisJCWlmICghcG1faWRsZSkgeworCQkJcHJpbnRrKCJ1c2luZyBtd2FpdCBpbiBpZGxlIHRocmVhZHMuXG4iKTsKKwkJCXBtX2lkbGUgPSBtd2FpdF9pZGxlOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBpZGxlX3NldHVwIChjaGFyICpzdHIpCit7CisJaWYgKCFzdHJuY21wKHN0ciwgInBvbGwiLCA0KSkgeworCQlwcmludGsoInVzaW5nIHBvbGxpbmcgaWRsZSB0aHJlYWRzLlxuIik7CisJCXBtX2lkbGUgPSBwb2xsX2lkbGU7CisjaWZkZWYgQ09ORklHX1g4Nl9TTVAKKwkJaWYgKHNtcF9udW1fc2libGluZ3MgPiAxKQorCQkJcHJpbnRrKCJXQVJOSU5HOiBwb2xsaW5nIGlkbGUgYW5kIEhUIGVuYWJsZWQsIHBlcmZvcm1hbmNlIG1heSBkZWdyYWRlLlxuIik7CisjZW5kaWYKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwgImhhbHQiLCA0KSkgeworCQlwcmludGsoInVzaW5nIGhhbHQgaW4gaWRsZSB0aHJlYWRzLlxuIik7CisJCXBtX2lkbGUgPSBkZWZhdWx0X2lkbGU7CisJfQorCisJYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImlkbGU9IiwgaWRsZV9zZXR1cCk7CisKK3ZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGNyMCA9IDBMLCBjcjIgPSAwTCwgY3IzID0gMEwsIGNyNCA9IDBMOworCisJcHJpbnRrKCJcbiIpOworCXByaW50aygiUGlkOiAlZCwgY29tbTogJTIwc1xuIiwgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tKTsKKwlwcmludGsoIkVJUDogJTA0eDpbPCUwOGx4Pl0gQ1BVOiAlZFxuIiwweGZmZmYgJiByZWdzLT54Y3MscmVncy0+ZWlwLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXByaW50X3N5bWJvbCgiRUlQIGlzIGF0ICVzXG4iLCByZWdzLT5laXApOworCisJaWYgKHJlZ3MtPnhjcyAmIDMpCisJCXByaW50aygiIEVTUDogJTA0eDolMDhseCIsMHhmZmZmICYgcmVncy0+eHNzLHJlZ3MtPmVzcCk7CisJcHJpbnRrKCIgRUZMQUdTOiAlMDhseCAgICAlcyAgKCVzKVxuIiwKKwkgICAgICAgcmVncy0+ZWZsYWdzLCBwcmludF90YWludGVkKCksIHN5c3RlbV91dHNuYW1lLnJlbGVhc2UpOworCXByaW50aygiRUFYOiAlMDhseCBFQlg6ICUwOGx4IEVDWDogJTA4bHggRURYOiAlMDhseFxuIiwKKwkJcmVncy0+ZWF4LHJlZ3MtPmVieCxyZWdzLT5lY3gscmVncy0+ZWR4KTsKKwlwcmludGsoIkVTSTogJTA4bHggRURJOiAlMDhseCBFQlA6ICUwOGx4IiwKKwkJcmVncy0+ZXNpLCByZWdzLT5lZGksIHJlZ3MtPmVicCk7CisJcHJpbnRrKCIgRFM6ICUwNHggRVM6ICUwNHhcbiIsCisJCTB4ZmZmZiAmIHJlZ3MtPnhkcywweGZmZmYgJiByZWdzLT54ZXMpOworCisJX19hc21fXygibW92bCAlJWNyMCwgJTAiOiAiPXIiIChjcjApKTsKKwlfX2FzbV9fKCJtb3ZsICUlY3IyLCAlMCI6ICI9ciIgKGNyMikpOworCV9fYXNtX18oIm1vdmwgJSVjcjMsICUwIjogIj1yIiAoY3IzKSk7CisJLyogVGhpcyBjb3VsZCBmYXVsdCBpZiAlY3I0IGRvZXMgbm90IGV4aXN0ICovCisJX19hc21fXygiMTogbW92bCAlJWNyNCwgJTAJCVxuIgorCQkiMjoJCQkJXG4iCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiCVxuIgorCQkiLmxvbmcgMWIsMmIJCQlcbiIKKwkJIi5wcmV2aW91cwkJCVxuIgorCQk6ICI9ciIgKGNyNCk6ICIwIiAoMCkpOworCXByaW50aygiQ1IwOiAlMDhseCBDUjI6ICUwOGx4IENSMzogJTA4bHggQ1I0OiAlMDhseFxuIiwgY3IwLCBjcjIsIGNyMywgY3I0KTsKKwlzaG93X3RyYWNlKE5VTEwsICZyZWdzLT5lc3ApOworfQorCisvKgorICogVGhpcyBnZXRzIHJ1biB3aXRoICVlYnggY29udGFpbmluZyB0aGUKKyAqIGZ1bmN0aW9uIHRvIGNhbGwsIGFuZCAlZWR4IGNvbnRhaW5pbmcKKyAqIHRoZSAiYXJncyIuCisgKi8KK2V4dGVybiB2b2lkIGtlcm5lbF90aHJlYWRfaGVscGVyKHZvaWQpOworX19hc21fXygiLnNlY3Rpb24gLnRleHRcbiIKKwkiLmFsaWduIDRcbiIKKwkia2VybmVsX3RocmVhZF9oZWxwZXI6XG5cdCIKKwkibW92bCAlZWR4LCVlYXhcblx0IgorCSJwdXNobCAlZWR4XG5cdCIKKwkiY2FsbCAqJWVieFxuXHQiCisJInB1c2hsICVlYXhcblx0IgorCSJjYWxsIGRvX2V4aXRcbiIKKwkiLnByZXZpb3VzIik7CisKKy8qCisgKiBDcmVhdGUgYSBrZXJuZWwgdGhyZWFkCisgKi8KK2ludCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisKKwltZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7CisKKwlyZWdzLmVieCA9ICh1bnNpZ25lZCBsb25nKSBmbjsKKwlyZWdzLmVkeCA9ICh1bnNpZ25lZCBsb25nKSBhcmc7CisKKwlyZWdzLnhkcyA9IF9fVVNFUl9EUzsKKwlyZWdzLnhlcyA9IF9fVVNFUl9EUzsKKwlyZWdzLm9yaWdfZWF4ID0gLTE7CisJcmVncy5laXAgPSAodW5zaWduZWQgbG9uZykga2VybmVsX3RocmVhZF9oZWxwZXI7CisJcmVncy54Y3MgPSBfX0tFUk5FTF9DUzsKKwlyZWdzLmVmbGFncyA9IFg4Nl9FRkxBR1NfSUYgfCBYODZfRUZMQUdTX1NGIHwgWDg2X0VGTEFHU19QRiB8IDB4MjsKKworCS8qIE9rLCBjcmVhdGUgdGhlIG5ldyBwcm9jZXNzLi4gKi8KKwlyZXR1cm4gZG9fZm9yayhmbGFncyB8IENMT05FX1ZNIHwgQ0xPTkVfVU5UUkFDRUQsIDAsICZyZWdzLCAwLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIEZyZWUgY3VycmVudCB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzIGV0Yy4uCisgKi8KK3ZvaWQgZXhpdF90aHJlYWQodm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQgPSAmdHNrLT50aHJlYWQ7CisKKwkvKiBUaGUgcHJvY2VzcyBtYXkgaGF2ZSBhbGxvY2F0ZWQgYW4gaW8gcG9ydCBiaXRtYXAuLi4gbnVrZSBpdC4gKi8KKwlpZiAodW5saWtlbHkoTlVMTCAhPSB0LT5pb19iaXRtYXBfcHRyKSkgeworCQlpbnQgY3B1ID0gZ2V0X2NwdSgpOworCQlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisKKwkJa2ZyZWUodC0+aW9fYml0bWFwX3B0cik7CisJCXQtPmlvX2JpdG1hcF9wdHIgPSBOVUxMOworCQkvKgorCQkgKiBDYXJlZnVsLCBjbGVhciB0aGlzIGluIHRoZSBUU1MgdG9vOgorCQkgKi8KKwkJbWVtc2V0KHRzcy0+aW9fYml0bWFwLCAweGZmLCB0c3MtPmlvX2JpdG1hcF9tYXgpOworCQl0LT5pb19iaXRtYXBfbWF4ID0gMDsKKwkJdHNzLT5pb19iaXRtYXBfb3duZXIgPSBOVUxMOworCQl0c3MtPmlvX2JpdG1hcF9tYXggPSAwOworCQl0c3MtPmlvX2JpdG1hcF9iYXNlID0gSU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VUOworCQlwdXRfY3B1KCk7CisJfQorfQorCit2b2lkIGZsdXNoX3RocmVhZCh2b2lkKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCW1lbXNldCh0c2stPnRocmVhZC5kZWJ1Z3JlZywgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjgpOworCW1lbXNldCh0c2stPnRocmVhZC50bHNfYXJyYXksIDAsIHNpemVvZih0c2stPnRocmVhZC50bHNfYXJyYXkpKTsJCisJLyoKKwkgKiBGb3JnZXQgY29wcm9jZXNzb3Igc3RhdGUuLgorCSAqLworCWNsZWFyX2ZwdSh0c2spOworCWNsZWFyX3VzZWRfbWF0aCgpOworfQorCit2b2lkIHJlbGVhc2VfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqZGVhZF90YXNrKQoreworCWlmIChkZWFkX3Rhc2stPm1tKSB7CisJCS8vIHRlbXBvcmFyeSBkZWJ1Z2dpbmcgY2hlY2sKKwkJaWYgKGRlYWRfdGFzay0+bW0tPmNvbnRleHQuc2l6ZSkgeworCQkJcHJpbnRrKCJXQVJOSU5HOiBkZWFkIHByb2Nlc3MgJThzIHN0aWxsIGhhcyBMRFQ/IDwlcC8lZD5cbiIsCisJCQkJCWRlYWRfdGFzay0+Y29tbSwKKwkJCQkJZGVhZF90YXNrLT5tbS0+Y29udGV4dC5sZHQsCisJCQkJCWRlYWRfdGFzay0+bW0tPmNvbnRleHQuc2l6ZSk7CisJCQlCVUcoKTsKKwkJfQorCX0KKworCXJlbGVhc2Vfdm04Nl9pcnFzKGRlYWRfdGFzayk7Cit9CisKKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIGJlZm9yZSB3ZSBhbGxvY2F0ZSBhIG5ldyB0aHJlYWQgYW5kIGNvcHkKKyAqIHRoZSBjdXJyZW50IHRhc2sgaW50byBpdC4KKyAqLwordm9pZCBwcmVwYXJlX3RvX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJdW5sYXp5X2ZwdSh0c2spOworfQorCitpbnQgY29weV90aHJlYWQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIGVzcCwKKwl1bnNpZ25lZCBsb25nIHVudXNlZCwKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBwLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgKiBjaGlsZHJlZ3M7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJaW50IGVycjsKKworCWNoaWxkcmVncyA9ICgoc3RydWN0IHB0X3JlZ3MgKikgKFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvKSkgLSAxOworCSpjaGlsZHJlZ3MgPSAqcmVnczsKKwljaGlsZHJlZ3MtPmVheCA9IDA7CisJY2hpbGRyZWdzLT5lc3AgPSBlc3A7CisKKwlwLT50aHJlYWQuZXNwID0gKHVuc2lnbmVkIGxvbmcpIGNoaWxkcmVnczsKKwlwLT50aHJlYWQuZXNwMCA9ICh1bnNpZ25lZCBsb25nKSAoY2hpbGRyZWdzKzEpOworCisJcC0+dGhyZWFkLmVpcCA9ICh1bnNpZ25lZCBsb25nKSByZXRfZnJvbV9mb3JrOworCisJc2F2ZXNlZ21lbnQoZnMscC0+dGhyZWFkLmZzKTsKKwlzYXZlc2VnbWVudChncyxwLT50aHJlYWQuZ3MpOworCisJdHNrID0gY3VycmVudDsKKwlpZiAodW5saWtlbHkoTlVMTCAhPSB0c2stPnRocmVhZC5pb19iaXRtYXBfcHRyKSkgeworCQlwLT50aHJlYWQuaW9fYml0bWFwX3B0ciA9IGttYWxsb2MoSU9fQklUTUFQX0JZVEVTLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwLT50aHJlYWQuaW9fYml0bWFwX3B0cikgeworCQkJcC0+dGhyZWFkLmlvX2JpdG1hcF9tYXggPSAwOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtY3B5KHAtPnRocmVhZC5pb19iaXRtYXBfcHRyLCB0c2stPnRocmVhZC5pb19iaXRtYXBfcHRyLAorCQkJSU9fQklUTUFQX0JZVEVTKTsKKwl9CisKKwkvKgorCSAqIFNldCBhIG5ldyBUTFMgZm9yIHRoZSBjaGlsZCB0aHJlYWQ/CisJICovCisJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfU0VUVExTKSB7CisJCXN0cnVjdCBkZXNjX3N0cnVjdCAqZGVzYzsKKwkJc3RydWN0IHVzZXJfZGVzYyBpbmZvOworCQlpbnQgaWR4OworCisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgX191c2VyICopY2hpbGRyZWdzLT5lc2ksIHNpemVvZihpbmZvKSkpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKExEVF9lbXB0eSgmaW5mbykpCisJCQlnb3RvIG91dDsKKworCQlpZHggPSBpbmZvLmVudHJ5X251bWJlcjsKKwkJaWYgKGlkeCA8IEdEVF9FTlRSWV9UTFNfTUlOIHx8IGlkeCA+IEdEVF9FTlRSWV9UTFNfTUFYKQorCQkJZ290byBvdXQ7CisKKwkJZGVzYyA9IHAtPnRocmVhZC50bHNfYXJyYXkgKyBpZHggLSBHRFRfRU5UUllfVExTX01JTjsKKwkJZGVzYy0+YSA9IExEVF9lbnRyeV9hKCZpbmZvKTsKKwkJZGVzYy0+YiA9IExEVF9lbnRyeV9iKCZpbmZvKTsKKwl9CisKKwllcnIgPSAwOworIG91dDoKKwlpZiAoZXJyICYmIHAtPnRocmVhZC5pb19iaXRtYXBfcHRyKSB7CisJCWtmcmVlKHAtPnRocmVhZC5pb19iaXRtYXBfcHRyKTsKKwkJcC0+dGhyZWFkLmlvX2JpdG1hcF9tYXggPSAwOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGEgY29yZSBkdW1wLi4KKyAqLwordm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCB1c2VyICogZHVtcCkKK3sKKwlpbnQgaTsKKworLyogY2hhbmdlZCB0aGUgc2l6ZSBjYWxjdWxhdGlvbnMgLSBzaG91bGQgaG9wZWZ1bGx5IHdvcmsgYmV0dGVyLiBsYnQgKi8KKwlkdW1wLT5tYWdpYyA9IENNQUdJQzsKKwlkdW1wLT5zdGFydF9jb2RlID0gMDsKKwlkdW1wLT5zdGFydF9zdGFjayA9IHJlZ3MtPmVzcCAmIH4oUEFHRV9TSVpFIC0gMSk7CisJZHVtcC0+dV90c2l6ZSA9ICgodW5zaWduZWQgbG9uZykgY3VycmVudC0+bW0tPmVuZF9jb2RlKSA+PiBQQUdFX1NISUZUOworCWR1bXAtPnVfZHNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIChjdXJyZW50LT5tbS0+YnJrICsgKFBBR0VfU0laRS0xKSkpID4+IFBBR0VfU0hJRlQ7CisJZHVtcC0+dV9kc2l6ZSAtPSBkdW1wLT51X3RzaXplOworCWR1bXAtPnVfc3NpemUgPSAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWR1bXAtPnVfZGVidWdyZWdbaV0gPSBjdXJyZW50LT50aHJlYWQuZGVidWdyZWdbaV07ICAKKworCWlmIChkdW1wLT5zdGFydF9zdGFjayA8IFRBU0tfU0laRSkKKwkJZHVtcC0+dV9zc2l6ZSA9ICgodW5zaWduZWQgbG9uZykgKFRBU0tfU0laRSAtIGR1bXAtPnN0YXJ0X3N0YWNrKSkgPj4gUEFHRV9TSElGVDsKKworCWR1bXAtPnJlZ3MuZWJ4ID0gcmVncy0+ZWJ4OworCWR1bXAtPnJlZ3MuZWN4ID0gcmVncy0+ZWN4OworCWR1bXAtPnJlZ3MuZWR4ID0gcmVncy0+ZWR4OworCWR1bXAtPnJlZ3MuZXNpID0gcmVncy0+ZXNpOworCWR1bXAtPnJlZ3MuZWRpID0gcmVncy0+ZWRpOworCWR1bXAtPnJlZ3MuZWJwID0gcmVncy0+ZWJwOworCWR1bXAtPnJlZ3MuZWF4ID0gcmVncy0+ZWF4OworCWR1bXAtPnJlZ3MuZHMgPSByZWdzLT54ZHM7CisJZHVtcC0+cmVncy5lcyA9IHJlZ3MtPnhlczsKKwlzYXZlc2VnbWVudChmcyxkdW1wLT5yZWdzLmZzKTsKKwlzYXZlc2VnbWVudChncyxkdW1wLT5yZWdzLmdzKTsKKwlkdW1wLT5yZWdzLm9yaWdfZWF4ID0gcmVncy0+b3JpZ19lYXg7CisJZHVtcC0+cmVncy5laXAgPSByZWdzLT5laXA7CisJZHVtcC0+cmVncy5jcyA9IHJlZ3MtPnhjczsKKwlkdW1wLT5yZWdzLmVmbGFncyA9IHJlZ3MtPmVmbGFnczsKKwlkdW1wLT5yZWdzLmVzcCA9IHJlZ3MtPmVzcDsKKwlkdW1wLT5yZWdzLnNzID0gcmVncy0+eHNzOworCisJZHVtcC0+dV9mcHZhbGlkID0gZHVtcF9mcHUgKHJlZ3MsICZkdW1wLT5pMzg3KTsKK30KKworLyogCisgKiBDYXB0dXJlIHRoZSB1c2VyIHNwYWNlIHJlZ2lzdGVycyBpZiB0aGUgdGFzayBpcyBub3QgcnVubmluZyAoaW4gdXNlciBzcGFjZSkKKyAqLworaW50IGR1bXBfdGFza19yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBlbGZfZ3JlZ3NldF90ICpyZWdzKQoreworCXN0cnVjdCBwdF9yZWdzIHB0cmVnczsKKwkKKwlwdHJlZ3MgPSAqKHN0cnVjdCBwdF9yZWdzICopCisJCSgodW5zaWduZWQgbG9uZyl0c2stPnRocmVhZF9pbmZvK1RIUkVBRF9TSVpFIC0gc2l6ZW9mKHB0cmVncykpOworCXB0cmVncy54Y3MgJj0gMHhmZmZmOworCXB0cmVncy54ZHMgJj0gMHhmZmZmOworCXB0cmVncy54ZXMgJj0gMHhmZmZmOworCXB0cmVncy54c3MgJj0gMHhmZmZmOworCisJZWxmX2NvcmVfY29weV9yZWdzKHJlZ3MsICZwdHJlZ3MpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraGFuZGxlX2lvX2JpdG1hcChzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqbmV4dCwgc3RydWN0IHRzc19zdHJ1Y3QgKnRzcykKK3sKKwlpZiAoIW5leHQtPmlvX2JpdG1hcF9wdHIpIHsKKwkJLyoKKwkJICogRGlzYWJsZSB0aGUgYml0bWFwIHZpYSBhbiBpbnZhbGlkIG9mZnNldC4gV2Ugc3RpbGwgY2FjaGUKKwkJICogdGhlIHByZXZpb3VzIGJpdG1hcCBvd25lciBhbmQgdGhlIElPIGJpdG1hcCBjb250ZW50czoKKwkJICovCisJCXRzcy0+aW9fYml0bWFwX2Jhc2UgPSBJTlZBTElEX0lPX0JJVE1BUF9PRkZTRVQ7CisJCXJldHVybjsKKwl9CisJaWYgKGxpa2VseShuZXh0ID09IHRzcy0+aW9fYml0bWFwX293bmVyKSkgeworCQkvKgorCQkgKiBQcmV2aW91cyBvd25lciBvZiB0aGUgYml0bWFwIChoZW5jZSB0aGUgYml0bWFwIGNvbnRlbnQpCisJCSAqIG1hdGNoZXMgdGhlIG5leHQgdGFzaywgd2UgZG9udCBoYXZlIHRvIGRvIGFueXRoaW5nIGJ1dAorCQkgKiB0byBzZXQgYSB2YWxpZCBvZmZzZXQgaW4gdGhlIFRTUzoKKwkJICovCisJCXRzcy0+aW9fYml0bWFwX2Jhc2UgPSBJT19CSVRNQVBfT0ZGU0VUOworCQlyZXR1cm47CisJfQorCS8qCisJICogTGF6eSBUU1MncyBJL08gYml0bWFwIGNvcHkuIFdlIHNldCBhbiBpbnZhbGlkIG9mZnNldCBoZXJlCisJICogYW5kIHdlIGxldCB0aGUgdGFzayB0byBnZXQgYSBHUEYgaW4gY2FzZSBhbiBJL08gaW5zdHJ1Y3Rpb24KKwkgKiBpcyBwZXJmb3JtZWQuICBUaGUgaGFuZGxlciBvZiB0aGUgR1BGIHdpbGwgdmVyaWZ5IHRoYXQgdGhlCisJICogZmF1bHRpbmcgdGFzayBoYXMgYSB2YWxpZCBJL08gYml0bWFwIGFuZCwgaXQgdHJ1ZSwgZG9lcyB0aGUKKwkgKiByZWFsIGNvcHkgYW5kIHJlc3RhcnQgdGhlIGluc3RydWN0aW9uLiAgVGhpcyB3aWxsIHNhdmUgdXMKKwkgKiByZWR1bmRhbnQgY29waWVzIHdoZW4gdGhlIGN1cnJlbnRseSBzd2l0Y2hlZCB0YXNrIGRvZXMgbm90CisJICogcGVyZm9ybSBhbnkgSS9PIGR1cmluZyBpdHMgdGltZXNsaWNlLgorCSAqLworCXRzcy0+aW9fYml0bWFwX2Jhc2UgPSBJTlZBTElEX0lPX0JJVE1BUF9PRkZTRVRfTEFaWTsKK30KKy8qCisgKiBUaGlzIHNwZWNpYWwgbWFjcm8gY2FuIGJlIHVzZWQgdG8gbG9hZCBhIGRlYnVnZ2luZyByZWdpc3RlcgorICovCisjZGVmaW5lIGxvYWRkZWJ1Zyh0aHJlYWQscmVnaXN0ZXIpIFwKKwkJX19hc21fXygibW92bCAlMCwlJWRiIiAjcmVnaXN0ZXIgIFwKKwkJCTogLyogbm8gb3V0cHV0ICovIFwKKwkJCToiciIgKHRocmVhZC0+ZGVidWdyZWdbcmVnaXN0ZXJdKSkKKworLyoKKyAqCXN3aXRjaF90byh4LHluKSBzaG91bGQgc3dpdGNoIHRhc2tzIGZyb20geCB0byB5LgorICoKKyAqIFdlIGZzYXZlL2Z3YWl0IHNvIHRoYXQgYW4gZXhjZXB0aW9uIGdvZXMgb2ZmIGF0IHRoZSByaWdodCB0aW1lCisgKiAoYXMgYSBjYWxsIGZyb20gdGhlIGZzYXZlIG9yIGZ3YWl0IGluIGVmZmVjdCkgcmF0aGVyIHRoYW4gdG8KKyAqIHRoZSB3cm9uZyBwcm9jZXNzLiBMYXp5IEZQIHNhdmluZyBubyBsb25nZXIgbWFrZXMgYW55IHNlbnNlCisgKiB3aXRoIG1vZGVybiBDUFUncywgYW5kIHRoaXMgc2ltcGxpZmllcyBhIGxvdCBvZiB0aGluZ3MgKFNNUAorICogYW5kIFVQIGJlY29tZSB0aGUgc2FtZSkuCisgKgorICogTk9URSEgV2UgdXNlZCB0byB1c2UgdGhlIHg4NiBoYXJkd2FyZSBjb250ZXh0IHN3aXRjaGluZy4gVGhlCisgKiByZWFzb24gZm9yIG5vdCB1c2luZyBpdCBhbnkgbW9yZSBiZWNvbWVzIGFwcGFyZW50IHdoZW4geW91CisgKiB0cnkgdG8gcmVjb3ZlciBncmFjZWZ1bGx5IGZyb20gc2F2ZWQgc3RhdGUgdGhhdCBpcyBubyBsb25nZXIKKyAqIHZhbGlkIChzdGFsZSBzZWdtZW50IHJlZ2lzdGVyIHZhbHVlcyBpbiBwYXJ0aWN1bGFyKS4gV2l0aCB0aGUKKyAqIGhhcmR3YXJlIHRhc2stc3dpdGNoLCB0aGVyZSBpcyBubyB3YXkgdG8gZml4IHVwIGJhZCBzdGF0ZSBpbgorICogYSByZWFzb25hYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgZmFjdCB0aGF0IEludGVsIGRvY3VtZW50cyB0aGUgaGFyZHdhcmUgdGFzay1zd2l0Y2hpbmcgdG8KKyAqIGJlIHNsb3cgaXMgYSBmYWlybHkgcmVkIGhlcnJpbmcgLSB0aGlzIGNvZGUgaXMgbm90IG5vdGljZWFibHkKKyAqIGZhc3Rlci4gSG93ZXZlciwgdGhlcmUgX2lzXyBzb21lIHJvb20gZm9yIGltcHJvdmVtZW50IGhlcmUsCisgKiBzbyB0aGUgcGVyZm9ybWFuY2UgaXNzdWVzIG1heSBldmVudHVhbGx5IGJlIGEgdmFsaWQgcG9pbnQuCisgKiBNb3JlIGltcG9ydGFudCwgaG93ZXZlciwgaXMgdGhlIGZhY3QgdGhhdCB0aGlzIGFsbG93cyB1cyBtdWNoCisgKiBtb3JlIGZsZXhpYmlsaXR5LgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgKGluICVlYXgpIHdpbGwgYmUgdGhlICJwcmV2IiB0YXNrIGFmdGVyCisgKiB0aGUgdGFzay1zd2l0Y2gsIGFuZCBzaG93cyB1cCBpbiByZXRfZnJvbV9mb3JrIGluIGVudHJ5LlMsCisgKiBmb3IgZXhhbXBsZS4KKyAqLworc3RydWN0IHRhc2tfc3RydWN0IGZhc3RjYWxsICogX19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2X3AsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dF9wKQoreworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICpwcmV2ID0gJnByZXZfcC0+dGhyZWFkLAorCQkJCSAqbmV4dCA9ICZuZXh0X3AtPnRocmVhZDsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCB0c3Nfc3RydWN0ICp0c3MgPSAmcGVyX2NwdShpbml0X3RzcywgY3B1KTsKKworCS8qIG5ldmVyIHB1dCBhIHByaW50ayBpbiBfX3N3aXRjaF90by4uLiBwcmludGsoKSBjYWxscyB3YWtlX3VwKigpIGluZGlyZWN0bHkgKi8KKworCV9fdW5sYXp5X2ZwdShwcmV2X3ApOworCisJLyoKKwkgKiBSZWxvYWQgZXNwMCwgTERUIGFuZCB0aGUgcGFnZSB0YWJsZSBwb2ludGVyOgorCSAqLworCWxvYWRfZXNwMCh0c3MsIG5leHQpOworCisJLyoKKwkgKiBMb2FkIHRoZSBwZXItdGhyZWFkIFRocmVhZC1Mb2NhbCBTdG9yYWdlIGRlc2NyaXB0b3IuCisJICovCisJbG9hZF9UTFMobmV4dCwgY3B1KTsKKworCS8qCisJICogU2F2ZSBhd2F5ICVmcyBhbmQgJWdzLiBObyBuZWVkIHRvIHNhdmUgJWVzIGFuZCAlZHMsIGFzCisJICogdGhvc2UgYXJlIGFsd2F5cyBrZXJuZWwgc2VnbWVudHMgd2hpbGUgaW5zaWRlIHRoZSBrZXJuZWwuCisJICovCisJYXNtIHZvbGF0aWxlKCJtb3ZsICUlZnMsJTAiOiI9bSIgKCooaW50ICopJnByZXYtPmZzKSk7CisJYXNtIHZvbGF0aWxlKCJtb3ZsICUlZ3MsJTAiOiI9bSIgKCooaW50ICopJnByZXYtPmdzKSk7CisKKwkvKgorCSAqIFJlc3RvcmUgJWZzIGFuZCAlZ3MgaWYgbmVlZGVkLgorCSAqLworCWlmICh1bmxpa2VseShwcmV2LT5mcyB8IHByZXYtPmdzIHwgbmV4dC0+ZnMgfCBuZXh0LT5ncykpIHsKKwkJbG9hZHNlZ21lbnQoZnMsIG5leHQtPmZzKTsKKwkJbG9hZHNlZ21lbnQoZ3MsIG5leHQtPmdzKTsKKwl9CisKKwkvKgorCSAqIE5vdyBtYXliZSByZWxvYWQgdGhlIGRlYnVnIHJlZ2lzdGVycworCSAqLworCWlmICh1bmxpa2VseShuZXh0LT5kZWJ1Z3JlZ1s3XSkpIHsKKwkJbG9hZGRlYnVnKG5leHQsIDApOworCQlsb2FkZGVidWcobmV4dCwgMSk7CisJCWxvYWRkZWJ1ZyhuZXh0LCAyKTsKKwkJbG9hZGRlYnVnKG5leHQsIDMpOworCQkvKiBubyA0IGFuZCA1ICovCisJCWxvYWRkZWJ1ZyhuZXh0LCA2KTsKKwkJbG9hZGRlYnVnKG5leHQsIDcpOworCX0KKworCWlmICh1bmxpa2VseShwcmV2LT5pb19iaXRtYXBfcHRyIHx8IG5leHQtPmlvX2JpdG1hcF9wdHIpKQorCQloYW5kbGVfaW9fYml0bWFwKG5leHQsIHRzcyk7CisKKwlyZXR1cm4gcHJldl9wOworfQorCithc21saW5rYWdlIGludCBzeXNfZm9yayhzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXJldHVybiBkb19mb3JrKFNJR0NITEQsIHJlZ3MuZXNwLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7Cit9CisKK2FzbWxpbmthZ2UgaW50IHN5c19jbG9uZShzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBuZXdzcDsKKwlpbnQgX191c2VyICpwYXJlbnRfdGlkcHRyLCAqY2hpbGRfdGlkcHRyOworCisJY2xvbmVfZmxhZ3MgPSByZWdzLmVieDsKKwluZXdzcCA9IHJlZ3MuZWN4OworCXBhcmVudF90aWRwdHIgPSAoaW50IF9fdXNlciAqKXJlZ3MuZWR4OworCWNoaWxkX3RpZHB0ciA9IChpbnQgX191c2VyICopcmVncy5lZGk7CisJaWYgKCFuZXdzcCkKKwkJbmV3c3AgPSByZWdzLmVzcDsKKwlyZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgbmV3c3AsICZyZWdzLCAwLCBwYXJlbnRfdGlkcHRyLCBjaGlsZF90aWRwdHIpOworfQorCisvKgorICogVGhpcyBpcyB0cml2aWFsLCBhbmQgb24gdGhlIGZhY2Ugb2YgaXQgbG9va3MgbGlrZSBpdAorICogY291bGQgZXF1YWxseSB3ZWxsIGJlIGRvbmUgaW4gdXNlciBtb2RlLgorICoKKyAqIE5vdCBzbywgZm9yIHF1aXRlIHVub2J2aW91cyByZWFzb25zIC0gcmVnaXN0ZXIgcHJlc3N1cmUuCisgKiBJbiB1c2VyIG1vZGUgdmZvcmsoKSBjYW5ub3QgaGF2ZSBhIHN0YWNrIGZyYW1lLCBhbmQgaWYKKyAqIGRvbmUgYnkgY2FsbGluZyB0aGUgImNsb25lKCkiIHN5c3RlbSBjYWxsIGRpcmVjdGx5LCB5b3UKKyAqIGRvIG5vdCBoYXZlIGVub3VnaCBjYWxsLWNsb2JiZXJlZCByZWdpc3RlcnMgdG8gaG9sZCBhbGwKKyAqIHRoZSBpbmZvcm1hdGlvbiB5b3UgbmVlZC4KKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX3Zmb3JrKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCit7CisJcmV0dXJuIGRvX2ZvcmsoQ0xPTkVfVkZPUksgfCBDTE9ORV9WTSB8IFNJR0NITEQsIHJlZ3MuZXNwLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCWludCBlcnJvcjsKKwljaGFyICogZmlsZW5hbWU7CisKKwlmaWxlbmFtZSA9IGdldG5hbWUoKGNoYXIgX191c2VyICopIHJlZ3MuZWJ4KTsKKwllcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOworCWlmIChJU19FUlIoZmlsZW5hbWUpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRvX2V4ZWN2ZShmaWxlbmFtZSwKKwkJCShjaGFyIF9fdXNlciAqIF9fdXNlciAqKSByZWdzLmVjeCwKKwkJCShjaGFyIF9fdXNlciAqIF9fdXNlciAqKSByZWdzLmVkeCwKKwkJCSZyZWdzKTsKKwlpZiAoZXJyb3IgPT0gMCkgeworCQl0YXNrX2xvY2soY3VycmVudCk7CisJCWN1cnJlbnQtPnB0cmFjZSAmPSB+UFRfRFRSQUNFOworCQl0YXNrX3VubG9jayhjdXJyZW50KTsKKwkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHJldHVybiB1c2luZyBzeXNlbnRlci4uICovCisJCXNldF90aHJlYWRfZmxhZyhUSUZfSVJFVCk7CisJfQorCXB1dG5hbWUoZmlsZW5hbWUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworI2RlZmluZSB0b3BfZXNwICAgICAgICAgICAgICAgIChUSFJFQURfU0laRSAtIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKyNkZWZpbmUgdG9wX2VicCAgICAgICAgICAgICAgICAoVEhSRUFEX1NJWkUgLSAyKnNpemVvZih1bnNpZ25lZCBsb25nKSkKKwordW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXVuc2lnbmVkIGxvbmcgZWJwLCBlc3AsIGVpcDsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX3BhZ2U7CisJaW50IGNvdW50ID0gMDsKKwlpZiAoIXAgfHwgcCA9PSBjdXJyZW50IHx8IHAtPnN0YXRlID09IFRBU0tfUlVOTklORykKKwkJcmV0dXJuIDA7CisJc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXAtPnRocmVhZF9pbmZvOworCWVzcCA9IHAtPnRocmVhZC5lc3A7CisJaWYgKCFzdGFja19wYWdlIHx8IGVzcCA8IHN0YWNrX3BhZ2UgfHwgZXNwID4gdG9wX2VzcCtzdGFja19wYWdlKQorCQlyZXR1cm4gMDsKKwkvKiBpbmNsdWRlL2FzbS1pMzg2L3N5c3RlbS5oOnN3aXRjaF90bygpIHB1c2hlcyBlYnAgbGFzdC4gKi8KKwllYnAgPSAqKHVuc2lnbmVkIGxvbmcgKikgZXNwOworCWRvIHsKKwkJaWYgKGVicCA8IHN0YWNrX3BhZ2UgfHwgZWJwID4gdG9wX2VicCtzdGFja19wYWdlKQorCQkJcmV0dXJuIDA7CisJCWVpcCA9ICoodW5zaWduZWQgbG9uZyAqKSAoZWJwKzQpOworCQlpZiAoIWluX3NjaGVkX2Z1bmN0aW9ucyhlaXApKQorCQkJcmV0dXJuIGVpcDsKKwkJZWJwID0gKih1bnNpZ25lZCBsb25nICopIGVicDsKKwl9IHdoaWxlIChjb3VudCsrIDwgMTYpOworCXJldHVybiAwOworfQorCisvKgorICogc3lzX2FsbG9jX3RocmVhZF9hcmVhOiBnZXQgYSB5ZXQgdW51c2VkIFRMUyBkZXNjcmlwdG9yIGluZGV4LgorICovCitzdGF0aWMgaW50IGdldF9mcmVlX2lkeCh2b2lkKQoreworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0ID0gJmN1cnJlbnQtPnRocmVhZDsKKwlpbnQgaWR4OworCisJZm9yIChpZHggPSAwOyBpZHggPCBHRFRfRU5UUllfVExTX0VOVFJJRVM7IGlkeCsrKQorCQlpZiAoZGVzY19lbXB0eSh0LT50bHNfYXJyYXkgKyBpZHgpKQorCQkJcmV0dXJuIGlkeCArIEdEVF9FTlRSWV9UTFNfTUlOOworCXJldHVybiAtRVNSQ0g7Cit9CisKKy8qCisgKiBTZXQgYSBnaXZlbiBUTFMgZGVzY3JpcHRvcjoKKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX3NldF90aHJlYWRfYXJlYShzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqdV9pbmZvKQoreworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0ID0gJmN1cnJlbnQtPnRocmVhZDsKKwlzdHJ1Y3QgdXNlcl9kZXNjIGluZm87CisJc3RydWN0IGRlc2Nfc3RydWN0ICpkZXNjOworCWludCBjcHUsIGlkeDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgdV9pbmZvLCBzaXplb2YoaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZHggPSBpbmZvLmVudHJ5X251bWJlcjsKKworCS8qCisJICogaW5kZXggLTEgbWVhbnMgdGhlIGtlcm5lbCBzaG91bGQgdHJ5IHRvIGZpbmQgYW5kCisJICogYWxsb2NhdGUgYW4gZW1wdHkgZGVzY3JpcHRvcjoKKwkgKi8KKwlpZiAoaWR4ID09IC0xKSB7CisJCWlkeCA9IGdldF9mcmVlX2lkeCgpOworCQlpZiAoaWR4IDwgMCkKKwkJCXJldHVybiBpZHg7CisJCWlmIChwdXRfdXNlcihpZHgsICZ1X2luZm8tPmVudHJ5X251bWJlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoaWR4IDwgR0RUX0VOVFJZX1RMU19NSU4gfHwgaWR4ID4gR0RUX0VOVFJZX1RMU19NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJZGVzYyA9IHQtPnRsc19hcnJheSArIGlkeCAtIEdEVF9FTlRSWV9UTFNfTUlOOworCisJLyoKKwkgKiBXZSBtdXN0IG5vdCBnZXQgcHJlZW1wdGVkIHdoaWxlIG1vZGlmeWluZyB0aGUgVExTLgorCSAqLworCWNwdSA9IGdldF9jcHUoKTsKKworCWlmIChMRFRfZW1wdHkoJmluZm8pKSB7CisJCWRlc2MtPmEgPSAwOworCQlkZXNjLT5iID0gMDsKKwl9IGVsc2UgeworCQlkZXNjLT5hID0gTERUX2VudHJ5X2EoJmluZm8pOworCQlkZXNjLT5iID0gTERUX2VudHJ5X2IoJmluZm8pOworCX0KKwlsb2FkX1RMUyh0LCBjcHUpOworCisJcHV0X2NwdSgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgVGhyZWFkLUxvY2FsIFN0b3JhZ2UgYXJlYToKKyAqLworCisjZGVmaW5lIEdFVF9CQVNFKGRlc2MpICggXAorCSgoKGRlc2MpLT5hID4+IDE2KSAmIDB4MDAwMGZmZmYpIHwgXAorCSgoKGRlc2MpLT5iIDw8IDE2KSAmIDB4MDBmZjAwMDApIHwgXAorCSggKGRlc2MpLT5iICAgICAgICAmIDB4ZmYwMDAwMDApICAgKQorCisjZGVmaW5lIEdFVF9MSU1JVChkZXNjKSAoIFwKKwkoKGRlc2MpLT5hICYgMHgwZmZmZikgfCBcCisJICgoZGVzYyktPmIgJiAweGYwMDAwKSApCisJCisjZGVmaW5lIEdFVF8zMkJJVChkZXNjKQkJKCgoZGVzYyktPmIgPj4gMjIpICYgMSkKKyNkZWZpbmUgR0VUX0NPTlRFTlRTKGRlc2MpCSgoKGRlc2MpLT5iID4+IDEwKSAmIDMpCisjZGVmaW5lIEdFVF9XUklUQUJMRShkZXNjKQkoKChkZXNjKS0+YiA+PiAgOSkgJiAxKQorI2RlZmluZSBHRVRfTElNSVRfUEFHRVMoZGVzYykJKCgoZGVzYyktPmIgPj4gMjMpICYgMSkKKyNkZWZpbmUgR0VUX1BSRVNFTlQoZGVzYykJKCgoZGVzYyktPmIgPj4gMTUpICYgMSkKKyNkZWZpbmUgR0VUX1VTRUFCTEUoZGVzYykJKCgoZGVzYyktPmIgPj4gMjApICYgMSkKKworYXNtbGlua2FnZSBpbnQgc3lzX2dldF90aHJlYWRfYXJlYShzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqdV9pbmZvKQoreworCXN0cnVjdCB1c2VyX2Rlc2MgaW5mbzsKKwlzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmRlc2M7CisJaW50IGlkeDsKKworCWlmIChnZXRfdXNlcihpZHgsICZ1X2luZm8tPmVudHJ5X251bWJlcikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChpZHggPCBHRFRfRU5UUllfVExTX01JTiB8fCBpZHggPiBHRFRfRU5UUllfVExTX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXNjID0gY3VycmVudC0+dGhyZWFkLnRsc19hcnJheSArIGlkeCAtIEdEVF9FTlRSWV9UTFNfTUlOOworCisJaW5mby5lbnRyeV9udW1iZXIgPSBpZHg7CisJaW5mby5iYXNlX2FkZHIgPSBHRVRfQkFTRShkZXNjKTsKKwlpbmZvLmxpbWl0ID0gR0VUX0xJTUlUKGRlc2MpOworCWluZm8uc2VnXzMyYml0ID0gR0VUXzMyQklUKGRlc2MpOworCWluZm8uY29udGVudHMgPSBHRVRfQ09OVEVOVFMoZGVzYyk7CisJaW5mby5yZWFkX2V4ZWNfb25seSA9ICFHRVRfV1JJVEFCTEUoZGVzYyk7CisJaW5mby5saW1pdF9pbl9wYWdlcyA9IEdFVF9MSU1JVF9QQUdFUyhkZXNjKTsKKwlpbmZvLnNlZ19ub3RfcHJlc2VudCA9ICFHRVRfUFJFU0VOVChkZXNjKTsKKwlpbmZvLnVzZWFibGUgPSBHRVRfVVNFQUJMRShkZXNjKTsKKworCWlmIChjb3B5X3RvX3VzZXIodV9pbmZvLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbl9zdGFjayh1bnNpZ25lZCBsb25nIHNwKQoreworCWlmIChyYW5kb21pemVfdmFfc3BhY2UpCisJCXNwIC09IGdldF9yYW5kb21faW50KCkgJSA4MTkyOworCXJldHVybiBzcCAmIH4weGY7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmYxNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYwpAQCAtMCwwICsxLDcxNyBAQAorLyogcHRyYWNlLmMgKi8KKy8qIEJ5IFJvc3MgQmlybyAxLzIzLzkyICovCisvKgorICogUGVudGl1bSBJSUkgRlhTUiwgU1NFIHN1cHBvcnQKKyAqCUdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4sIE1heSAyMDAwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdXNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaTM4Ny5oPgorI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgorI2luY2x1ZGUgPGFzbS9sZHQuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorCisvKgorICogZG9lcyBub3QgeWV0IGNhdGNoIHNpZ25hbHMgc2VudCB3aGVuIHRoZSBjaGlsZCBkaWVzLgorICogaW4gZXhpdC5jIG9yIGluIHNpZ25hbC5jLgorICovCisKKy8qIGRldGVybWluZXMgd2hpY2ggZmxhZ3MgdGhlIHVzZXIgaGFzIGFjY2VzcyB0by4gKi8KKy8qIDEgPSBhY2Nlc3MgMCA9IG5vIGFjY2VzcyAqLworI2RlZmluZSBGTEFHX01BU0sgMHgwMDA0NGRkNQorCisvKiBzZXQncyB0aGUgdHJhcCBmbGFnLiAqLworI2RlZmluZSBUUkFQX0ZMQUcgMHgxMDAKKworLyoKKyAqIE9mZnNldCBvZiBlZmxhZ3Mgb24gY2hpbGQgc3RhY2suLgorICovCisjZGVmaW5lIEVGTF9PRkZTRVQgKChFRkwtMikqNC1zaXplb2Yoc3RydWN0IHB0X3JlZ3MpKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwdF9yZWdzICpnZXRfY2hpbGRfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJdm9pZCAqc3RhY2tfdG9wID0gKHZvaWQgKil0YXNrLT50aHJlYWQuZXNwMDsKKwlyZXR1cm4gc3RhY2tfdG9wIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKTsKK30KKworLyoKKyAqIHRoaXMgcm91dGluZSB3aWxsIGdldCBhIHdvcmQgb2ZmIG9mIHRoZSBwcm9jZXNzZXMgcHJpdmlsZWdlZCBzdGFjay4gCisgKiB0aGUgb2Zmc2V0IGlzIGhvdyBmYXIgZnJvbSB0aGUgYmFzZSBhZGRyIGFzIHN0b3JlZCBpbiB0aGUgVFNTLiAgCisgKiB0aGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IGFsbCB0aGUgcHJpdmlsZWdlZCBzdGFja3MgYXJlIGluIG91cgorICogZGF0YSBzcGFjZS4KKyAqLyAgIAorc3RhdGljIGlubGluZSBpbnQgZ2V0X3N0YWNrX2xvbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGNoYXIgKnN0YWNrOworCisJc3RhY2sgPSAodW5zaWduZWQgY2hhciAqKXRhc2stPnRocmVhZC5lc3AwOworCXN0YWNrICs9IG9mZnNldDsKKwlyZXR1cm4gKCooKGludCAqKXN0YWNrKSk7Cit9CisKKy8qCisgKiB0aGlzIHJvdXRpbmUgd2lsbCBwdXQgYSB3b3JkIG9uIHRoZSBwcm9jZXNzZXMgcHJpdmlsZWdlZCBzdGFjay4gCisgKiB0aGUgb2Zmc2V0IGlzIGhvdyBmYXIgZnJvbSB0aGUgYmFzZSBhZGRyIGFzIHN0b3JlZCBpbiB0aGUgVFNTLiAgCisgKiB0aGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IGFsbCB0aGUgcHJpdmlsZWdlZCBzdGFja3MgYXJlIGluIG91cgorICogZGF0YSBzcGFjZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcHV0X3N0YWNrX2xvbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb2Zmc2V0LAorCXVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyICogc3RhY2s7CisKKwlzdGFjayA9ICh1bnNpZ25lZCBjaGFyICopIHRhc2stPnRocmVhZC5lc3AwOworCXN0YWNrICs9IG9mZnNldDsKKwkqKHVuc2lnbmVkIGxvbmcgKikgc3RhY2sgPSBkYXRhOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1dHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAorCXVuc2lnbmVkIGxvbmcgcmVnbm8sIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJc3dpdGNoIChyZWdubyA+PiAyKSB7CisJCWNhc2UgRlM6CisJCQlpZiAodmFsdWUgJiYgKHZhbHVlICYgMykgIT0gMykKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWNoaWxkLT50aHJlYWQuZnMgPSB2YWx1ZTsKKwkJCXJldHVybiAwOworCQljYXNlIEdTOgorCQkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCisJCQkJcmV0dXJuIC1FSU87CisJCQljaGlsZC0+dGhyZWFkLmdzID0gdmFsdWU7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBEUzoKKwkJY2FzZSBFUzoKKwkJCWlmICh2YWx1ZSAmJiAodmFsdWUgJiAzKSAhPSAzKQorCQkJCXJldHVybiAtRUlPOworCQkJdmFsdWUgJj0gMHhmZmZmOworCQkJYnJlYWs7CisJCWNhc2UgU1M6CisJCWNhc2UgQ1M6CisJCQlpZiAoKHZhbHVlICYgMykgIT0gMykKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCXZhbHVlICY9IDB4ZmZmZjsKKwkJCWJyZWFrOworCQljYXNlIEVGTDoKKwkJCXZhbHVlICY9IEZMQUdfTUFTSzsKKwkJCXZhbHVlIHw9IGdldF9zdGFja19sb25nKGNoaWxkLCBFRkxfT0ZGU0VUKSAmIH5GTEFHX01BU0s7CisJCQlicmVhazsKKwl9CisJaWYgKHJlZ25vID4gR1MqNCkKKwkJcmVnbm8gLT0gMio0OworCXB1dF9zdGFja19sb25nKGNoaWxkLCByZWdubyAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncyksIHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0cmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCisJdW5zaWduZWQgbG9uZyByZWdubykKK3sKKwl1bnNpZ25lZCBsb25nIHJldHZhbCA9IH4wVUw7CisKKwlzd2l0Y2ggKHJlZ25vID4+IDIpIHsKKwkJY2FzZSBGUzoKKwkJCXJldHZhbCA9IGNoaWxkLT50aHJlYWQuZnM7CisJCQlicmVhazsKKwkJY2FzZSBHUzoKKwkJCXJldHZhbCA9IGNoaWxkLT50aHJlYWQuZ3M7CisJCQlicmVhazsKKwkJY2FzZSBEUzoKKwkJY2FzZSBFUzoKKwkJY2FzZSBTUzoKKwkJY2FzZSBDUzoKKwkJCXJldHZhbCA9IDB4ZmZmZjsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJaWYgKHJlZ25vID4gR1MqNCkKKwkJCQlyZWdubyAtPSAyKjQ7CisJCQlyZWdubyA9IHJlZ25vIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKTsKKwkJCXJldHZhbCAmPSBnZXRfc3RhY2tfbG9uZyhjaGlsZCwgcmVnbm8pOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisjZGVmaW5lIExEVF9TRUdNRU5UIDQKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY29udmVydF9laXBfdG9fbGluZWFyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciwgc2VnOworCisJYWRkciA9IHJlZ3MtPmVpcDsKKwlzZWcgPSByZWdzLT54Y3MgJiAweGZmZmY7CisJaWYgKHJlZ3MtPmVmbGFncyAmIFZNX01BU0spIHsKKwkJYWRkciA9IChhZGRyICYgMHhmZmZmKSArIChzZWcgPDwgNCk7CisJCXJldHVybiBhZGRyOworCX0KKworCS8qCisJICogV2UnbGwgYXNzdW1lIHRoYXQgdGhlIGNvZGUgc2VnbWVudHMgaW4gdGhlIEdEVAorCSAqIGFyZSBhbGwgemVyby1iYXNlZC4gVGhhdCBpcyBsYXJnZWx5IHRydWU6IHRoZQorCSAqIFRMUyBzZWdtZW50cyBhcmUgdXNlZCBmb3IgZGF0YSwgYW5kIHRoZSBQTlBCSU9TCisJICogYW5kIEFQTSBiaW9zIG9uZXMgd2UganVzdCBpZ25vcmUgaGVyZS4KKwkgKi8KKwlpZiAoc2VnICYgTERUX1NFR01FTlQpIHsKKwkJdTMyICpkZXNjOworCQl1bnNpZ25lZCBsb25nIGJhc2U7CisKKwkJZG93bigmY2hpbGQtPm1tLT5jb250ZXh0LnNlbSk7CisJCWRlc2MgPSBjaGlsZC0+bW0tPmNvbnRleHQubGR0ICsgKHNlZyAmIH43KTsKKwkJYmFzZSA9IChkZXNjWzBdID4+IDE2KSB8ICgoZGVzY1sxXSAmIDB4ZmYpIDw8IDE2KSB8IChkZXNjWzFdICYgMHhmZjAwMDAwMCk7CisKKwkJLyogMTYtYml0IGNvZGUgc2VnbWVudD8gKi8KKwkJaWYgKCEoKGRlc2NbMV0gPj4gMjIpICYgMSkpCisJCQlhZGRyICY9IDB4ZmZmZjsKKwkJYWRkciArPSBiYXNlOworCQl1cCgmY2hpbGQtPm1tLT5jb250ZXh0LnNlbSk7CisJfQorCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19hdF9wb3BmKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpLCBjb3BpZWQ7CisJdW5zaWduZWQgY2hhciBvcGNvZGVbMTZdOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGNvbnZlcnRfZWlwX3RvX2xpbmVhcihjaGlsZCwgcmVncyk7CisKKwljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgb3Bjb2RlLCBzaXplb2Yob3Bjb2RlKSwgMCk7CisJZm9yIChpID0gMDsgaSA8IGNvcGllZDsgaSsrKSB7CisJCXN3aXRjaCAob3Bjb2RlW2ldKSB7CisJCS8qIHBvcGYgKi8KKwkJY2FzZSAweDlkOgorCQkJcmV0dXJuIDE7CisJCS8qIG9wY29kZSBhbmQgYWRkcmVzcyBzaXplIHByZWZpeGVzICovCisJCWNhc2UgMHg2NjogY2FzZSAweDY3OgorCQkJY29udGludWU7CisJCS8qIGlycmVsZXZhbnQgcHJlZml4ZXMgKHNlZ21lbnQgb3ZlcnJpZGVzIGFuZCByZXBlYXRzKSAqLworCQljYXNlIDB4MjY6IGNhc2UgMHgyZToKKwkJY2FzZSAweDM2OiBjYXNlIDB4M2U6CisJCWNhc2UgMHg2NDogY2FzZSAweDY1OgorCQljYXNlIDB4ZjA6IGNhc2UgMHhmMjogY2FzZSAweGYzOgorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogcHVzaGY6IE5PVEUhIFdlIHNob3VsZCBwcm9iYWJseSBub3QgbGV0CisJCSAqIHRoZSB1c2VyIHNlZSB0aGUgVEYgYml0IGJlaW5nIHNldC4gQnV0CisJCSAqIGl0J3MgbW9yZSBwYWluIHRoYW4gaXQncyB3b3J0aCB0byBhdm9pZAorCQkgKiBpdCwgYW5kIGEgZGVidWdnZXIgY291bGQgZW11bGF0ZSB0aGlzCisJCSAqIGFsbCBpbiB1c2VyIHNwYWNlIGlmIGl0IF9yZWFsbHlfIGNhcmVzLgorCQkgKi8KKwkJY2FzZSAweDljOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zaW5nbGVzdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfY2hpbGRfcmVncyhjaGlsZCk7CisKKwkvKgorCSAqIEFsd2F5cyBzZXQgVElGX1NJTkdMRVNURVAgLSB0aGlzIGd1YXJhbnRlZXMgdGhhdCAKKwkgKiB3ZSBzaW5nbGUtc3RlcCBzeXN0ZW0gY2FsbHMgZXRjLi4gIFRoaXMgd2lsbCBhbHNvCisJICogY2F1c2UgdXMgdG8gc2V0IFRGIHdoZW4gcmV0dXJuaW5nIHRvIHVzZXIgbW9kZS4KKwkgKi8KKwlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU0lOR0xFU1RFUCk7CisKKwkvKgorCSAqIElmIFRGIHdhcyBhbHJlYWR5IHNldCwgZG9uJ3QgZG8gYW55dGhpbmcgZWxzZQorCSAqLworCWlmIChyZWdzLT5lZmxhZ3MgJiBUUkFQX0ZMQUcpCisJCXJldHVybjsKKworCS8qIFNldCBURiBvbiB0aGUga2VybmVsIHN0YWNrLi4gKi8KKwlyZWdzLT5lZmxhZ3MgfD0gVFJBUF9GTEFHOworCisJLyoKKwkgKiAuLmJ1dCBpZiBURiBpcyBjaGFuZ2VkIGJ5IHRoZSBpbnN0cnVjdGlvbiB3ZSB3aWxsIHRyYWNlLAorCSAqIGRvbid0IG1hcmsgaXQgYXMgYmVpbmcgInVzIiB0aGF0IHNldCBpdCwgc28gdGhhdCB3ZQorCSAqIHdvbid0IGNsZWFyIGl0IGJ5IGhhbmQgbGF0ZXIuCisJICovCisJaWYgKGlzX2F0X3BvcGYoY2hpbGQsIHJlZ3MpKQorCQlyZXR1cm47CisJCisJY2hpbGQtPnB0cmFjZSB8PSBQVF9EVFJBQ0U7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX3NpbmdsZXN0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwkvKiBBbHdheXMgY2xlYXIgVElGX1NJTkdMRVNURVAuLi4gKi8KKwljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TSU5HTEVTVEVQKTsKKworCS8qIEJ1dCB0b3VjaCBURiBvbmx5IGlmIGl0IHdhcyBzZXQgYnkgdXMuLiAqLworCWlmIChjaGlsZC0+cHRyYWNlICYgUFRfRFRSQUNFKSB7CisJCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X2NoaWxkX3JlZ3MoY2hpbGQpOworCQlyZWdzLT5lZmxhZ3MgJj0gflRSQVBfRkxBRzsKKwkJY2hpbGQtPnB0cmFjZSAmPSB+UFRfRFRSQUNFOworCX0KK30KKworLyoKKyAqIENhbGxlZCBieSBrZXJuZWwvcHRyYWNlLmMgd2hlbiBkZXRhY2hpbmcuLgorICoKKyAqIE1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuCisgKi8KK3ZvaWQgcHRyYWNlX2Rpc2FibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sgCisJY2xlYXJfc2luZ2xlc3RlcChjaGlsZCk7Cit9CisKKy8qCisgKiBQZXJmb3JtIGdldF90aHJlYWRfYXJlYSBvbiBiZWhhbGYgb2YgdGhlIHRyYWNlZCBjaGlsZC4KKyAqLworc3RhdGljIGludAorcHRyYWNlX2dldF90aHJlYWRfYXJlYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAorCQkgICAgICAgaW50IGlkeCwgc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKnVzZXJfZGVzYykKK3sKKwlzdHJ1Y3QgdXNlcl9kZXNjIGluZm87CisJc3RydWN0IGRlc2Nfc3RydWN0ICpkZXNjOworCisvKgorICogR2V0IHRoZSBjdXJyZW50IFRocmVhZC1Mb2NhbCBTdG9yYWdlIGFyZWE6CisgKi8KKworI2RlZmluZSBHRVRfQkFTRShkZXNjKSAoIFwKKwkoKChkZXNjKS0+YSA+PiAxNikgJiAweDAwMDBmZmZmKSB8IFwKKwkoKChkZXNjKS0+YiA8PCAxNikgJiAweDAwZmYwMDAwKSB8IFwKKwkoIChkZXNjKS0+YiAgICAgICAgJiAweGZmMDAwMDAwKSAgICkKKworI2RlZmluZSBHRVRfTElNSVQoZGVzYykgKCBcCisJKChkZXNjKS0+YSAmIDB4MGZmZmYpIHwgXAorCSAoKGRlc2MpLT5iICYgMHhmMDAwMCkgKQorCisjZGVmaW5lIEdFVF8zMkJJVChkZXNjKQkJKCgoZGVzYyktPmIgPj4gMjIpICYgMSkKKyNkZWZpbmUgR0VUX0NPTlRFTlRTKGRlc2MpCSgoKGRlc2MpLT5iID4+IDEwKSAmIDMpCisjZGVmaW5lIEdFVF9XUklUQUJMRShkZXNjKQkoKChkZXNjKS0+YiA+PiAgOSkgJiAxKQorI2RlZmluZSBHRVRfTElNSVRfUEFHRVMoZGVzYykJKCgoZGVzYyktPmIgPj4gMjMpICYgMSkKKyNkZWZpbmUgR0VUX1BSRVNFTlQoZGVzYykJKCgoZGVzYyktPmIgPj4gMTUpICYgMSkKKyNkZWZpbmUgR0VUX1VTRUFCTEUoZGVzYykJKCgoZGVzYyktPmIgPj4gMjApICYgMSkKKworCWlmIChpZHggPCBHRFRfRU5UUllfVExTX01JTiB8fCBpZHggPiBHRFRfRU5UUllfVExTX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXNjID0gY2hpbGQtPnRocmVhZC50bHNfYXJyYXkgKyBpZHggLSBHRFRfRU5UUllfVExTX01JTjsKKworCWluZm8uZW50cnlfbnVtYmVyID0gaWR4OworCWluZm8uYmFzZV9hZGRyID0gR0VUX0JBU0UoZGVzYyk7CisJaW5mby5saW1pdCA9IEdFVF9MSU1JVChkZXNjKTsKKwlpbmZvLnNlZ18zMmJpdCA9IEdFVF8zMkJJVChkZXNjKTsKKwlpbmZvLmNvbnRlbnRzID0gR0VUX0NPTlRFTlRTKGRlc2MpOworCWluZm8ucmVhZF9leGVjX29ubHkgPSAhR0VUX1dSSVRBQkxFKGRlc2MpOworCWluZm8ubGltaXRfaW5fcGFnZXMgPSBHRVRfTElNSVRfUEFHRVMoZGVzYyk7CisJaW5mby5zZWdfbm90X3ByZXNlbnQgPSAhR0VUX1BSRVNFTlQoZGVzYyk7CisJaW5mby51c2VhYmxlID0gR0VUX1VTRUFCTEUoZGVzYyk7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJfZGVzYywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXJmb3JtIHNldF90aHJlYWRfYXJlYSBvbiBiZWhhbGYgb2YgdGhlIHRyYWNlZCBjaGlsZC4KKyAqLworc3RhdGljIGludAorcHRyYWNlX3NldF90aHJlYWRfYXJlYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAorCQkgICAgICAgaW50IGlkeCwgc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKnVzZXJfZGVzYykKK3sKKwlzdHJ1Y3QgdXNlcl9kZXNjIGluZm87CisJc3RydWN0IGRlc2Nfc3RydWN0ICpkZXNjOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCB1c2VyX2Rlc2MsIHNpemVvZihpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGlkeCA8IEdEVF9FTlRSWV9UTFNfTUlOIHx8IGlkeCA+IEdEVF9FTlRSWV9UTFNfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlc2MgPSBjaGlsZC0+dGhyZWFkLnRsc19hcnJheSArIGlkeCAtIEdEVF9FTlRSWV9UTFNfTUlOOworCWlmIChMRFRfZW1wdHkoJmluZm8pKSB7CisJCWRlc2MtPmEgPSAwOworCQlkZXNjLT5iID0gMDsKKwl9IGVsc2UgeworCQlkZXNjLT5hID0gTERUX2VudHJ5X2EoJmluZm8pOworCQlkZXNjLT5iID0gTERUX2VudHJ5X2IoJmluZm8pOworCX0KKworCXJldHVybiAwOworfQorCithc21saW5rYWdlIGludCBzeXNfcHRyYWNlKGxvbmcgcmVxdWVzdCwgbG9uZyBwaWQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQ7CisJc3RydWN0IHVzZXIgKiBkdW1teSA9IE5VTEw7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilkYXRhOworCisJbG9ja19rZXJuZWwoKTsKKwlyZXQgPSAtRVBFUk07CisJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1RSQUNFTUUpIHsKKwkJLyogYXJlIHdlIGFscmVhZHkgYmVpbmcgdHJhY2VkPyAqLworCQlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkKKwkJCWdvdG8gb3V0OworCQlyZXQgPSBzZWN1cml0eV9wdHJhY2UoY3VycmVudC0+cGFyZW50LCBjdXJyZW50KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCQkvKiBzZXQgdGhlIHB0cmFjZSBiaXQgaW4gdGhlIHByb2Nlc3MgZmxhZ3MuICovCisJCWN1cnJlbnQtPnB0cmFjZSB8PSBQVF9QVFJBQ0VEOworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gLUVTUkNIOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJY2hpbGQgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CisJaWYgKGNoaWxkKQorCQlnZXRfdGFza19zdHJ1Y3QoY2hpbGQpOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlpZiAoIWNoaWxkKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FUEVSTTsKKwlpZiAocGlkID09IDEpCQkvKiB5b3UgbWF5IG5vdCBtZXNzIHdpdGggaW5pdCAqLworCQlnb3RvIG91dF90c2s7CisKKwlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfQVRUQUNIKSB7CisJCXJldCA9IHB0cmFjZV9hdHRhY2goY2hpbGQpOworCQlnb3RvIG91dF90c2s7CisJfQorCisJcmV0ID0gcHRyYWNlX2NoZWNrX2F0dGFjaChjaGlsZCwgcmVxdWVzdCA9PSBQVFJBQ0VfS0lMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X3RzazsKKworCXN3aXRjaCAocmVxdWVzdCkgeworCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KKwljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovIAorCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQlpbnQgY29waWVkOworCisJCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7CisJCXJldCA9IC1FSU87CisJCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCisJCQlicmVhazsKKwkJcmV0ID0gcHV0X3VzZXIodG1wLCBkYXRhcCk7CisJCWJyZWFrOworCX0KKworCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLworCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkJcmV0ID0gLUVJTzsKKwkJaWYgKChhZGRyICYgMykgfHwgYWRkciA8IDAgfHwgCisJCSAgICBhZGRyID4gc2l6ZW9mKHN0cnVjdCB1c2VyKSAtIDMpCisJCQlicmVhazsKKworCQl0bXAgPSAwOyAgLyogRGVmYXVsdCByZXR1cm4gY29uZGl0aW9uICovCisJCWlmKGFkZHIgPCBGUkFNRV9TSVpFKnNpemVvZihsb25nKSkKKwkJCXRtcCA9IGdldHJlZyhjaGlsZCwgYWRkcik7CisJCWlmKGFkZHIgPj0gKGxvbmcpICZkdW1teS0+dV9kZWJ1Z3JlZ1swXSAmJgorCQkgICBhZGRyIDw9IChsb25nKSAmZHVtbXktPnVfZGVidWdyZWdbN10peworCQkJYWRkciAtPSAobG9uZykgJmR1bW15LT51X2RlYnVncmVnWzBdOworCQkJYWRkciA9IGFkZHIgPj4gMjsKKwkJCXRtcCA9IGNoaWxkLT50aHJlYWQuZGVidWdyZWdbYWRkcl07CisJCX0KKwkJcmV0ID0gcHV0X3VzZXIodG1wLCBkYXRhcCk7CisJCWJyZWFrOworCX0KKworCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLworCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLworCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgorCQlyZXQgPSAwOworCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKKwkJCWJyZWFrOworCQlyZXQgPSAtRUlPOworCQlicmVhazsKKworCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLworCQlyZXQgPSAtRUlPOworCQlpZiAoKGFkZHIgJiAzKSB8fCBhZGRyIDwgMCB8fCAKKwkJICAgIGFkZHIgPiBzaXplb2Yoc3RydWN0IHVzZXIpIC0gMykKKwkJCWJyZWFrOworCisJCWlmIChhZGRyIDwgRlJBTUVfU0laRSpzaXplb2YobG9uZykpIHsKKwkJCXJldCA9IHB1dHJlZyhjaGlsZCwgYWRkciwgZGF0YSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBXZSBuZWVkIHRvIGJlIHZlcnkgY2FyZWZ1bCBoZXJlLiAgV2UgaW1wbGljaXRseQorCQkgICB3YW50IHRvIG1vZGlmeSBhIHBvcnRpb24gb2YgdGhlIHRhc2tfc3RydWN0LCBhbmQgd2UKKwkJICAgaGF2ZSB0byBiZSBzZWxlY3RpdmUgYWJvdXQgd2hhdCBwb3J0aW9ucyB3ZSBhbGxvdyBzb21lb25lCisJCSAgIHRvIG1vZGlmeS4gKi8KKworCQkgIHJldCA9IC1FSU87CisJCSAgaWYoYWRkciA+PSAobG9uZykgJmR1bW15LT51X2RlYnVncmVnWzBdICYmCisJCSAgICAgYWRkciA8PSAobG9uZykgJmR1bW15LT51X2RlYnVncmVnWzddKXsKKworCQkJICBpZihhZGRyID09IChsb25nKSAmZHVtbXktPnVfZGVidWdyZWdbNF0pIGJyZWFrOworCQkJICBpZihhZGRyID09IChsb25nKSAmZHVtbXktPnVfZGVidWdyZWdbNV0pIGJyZWFrOworCQkJICBpZihhZGRyIDwgKGxvbmcpICZkdW1teS0+dV9kZWJ1Z3JlZ1s0XSAmJgorCQkJICAgICAoKHVuc2lnbmVkIGxvbmcpIGRhdGEpID49IFRBU0tfU0laRS0zKSBicmVhazsKKwkJCSAgCisJCQkgIC8qIFNhbml0eS1jaGVjayBkYXRhLiBUYWtlIG9uZSBoYWxmLWJ5dGUgYXQgb25jZSB3aXRoCisJCQkgICAqIGNoZWNrID0gKHZhbCA+PiAoMTYgKyA0KmkpKSAmIDB4Zi4gSXQgY29udGFpbnMgdGhlCisJCQkgICAqIFIvV2kgYW5kIExFTmkgYml0czsgYml0cyAwIGFuZCAxIGFyZSBSL1dpLCBhbmQgYml0cworCQkJICAgKiAyIGFuZCAzIGFyZSBMRU5pLiBHaXZlbiBhIGxpc3Qgb2YgaW52YWxpZCB2YWx1ZXMsCisJCQkgICAqIHdlIGRvIG1hc2sgfD0gMSA8PCBpbnZhbGlkX3ZhbHVlLCBzbyB0aGF0CisJCQkgICAqIChtYXNrID4+IGNoZWNrKSAmIDEgaXMgYSBjb3JyZWN0IHRlc3QgZm9yIGludmFsaWQKKwkJCSAgICogdmFsdWVzLgorCQkJICAgKgorCQkJICAgKiBSL1dpIGNvbnRhaW5zIHRoZSB0eXBlIG9mIHRoZSBicmVha3BvaW50IC8KKwkJCSAgICogd2F0Y2hwb2ludCwgTEVOaSBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSB3YXRjaGVkCisJCQkgICAqIGRhdGEgaW4gdGhlIHdhdGNocG9pbnQgY2FzZS4KKwkJCSAgICoKKwkJCSAgICogVGhlIGludmFsaWQgdmFsdWVzIGFyZToKKwkJCSAgICogLSBMRU5pID09IDB4MTAgKHVuZGVmaW5lZCksIHNvIG1hc2sgfD0gMHgwZjAwLgorCQkJICAgKiAtIFIvV2kgPT0gMHgxMCAoYnJlYWsgb24gSS9PIHJlYWRzIG9yIHdyaXRlcyksIHNvCisJCQkgICAqICAgbWFzayB8PSAweDQ0NDQuCisJCQkgICAqIC0gUi9XaSA9PSAweDAwICYmIExFTmkgIT0gMHgwMCwgc28gd2UgaGF2ZSBtYXNrIHw9CisJCQkgICAqICAgMHgxMTEwLgorCQkJICAgKgorCQkJICAgKiBGaW5hbGx5LCBtYXNrID0gMHgwZjAwIHwgMHg0NDQ0IHwgMHgxMTEwID09IDB4NWY1NC4KKwkJCSAgICoKKwkJCSAgICogU2VlIHRoZSBJbnRlbCBNYW51YWwgIlN5c3RlbSBQcm9ncmFtbWluZyBHdWlkZSIsCisJCQkgICAqIDE1LjIuNAorCQkJICAgKgorCQkJICAgKiBOb3RlIHRoYXQgTEVOaSA9PSAweDEwIGlzIGRlZmluZWQgb24geDg2XzY0IGluIGxvbmcKKwkJCSAgICogbW9kZSAoaS5lLiBldmVuIGZvciAzMi1iaXQgdXNlcnNwYWNlIHNvZnR3YXJlLCBidXQKKwkJCSAgICogNjQtYml0IGtlcm5lbCksIHNvIHRoZSB4ODZfNjQgbWFzayB2YWx1ZSBpcyAweDU0NTQuCisJCQkgICAqIFNlZSB0aGUgQU1EIG1hbnVhbCBuby4gMjQ1OTMgKEFNRDY0IFN5c3RlbQorCQkJICAgKiBQcm9ncmFtbWluZykqLworCisJCQkgIGlmKGFkZHIgPT0gKGxvbmcpICZkdW1teS0+dV9kZWJ1Z3JlZ1s3XSkgeworCQkJCSAgZGF0YSAmPSB+RFJfQ09OVFJPTF9SRVNFUlZFRDsKKwkJCQkgIGZvcihpPTA7IGk8NDsgaSsrKQorCQkJCQkgIGlmICgoMHg1ZjU0ID4+ICgoZGF0YSA+PiAoMTYgKyA0KmkpKSAmIDB4ZikpICYgMSkKKwkJCQkJCSAgZ290byBvdXRfdHNrOworCQkJICB9CisKKwkJCSAgYWRkciAtPSAobG9uZykgJmR1bW15LT51X2RlYnVncmVnOworCQkJICBhZGRyID0gYWRkciA+PiAyOworCQkJICBjaGlsZC0+dGhyZWFkLmRlYnVncmVnW2FkZHJdID0gZGF0YTsKKwkJCSAgcmV0ID0gMDsKKwkJICB9CisJCSAgYnJlYWs7CisKKwljYXNlIFBUUkFDRV9TWVNDQUxMOgkvKiBjb250aW51ZSBhbmQgc3RvcCBhdCBuZXh0IChyZXR1cm4gZnJvbSkgc3lzY2FsbCAqLworCWNhc2UgUFRSQUNFX0NPTlQ6CS8qIHJlc3RhcnQgYWZ0ZXIgc2lnbmFsLiAqLworCQlyZXQgPSAtRUlPOworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIGRhdGEgPiBfTlNJRykKKwkJCWJyZWFrOworCQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfU1lTQ0FMTCkgeworCQkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQl9CisJCWVsc2UgeworCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CisJCX0KKwkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7CisJCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCisJCWNsZWFyX3NpbmdsZXN0ZXAoY2hpbGQpOworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlyZXQgPSAwOworCQlicmVhazsKKworLyoKKyAqIG1ha2UgdGhlIGNoaWxkIGV4aXQuICBCZXN0IEkgY2FuIGRvIGlzIHNlbmQgaXQgYSBzaWdraWxsLiAKKyAqIHBlcmhhcHMgaXQgc2hvdWxkIGJlIHB1dCBpbiB0aGUgc3RhdHVzIHRoYXQgaXQgd2FudHMgdG8gCisgKiBleGl0LgorICovCisJY2FzZSBQVFJBQ0VfS0lMTDoKKwkJcmV0ID0gMDsKKwkJaWYgKGNoaWxkLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKQkvKiBhbHJlYWR5IGRlYWQgKi8KKwkJCWJyZWFrOworCQljaGlsZC0+ZXhpdF9jb2RlID0gU0lHS0lMTDsKKwkJLyogbWFrZSBzdXJlIHRoZSBzaW5nbGUgc3RlcCBiaXQgaXMgbm90IHNldC4gKi8KKwkJY2xlYXJfc2luZ2xlc3RlcChjaGlsZCk7CisJCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfU0lOR0xFU1RFUDoJLyogc2V0IHRoZSB0cmFwIGZsYWcuICovCisJCXJldCA9IC1FSU87CisJCWlmICgodW5zaWduZWQgbG9uZykgZGF0YSA+IF9OU0lHKQorCQkJYnJlYWs7CisJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQlzZXRfc2luZ2xlc3RlcChjaGlsZCk7CisJCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOworCQkvKiBnaXZlIGl0IGEgY2hhbmNlIHRvIHJ1bi4gKi8KKwkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBUUkFDRV9ERVRBQ0g6CisJCS8qIGRldGFjaCBhIHByb2Nlc3MgdGhhdCB3YXMgYXR0YWNoZWQuICovCisJCXJldCA9IHB0cmFjZV9kZXRhY2goY2hpbGQsIGRhdGEpOworCQlicmVhazsKKworCWNhc2UgUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IGFsbCBncCByZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCSAgCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGF0YXAsIEZSQU1FX1NJWkUqc2l6ZW9mKGxvbmcpKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWZvciAoIGkgPSAwOyBpIDwgRlJBTUVfU0laRSpzaXplb2YobG9uZyk7IGkgKz0gc2l6ZW9mKGxvbmcpICkgeworCQkJX19wdXRfdXNlcihnZXRyZWcoY2hpbGQsIGkpLCBkYXRhcCk7CisJCQlkYXRhcCsrOworCQl9CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IGFsbCBncCByZWdzIGluIHRoZSBjaGlsZC4gKi8KKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGRhdGFwLCBGUkFNRV9TSVpFKnNpemVvZihsb25nKSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlmb3IgKCBpID0gMDsgaSA8IEZSQU1FX1NJWkUqc2l6ZW9mKGxvbmcpOyBpICs9IHNpemVvZihsb25nKSApIHsKKwkJCV9fZ2V0X3VzZXIodG1wLCBkYXRhcCk7CisJCQlwdXRyZWcoY2hpbGQsIGksIHRtcCk7CisJCQlkYXRhcCsrOworCQl9CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkYXRhcCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QpKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IDA7CisJCWlmICghdHNrX3VzZWRfbWF0aChjaGlsZCkpCisJCQlpbml0X2ZwdShjaGlsZCk7CisJCWdldF9mcHJlZ3MoKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqKWRhdGEsIGNoaWxkKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBQVFJBQ0VfU0VURlBSRUdTOiB7IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlLiAqLworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZGF0YXAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlzZXRfc3RvcHBlZF9jaGlsZF91c2VkX21hdGgoY2hpbGQpOworCQlzZXRfZnByZWdzKGNoaWxkLCAoc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICopZGF0YSk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX0dFVEZQWFJFR1M6IHsgLyogR2V0IHRoZSBjaGlsZCBleHRlbmRlZCBGUFUgc3RhdGUuICovCisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGF0YXAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXRza191c2VkX21hdGgoY2hpbGQpKQorCQkJaW5pdF9mcHUoY2hpbGQpOworCQlyZXQgPSBnZXRfZnB4cmVncygoc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgX191c2VyICopZGF0YSwgY2hpbGQpOworCQlicmVhazsKKwl9CisKKwljYXNlIFBUUkFDRV9TRVRGUFhSRUdTOiB7IC8qIFNldCB0aGUgY2hpbGQgZXh0ZW5kZWQgRlBVIHN0YXRlLiAqLworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZGF0YXAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlzZXRfc3RvcHBlZF9jaGlsZF91c2VkX21hdGgoY2hpbGQpOworCQlyZXQgPSBzZXRfZnB4cmVncyhjaGlsZCwgKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IF9fdXNlciAqKWRhdGEpOworCQlicmVhazsKKwl9CisKKwljYXNlIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUE6CisJCXJldCA9IHB0cmFjZV9nZXRfdGhyZWFkX2FyZWEoY2hpbGQsIGFkZHIsCisJCQkJCShzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqKSBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFBUUkFDRV9TRVRfVEhSRUFEX0FSRUE6CisJCXJldCA9IHB0cmFjZV9zZXRfdGhyZWFkX2FyZWEoY2hpbGQsIGFkZHIsCisJCQkJCShzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqKSBkYXRhKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSBwdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CisJCWJyZWFrOworCX0KK291dF90c2s6CisJcHV0X3Rhc2tfc3RydWN0KGNoaWxkKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzZW5kX3NpZ3RyYXAoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZXJyb3JfY29kZSkKK3sKKwlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOworCisJdHNrLT50aHJlYWQudHJhcF9ubyA9IDE7CisJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJaW5mby5zaV9zaWdubyA9IFNJR1RSQVA7CisJaW5mby5zaV9jb2RlID0gVFJBUF9CUktQVDsKKworCS8qIFVzZXItbW9kZSBlaXA/ICovCisJaW5mby5zaV9hZGRyID0gdXNlcl9tb2RlKHJlZ3MpID8gKHZvaWQgX191c2VyICopIHJlZ3MtPmVpcCA6IE5VTEw7CisKKwkvKiBTZW5kIHVzIHRoZSBmYWtleSBTSUdUUkFQICovCisJZm9yY2Vfc2lnX2luZm8oU0lHVFJBUCwgJmluZm8sIHRzayk7Cit9CisKKy8qIG5vdGlmaWNhdGlvbiBvZiBzeXN0ZW0gY2FsbCBlbnRyeS9leGl0CisgKiAtIHRyaWdnZXJlZCBieSBjdXJyZW50LT53b3JrLnN5c2NhbGxfdHJhY2UKKyAqLworX19hdHRyaWJ1dGVfXygocmVncGFybSgzKSkpCit2b2lkIGRvX3N5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBlbnRyeWV4aXQpCit7CisJLyogZG8gdGhlIHNlY3VyZSBjb21wdXRpbmcgY2hlY2sgZmlyc3QgKi8KKwlzZWN1cmVfY29tcHV0aW5nKHJlZ3MtPm9yaWdfZWF4KTsKKworCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSkgeworCQlpZiAoIWVudHJ5ZXhpdCkKKwkJCWF1ZGl0X3N5c2NhbGxfZW50cnkoY3VycmVudCwgcmVncy0+b3JpZ19lYXgsCisJCQkJCSAgICByZWdzLT5lYngsIHJlZ3MtPmVjeCwKKwkJCQkJICAgIHJlZ3MtPmVkeCwgcmVncy0+ZXNpKTsKKwkJZWxzZQorCQkJYXVkaXRfc3lzY2FsbF9leGl0KGN1cnJlbnQsIHJlZ3MtPmVheCk7CisJfQorCisJaWYgKCEoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCisJCXJldHVybjsKKworCS8qIEZha2UgYSBkZWJ1ZyB0cmFwICovCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKQorCQlzZW5kX3NpZ3RyYXAoY3VycmVudCwgcmVncywgMCk7CisKKwlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQorCQlyZXR1cm47CisKKwkvKiB0aGUgMHg4MCBwcm92aWRlcyBhIHdheSBmb3IgdGhlIHRyYWNpbmcgcGFyZW50IHRvIGRpc3Rpbmd1aXNoCisJICAgYmV0d2VlbiBhIHN5c2NhbGwgc3RvcCBhbmQgU0lHVFJBUCBkZWxpdmVyeSAqLworCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCB8ICgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKSA/IDB4ODAgOiAwKSk7CisKKwkvKgorCSAqIHRoaXMgaXNuJ3QgdGhlIHNhbWUgYXMgY29udGludWluZyB3aXRoIGEgc2lnbmFsLCBidXQgaXQgd2lsbCBkbworCSAqIGZvciBub3JtYWwgdXNlLiAgc3RyYWNlIG9ubHkgY29udGludWVzIHdpdGggYSBzaWduYWwgaWYgdGhlCisJICogc3RvcHBpbmcgc2lnbmFsIGlzIG5vdCBTSUdUUkFQLiAgLWJybAorCSAqLworCWlmIChjdXJyZW50LT5leGl0X2NvZGUpIHsKKwkJc2VuZF9zaWcoY3VycmVudC0+ZXhpdF9jb2RlLCBjdXJyZW50LCAxKTsKKwkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3F1aXJrcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9xdWlya3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWY4OWNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9xdWlya3MuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHdvcmstYXJvdW5kcyBmb3IgeDg2IGFuZCB4ODZfNjQgcGxhdGZvcm0gYnVncy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfUENJKQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfaW50ZWxfaXJxYmFsYW5jZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXU4IGNvbmZpZywgcmV2OworCXUzMiB3b3JkOworCisJLyogQklPUyBtYXkgZW5hYmxlIGhhcmR3YXJlIElSUSBiYWxhbmNpbmcgZm9yCisJICogRTc1MjAvRTczMjAvRTc1MjUocmV2aXNpb24gSUQgMHg5IGFuZCBiZWxvdykKKwkgKiBiYXNlZCBwbGF0Zm9ybXMuCisJICogRGlzYWJsZSBTVyBpcnFiYWxhbmNlL2FmZmluaXR5IG9uIHRob3NlIHBsYXRmb3Jtcy4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldik7CisJaWYgKHJldiA+IDB4OSkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSW50ZWwgRTc1MjAvNzMyMC83NTI1IGRldGVjdGVkLiIpOworCisJLyogZW5hYmxlIGFjY2VzcyB0byBjb25maWcgc3BhY2UqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHhmNCwgJmNvbmZpZyk7CisJY29uZmlnIHw9IDB4MjsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGY0LCBjb25maWcpOworCisJLyogcmVhZCB4VFBSIHJlZ2lzdGVyICovCisJcmF3X3BjaV9vcHMtPnJlYWQoMCwgMCwgMHg0MCwgMHg0YywgMiwgJndvcmQpOworCisJaWYgKCEod29yZCAmICgxIDw8IDEzKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIGlycSBiYWxhbmNpbmcgYW5kIGFmZmluaXR5XG4iKTsKKyNpZmRlZiBDT05GSUdfSVJRQkFMQU5DRQorCQlpcnFiYWxhbmNlX2Rpc2FibGUoIiIpOworI2VuZGlmCisJCW5vaXJxZGVidWdfc2V0dXAoIiIpOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJCW5vX2lycV9hZmZpbml0eSA9IDE7CisjZW5kaWYKKwl9CisKKwljb25maWcgJj0gfjB4MjsKKwkvKiBkaXNhYmxlIGFjY2VzcyB0byBjb25maWcgc3BhY2UqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ZjQsIGNvbmZpZyk7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0U3MzIwX01DSCwJcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0U3NTI1X01DSCwJcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0U3NTIwX01DSCwJcXVpcmtfaW50ZWxfaXJxYmFsYW5jZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL2kzODYva2VybmVsL3JlYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkN2U5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3JlYm9vdC5jCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvcmVib290LmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlICJtYWNoX3JlYm9vdC5oIgorCisvKgorICogUG93ZXIgb2ZmIGZ1bmN0aW9uLCBpZiBhbnkKKyAqLwordm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCk7CisKK3N0YXRpYyBpbnQgcmVib290X21vZGU7CitzdGF0aWMgaW50IHJlYm9vdF90aHJ1X2Jpb3M7CisKKyNpZmRlZiBDT05GSUdfU01QCitpbnQgcmVib290X3NtcCA9IDA7CitzdGF0aWMgaW50IHJlYm9vdF9jcHUgPSAtMTsKKy8qIHNoYW1lbGVzc2x5IGdyYWJiZWQgZnJvbSBsaWIvdnNwcmludGYuYyBmb3IgcmVhZGFiaWxpdHkgKi8KKyNkZWZpbmUgaXNfZGlnaXQoYykJKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc5JykKKyNlbmRpZgorc3RhdGljIGludCBfX2luaXQgcmVib290X3NldHVwKGNoYXIgKnN0cikKK3sKKwl3aGlsZSgxKSB7CisJCXN3aXRjaCAoKnN0cikgeworCQljYXNlICd3JzogLyogIndhcm0iIHJlYm9vdCAobm8gbWVtb3J5IHRlc3RpbmcgZXRjKSAqLworCQkJcmVib290X21vZGUgPSAweDEyMzQ7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6IC8qICJjb2xkIiByZWJvb3QgKHdpdGggbWVtb3J5IHRlc3RpbmcgZXRjKSAqLworCQkJcmVib290X21vZGUgPSAweDA7CisJCQlicmVhazsKKwkJY2FzZSAnYic6IC8qICJiaW9zIiByZWJvb3QgYnkganVtcGluZyB0aHJvdWdoIHRoZSBCSU9TICovCisJCQlyZWJvb3RfdGhydV9iaW9zID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdoJzogLyogImhhcmQiIHJlYm9vdCBieSB0b2dnbGluZyBSRVNFVCBhbmQvb3IgY3Jhc2hpbmcgdGhlIENQVSAqLworCQkJcmVib290X3RocnVfYmlvcyA9IDA7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfU01QCisJCWNhc2UgJ3MnOiAvKiAic21wIiByZWJvb3QgYnkgZXhlY3V0aW5nIHJlc2V0IG9uIEJTUCBvciBvdGhlciBDUFUqLworCQkJcmVib290X3NtcCA9IDE7CisJCQlpZiAoaXNfZGlnaXQoKihzdHIrMSkpKSB7CisJCQkJcmVib290X2NwdSA9IChpbnQpICgqKHN0cisxKSAtICcwJyk7CisJCQkJaWYgKGlzX2RpZ2l0KCooc3RyKzIpKSkgCisJCQkJCXJlYm9vdF9jcHUgPSByZWJvb3RfY3B1KjEwICsgKGludCkoKihzdHIrMikgLSAnMCcpOworCQkJfQorCQkJCS8qIHdlIHdpbGwgbGVhdmUgc29ydGluZyBvdXQgdGhlIGZpbmFsIHZhbHVlIAorCQkJCXdoZW4gd2UgYXJlIHJlYWR5IHRvIHJlYm9vdCwgc2luY2Ugd2UgbWlnaHQgbm90CisgCQkJCWhhdmUgc2V0IHVwIGJvb3RfY3B1X2lkIG9yIHNtcF9udW1fY3B1ICovCisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWlmKChzdHIgPSBzdHJjaHIoc3RyLCcsJykpICE9IE5VTEwpCisJCQlzdHIrKzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJyZWJvb3Q9IiwgcmVib290X3NldHVwKTsKKworLyoKKyAqIFJlYm9vdCBvcHRpb25zIGFuZCBzeXN0ZW0gYXV0by1kZXRlY3Rpb24gY29kZSBwcm92aWRlZCBieQorICogRGVsbCBJbmMuIHNvIHRoZWlyIHN5c3RlbXMgImp1c3Qgd29yayIuIDotKQorICovCisKKy8qCisgKiBTb21lIG1hY2hpbmVzIHJlcXVpcmUgdGhlICJyZWJvb3Q9YiIgIGNvbW1hbmRsaW5lIG9wdGlvbiwgdGhpcyBxdWlyayBtYWtlcyB0aGF0IGF1dG9tYXRpYy4KKyAqLworc3RhdGljIGludCBfX2luaXQgc2V0X2Jpb3NfcmVib290KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmICghcmVib290X3RocnVfYmlvcykgeworCQlyZWJvb3RfdGhydV9iaW9zID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgc2VyaWVzIGJvYXJkIGRldGVjdGVkLiBTZWxlY3RpbmcgQklPUy1tZXRob2QgZm9yIHJlYm9vdHMuXG4iLCBkLT5pZGVudCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogU29tZSBtYWNoaW5lcyByZXF1aXJlIHRoZSAicmVib290PXMiICBjb21tYW5kbGluZSBvcHRpb24sIHRoaXMgcXVpcmsgbWFrZXMgdGhhdCBhdXRvbWF0aWMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldF9zbXBfcmVib290KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlpZiAoIXJlYm9vdF9zbXApIHsKKwkJcmVib290X3NtcCA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIHNlcmllcyBib2FyZCBkZXRlY3RlZC4gU2VsZWN0aW5nIFNNUC1tZXRob2QgZm9yIHJlYm9vdHMuXG4iLCBkLT5pZGVudCk7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTb21lIG1hY2hpbmVzIHJlcXVpcmUgdGhlICJyZWJvb3Q9YixzIiAgY29tbWFuZGxpbmUgb3B0aW9uLCB0aGlzIHF1aXJrIG1ha2VzIHRoYXQgYXV0b21hdGljLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzZXRfc21wX2Jpb3NfcmVib290KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCXNldF9zbXBfcmVib290KGQpOworCXNldF9iaW9zX3JlYm9vdChkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgcmVib290X2RtaV90YWJsZVtdID0geworCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggcmVib290aW5nIG9uIERlbGwgMTMwMCdzICovCisJCS5jYWxsYmFjayA9IHNldF9zbXBfYmlvc19yZWJvb3QsCisJCS5pZGVudCA9ICJEZWxsIFBvd2VyRWRnZSAxMzAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBvd2VyRWRnZSAxMzAwLyIpLAorCQl9LAorCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gRGVsbCAzMDAncyAqLworCQkuY2FsbGJhY2sgPSBzZXRfYmlvc19yZWJvb3QsCisJCS5pZGVudCA9ICJEZWxsIFBvd2VyRWRnZSAzMDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUG93ZXJFZGdlIDMwMC8iKSwKKwkJfSwKKwl9LAorCXsJLyogSGFuZGxlIHByb2JsZW1zIHdpdGggcmVib290aW5nIG9uIERlbGwgMjQwMCdzICovCisJCS5jYWxsYmFjayA9IHNldF9iaW9zX3JlYm9vdCwKKwkJLmlkZW50ID0gIkRlbGwgUG93ZXJFZGdlIDI0MDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUG93ZXJFZGdlIDI0MDAiKSwKKwkJfSwKKwl9LAorCXsgfQorfTsKKworc3RhdGljIGludCBfX2luaXQgcmVib290X2luaXQodm9pZCkKK3sKKwlkbWlfY2hlY2tfc3lzdGVtKHJlYm9vdF9kbWlfdGFibGUpOworCXJldHVybiAwOworfQorCitjb3JlX2luaXRjYWxsKHJlYm9vdF9pbml0KTsKKworLyogVGhlIGZvbGxvd2luZyBjb2RlIGFuZCBkYXRhIHJlYm9vdHMgdGhlIG1hY2hpbmUgYnkgc3dpdGNoaW5nIHRvIHJlYWwKKyAgIG1vZGUgYW5kIGp1bXBpbmcgdG8gdGhlIEJJT1MgcmVzZXQgZW50cnkgcG9pbnQsIGFzIGlmIHRoZSBDUFUgaGFzCisgICByZWFsbHkgYmVlbiByZXNldC4gIFRoZSBwcmV2aW91cyB2ZXJzaW9uIGFza2VkIHRoZSBrZXlib2FyZAorICAgY29udHJvbGxlciB0byBwdWxzZSB0aGUgQ1BVIHJlc2V0IGxpbmUsIHdoaWNoIGlzIG1vcmUgdGhvcm91Z2gsIGJ1dAorICAgZG9lc24ndCB3b3JrIHdpdGggYXQgbGVhc3Qgb25lIHR5cGUgb2YgNDg2IG1vdGhlcmJvYXJkLiAgSXQgaXMgZWFzeQorICAgdG8gc3RvcCB0aGlzIGNvZGUgd29ya2luZzsgaGVuY2UgdGhlIGNvcGlvdXMgY29tbWVudHMuICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcKK3JlYWxfbW9kZV9nZHRfZW50cmllcyBbM10gPQoreworCTB4MDAwMDAwMDAwMDAwMDAwMFVMTCwJLyogTnVsbCBkZXNjcmlwdG9yICovCisJMHgwMDAwOWEwMDAwMDBmZmZmVUxMLAkvKiAxNi1iaXQgcmVhbC1tb2RlIDY0ayBjb2RlIGF0IDB4MDAwMDAwMDAgKi8KKwkweDAwMDA5MjAwMDEwMGZmZmZVTEwJLyogMTYtYml0IHJlYWwtbW9kZSA2NGsgZGF0YSBhdCAweDAwMDAwMTAwICovCit9OworCitzdGF0aWMgc3RydWN0Cit7CisJdW5zaWduZWQgc2hvcnQgICAgICAgc2l6ZSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdW5zaWduZWQgbG9uZyBsb25nICogYmFzZSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9CityZWFsX21vZGVfZ2R0ID0geyBzaXplb2YgKHJlYWxfbW9kZV9nZHRfZW50cmllcykgLSAxLCByZWFsX21vZGVfZ2R0X2VudHJpZXMgfSwKK3JlYWxfbW9kZV9pZHQgPSB7IDB4M2ZmLCBOVUxMIH0sCitub19pZHQgPSB7IDAsIE5VTEwgfTsKKworCisvKiBUaGlzIGlzIDE2LWJpdCBwcm90ZWN0ZWQgbW9kZSBjb2RlIHRvIGRpc2FibGUgcGFnaW5nIGFuZCB0aGUgY2FjaGUsCisgICBzd2l0Y2ggdG8gcmVhbCBtb2RlIGFuZCBqdW1wIHRvIHRoZSBCSU9TIHJlc2V0IGNvZGUuCisKKyAgIFRoZSBpbnN0cnVjdGlvbiB0aGF0IHN3aXRjaGVzIHRvIHJlYWwgbW9kZSBieSB3cml0aW5nIHRvIENSMCBtdXN0IGJlCisgICBmb2xsb3dlZCBpbW1lZGlhdGVseSBieSBhIGZhciBqdW1wIGluc3RydWN0aW9uLCB3aGljaCBzZXQgQ1MgdG8gYQorICAgdmFsaWQgdmFsdWUgZm9yIHJlYWwgbW9kZSwgYW5kIGZsdXNoZXMgdGhlIHByZWZldGNoIHF1ZXVlIHRvIGF2b2lkCisgICBydW5uaW5nIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRlY29kZWQgaW4gcHJvdGVjdGVkCisgICBtb2RlLgorCisgICBDbGVhcnMgYWxsIHRoZSBmbGFncyBleGNlcHQgRVQsIGVzcGVjaWFsbHkgUEcgKHBhZ2luZyksIFBFCisgICAocHJvdGVjdGVkLW1vZGUgZW5hYmxlKSBhbmQgVFMgKHRhc2sgc3dpdGNoIGZvciBjb3Byb2Nlc3NvciBzdGF0ZQorICAgc2F2ZSkuICBGbHVzaGVzIHRoZSBUTEIgYWZ0ZXIgcGFnaW5nIGhhcyBiZWVuIGRpc2FibGVkLiAgU2V0cyBDRCBhbmQKKyAgIE5XLCB0byBkaXNhYmxlIHRoZSBjYWNoZSBvbiBhIDQ4NiwgYW5kIGludmFsaWRhdGVzIHRoZSBjYWNoZS4gIFRoaXMKKyAgIGlzIG1vcmUgbGlrZSB0aGUgc3RhdGUgb2YgYSA0ODYgYWZ0ZXIgcmVzZXQuICBJIGRvbid0IGtub3cgaWYKKyAgIHNvbWV0aGluZyBlbHNlIHNob3VsZCBiZSBkb25lIGZvciBvdGhlciBjaGlwcy4KKworICAgTW9yZSBjb3VsZCBiZSBkb25lIGhlcmUgdG8gc2V0IHVwIHRoZSByZWdpc3RlcnMgYXMgaWYgYSBDUFUgcmVzZXQgaGFkCisgICBvY2N1cnJlZDsgaG9wZWZ1bGx5IHJlYWwgQklPU3MgZG9uJ3QgYXNzdW1lIG11Y2guICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWxfbW9kZV9zd2l0Y2ggW10gPQoreworCTB4NjYsIDB4MGYsIDB4MjAsIDB4YzAsCQkJLyogICAgbW92bCAgJWNyMCwlZWF4ICAgICAgICAqLworCTB4NjYsIDB4ODMsIDB4ZTAsIDB4MTEsCQkJLyogICAgYW5kbCAgJDB4MDAwMDAwMTEsJWVheCAqLworCTB4NjYsIDB4MGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjAsCS8qICAgIG9ybCAgICQweDYwMDAwMDAwLCVlYXggKi8KKwkweDY2LCAweDBmLCAweDIyLCAweGMwLAkJCS8qICAgIG1vdmwgICVlYXgsJWNyMCAgICAgICAgKi8KKwkweDY2LCAweDBmLCAweDIyLCAweGQ4LAkJCS8qICAgIG1vdmwgICVlYXgsJWNyMyAgICAgICAgKi8KKwkweDY2LCAweDBmLCAweDIwLCAweGMzLAkJCS8qICAgIG1vdmwgICVjcjAsJWVieCAgICAgICAgKi8KKwkweDY2LCAweDgxLCAweGUzLCAweDAwLCAweDAwLCAweDAwLCAweDYwLAkvKiAgICBhbmRsICAkMHg2MDAwMDAwMCwlZWJ4ICovCisJMHg3NCwgMHgwMiwJCQkJLyogICAganogICAgZiAgICAgICAgICAgICAgICAqLworCTB4MGYsIDB4MDksCQkJCS8qICAgIHdiaW52ZCAgICAgICAgICAgICAgICAgKi8KKwkweDI0LCAweDEwLAkJCQkvKiBmOiBhbmRiICAkMHgxMCxhbCAgICAgICAgICovCisJMHg2NiwgMHgwZiwgMHgyMiwgMHhjMAkJCS8qICAgIG1vdmwgICVlYXgsJWNyMCAgICAgICAgKi8KK307CitzdGF0aWMgdW5zaWduZWQgY2hhciBqdW1wX3RvX2Jpb3MgW10gPQoreworCTB4ZWEsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYJCS8qICAgIGxqbXAgICQweGZmZmYsJDB4MDAwMCAgKi8KK307CisKKy8qCisgKiBTd2l0Y2ggdG8gcmVhbCBtb2RlIGFuZCB0aGVuIGV4ZWN1dGUgdGhlIGNvZGUKKyAqIHNwZWNpZmllZCBieSB0aGUgY29kZSBhbmQgbGVuZ3RoIHBhcmFtZXRlcnMuCisgKiBXZSBhc3N1bWUgdGhhdCBsZW5ndGggd2lsbCBhd2F5cyBiZSBsZXNzIHRoYXQgMTAwIQorICovCit2b2lkIG1hY2hpbmVfcmVhbF9yZXN0YXJ0KHVuc2lnbmVkIGNoYXIgKmNvZGUsIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBXcml0ZSB6ZXJvIHRvIENNT1MgcmVnaXN0ZXIgbnVtYmVyIDB4MGYsIHdoaWNoIHRoZSBCSU9TIFBPU1QKKwkgICByb3V0aW5lIHdpbGwgcmVjb2duaXplIGFzIHRlbGxpbmcgaXQgdG8gZG8gYSBwcm9wZXIgcmVib290LiAgKFdlbGwKKwkgICB0aGF0J3Mgd2hhdCB0aGlzIGJvb2sgaW4gZnJvbnQgb2YgbWUgc2F5cyAtLSBpdCBtYXkgb25seSBhcHBseSB0bworCSAgIHRoZSBQaG9lbml4IEJJT1MgdGhvdWdoLCBpdCdzIG5vdCBjbGVhcikuICBBdCB0aGUgc2FtZSB0aW1lLAorCSAgIGRpc2FibGUgTk1JcyBieSBzZXR0aW5nIHRoZSB0b3AgYml0IGluIHRoZSBDTU9TIGFkZHJlc3MgcmVnaXN0ZXIsCisJICAgYXMgd2UncmUgYWJvdXQgdG8gZG8gcGVjdWxpYXIgdGhpbmdzIHRvIHRoZSBDUFUuICBJJ20gbm90IHN1cmUgaWYKKwkgICBgb3V0Yl9wJyBpcyBuZWVkZWQgaW5zdGVhZCBvZiBqdXN0IGBvdXRiJy4gIFVzZSBpdCB0byBiZSBvbiB0aGUKKwkgICBzYWZlIHNpZGUuICAoWWVzLCBDTU9TX1dSSVRFIGRvZXMgb3V0Yl9wJ3MuIC0gIFBhdWwgRy4pCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwlDTU9TX1dSSVRFKDB4MDAsIDB4OGYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisKKwkvKiBSZW1hcCB0aGUga2VybmVsIGF0IHZpcnR1YWwgYWRkcmVzcyB6ZXJvLCBhcyB3ZWxsIGFzIG9mZnNldCB6ZXJvCisJICAgZnJvbSB0aGUga2VybmVsIHNlZ21lbnQuICBUaGlzIGFzc3VtZXMgdGhlIGtlcm5lbCBzZWdtZW50IHN0YXJ0cyBhdAorCSAgIHZpcnR1YWwgYWRkcmVzcyBQQUdFX09GRlNFVC4gKi8KKworCW1lbWNweSAoc3dhcHBlcl9wZ19kaXIsIHN3YXBwZXJfcGdfZGlyICsgVVNFUl9QR0RfUFRSUywKKwkJc2l6ZW9mIChzd2FwcGVyX3BnX2RpciBbMF0pICogS0VSTkVMX1BHRF9QVFJTKTsKKworCS8qCisJICogVXNlIGBzd2FwcGVyX3BnX2RpcicgYXMgb3VyIHBhZ2UgZGlyZWN0b3J5LgorCSAqLworCWxvYWRfY3IzKHN3YXBwZXJfcGdfZGlyKTsKKworCS8qIFdyaXRlIDB4MTIzNCB0byBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24gMHg0NzIuICBUaGUgQklPUyByZWFkcworCSAgIHRoaXMgb24gYm9vdGluZyB0byB0ZWxsIGl0IHRvICJCeXBhc3MgbWVtb3J5IHRlc3QgKGFsc28gd2FybQorCSAgIGJvb3QpIi4gIFRoaXMgc2VlbXMgbGlrZSBhIGZhaXJseSBzdGFuZGFyZCB0aGluZyB0aGF0IGdldHMgc2V0IGJ5CisJICAgUkVCT09ULkNPTSBwcm9ncmFtcywgYW5kIHRoZSBwcmV2aW91cyByZXNldCByb3V0aW5lIGRpZCB0aGlzCisJICAgdG9vLiAqLworCisJKigodW5zaWduZWQgc2hvcnQgKikweDQ3MikgPSByZWJvb3RfbW9kZTsKKworCS8qIEZvciB0aGUgc3dpdGNoIHRvIHJlYWwgbW9kZSwgY29weSBzb21lIGNvZGUgdG8gbG93IG1lbW9yeS4gIEl0IGhhcworCSAgIHRvIGJlIGluIHRoZSBmaXJzdCA2NGsgYmVjYXVzZSBpdCBpcyBydW5uaW5nIGluIDE2LWJpdCBtb2RlLCBhbmQgaXQKKwkgICBoYXMgdG8gaGF2ZSB0aGUgc2FtZSBwaHlzaWNhbCBhbmQgdmlydHVhbCBhZGRyZXNzLCBiZWNhdXNlIGl0IHR1cm5zCisJICAgb2ZmIHBhZ2luZy4gIENvcHkgaXQgbmVhciB0aGUgZW5kIG9mIHRoZSBmaXJzdCBwYWdlLCBvdXQgb2YgdGhlIHdheQorCSAgIG9mIEJJT1MgdmFyaWFibGVzLiAqLworCisJbWVtY3B5ICgodm9pZCAqKSAoMHgxMDAwIC0gc2l6ZW9mIChyZWFsX21vZGVfc3dpdGNoKSAtIDEwMCksCisJCXJlYWxfbW9kZV9zd2l0Y2gsIHNpemVvZiAocmVhbF9tb2RlX3N3aXRjaCkpOworCW1lbWNweSAoKHZvaWQgKikgKDB4MTAwMCAtIDEwMCksIGNvZGUsIGxlbmd0aCk7CisKKwkvKiBTZXQgdXAgdGhlIElEVCBmb3IgcmVhbCBtb2RlLiAqLworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsaWR0ICUwIiA6IDogIm0iIChyZWFsX21vZGVfaWR0KSk7CisKKwkvKiBTZXQgdXAgYSBHRFQgZnJvbSB3aGljaCB3ZSBjYW4gbG9hZCBzZWdtZW50IGRlc2NyaXB0b3JzIGZvciByZWFsCisJICAgbW9kZS4gIFRoZSBHRFQgaXMgbm90IHVzZWQgaW4gcmVhbCBtb2RlOyBpdCBpcyBqdXN0IG5lZWRlZCBoZXJlIHRvCisJICAgcHJlcGFyZSB0aGUgZGVzY3JpcHRvcnMuICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxnZHQgJTAiIDogOiAibSIgKHJlYWxfbW9kZV9nZHQpKTsKKworCS8qIExvYWQgdGhlIGRhdGEgc2VnbWVudCByZWdpc3RlcnMsIGFuZCB0aHVzIHRoZSBkZXNjcmlwdG9ycyByZWFkeSBmb3IKKwkgICByZWFsIG1vZGUuICBUaGUgYmFzZSBhZGRyZXNzIG9mIGVhY2ggc2VnbWVudCBpcyAweDEwMCwgMTYgdGltZXMgdGhlCisJICAgc2VsZWN0b3IgdmFsdWUgYmVpbmcgbG9hZGVkIGhlcmUuICBUaGlzIGlzIHNvIHRoYXQgdGhlIHNlZ21lbnQKKwkgICByZWdpc3RlcnMgZG9uJ3QgaGF2ZSB0byBiZSByZWxvYWRlZCBhZnRlciBzd2l0Y2hpbmcgdG8gcmVhbCBtb2RlOgorCSAgIHRoZSB2YWx1ZXMgYXJlIGNvbnNpc3RlbnQgZm9yIHJlYWwgbW9kZSBvcGVyYXRpb24gYWxyZWFkeS4gKi8KKworCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92bCAkMHgwMDEwLCUlZWF4XG4iCisJCQkJIlx0bW92bCAlJWVheCwlJWRzXG4iCisJCQkJIlx0bW92bCAlJWVheCwlJWVzXG4iCisJCQkJIlx0bW92bCAlJWVheCwlJWZzXG4iCisJCQkJIlx0bW92bCAlJWVheCwlJWdzXG4iCisJCQkJIlx0bW92bCAlJWVheCwlJXNzIiA6IDogOiAiZWF4Iik7CisKKwkvKiBKdW1wIHRvIHRoZSAxNi1iaXQgY29kZSB0aGF0IHdlIGNvcGllZCBlYXJsaWVyLiAgSXQgZGlzYWJsZXMgcGFnaW5nCisJICAgYW5kIHRoZSBjYWNoZSwgc3dpdGNoZXMgdG8gcmVhbCBtb2RlLCBhbmQganVtcHMgdG8gdGhlIEJJT1MgcmVzZXQKKwkgICBlbnRyeSBwb2ludC4gKi8KKworCV9fYXNtX18gX192b2xhdGlsZV9fICgibGptcCAkMHgwMDA4LCUwIgorCQkJCToKKwkJCQk6ICJpIiAoKHZvaWQgKikgKDB4MTAwMCAtIHNpemVvZiAocmVhbF9tb2RlX3N3aXRjaCkgLSAxMDApKSk7Cit9CisKK3ZvaWQgbWFjaGluZV9yZXN0YXJ0KGNoYXIgKiBfX3VudXNlZCkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJaW50IGNwdWlkOworCQorCWNwdWlkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKKworCWlmIChyZWJvb3Rfc21wKSB7CisKKwkJLyogY2hlY2sgdG8gc2VlIGlmIHJlYm9vdF9jcHUgaXMgdmFsaWQgCisJCSAgIGlmIGl0cyBub3QsIGRlZmF1bHQgdG8gdGhlIEJTUCAqLworCQlpZiAoKHJlYm9vdF9jcHUgPT0gLTEpIHx8ICAKKwkJICAgICAgKHJlYm9vdF9jcHUgPiAoTlJfQ1BVUyAtMSkpICB8fCAKKwkJICAgICAgIXBoeXNpZF9pc3NldChjcHVpZCwgcGh5c19jcHVfcHJlc2VudF9tYXApKQorCQkJcmVib290X2NwdSA9IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZDsKKworCQlyZWJvb3Rfc21wID0gMDsgIC8qIHVzZSB0aGlzIGFzIGEgZmxhZyB0byBvbmx5IGdvIHRocm91Z2ggdGhpcyBvbmNlKi8KKwkJLyogcmUtcnVuIHRoaXMgZnVuY3Rpb24gb24gdGhlIG90aGVyIENQVXMKKwkJICAgaXQgd2lsbCBmYWxsIHRob3VnaCB0aGlzIHNlY3Rpb24gc2luY2Ugd2UgaGF2ZSAKKwkJICAgY2xlYXJlZCByZWJvb3Rfc21wLCBhbmQgZG8gdGhlIHJlYm9vdCBpZiBpdCBpcyB0aGUKKwkJICAgY29ycmVjdCBDUFUsIG90aGVyd2lzZSBpdCBoYWx0cy4gKi8KKwkJaWYgKHJlYm9vdF9jcHUgIT0gY3B1aWQpCisJCQlzbXBfY2FsbF9mdW5jdGlvbigodm9pZCAqKW1hY2hpbmVfcmVzdGFydCAsIE5VTEwsIDEsIDApOworCX0KKworCS8qIGlmIHJlYm9vdF9jcHUgaXMgc3RpbGwgLTEsIHRoZW4gd2Ugd2FudCBhIHRyYWRpb25hbCByZWJvb3QsIAorCSAgIGFuZCBpZiB3ZSBhcmUgbm90IHJ1bm5pbmcgb24gdGhlIHJlYm9vdF9jcHUsLCBoYWx0ICovCisJaWYgKChyZWJvb3RfY3B1ICE9IC0xKSAmJiAoY3B1aWQgIT0gcmVib290X2NwdSkpIHsKKwkJZm9yICg7OykKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJobHQiKTsKKwl9CisJLyoKKwkgKiBTdG9wIGFsbCBDUFVzIGFuZCB0dXJuIG9mZiBsb2NhbCBBUElDcyBhbmQgdGhlIElPLUFQSUMsIHNvCisJICogb3RoZXIgT1NzIHNlZSBhIGNsZWFuIElSUSBzdGF0ZS4KKwkgKi8KKwlzbXBfc2VuZF9zdG9wKCk7CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCisJbGFwaWNfc2h1dGRvd24oKTsKKworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWRpc2FibGVfSU9fQVBJQygpOworI2VuZGlmCisKKwlpZiAoIXJlYm9vdF90aHJ1X2Jpb3MpIHsKKwkJaWYgKGVmaV9lbmFibGVkKSB7CisJCQllZmkucmVzZXRfc3lzdGVtKEVGSV9SRVNFVF9DT0xELCBFRklfU1VDQ0VTUywgMCwgTlVMTCk7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGlkdCAlMCI6IDoibSIgKG5vX2lkdCkpOworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImludDMiKTsKKwkJfQorCQkvKiByZWJvb3RpbmcgbmVlZHMgdG8gdG91Y2ggdGhlIHBhZ2UgYXQgYWJzb2x1dGUgYWRkciAwICovCisJCSooKHVuc2lnbmVkIHNob3J0ICopX192YSgweDQ3MikpID0gcmVib290X21vZGU7CisJCWZvciAoOzspIHsKKwkJCW1hY2hfcmVib290KCk7CisJCQkvKiBUaGF0IGRpZG4ndCB3b3JrIC0gZm9yY2UgYSB0cmlwbGUgZmF1bHQuLiAqLworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImxpZHQgJTAiOiA6Im0iIChub19pZHQpKTsKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpbnQzIik7CisJCX0KKwl9CisJaWYgKGVmaV9lbmFibGVkKQorCQllZmkucmVzZXRfc3lzdGVtKEVGSV9SRVNFVF9XQVJNLCBFRklfU1VDQ0VTUywgMCwgTlVMTCk7CisKKwltYWNoaW5lX3JlYWxfcmVzdGFydChqdW1wX3RvX2Jpb3MsIHNpemVvZihqdW1wX3RvX2Jpb3MpKTsKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX3Jlc3RhcnQpOworCit2b2lkIG1hY2hpbmVfaGFsdCh2b2lkKQoreworfQorCitFWFBPUlRfU1lNQk9MKG1hY2hpbmVfaGFsdCk7CisKK3ZvaWQgbWFjaGluZV9wb3dlcl9vZmYodm9pZCkKK3sKKwlsYXBpY19zaHV0ZG93bigpOworCisJaWYgKGVmaV9lbmFibGVkKQorCQllZmkucmVzZXRfc3lzdGVtKEVGSV9SRVNFVF9TSFVURE9XTiwgRUZJX1NVQ0NFU1MsIDAsIE5VTEwpOworCWlmIChwbV9wb3dlcl9vZmYpCisJCXBtX3Bvd2VyX29mZigpOworfQorCitFWFBPUlRfU1lNQk9MKG1hY2hpbmVfcG93ZXJfb2ZmKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zY3gyMDAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2N4MjAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllMjAzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2N4MjAwLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvc2N4MjAwLmMgCisKKyAgIENvcHlyaWdodCAoYykgMjAwMSwyMDAyIENocmlzdGVyIFdlaW5pZ2VsIDx3aW5nZWxAbmFuby1zeXN0ZW0uY29tPgorCisgICBOYXRpb25hbCBTZW1pY29uZHVjdG9yIFNDeDIwMCBzdXBwb3J0LiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zY3gyMDAuaD4KKworLyogVmVyaWZ5IHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gYmxvY2sgcmVhbGx5IGlzIHRoZXJlICovCisjZGVmaW5lIHNjeDIwMF9jYl9wcm9iZShiYXNlKSAoaW53KChiYXNlKSArIFNDeDIwMF9DQkEpID09IChiYXNlKSkKKworI2RlZmluZSBOQU1FICJzY3gyMDAiCisKK01PRFVMRV9BVVRIT1IoIkNocmlzdGVyIFdlaW5pZ2VsIDx3aW5nZWxAbmFuby1zeXN0ZW0uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOYXRTZW1pIFNDeDIwMCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwordW5zaWduZWQgc2N4MjAwX2dwaW9fYmFzZSA9IDA7Citsb25nIHNjeDIwMF9ncGlvX3NoYWRvd1syXTsKKwordW5zaWduZWQgc2N4MjAwX2NiX2Jhc2UgPSAwOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2N4MjAwX3RibFtdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TX1NDeDIwMF9CUklER0UpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlMsIFBDSV9ERVZJQ0VfSURfTlNfU0MxMTAwX0JSSURHRSkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19TQ3gyMDBfWEJVUykgICB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TX1NDMTEwMF9YQlVTKSAgIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLHNjeDIwMF90YmwpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzY3gyMDBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzY3gyMDBfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9ICJzY3gyMDAiLAorCS5pZF90YWJsZSA9IHNjeDIwMF90YmwsCisJLnByb2JlID0gc2N4MjAwX3Byb2JlLAorfTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhzY3gyMDBfZ3Bpb19jb25maWdfbG9jayk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNjeDIwMF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgYmFuazsKKwl1bnNpZ25lZCBiYXNlOworCisJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05TX1NDeDIwMF9CUklER0UgfHwKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTlNfU0MxMTAwX0JSSURHRSkgeworCQliYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCQlwcmludGsoS0VSTl9JTkZPIE5BTUUgIjogR1BJTyBiYXNlIDB4JXhcbiIsIGJhc2UpOworCisJCWlmIChyZXF1ZXN0X3JlZ2lvbihiYXNlLCBTQ3gyMDBfR1BJT19TSVpFLCAiTmF0U2VtaSBTQ3gyMDAgR1BJTyIpID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBOQU1FICI6IGNhbid0IGFsbG9jYXRlIEkvTyBmb3IgR1BJT3NcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCXNjeDIwMF9ncGlvX2Jhc2UgPSBiYXNlOworCisJCS8qIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWVzIGRyaXZlbiBvbiB0aGUgR1BJTyBzaWduYWxzICovCisJCWZvciAoYmFuayA9IDA7IGJhbmsgPCAyOyArK2JhbmspCisJCQlzY3gyMDBfZ3Bpb19zaGFkb3dbYmFua10gPSBpbmwoc2N4MjAwX2dwaW9fYmFzZSArIDB4MTAgKiBiYW5rKTsKKworCX0gZWxzZSB7CisJCS8qIGZpbmQgdGhlIGJhc2Ugb2YgdGhlIENvbmZpZ3VyYXRpb24gQmxvY2sgKi8KKwkJaWYgKHNjeDIwMF9jYl9wcm9iZShTQ3gyMDBfQ0JfQkFTRV9GSVhFRCkpIHsKKwkJCXNjeDIwMF9jYl9iYXNlID0gU0N4MjAwX0NCX0JBU0VfRklYRUQ7CisJCX0gZWxzZSB7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgU0N4MjAwX0NCQV9TQ1JBVENILCAmYmFzZSk7CisJCQlpZiAoc2N4MjAwX2NiX3Byb2JlKGJhc2UpKSB7CisJCQkJc2N4MjAwX2NiX2Jhc2UgPSBiYXNlOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIE5BTUUgIjogQ29uZmlndXJhdGlvbiBCbG9jayBub3QgZm91bmRcbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQl9CisJCXByaW50ayhLRVJOX0lORk8gTkFNRSAiOiBDb25maWd1cmF0aW9uIEJsb2NrIGJhc2UgMHgleFxuIiwgc2N4MjAwX2NiX2Jhc2UpOworCX0KKworCXJldHVybiAwOworfQorCit1MzIgc2N4MjAwX2dwaW9fY29uZmlndXJlKGludCBpbmRleCwgdTMyIG1hc2ssIHUzMiBiaXRzKQoreworCXUzMiBjb25maWcsIG5ld19jb25maWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzY3gyMDBfZ3Bpb19jb25maWdfbG9jaywgZmxhZ3MpOworCisJb3V0bChpbmRleCwgc2N4MjAwX2dwaW9fYmFzZSArIDB4MjApOworCWNvbmZpZyA9IGlubChzY3gyMDBfZ3Bpb19iYXNlICsgMHgyNCk7CisKKwluZXdfY29uZmlnID0gKGNvbmZpZyAmIG1hc2spIHwgYml0czsKKwlvdXRsKG5ld19jb25maWcsIHNjeDIwMF9ncGlvX2Jhc2UgKyAweDI0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjeDIwMF9ncGlvX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY29uZmlnOworfQorCisjaWYgMAordm9pZCBzY3gyMDBfZ3Bpb19kdW1wKHVuc2lnbmVkIGluZGV4KQoreworCXUzMiBjb25maWcgPSBzY3gyMDBfZ3Bpb19jb25maWd1cmUoaW5kZXgsIH4wLCAwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiR1BJTyUwMnU6IDB4JTA4bHgiLCBpbmRleCwgKHVuc2lnbmVkIGxvbmcpY29uZmlnKTsKKwkKKwlpZiAoY29uZmlnICYgMSkgCisJCXByaW50aygiIE9FIik7IC8qIG91dHB1dCBlbmFibGVkICovCisJZWxzZQorCQlwcmludGsoIiBUUyIpOyAvKiB0cmlzdGF0ZSAqLworCWlmIChjb25maWcgJiAyKSAKKwkJcHJpbnRrKCIgUFAiKTsgLyogcHVzaCBwdWxsICovCisJZWxzZQorCQlwcmludGsoIiBPRCIpOyAvKiBvcGVuIGRyYWluICovCisJaWYgKGNvbmZpZyAmIDQpIAorCQlwcmludGsoIiBQVUUiKTsgLyogcHVsbCB1cCBlbmFibGVkICovCisJZWxzZQorCQlwcmludGsoIiBQVUQiKTsgLyogcHVsbCB1cCBkaXNhYmxlZCAqLworCWlmIChjb25maWcgJiA4KSAKKwkJcHJpbnRrKCIgTE9DS0VEIik7IC8qIGxvY2tlZCAqLworCWlmIChjb25maWcgJiAxNikgCisJCXByaW50aygiIExFVkVMIik7IC8qIGxldmVsIGlucHV0ICovCisJZWxzZQorCQlwcmludGsoIiBFREdFIik7IC8qIGVkZ2UgaW5wdXQgKi8KKwlpZiAoY29uZmlnICYgMzIpIAorCQlwcmludGsoIiBISSIpOyAvKiB0cmlnZ2VyIG9uIHJpc2luZyBlZGdlICovCisJZWxzZQorCQlwcmludGsoIiBMTyIpOyAvKiB0cmlnZ2VyIG9uIGZhbGxpbmcgZWRnZSAqLworCWlmIChjb25maWcgJiA2NCkgCisJCXByaW50aygiIERFQk9VTkNFIik7IC8qIGRlYm91bmNlICovCisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmICAvKiAgMCAgKi8KKworc3RhdGljIGludCBfX2luaXQgc2N4MjAwX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIE5BTUUgIjogTmF0U2VtaSBTQ3gyMDAgRHJpdmVyXG4iKTsKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnNjeDIwMF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNjeDIwMF9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzY3gyMDBfcGNpX2RyaXZlcik7CisJcmVsZWFzZV9yZWdpb24oc2N4MjAwX2dwaW9fYmFzZSwgU0N4MjAwX0dQSU9fU0laRSk7Cit9CisKK21vZHVsZV9pbml0KHNjeDIwMF9pbml0KTsKK21vZHVsZV9leGl0KHNjeDIwMF9jbGVhbnVwKTsKKworRVhQT1JUX1NZTUJPTChzY3gyMDBfZ3Bpb19iYXNlKTsKK0VYUE9SVF9TWU1CT0woc2N4MjAwX2dwaW9fc2hhZG93KTsKK0VYUE9SVF9TWU1CT0woc2N4MjAwX2dwaW9fY29uZmlndXJlKTsKK0VYUE9SVF9TWU1CT0woc2N4MjAwX2NiX2Jhc2UpOworCisvKgorICAgIExvY2FsIHZhcmlhYmxlczoKKyAgICAgICAgY29tcGlsZS1jb21tYW5kOiAibWFrZSAtayAtQyAuLi8uLi8uLiBTVUJESVJTPWFyY2gvaTM4Ni9rZXJuZWwgbW9kdWxlcyIKKyAgICAgICAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAgICBFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zZW1hcGhvcmUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2VtYXBob3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5ZjQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2VtYXBob3JlLmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBpMzg2IHNlbWFwaG9yZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDE5OTkgTGludXMgVG9ydmFsZHMKKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgMTk5OSBSZWQgSGF0LCBJbmMuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBydyBzZW1hcGhvcmVzIGltcGxlbWVudGVkIE5vdmVtYmVyIDE5OTkgYnkgQmVuamFtaW4gTGFIYWlzZSA8YmNybEBrdmFjay5vcmc+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKy8qCisgKiBTZW1hcGhvcmVzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIHR3by13YXkgY291bnRlcjoKKyAqIFRoZSAiY291bnQiIHZhcmlhYmxlIGlzIGRlY3JlbWVudGVkIGZvciBlYWNoIHByb2Nlc3MKKyAqIHRoYXQgdHJpZXMgdG8gYWNxdWlyZSB0aGUgc2VtYXBob3JlLCB3aGlsZSB0aGUgInNsZWVwaW5nIgorICogdmFyaWFibGUgaXMgYSBjb3VudCBvZiBzdWNoIGFjcXVpcmVzLgorICoKKyAqIE5vdGFibHksIHRoZSBpbmxpbmUgInVwKCkiIGFuZCAiZG93bigpIiBmdW5jdGlvbnMgY2FuCisgKiBlZmZpY2llbnRseSB0ZXN0IGlmIHRoZXkgbmVlZCB0byBkbyBhbnkgZXh0cmEgd29yayAodXAKKyAqIG5lZWRzIHRvIGRvIHNvbWV0aGluZyBvbmx5IGlmIGNvdW50IHdhcyBuZWdhdGl2ZSBiZWZvcmUKKyAqIHRoZSBpbmNyZW1lbnQgb3BlcmF0aW9uLgorICoKKyAqICJzbGVlcGluZyIgYW5kIHRoZSBjb250ZW50aW9uIHJvdXRpbmUgb3JkZXJpbmcgaXMgcHJvdGVjdGVkCisgKiBieSB0aGUgc3BpbmxvY2sgaW4gdGhlIHNlbWFwaG9yZSdzIHdhaXRxdWV1ZSBoZWFkLgorICoKKyAqIE5vdGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlcmUgaXMKKyAqIGNvbnRlbnRpb24gb24gdGhlIGxvY2ssIGFuZCBhcyBzdWNoIGFsbCB0aGlzIGlzIHRoZQorICogIm5vbi1jcml0aWNhbCIgcGFydCBvZiB0aGUgd2hvbGUgc2VtYXBob3JlIGJ1c2luZXNzLiBUaGUKKyAqIGNyaXRpY2FsIHBhcnQgaXMgdGhlIGlubGluZSBzdHVmZiBpbiA8YXNtL3NlbWFwaG9yZS5oPgorICogd2hlcmUgd2Ugd2FudCB0byBhdm9pZCBhbnkgZXh0cmEganVtcHMgYW5kIGNhbGxzLgorICovCisKKy8qCisgKiBMb2dpYzoKKyAqICAtIG9ubHkgb24gYSBib3VuZGFyeSBjb25kaXRpb24gZG8gd2UgbmVlZCB0byBjYXJlLiBXaGVuIHdlIGdvCisgKiAgICBmcm9tIGEgbmVnYXRpdmUgY291bnQgdG8gYSBub24tbmVnYXRpdmUsIHdlIHdha2UgcGVvcGxlIHVwLgorICogIC0gd2hlbiB3ZSBnbyBmcm9tIGEgbm9uLW5lZ2F0aXZlIGNvdW50IHRvIGEgbmVnYXRpdmUgZG8gd2UKKyAqICAgIChhKSBzeW5jaHJvbml6ZSB3aXRoIHRoZSAic2xlZXBlciIgY291bnQgYW5kIChiKSBtYWtlIHN1cmUKKyAqICAgIHRoYXQgd2UncmUgb24gdGhlIHdha2V1cCBsaXN0IGJlZm9yZSB3ZSBzeW5jaHJvbml6ZSBzbyB0aGF0CisgKiAgICB3ZSBjYW5ub3QgbG9zZSB3YWtldXAgZXZlbnRzLgorICovCisKK3N0YXRpYyBmYXN0Y2FsbCB2b2lkIF9fYXR0cmlidXRlX3VzZWRfXyAgX191cChzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCit7CisJd2FrZV91cCgmc2VtLT53YWl0KTsKK30KKworc3RhdGljIGZhc3RjYWxsIHZvaWQgX19hdHRyaWJ1dGVfdXNlZF9fIF9fc2NoZWQgX19kb3duKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRzay0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmVfbG9ja2VkKCZzZW0tPndhaXQsICZ3YWl0KTsKKworCXNlbS0+c2xlZXBlcnMrKzsKKwlmb3IgKDs7KSB7CisJCWludCBzbGVlcGVycyA9IHNlbS0+c2xlZXBlcnM7CisKKwkJLyoKKwkJICogQWRkICJldmVyeWJvZHkgZWxzZSIgaW50byBpdC4gVGhleSBhcmVuJ3QKKwkJICogcGxheWluZywgYmVjYXVzZSB3ZSBvd24gdGhlIHNwaW5sb2NrIGluCisJCSAqIHRoZSB3YWl0X3F1ZXVlX2hlYWQuCisJCSAqLworCQlpZiAoIWF0b21pY19hZGRfbmVnYXRpdmUoc2xlZXBlcnMgLSAxLCAmc2VtLT5jb3VudCkpIHsKKwkJCXNlbS0+c2xlZXBlcnMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJc2VtLT5zbGVlcGVycyA9IDE7CS8qIHVzIC0gc2VlIC0xIGFib3ZlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7CisKKwkJc2NoZWR1bGUoKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKKwkJdHNrLT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZV9sb2NrZWQoJnNlbS0+d2FpdCwgJndhaXQpOworCXdha2VfdXBfbG9ja2VkKCZzZW0tPndhaXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7CisJdHNrLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKK30KKworc3RhdGljIGZhc3RjYWxsIGludCBfX2F0dHJpYnV0ZV91c2VkX18gX19zY2hlZCBfX2Rvd25faW50ZXJydXB0aWJsZShzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQoreworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0c2stPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNwaW5fbG9ja19pcnFzYXZlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZV9sb2NrZWQoJnNlbS0+d2FpdCwgJndhaXQpOworCisJc2VtLT5zbGVlcGVycysrOworCWZvciAoOzspIHsKKwkJaW50IHNsZWVwZXJzID0gc2VtLT5zbGVlcGVyczsKKworCQkvKgorCQkgKiBXaXRoIHNpZ25hbHMgcGVuZGluZywgdGhpcyB0dXJucyBpbnRvCisJCSAqIHRoZSB0cnlsb2NrIGZhaWx1cmUgY2FzZSAtIHdlIHdvbid0IGJlCisJCSAqIHNsZWVwaW5nLCBhbmQgd2UqIGNhbid0IGdldCB0aGUgbG9jayBhcworCQkgKiBpdCBoYXMgY29udGVudGlvbi4gSnVzdCBjb3JyZWN0IHRoZSBjb3VudAorCQkgKiBhbmQgZXhpdC4KKwkJICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVJTlRSOworCQkJc2VtLT5zbGVlcGVycyA9IDA7CisJCQlhdG9taWNfYWRkKHNsZWVwZXJzLCAmc2VtLT5jb3VudCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIEFkZCAiZXZlcnlib2R5IGVsc2UiIGludG8gaXQuIFRoZXkgYXJlbid0CisJCSAqIHBsYXlpbmcsIGJlY2F1c2Ugd2Ugb3duIHRoZSBzcGlubG9jayBpbgorCQkgKiB3YWl0X3F1ZXVlX2hlYWQuIFRoZSAiLTEiIGlzIGJlY2F1c2Ugd2UncmUKKwkJICogc3RpbGwgaG9waW5nIHRvIGdldCB0aGUgc2VtYXBob3JlLgorCQkgKi8KKwkJaWYgKCFhdG9taWNfYWRkX25lZ2F0aXZlKHNsZWVwZXJzIC0gMSwgJnNlbS0+Y291bnQpKSB7CisJCQlzZW0tPnNsZWVwZXJzID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXNlbS0+c2xlZXBlcnMgPSAxOwkvKiB1cyAtIHNlZSAtMSBhYm92ZSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOworCisJCXNjaGVkdWxlKCk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbS0+d2FpdC5sb2NrLCBmbGFncyk7CisJCXRzay0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlX2xvY2tlZCgmc2VtLT53YWl0LCAmd2FpdCk7CisJd2FrZV91cF9sb2NrZWQoJnNlbS0+d2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKKworCXRzay0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRyeWxvY2sgZmFpbGVkIC0gbWFrZSBzdXJlIHdlIGNvcnJlY3QgZm9yCisgKiBoYXZpbmcgZGVjcmVtZW50ZWQgdGhlIGNvdW50LgorICoKKyAqIFdlIGNvdWxkIGhhdmUgZG9uZSB0aGUgdHJ5bG9jayB3aXRoIGEKKyAqIHNpbmdsZSAiY21weGNoZyIgd2l0aG91dCBmYWlsdXJlIGNhc2VzLAorICogYnV0IHRoZW4gaXQgd291bGRuJ3Qgd29yayBvbiBhIDM4Ni4KKyAqLworc3RhdGljIGZhc3RjYWxsIGludCBfX2F0dHJpYnV0ZV91c2VkX18gX19kb3duX3RyeWxvY2soc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK3sKKwlpbnQgc2xlZXBlcnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZW0tPndhaXQubG9jaywgZmxhZ3MpOworCXNsZWVwZXJzID0gc2VtLT5zbGVlcGVycyArIDE7CisJc2VtLT5zbGVlcGVycyA9IDA7CisKKwkvKgorCSAqIEFkZCAiZXZlcnlib2R5IGVsc2UiIGFuZCB1cyBpbnRvIGl0LiBUaGV5IGFyZW4ndAorCSAqIHBsYXlpbmcsIGJlY2F1c2Ugd2Ugb3duIHRoZSBzcGlubG9jayBpbiB0aGUKKwkgKiB3YWl0X3F1ZXVlX2hlYWQuCisJICovCisJaWYgKCFhdG9taWNfYWRkX25lZ2F0aXZlKHNsZWVwZXJzLCAmc2VtLT5jb3VudCkpIHsKKwkJd2FrZV91cF9sb2NrZWQoJnNlbS0+d2FpdCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtLT53YWl0LmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogVGhlIHNlbWFwaG9yZSBvcGVyYXRpb25zIGhhdmUgYSBzcGVjaWFsIGNhbGxpbmcgc2VxdWVuY2UgdGhhdAorICogYWxsb3cgdXMgdG8gZG8gYSBzaW1wbGVyIGluLWxpbmUgdmVyc2lvbiBvZiB0aGVtLiBUaGVzZSByb3V0aW5lcworICogbmVlZCB0byBjb252ZXJ0IHRoYXQgc2VxdWVuY2UgYmFjayBpbnRvIHRoZSBDIHNlcXVlbmNlIHdoZW4KKyAqIHRoZXJlIGlzIGNvbnRlbnRpb24gb24gdGhlIHNlbWFwaG9yZS4KKyAqCisgKiAlZWF4IGNvbnRhaW5zIHRoZSBzZW1hcGhvcmUgcG9pbnRlciBvbiBlbnRyeS4gU2F2ZSB0aGUgQy1jbG9iYmVyZWQKKyAqIHJlZ2lzdGVycyAoJWVheCwgJWVkeCBhbmQgJWVjeCkgZXhjZXB0ICVlYXggd2hpc2ggaXMgZWl0aGVyIGEgcmV0dXJuCisgKiB2YWx1ZSBvciBqdXN0IGNsb2JiZXJlZC4uCisgKi8KK2FzbSgKKyIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgorIi5hbGlnbiA0XG4iCisiLmdsb2JsIF9fZG93bl9mYWlsZWRcbiIKKyJfX2Rvd25fZmFpbGVkOlxuXHQiCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKKwkicHVzaGwgJWVicFxuXHQiCisJIm1vdmwgICVlc3AsJWVicFxuXHQiCisjZW5kaWYKKwkicHVzaGwgJWVkeFxuXHQiCisJInB1c2hsICVlY3hcblx0IgorCSJjYWxsIF9fZG93blxuXHQiCisJInBvcGwgJWVjeFxuXHQiCisJInBvcGwgJWVkeFxuXHQiCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKKwkibW92bCAlZWJwLCVlc3Bcblx0IgorCSJwb3BsICVlYnBcblx0IgorI2VuZGlmCisJInJldCIKKyk7CisKK2FzbSgKKyIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgorIi5hbGlnbiA0XG4iCisiLmdsb2JsIF9fZG93bl9mYWlsZWRfaW50ZXJydXB0aWJsZVxuIgorIl9fZG93bl9mYWlsZWRfaW50ZXJydXB0aWJsZTpcblx0IgorI2lmIGRlZmluZWQoQ09ORklHX0ZSQU1FX1BPSU5URVIpCisJInB1c2hsICVlYnBcblx0IgorCSJtb3ZsICAlZXNwLCVlYnBcblx0IgorI2VuZGlmCisJInB1c2hsICVlZHhcblx0IgorCSJwdXNobCAlZWN4XG5cdCIKKwkiY2FsbCBfX2Rvd25faW50ZXJydXB0aWJsZVxuXHQiCisJInBvcGwgJWVjeFxuXHQiCisJInBvcGwgJWVkeFxuXHQiCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKKwkibW92bCAlZWJwLCVlc3Bcblx0IgorCSJwb3BsICVlYnBcblx0IgorI2VuZGlmCisJInJldCIKKyk7CisKK2FzbSgKKyIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgorIi5hbGlnbiA0XG4iCisiLmdsb2JsIF9fZG93bl9mYWlsZWRfdHJ5bG9ja1xuIgorIl9fZG93bl9mYWlsZWRfdHJ5bG9jazpcblx0IgorI2lmIGRlZmluZWQoQ09ORklHX0ZSQU1FX1BPSU5URVIpCisJInB1c2hsICVlYnBcblx0IgorCSJtb3ZsICAlZXNwLCVlYnBcblx0IgorI2VuZGlmCisJInB1c2hsICVlZHhcblx0IgorCSJwdXNobCAlZWN4XG5cdCIKKwkiY2FsbCBfX2Rvd25fdHJ5bG9ja1xuXHQiCisJInBvcGwgJWVjeFxuXHQiCisJInBvcGwgJWVkeFxuXHQiCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKKwkibW92bCAlZWJwLCVlc3Bcblx0IgorCSJwb3BsICVlYnBcblx0IgorI2VuZGlmCisJInJldCIKKyk7CisKK2FzbSgKKyIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgorIi5hbGlnbiA0XG4iCisiLmdsb2JsIF9fdXBfd2FrZXVwXG4iCisiX191cF93YWtldXA6XG5cdCIKKwkicHVzaGwgJWVkeFxuXHQiCisJInB1c2hsICVlY3hcblx0IgorCSJjYWxsIF9fdXBcblx0IgorCSJwb3BsICVlY3hcblx0IgorCSJwb3BsICVlZHhcblx0IgorCSJyZXQiCispOworCisvKgorICogcncgc3BpbmxvY2sgZmFsbGJhY2tzCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TTVApCithc20oCisiLnNlY3Rpb24gLnNjaGVkLnRleHRcbiIKKyIuYWxpZ24JNFxuIgorIi5nbG9ibAlfX3dyaXRlX2xvY2tfZmFpbGVkXG4iCisiX193cml0ZV9sb2NrX2ZhaWxlZDpcblx0IgorCUxPQ0sgImFkZGwJJCIgUldfTE9DS19CSUFTX1NUUiAiLCglZWF4KVxuIgorIjE6CXJlcDsgbm9wXG5cdCIKKwkiY21wbAkkIiBSV19MT0NLX0JJQVNfU1RSICIsKCVlYXgpXG5cdCIKKwkiam5lCTFiXG5cdCIKKwlMT0NLICJzdWJsCSQiIFJXX0xPQ0tfQklBU19TVFIgIiwoJWVheClcblx0IgorCSJqbnoJX193cml0ZV9sb2NrX2ZhaWxlZFxuXHQiCisJInJldCIKKyk7CisKK2FzbSgKKyIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgorIi5hbGlnbgk0XG4iCisiLmdsb2JsCV9fcmVhZF9sb2NrX2ZhaWxlZFxuIgorIl9fcmVhZF9sb2NrX2ZhaWxlZDpcblx0IgorCUxPQ0sgImluY2wJKCVlYXgpXG4iCisiMToJcmVwOyBub3Bcblx0IgorCSJjbXBsCSQxLCglZWF4KVxuXHQiCisJImpzCTFiXG5cdCIKKwlMT0NLICJkZWNsCSglZWF4KVxuXHQiCisJImpzCV9fcmVhZF9sb2NrX2ZhaWxlZFxuXHQiCisJInJldCIKKyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVlYzczCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCkBAIC0wLDAgKzEsMTUzNSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1ICBMaW51cyBUb3J2YWxkcworICoKKyAqICBTdXBwb3J0IG9mIEJJR01FTSBhZGRlZCBieSBHZXJoYXJkIFdpY2hlcnQsIFNpZW1lbnMgQUcsIEp1bHkgMTk5OQorICoKKyAqICBNZW1vcnkgcmVnaW9uIHN1cHBvcnQKKyAqCURhdmlkIFBhcnNvbnMgPG9yY0BwZWxsLmNoaS5pbC51cz4sIEp1bHktQXVndXN0IDE5OTkKKyAqCisgKiAgQWRkZWQgRTgyMCBzYW5pdGl6YXRpb24gcm91dGluZSAocmVtb3ZlcyBvdmVybGFwcGluZyBtZW1vcnkgcmVnaW9ucyk7CisgKiAgQnJpYW4gTW95bGUgPGJtb3lsZUBtdmlzdGEuY29tPiwgRmVicnVhcnkgMjAwMQorICoKKyAqIE1vdmVkIENQVSBkZXRlY3Rpb24gY29kZSB0byBjcHUvJHtjcHV9LmMKKyAqICAgIFBhdHJpY2sgTW9jaGVsIDxtb2NoZWxAb3NkbC5vcmc+LCBNYXJjaCAyMDAyCisgKgorICogIFByb3Zpc2lvbnMgZm9yIGVtcHR5IEU4MjAgbWVtb3J5IHJlZ2lvbnMgKHJlcG9ydGVkIGJ5IGNlcnRhaW4gQklPU2VzKS4KKyAqICBBbGV4IEFjaGVuYmFjaCA8eGVsYUBzbGl0LmRlPiwgRGVjZW1iZXIgMjAwMi4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIGluaXRpYWxpemF0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvbWNhLmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2VkZC5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZSA8dmlkZW8vZWRpZC5oPgorI2luY2x1ZGUgPGFzbS9lODIwLmg+CisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaXN0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAic2V0dXBfYXJjaF9wcmUuaCIKKyNpbmNsdWRlIDxiaW9zX2ViZGEuaD4KKworLyogVGhpcyB2YWx1ZSBpcyBzZXQgdXAgYnkgdGhlIGVhcmx5IGJvb3QgY29kZSB0byBwb2ludCB0byB0aGUgdmFsdWUKKyAgIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBib290IHRpbWUgcGFnZSB0YWJsZXMuICBJdCBjb250YWlucyBhICpwaHlzaWNhbCoKKyAgIGFkZHJlc3MsIGFuZCBtdXN0IG5vdCBiZSBpbiB0aGUgLmJzcyBzZWdtZW50ISAqLwordW5zaWduZWQgbG9uZyBpbml0X3BnX3RhYmxlc19lbmQgX19pbml0ZGF0YSA9IH4wVUw7CisKK2ludCBkaXNhYmxlX3BzZSBfX2luaXRkYXRhID0gMDsKKworLyoKKyAqIE1hY2hpbmUgc2V0dXAuLgorICovCisKKyNpZmRlZiBDT05GSUdfRUZJCitpbnQgZWZpX2VuYWJsZWQgPSAwOworRVhQT1JUX1NZTUJPTChlZmlfZW5hYmxlZCk7CisjZW5kaWYKKworLyogY3B1IGRhdGEgYXMgZGV0ZWN0ZWQgYnkgdGhlIGFzc2VtYmx5IGNvZGUgaW4gaGVhZC5TICovCitzdHJ1Y3QgY3B1aW5mb194ODYgbmV3X2NwdV9kYXRhIF9faW5pdGRhdGEgPSB7IDAsIDAsIDAsIDAsIC0xLCAxLCAwLCAwLCAtMSB9OworLyogY29tbW9uIGNwdSBkYXRhIGZvciBhbGwgY3B1cyAqLworc3RydWN0IGNwdWluZm9feDg2IGJvb3RfY3B1X2RhdGEgPSB7IDAsIDAsIDAsIDAsIC0xLCAxLCAwLCAwLCAtMSB9OworCit1bnNpZ25lZCBsb25nIG1tdV9jcjRfZmVhdHVyZXM7CisKKyNpZmRlZglDT05GSUdfQUNQSV9JTlRFUlBSRVRFUgorCWludCBhY3BpX2Rpc2FibGVkID0gMDsKKyNlbHNlCisJaW50IGFjcGlfZGlzYWJsZWQgPSAxOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZWQpOworCisjaWZkZWYJQ09ORklHX0FDUElfQk9PVAoraW50IF9faW5pdGRhdGEgYWNwaV9mb3JjZSA9IDA7CitleHRlcm4gYWNwaV9pbnRlcnJ1cHRfZmxhZ3MJYWNwaV9zY2lfZmxhZ3M7CisjZW5kaWYKKworLyogZm9yIE1DQSwgYnV0IGFueW9uZSBlbHNlIGNhbiB1c2UgaXQgaWYgdGhleSB3YW50ICovCit1bnNpZ25lZCBpbnQgbWFjaGluZV9pZDsKK3Vuc2lnbmVkIGludCBtYWNoaW5lX3N1Ym1vZGVsX2lkOwordW5zaWduZWQgaW50IEJJT1NfcmV2aXNpb247Cit1bnNpZ25lZCBpbnQgbWNhX3BlbnRpdW1fZmxhZzsKKworLyogRm9yIFBDSSBvciBvdGhlciBtZW1vcnktbWFwcGVkIHJlc291cmNlcyAqLwordW5zaWduZWQgbG9uZyBwY2lfbWVtX3N0YXJ0ID0gMHgxMDAwMDAwMDsKKworLyogQm9vdCBsb2FkZXIgSUQgYXMgYW4gaW50ZWdlciwgZm9yIHRoZSBiZW5lZml0IG9mIHByb2NfZG9pbnR2ZWMgKi8KK2ludCBib290bG9hZGVyX3R5cGU7CisKKy8qIHVzZXItZGVmaW5lZCBoaWdobWVtIHNpemUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGlnaG1lbV9wYWdlcyA9IC0xOworCisvKgorICogU2V0dXAgb3B0aW9ucworICovCitzdHJ1Y3QgZHJpdmVfaW5mb19zdHJ1Y3QgeyBjaGFyIGR1bW15WzMyXTsgfSBkcml2ZV9pbmZvOworc3RydWN0IHNjcmVlbl9pbmZvIHNjcmVlbl9pbmZvOworc3RydWN0IGFwbV9pbmZvIGFwbV9pbmZvOworc3RydWN0IHN5c19kZXNjX3RhYmxlX3N0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgdGFibGVbMF07Cit9Oworc3RydWN0IGVkaWRfaW5mbyBlZGlkX2luZm87CitzdHJ1Y3QgaXN0X2luZm8gaXN0X2luZm87CitzdHJ1Y3QgZTgyMG1hcCBlODIwOworCitleHRlcm4gdm9pZCBlYXJseV9jcHVfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGRtaV9zY2FuX21hY2hpbmUodm9pZCk7CitleHRlcm4gdm9pZCBnZW5lcmljX2FwaWNfcHJvYmUoY2hhciAqKTsKK2V4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOworCit1bnNpZ25lZCBsb25nIHNhdmVkX3ZpZGVvbW9kZTsKKworI2RlZmluZSBSQU1ESVNLX0lNQUdFX1NUQVJUX01BU0sgIAkweDA3RkYKKyNkZWZpbmUgUkFNRElTS19QUk9NUFRfRkxBRwkJMHg4MDAwCisjZGVmaW5lIFJBTURJU0tfTE9BRF9GTEFHCQkweDQwMDAJCisKK3N0YXRpYyBjaGFyIGNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CisKK3Vuc2lnbmVkIGNoYXIgX19pbml0ZGF0YSBib290X3BhcmFtc1tQQVJBTV9TSVpFXTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYXRhX3Jlc291cmNlID0geworCS5uYW1lCT0gIktlcm5lbCBkYXRhIiwKKwkuc3RhcnQJPSAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvZGVfcmVzb3VyY2UgPSB7CisJLm5hbWUJPSAiS2VybmVsIGNvZGUiLAorCS5zdGFydAk9IDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9NRU0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3lzdGVtX3JvbV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJTeXN0ZW0gUk9NIiwKKwkuc3RhcnQJPSAweGYwMDAwLAorCS5lbmQJPSAweGZmZmZmLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBleHRlbnNpb25fcm9tX3Jlc291cmNlID0geworCS5uYW1lCT0gIkV4dGVuc2lvbiBST00iLAorCS5zdGFydAk9IDB4ZTAwMDAsCisJLmVuZAk9IDB4ZWZmZmYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFkYXB0ZXJfcm9tX3Jlc291cmNlc1tdID0geyB7CisJLm5hbWUgCT0gIkFkYXB0ZXIgUk9NIiwKKwkuc3RhcnQJPSAweGM4MDAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQorfSwgeworCS5uYW1lIAk9ICJBZGFwdGVyIFJPTSIsCisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK30sIHsKKwkubmFtZSAJPSAiQWRhcHRlciBST00iLAorCS5zdGFydAk9IDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9LCB7CisJLm5hbWUgCT0gIkFkYXB0ZXIgUk9NIiwKKwkuc3RhcnQJPSAwLAorCS5lbmQJPSAwLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfUkVBRE9OTFkgfCBJT1JFU09VUkNFX01FTQorfSwgeworCS5uYW1lIAk9ICJBZGFwdGVyIFJPTSIsCisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9NRU0KK30sIHsKKwkubmFtZSAJPSAiQWRhcHRlciBST00iLAorCS5zdGFydAk9IDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9IH07CisKKyNkZWZpbmUgQURBUFRFUl9ST01fUkVTT1VSQ0VTIFwKKwkoc2l6ZW9mIGFkYXB0ZXJfcm9tX3Jlc291cmNlcyAvIHNpemVvZiBhZGFwdGVyX3JvbV9yZXNvdXJjZXNbMF0pCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdmlkZW9fcm9tX3Jlc291cmNlID0geworCS5uYW1lIAk9ICJWaWRlbyBST00iLAorCS5zdGFydAk9IDB4YzAwMDAsCisJLmVuZAk9IDB4YzdmZmYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9SRUFET05MWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHZpZGVvX3JhbV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJWaWRlbyBSQU0gYXJlYSIsCisJLnN0YXJ0CT0gMHhhMDAwMCwKKwkuZW5kCT0gMHhiZmZmZiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX01FTQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzdGFuZGFyZF9pb19yZXNvdXJjZXNbXSA9IHsgeworCS5uYW1lCT0gImRtYTEiLAorCS5zdGFydAk9IDB4MDAwMCwKKwkuZW5kCT0gMHgwMDFmLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZQk9ICJwaWMxIiwKKwkuc3RhcnQJPSAweDAwMjAsCisJLmVuZAk9IDB4MDAyMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9LCB7CisJLm5hbWUgICA9ICJ0aW1lcjAiLAorCS5zdGFydAk9IDB4MDA0MCwKKwkuZW5kICAgID0gMHgwMDQzLAorCS5mbGFncyAgPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9LCB7CisJLm5hbWUgICA9ICJ0aW1lcjEiLAorCS5zdGFydCAgPSAweDAwNTAsCisJLmVuZCAgICA9IDB4MDA1MywKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9LCB7CisJLm5hbWUJPSAia2V5Ym9hcmQiLAorCS5zdGFydAk9IDB4MDA2MCwKKwkuZW5kCT0gMHgwMDZmLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZQk9ICJkbWEgcGFnZSByZWciLAorCS5zdGFydAk9IDB4MDA4MCwKKwkuZW5kCT0gMHgwMDhmLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfSU8KK30sIHsKKwkubmFtZQk9ICJwaWMyIiwKKwkuc3RhcnQJPSAweDAwYTAsCisJLmVuZAk9IDB4MDBhMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX0lPCit9LCB7CisJLm5hbWUJPSAiZG1hMiIsCisJLnN0YXJ0CT0gMHgwMGMwLAorCS5lbmQJPSAweDAwZGYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTworfSwgeworCS5uYW1lCT0gImZwdSIsCisJLnN0YXJ0CT0gMHgwMGYwLAorCS5lbmQJPSAweDAwZmYsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9JTworfSB9OworCisjZGVmaW5lIFNUQU5EQVJEX0lPX1JFU09VUkNFUyBcCisJKHNpemVvZiBzdGFuZGFyZF9pb19yZXNvdXJjZXMgLyBzaXplb2Ygc3RhbmRhcmRfaW9fcmVzb3VyY2VzWzBdKQorCisjZGVmaW5lIHJvbXNpZ25hdHVyZSh4KSAoKih1bnNpZ25lZCBzaG9ydCAqKSh4KSA9PSAweGFhNTUpCisKK3N0YXRpYyBpbnQgX19pbml0IHJvbWNoZWNrc3VtKHVuc2lnbmVkIGNoYXIgKnJvbSwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJdW5zaWduZWQgY2hhciAqcCwgc3VtID0gMDsKKworCWZvciAocCA9IHJvbTsgcCA8IHJvbSArIGxlbmd0aDsgcCsrKQorCQlzdW0gKz0gKnA7CisJcmV0dXJuIHN1bSA9PSAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcHJvYmVfcm9tcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGxlbmd0aCwgdXBwZXI7CisJdW5zaWduZWQgY2hhciAqcm9tOworCWludAkgICAgICBpOworCisJLyogdmlkZW8gcm9tICovCisJdXBwZXIgPSBhZGFwdGVyX3JvbV9yZXNvdXJjZXNbMF0uc3RhcnQ7CisJZm9yIChzdGFydCA9IHZpZGVvX3JvbV9yZXNvdXJjZS5zdGFydDsgc3RhcnQgPCB1cHBlcjsgc3RhcnQgKz0gMjA0OCkgeworCQlyb20gPSBpc2FfYnVzX3RvX3ZpcnQoc3RhcnQpOworCQlpZiAoIXJvbXNpZ25hdHVyZShyb20pKQorCQkJY29udGludWU7CisKKwkJdmlkZW9fcm9tX3Jlc291cmNlLnN0YXJ0ID0gc3RhcnQ7CisKKwkJLyogMCA8IGxlbmd0aCA8PSAweDdmICogNTEyLCBoaXN0b3JpY2FsbHkgKi8KKwkJbGVuZ3RoID0gcm9tWzJdICogNTEyOworCisJCS8qIGlmIGNoZWNrc3VtIG9rYXksIHRydXN0IGxlbmd0aCBieXRlICovCisJCWlmIChsZW5ndGggJiYgcm9tY2hlY2tzdW0ocm9tLCBsZW5ndGgpKQorCQkJdmlkZW9fcm9tX3Jlc291cmNlLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIC0gMTsKKworCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnZpZGVvX3JvbV9yZXNvdXJjZSk7CisJCWJyZWFrOworCX0KKworCXN0YXJ0ID0gKHZpZGVvX3JvbV9yZXNvdXJjZS5lbmQgKyAxICsgMjA0NykgJiB+MjA0N1VMOworCWlmIChzdGFydCA8IHVwcGVyKQorCQlzdGFydCA9IHVwcGVyOworCisJLyogc3lzdGVtIHJvbSAqLworCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmc3lzdGVtX3JvbV9yZXNvdXJjZSk7CisJdXBwZXIgPSBzeXN0ZW1fcm9tX3Jlc291cmNlLnN0YXJ0OworCisJLyogY2hlY2sgZm9yIGV4dGVuc2lvbiByb20gKGlnbm9yZSBsZW5ndGggYnl0ZSEpICovCisJcm9tID0gaXNhX2J1c190b192aXJ0KGV4dGVuc2lvbl9yb21fcmVzb3VyY2Uuc3RhcnQpOworCWlmIChyb21zaWduYXR1cmUocm9tKSkgeworCQlsZW5ndGggPSBleHRlbnNpb25fcm9tX3Jlc291cmNlLmVuZCAtIGV4dGVuc2lvbl9yb21fcmVzb3VyY2Uuc3RhcnQgKyAxOworCQlpZiAocm9tY2hlY2tzdW0ocm9tLCBsZW5ndGgpKSB7CisJCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmV4dGVuc2lvbl9yb21fcmVzb3VyY2UpOworCQkJdXBwZXIgPSBleHRlbnNpb25fcm9tX3Jlc291cmNlLnN0YXJ0OworCQl9CisJfQorCisJLyogY2hlY2sgZm9yIGFkYXB0ZXIgcm9tcyBvbiAyayBib3VuZGFyaWVzICovCisJZm9yIChpID0gMDsgaSA8IEFEQVBURVJfUk9NX1JFU09VUkNFUyAmJiBzdGFydCA8IHVwcGVyOyBzdGFydCArPSAyMDQ4KSB7CisJCXJvbSA9IGlzYV9idXNfdG9fdmlydChzdGFydCk7CisJCWlmICghcm9tc2lnbmF0dXJlKHJvbSkpCisJCQljb250aW51ZTsKKworCQkvKiAwIDwgbGVuZ3RoIDw9IDB4N2YgKiA1MTIsIGhpc3RvcmljYWxseSAqLworCQlsZW5ndGggPSByb21bMl0gKiA1MTI7CisKKwkJLyogYnV0IGFjY2VwdCBhbnkgbGVuZ3RoIHRoYXQgZml0cyBpZiBjaGVja3N1bSBva2F5ICovCisJCWlmICghbGVuZ3RoIHx8IHN0YXJ0ICsgbGVuZ3RoID4gdXBwZXIgfHwgIXJvbWNoZWNrc3VtKHJvbSwgbGVuZ3RoKSkKKwkJCWNvbnRpbnVlOworCisJCWFkYXB0ZXJfcm9tX3Jlc291cmNlc1tpXS5zdGFydCA9IHN0YXJ0OworCQlhZGFwdGVyX3JvbV9yZXNvdXJjZXNbaV0uZW5kID0gc3RhcnQgKyBsZW5ndGggLSAxOworCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmFkYXB0ZXJfcm9tX3Jlc291cmNlc1tpXSk7CisKKwkJc3RhcnQgPSBhZGFwdGVyX3JvbV9yZXNvdXJjZXNbaSsrXS5lbmQgJiB+MjA0N1VMOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGxpbWl0X3JlZ2lvbnModW5zaWduZWQgbG9uZyBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGN1cnJlbnRfYWRkciA9IDA7CisJaW50IGk7CisKKwlpZiAoZWZpX2VuYWJsZWQpIHsKKwkJZm9yIChpID0gMDsgaSA8IG1lbW1hcC5ucl9tYXA7IGkrKykgeworCQkJY3VycmVudF9hZGRyID0gbWVtbWFwLm1hcFtpXS5waHlzX2FkZHIgKworCQkJCSAgICAgICAobWVtbWFwLm1hcFtpXS5udW1fcGFnZXMgPDwgMTIpOworCQkJaWYgKG1lbW1hcC5tYXBbaV0udHlwZSA9PSBFRklfQ09OVkVOVElPTkFMX01FTU9SWSkgeworCQkJCWlmIChjdXJyZW50X2FkZHIgPj0gc2l6ZSkgeworCQkJCQltZW1tYXAubWFwW2ldLm51bV9wYWdlcyAtPQorCQkJCQkJKCgoY3VycmVudF9hZGRyLXNpemUpICsgUEFHRV9TSVpFLTEpID4+IFBBR0VfU0hJRlQpOworCQkJCQltZW1tYXAubnJfbWFwID0gaSArIDE7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKKwkJaWYgKGU4MjAubWFwW2ldLnR5cGUgPT0gRTgyMF9SQU0pIHsKKwkJCWN1cnJlbnRfYWRkciA9IGU4MjAubWFwW2ldLmFkZHIgKyBlODIwLm1hcFtpXS5zaXplOworCQkJaWYgKGN1cnJlbnRfYWRkciA+PSBzaXplKSB7CisJCQkJZTgyMC5tYXBbaV0uc2l6ZSAtPSBjdXJyZW50X2FkZHItc2l6ZTsKKwkJCQllODIwLm5yX21hcCA9IGkgKyAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGFkZF9tZW1vcnlfcmVnaW9uKHVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwgaW50IHR5cGUpCit7CisJaW50IHg7CisKKwlpZiAoIWVmaV9lbmFibGVkKSB7CisgICAgICAgCQl4ID0gZTgyMC5ucl9tYXA7CisKKwkJaWYgKHggPT0gRTgyME1BWCkgeworCQkgICAgcHJpbnRrKEtFUk5fRVJSICJPb29wcyEgVG9vIG1hbnkgZW50cmllcyBpbiB0aGUgbWVtb3J5IG1hcCFcbiIpOworCQkgICAgcmV0dXJuOworCQl9CisKKwkJZTgyMC5tYXBbeF0uYWRkciA9IHN0YXJ0OworCQllODIwLm1hcFt4XS5zaXplID0gc2l6ZTsKKwkJZTgyMC5tYXBbeF0udHlwZSA9IHR5cGU7CisJCWU4MjAubnJfbWFwKys7CisJfQorfSAvKiBhZGRfbWVtb3J5X3JlZ2lvbiAqLworCisjZGVmaW5lIEU4MjBfREVCVUcJMQorCitzdGF0aWMgdm9pZCBfX2luaXQgcHJpbnRfbWVtb3J5X21hcChjaGFyICp3aG8pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCQlwcmludGsoIiAlczogJTAxNkx4IC0gJTAxNkx4ICIsIHdobywKKwkJCWU4MjAubWFwW2ldLmFkZHIsCisJCQllODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSk7CisJCXN3aXRjaCAoZTgyMC5tYXBbaV0udHlwZSkgeworCQljYXNlIEU4MjBfUkFNOglwcmludGsoIih1c2FibGUpXG4iKTsKKwkJCQlicmVhazsKKwkJY2FzZSBFODIwX1JFU0VSVkVEOgorCQkJCXByaW50aygiKHJlc2VydmVkKVxuIik7CisJCQkJYnJlYWs7CisJCWNhc2UgRTgyMF9BQ1BJOgorCQkJCXByaW50aygiKEFDUEkgZGF0YSlcbiIpOworCQkJCWJyZWFrOworCQljYXNlIEU4MjBfTlZTOgorCQkJCXByaW50aygiKEFDUEkgTlZTKVxuIik7CisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CXByaW50aygidHlwZSAlbHVcbiIsIGU4MjAubWFwW2ldLnR5cGUpOworCQkJCWJyZWFrOworCQl9CisJfQorfQorCisvKgorICogU2FuaXRpemUgdGhlIEJJT1MgZTgyMCBtYXAuCisgKgorICogU29tZSBlODIwIHJlc3BvbnNlcyBpbmNsdWRlIG92ZXJsYXBwaW5nIGVudHJpZXMuICBUaGUgZm9sbG93aW5nIAorICogcmVwbGFjZXMgdGhlIG9yaWdpbmFsIGU4MjAgbWFwIHdpdGggYSBuZXcgb25lLCByZW1vdmluZyBvdmVybGFwcy4KKyAqCisgKi8KK3N0cnVjdCBjaGFuZ2VfbWVtYmVyIHsKKwlzdHJ1Y3QgZTgyMGVudHJ5ICpwYmlvczsgLyogcG9pbnRlciB0byBvcmlnaW5hbCBiaW9zIGVudHJ5ICovCisJdW5zaWduZWQgbG9uZyBsb25nIGFkZHI7IC8qIGFkZHJlc3MgZm9yIHRoaXMgY2hhbmdlIHBvaW50ICovCit9Oworc3RhdGljIHN0cnVjdCBjaGFuZ2VfbWVtYmVyIGNoYW5nZV9wb2ludF9saXN0WzIqRTgyME1BWF0gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgY2hhbmdlX21lbWJlciAqY2hhbmdlX3BvaW50WzIqRTgyME1BWF0gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgZTgyMGVudHJ5ICpvdmVybGFwX2xpc3RbRTgyME1BWF0gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgZTgyMGVudHJ5IG5ld19iaW9zW0U4MjBNQVhdIF9faW5pdGRhdGE7CisKK3N0YXRpYyBpbnQgX19pbml0IHNhbml0aXplX2U4MjBfbWFwKHN0cnVjdCBlODIwZW50cnkgKiBiaW9zbWFwLCBjaGFyICogcG5yX21hcCkKK3sKKwlzdHJ1Y3QgY2hhbmdlX21lbWJlciAqY2hhbmdlX3RtcDsKKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfdHlwZSwgbGFzdF90eXBlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0X2FkZHI7CisJaW50IGNoZ2lkeCwgc3RpbGxfY2hhbmdpbmc7CisJaW50IG92ZXJsYXBfZW50cmllczsKKwlpbnQgbmV3X2Jpb3NfZW50cnk7CisJaW50IG9sZF9uciwgbmV3X25yLCBjaGdfbnI7CisJaW50IGk7CisKKwkvKgorCQlWaXN1YWxseSB3ZSdyZSBwZXJmb3JtaW5nIHRoZSBmb2xsb3dpbmcgKDEsMiwzLDQgPSBtZW1vcnkgdHlwZXMpLi4uCisKKwkJU2FtcGxlIG1lbW9yeSBtYXAgKHcvb3ZlcmxhcHMpOgorCQkgICBfX19fMjJfX19fX19fX19fX19fX19fX18KKwkJICAgX19fX19fX19fX19fX19fX19fX19fXzRfCisJCSAgIF9fX18xMTExX19fX19fX19fX19fX19fXworCQkgICBfNDRfX19fX19fX19fX19fX19fX19fX18KKwkJICAgMTExMTExMTFfX19fX19fX19fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX19fMzNfXworCQkgICBfX19fX19fX19fXzQ0X19fX19fX19fX18KKwkJICAgX19fX19fX19fXzMzMzMzX19fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fMjJfX19fX19fXworCQkgICBfX19fX19fX19fX19fX19fX19fMjIyMl8KKwkJICAgX19fX19fX19fMTExMTExMTExX19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX19fXzExXworCQkgICBfX19fX19fX19fX19fX19fXzRfX19fX18KKworCQlTYW5pdGl6ZWQgZXF1aXZhbGVudCAobm8gb3ZlcmxhcCk6CisJCSAgIDFfX19fX19fX19fX19fX19fX19fX19fXworCQkgICBfNDRfX19fX19fX19fX19fX19fX19fX18KKwkJICAgX19fMV9fX19fX19fX19fX19fX19fX19fCisJCSAgIF9fX18yMl9fX19fX19fX19fX19fX19fXworCQkgICBfX19fX18xMV9fX19fX19fX19fX19fX18KKwkJICAgX19fX19fX19fMV9fX19fX19fX19fX19fCisJCSAgIF9fX19fX19fX18zX19fX19fX19fX19fXworCQkgICBfX19fX19fX19fXzQ0X19fX19fX19fX18KKwkJICAgX19fX19fX19fX19fXzMzX19fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fXzJfX19fX19fXworCQkgICBfX19fX19fX19fX19fX19fMV9fX19fX18KKwkJICAgX19fX19fX19fX19fX19fX180X19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX18yX19fXworCQkgICBfX19fX19fX19fX19fX19fX19fXzMzX18KKwkJICAgX19fX19fX19fX19fX19fX19fX19fXzRfCisJKi8KKworCS8qIGlmIHRoZXJlJ3Mgb25seSBvbmUgbWVtb3J5IHJlZ2lvbiwgZG9uJ3QgYm90aGVyICovCisJaWYgKCpwbnJfbWFwIDwgMikKKwkJcmV0dXJuIC0xOworCisJb2xkX25yID0gKnBucl9tYXA7CisKKwkvKiBiYWlsIG91dCBpZiB3ZSBmaW5kIGFueSB1bnJlYXNvbmFibGUgYWRkcmVzc2VzIGluIGJpb3MgbWFwICovCisJZm9yIChpPTA7IGk8b2xkX25yOyBpKyspCisJCWlmIChiaW9zbWFwW2ldLmFkZHIgKyBiaW9zbWFwW2ldLnNpemUgPCBiaW9zbWFwW2ldLmFkZHIpCisJCQlyZXR1cm4gLTE7CisKKwkvKiBjcmVhdGUgcG9pbnRlcnMgZm9yIGluaXRpYWwgY2hhbmdlLXBvaW50IGluZm9ybWF0aW9uIChmb3Igc29ydGluZykgKi8KKwlmb3IgKGk9MDsgaSA8IDIqb2xkX25yOyBpKyspCisJCWNoYW5nZV9wb2ludFtpXSA9ICZjaGFuZ2VfcG9pbnRfbGlzdFtpXTsKKworCS8qIHJlY29yZCBhbGwga25vd24gY2hhbmdlLXBvaW50cyAoc3RhcnRpbmcgYW5kIGVuZGluZyBhZGRyZXNzZXMpLAorCSAgIG9taXR0aW5nIHRob3NlIHRoYXQgYXJlIGZvciBlbXB0eSBtZW1vcnkgcmVnaW9ucyAqLworCWNoZ2lkeCA9IDA7CisJZm9yIChpPTA7IGkgPCBvbGRfbnI7IGkrKykJeworCQlpZiAoYmlvc21hcFtpXS5zaXplICE9IDApIHsKKwkJCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyID0gYmlvc21hcFtpXS5hZGRyOworCQkJY2hhbmdlX3BvaW50W2NoZ2lkeCsrXS0+cGJpb3MgPSAmYmlvc21hcFtpXTsKKwkJCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyID0gYmlvc21hcFtpXS5hZGRyICsgYmlvc21hcFtpXS5zaXplOworCQkJY2hhbmdlX3BvaW50W2NoZ2lkeCsrXS0+cGJpb3MgPSAmYmlvc21hcFtpXTsKKwkJfQorCX0KKwljaGdfbnIgPSBjaGdpZHg7ICAgIAkvKiB0cnVlIG51bWJlciBvZiBjaGFuZ2UtcG9pbnRzICovCisKKwkvKiBzb3J0IGNoYW5nZS1wb2ludCBsaXN0IGJ5IG1lbW9yeSBhZGRyZXNzZXMgKGxvdyAtPiBoaWdoKSAqLworCXN0aWxsX2NoYW5naW5nID0gMTsKKwl3aGlsZSAoc3RpbGxfY2hhbmdpbmcpCXsKKwkJc3RpbGxfY2hhbmdpbmcgPSAwOworCQlmb3IgKGk9MTsgaSA8IGNoZ19ucjsgaSsrKSAgeworCQkJLyogaWYgPGN1cnJlbnRfYWRkcj4gPiA8bGFzdF9hZGRyPiwgc3dhcCAqLworCQkJLyogb3IsIGlmIGN1cnJlbnQ9PHN0YXJ0X2FkZHI+ICYgbGFzdD08ZW5kX2FkZHI+LCBzd2FwICovCisJCQlpZiAoKGNoYW5nZV9wb2ludFtpXS0+YWRkciA8IGNoYW5nZV9wb2ludFtpLTFdLT5hZGRyKSB8fAorCQkJCSgoY2hhbmdlX3BvaW50W2ldLT5hZGRyID09IGNoYW5nZV9wb2ludFtpLTFdLT5hZGRyKSAmJgorCQkJCSAoY2hhbmdlX3BvaW50W2ldLT5hZGRyID09IGNoYW5nZV9wb2ludFtpXS0+cGJpb3MtPmFkZHIpICYmCisJCQkJIChjaGFuZ2VfcG9pbnRbaS0xXS0+YWRkciAhPSBjaGFuZ2VfcG9pbnRbaS0xXS0+cGJpb3MtPmFkZHIpKQorCQkJICAgKQorCQkJeworCQkJCWNoYW5nZV90bXAgPSBjaGFuZ2VfcG9pbnRbaV07CisJCQkJY2hhbmdlX3BvaW50W2ldID0gY2hhbmdlX3BvaW50W2ktMV07CisJCQkJY2hhbmdlX3BvaW50W2ktMV0gPSBjaGFuZ2VfdG1wOworCQkJCXN0aWxsX2NoYW5naW5nPTE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBjcmVhdGUgYSBuZXcgYmlvcyBtZW1vcnkgbWFwLCByZW1vdmluZyBvdmVybGFwcyAqLworCW92ZXJsYXBfZW50cmllcz0wOwkgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG92ZXJsYXAgdGFibGUgKi8KKwluZXdfYmlvc19lbnRyeT0wOwkgLyogaW5kZXggZm9yIGNyZWF0aW5nIG5ldyBiaW9zIG1hcCBlbnRyaWVzICovCisJbGFzdF90eXBlID0gMDsJCSAvKiBzdGFydCB3aXRoIHVuZGVmaW5lZCBtZW1vcnkgdHlwZSAqLworCWxhc3RfYWRkciA9IDA7CQkgLyogc3RhcnQgd2l0aCAwIGFzIGxhc3Qgc3RhcnRpbmcgYWRkcmVzcyAqLworCS8qIGxvb3AgdGhyb3VnaCBjaGFuZ2UtcG9pbnRzLCBkZXRlcm1pbmluZyBhZmZlY3Qgb24gdGhlIG5ldyBiaW9zIG1hcCAqLworCWZvciAoY2hnaWR4PTA7IGNoZ2lkeCA8IGNoZ19ucjsgY2hnaWR4KyspCisJeworCQkvKiBrZWVwIHRyYWNrIG9mIGFsbCBvdmVybGFwcGluZyBiaW9zIGVudHJpZXMgKi8KKwkJaWYgKGNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyID09IGNoYW5nZV9wb2ludFtjaGdpZHhdLT5wYmlvcy0+YWRkcikKKwkJeworCQkJLyogYWRkIG1hcCBlbnRyeSB0byBvdmVybGFwIGxpc3QgKD4gMSBlbnRyeSBpbXBsaWVzIGFuIG92ZXJsYXApICovCisJCQlvdmVybGFwX2xpc3Rbb3ZlcmxhcF9lbnRyaWVzKytdPWNoYW5nZV9wb2ludFtjaGdpZHhdLT5wYmlvczsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3QgKG9yZGVyIGluZGVwZW5kZW50LCBzbyBzd2FwIHdpdGggbGFzdCkgKi8KKwkJCWZvciAoaT0wOyBpPG92ZXJsYXBfZW50cmllczsgaSsrKQorCQkJeworCQkJCWlmIChvdmVybGFwX2xpc3RbaV0gPT0gY2hhbmdlX3BvaW50W2NoZ2lkeF0tPnBiaW9zKQorCQkJCQlvdmVybGFwX2xpc3RbaV0gPSBvdmVybGFwX2xpc3Rbb3ZlcmxhcF9lbnRyaWVzLTFdOworCQkJfQorCQkJb3ZlcmxhcF9lbnRyaWVzLS07CisJCX0KKwkJLyogaWYgdGhlcmUgYXJlIG92ZXJsYXBwaW5nIGVudHJpZXMsIGRlY2lkZSB3aGljaCAidHlwZSIgdG8gdXNlICovCisJCS8qIChsYXJnZXIgdmFsdWUgdGFrZXMgcHJlY2VkZW5jZSAtLSAxPXVzYWJsZSwgMiwzLDQsNCs9dW51c2FibGUpICovCisJCWN1cnJlbnRfdHlwZSA9IDA7CisJCWZvciAoaT0wOyBpPG92ZXJsYXBfZW50cmllczsgaSsrKQorCQkJaWYgKG92ZXJsYXBfbGlzdFtpXS0+dHlwZSA+IGN1cnJlbnRfdHlwZSkKKwkJCQljdXJyZW50X3R5cGUgPSBvdmVybGFwX2xpc3RbaV0tPnR5cGU7CisJCS8qIGNvbnRpbnVlIGJ1aWxkaW5nIHVwIG5ldyBiaW9zIG1hcCBiYXNlZCBvbiB0aGlzIGluZm9ybWF0aW9uICovCisJCWlmIChjdXJyZW50X3R5cGUgIT0gbGFzdF90eXBlKQl7CisJCQlpZiAobGFzdF90eXBlICE9IDApCSB7CisJCQkJbmV3X2Jpb3NbbmV3X2Jpb3NfZW50cnldLnNpemUgPQorCQkJCQljaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkciAtIGxhc3RfYWRkcjsKKwkJCQkvKiBtb3ZlIGZvcndhcmQgb25seSBpZiB0aGUgbmV3IHNpemUgd2FzIG5vbi16ZXJvICovCisJCQkJaWYgKG5ld19iaW9zW25ld19iaW9zX2VudHJ5XS5zaXplICE9IDApCisJCQkJCWlmICgrK25ld19iaW9zX2VudHJ5ID49IEU4MjBNQVgpCisJCQkJCQlicmVhazsgCS8qIG5vIG1vcmUgc3BhY2UgbGVmdCBmb3IgbmV3IGJpb3MgZW50cmllcyAqLworCQkJfQorCQkJaWYgKGN1cnJlbnRfdHlwZSAhPSAwKQl7CisJCQkJbmV3X2Jpb3NbbmV3X2Jpb3NfZW50cnldLmFkZHIgPSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkcjsKKwkJCQluZXdfYmlvc1tuZXdfYmlvc19lbnRyeV0udHlwZSA9IGN1cnJlbnRfdHlwZTsKKwkJCQlsYXN0X2FkZHI9Y2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHI7CisJCQl9CisJCQlsYXN0X3R5cGUgPSBjdXJyZW50X3R5cGU7CisJCX0KKwl9CisJbmV3X25yID0gbmV3X2Jpb3NfZW50cnk7ICAgLyogcmV0YWluIGNvdW50IGZvciBuZXcgYmlvcyBlbnRyaWVzICovCisKKwkvKiBjb3B5IG5ldyBiaW9zIG1hcHBpbmcgaW50byBvcmlnaW5hbCBsb2NhdGlvbiAqLworCW1lbWNweShiaW9zbWFwLCBuZXdfYmlvcywgbmV3X25yKnNpemVvZihzdHJ1Y3QgZTgyMGVudHJ5KSk7CisJKnBucl9tYXAgPSBuZXdfbnI7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcHkgdGhlIEJJT1MgZTgyMCBtYXAgaW50byBhIHNhZmUgcGxhY2UuCisgKgorICogU2FuaXR5LWNoZWNrIGl0IHdoaWxlIHdlJ3JlIGF0IGl0Li4KKyAqCisgKiBJZiB3ZSdyZSBsdWNreSBhbmQgbGl2ZSBvbiBhIG1vZGVybiBzeXN0ZW0sIHRoZSBzZXR1cCBjb2RlCisgKiB3aWxsIGhhdmUgZ2l2ZW4gdXMgYSBtZW1vcnkgbWFwIHRoYXQgd2UgY2FuIHVzZSB0byBwcm9wZXJseQorICogc2V0IHVwIG1lbW9yeS4gIElmIHdlIGFyZW4ndCwgd2UnbGwgZmFrZSBhIG1lbW9yeSBtYXAuCisgKgorICogV2UgY2hlY2sgdG8gc2VlIHRoYXQgdGhlIG1lbW9yeSBtYXAgY29udGFpbnMgYXQgbGVhc3QgMiBlbGVtZW50cworICogYmVmb3JlIHdlJ2xsIHVzZSBpdCwgYmVjYXVzZSB0aGUgZGV0ZWN0aW9uIGNvZGUgaW4gc2V0dXAuUyBtYXkKKyAqIG5vdCBiZSBwZXJmZWN0IGFuZCBtb3N0IGV2ZXJ5IFBDIGtub3duIHRvIG1hbiBoYXMgdHdvIG1lbW9yeQorICogcmVnaW9uczogb25lIGZyb20gMCB0byA2NDBrLCBhbmQgb25lIGZyb20gMW1iIHVwLiAgKFRoZSBJQk0KKyAqIHRoaW5rcGFkIDU2MHgsIGZvciBleGFtcGxlLCBkb2VzIG5vdCBjb29wZXJhdGUgd2l0aCB0aGUgbWVtb3J5CisgKiBkZXRlY3Rpb24gY29kZS4pCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNvcHlfZTgyMF9tYXAoc3RydWN0IGU4MjBlbnRyeSAqIGJpb3NtYXAsIGludCBucl9tYXApCit7CisJLyogT25seSBvbmUgbWVtb3J5IHJlZ2lvbiAob3IgbmVnYXRpdmUpPyBJZ25vcmUgaXQgKi8KKwlpZiAobnJfbWFwIDwgMikKKwkJcmV0dXJuIC0xOworCisJZG8geworCQl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQgPSBiaW9zbWFwLT5hZGRyOworCQl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSA9IGJpb3NtYXAtPnNpemU7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBlbmQgPSBzdGFydCArIHNpemU7CisJCXVuc2lnbmVkIGxvbmcgdHlwZSA9IGJpb3NtYXAtPnR5cGU7CisKKwkJLyogT3ZlcmZsb3cgaW4gNjQgYml0cz8gSWdub3JlIHRoZSBtZW1vcnkgbWFwLiAqLworCQlpZiAoc3RhcnQgPiBlbmQpCisJCQlyZXR1cm4gLTE7CisKKwkJLyoKKwkJICogU29tZSBCSU9TZXMgY2xhaW0gUkFNIGluIHRoZSA2NDBrIC0gMU0gcmVnaW9uLgorCQkgKiBOb3QgcmlnaHQuIEZpeCBpdCB1cC4KKwkJICovCisJCWlmICh0eXBlID09IEU4MjBfUkFNKSB7CisJCQlpZiAoc3RhcnQgPCAweDEwMDAwMFVMTCAmJiBlbmQgPiAweEEwMDAwVUxMKSB7CisJCQkJaWYgKHN0YXJ0IDwgMHhBMDAwMFVMTCkKKwkJCQkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnQsIDB4QTAwMDBVTEwtc3RhcnQsIHR5cGUpOworCQkJCWlmIChlbmQgPD0gMHgxMDAwMDBVTEwpCisJCQkJCWNvbnRpbnVlOworCQkJCXN0YXJ0ID0gMHgxMDAwMDBVTEw7CisJCQkJc2l6ZSA9IGVuZCAtIHN0YXJ0OworCQkJfQorCQl9CisJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0LCBzaXplLCB0eXBlKTsKKwl9IHdoaWxlIChiaW9zbWFwKyssLS1ucl9tYXApOworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfRUREKSB8fCBkZWZpbmVkKENPTkZJR19FRERfTU9EVUxFKQorc3RydWN0IGVkZCBlZGQ7CisjaWZkZWYgQ09ORklHX0VERF9NT0RVTEUKK0VYUE9SVF9TWU1CT0woZWRkKTsKKyNlbmRpZgorLyoqCisgKiBjb3B5X2VkZCgpIC0gQ29weSB0aGUgQklPUyBFREQgaW5mb3JtYXRpb24KKyAqICAgICAgICAgICAgICBmcm9tIGJvb3RfcGFyYW1zIGludG8gYSBzYWZlIHBsYWNlLgorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfZWRkKHZvaWQpCit7CisgICAgIG1lbWNweShlZGQubWJyX3NpZ25hdHVyZSwgRUREX01CUl9TSUdOQVRVUkUsIHNpemVvZihlZGQubWJyX3NpZ25hdHVyZSkpOworICAgICBtZW1jcHkoZWRkLmVkZF9pbmZvLCBFRERfQlVGLCBzaXplb2YoZWRkLmVkZF9pbmZvKSk7CisgICAgIGVkZC5tYnJfc2lnbmF0dXJlX25yID0gRUREX01CUl9TSUdfTlI7CisgICAgIGVkZC5lZGRfaW5mb19uciA9IEVERF9OUjsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9lZGQodm9pZCkKK3sKK30KKyNlbmRpZgorCisvKgorICogRG8gTk9UIEVWRVIgbG9vayBhdCB0aGUgQklPUyBtZW1vcnkgc2l6ZSBsb2NhdGlvbi4KKyAqIEl0IGRvZXMgbm90IHdvcmsgb24gbWFueSBtYWNoaW5lcy4KKyAqLworI2RlZmluZSBMT1dNRU1TSVpFKCkJKDB4OWYwMDApCisKK3N0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV9jbWRsaW5lX2Vhcmx5IChjaGFyICoqIGNtZGxpbmVfcCkKK3sKKwljaGFyIGMgPSAnICcsICp0byA9IGNvbW1hbmRfbGluZSwgKmZyb20gPSBzYXZlZF9jb21tYW5kX2xpbmU7CisJaW50IGxlbiA9IDA7CisJaW50IHVzZXJkZWYgPSAwOworCisJLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLworCXNhdmVkX2NvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRS0xXSA9ICdcMCc7CisKKwlmb3IgKDs7KSB7CisJCWlmIChjICE9ICcgJykKKwkJCWdvdG8gbmV4dF9jaGFyOworCQkvKgorCQkgKiAibWVtPW5vcGVudGl1bSIgZGlzYWJsZXMgdGhlIDRNQiBwYWdlIHRhYmxlcy4KKwkJICogIm1lbT1YWFhba0ttTV0iIGRlZmluZXMgYSBtZW1vcnkgcmVnaW9uIGZyb20gSElHSF9NRU0KKwkJICogdG8gPG1lbT4sIG92ZXJyaWRpbmcgdGhlIGJpb3Mgc2l6ZS4KKwkJICogIm1lbW1hcD1YWFhbS2ttTV1AWFhYW0trbU1dIiBkZWZpbmVzIGEgbWVtb3J5IHJlZ2lvbiBmcm9tCisJCSAqIDxzdGFydD4gdG8gPHN0YXJ0Pis8bWVtPiwgb3ZlcnJpZGluZyB0aGUgYmlvcyBzaXplLgorCQkgKgorCQkgKiBIUEEgdGVsbHMgbWUgYm9vdGxvYWRlcnMgbmVlZCB0byBwYXJzZSBtZW09LCBzbyBubyBuZXcKKwkJICogb3B0aW9uIHNob3VsZCBiZSBtZW09ICBbYWxzbyBzZWUgRG9jdW1lbnRhdGlvbi9pMzg2L2Jvb3QudHh0XQorCQkgKi8KKwkJaWYgKCFtZW1jbXAoZnJvbSwgIm1lbT0iLCA0KSkgeworCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKKwkJCQl0by0tOworCQkJaWYgKCFtZW1jbXAoZnJvbSs0LCAibm9wZW50aXVtIiwgOSkpIHsKKwkJCQlmcm9tICs9IDkrNDsKKwkJCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfUFNFLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKKwkJCQlkaXNhYmxlX3BzZSA9IDE7CisJCQl9IGVsc2UgeworCQkJCS8qIElmIHRoZSB1c2VyIHNwZWNpZmllcyBtZW1vcnkgc2l6ZSwgd2UKKwkJCQkgKiBsaW1pdCB0aGUgQklPUy1wcm92aWRlZCBtZW1vcnkgbWFwIHRvCisJCQkJICogdGhhdCBzaXplLiBleGFjdG1hcCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisJCQkJICogdGhlIGV4YWN0IG1hcC4gbWVtPW51bWJlciBjYW4gYmUgdXNlZCB0bworCQkJCSAqIHRyaW0gdGhlIGV4aXN0aW5nIG1lbW9yeSBtYXAuCisJCQkJICovCisJCQkJdW5zaWduZWQgbG9uZyBsb25nIG1lbV9zaXplOworIAorCQkJCW1lbV9zaXplID0gbWVtcGFyc2UoZnJvbSs0LCAmZnJvbSk7CisJCQkJbGltaXRfcmVnaW9ucyhtZW1fc2l6ZSk7CisJCQkJdXNlcmRlZj0xOworCQkJfQorCQl9CisKKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAibWVtbWFwPSIsIDcpKSB7CisJCQlpZiAodG8gIT0gY29tbWFuZF9saW5lKQorCQkJCXRvLS07CisJCQlpZiAoIW1lbWNtcChmcm9tKzcsICJleGFjdG1hcCIsIDgpKSB7CisJCQkJZnJvbSArPSA4Kzc7CisJCQkJZTgyMC5ucl9tYXAgPSAwOworCQkJCXVzZXJkZWYgPSAxOworCQkJfSBlbHNlIHsKKwkJCQkvKiBJZiB0aGUgdXNlciBzcGVjaWZpZXMgbWVtb3J5IHNpemUsIHdlCisJCQkJICogbGltaXQgdGhlIEJJT1MtcHJvdmlkZWQgbWVtb3J5IG1hcCB0bworCQkJCSAqIHRoYXQgc2l6ZS4gZXhhY3RtYXAgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorCQkJCSAqIHRoZSBleGFjdCBtYXAuIG1lbT1udW1iZXIgY2FuIGJlIHVzZWQgdG8KKwkJCQkgKiB0cmltIHRoZSBleGlzdGluZyBtZW1vcnkgbWFwLgorCQkJCSAqLworCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydF9hdCwgbWVtX3NpemU7CisgCisJCQkJbWVtX3NpemUgPSBtZW1wYXJzZShmcm9tKzcsICZmcm9tKTsKKwkJCQlpZiAoKmZyb20gPT0gJ0AnKSB7CisJCQkJCXN0YXJ0X2F0ID0gbWVtcGFyc2UoZnJvbSsxLCAmZnJvbSk7CisJCQkJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9SQU0pOworCQkJCX0gZWxzZSBpZiAoKmZyb20gPT0gJyMnKSB7CisJCQkJCXN0YXJ0X2F0ID0gbWVtcGFyc2UoZnJvbSsxLCAmZnJvbSk7CisJCQkJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9BQ1BJKTsKKwkJCQl9IGVsc2UgaWYgKCpmcm9tID09ICckJykgeworCQkJCQlzdGFydF9hdCA9IG1lbXBhcnNlKGZyb20rMSwgJmZyb20pOworCQkJCQlhZGRfbWVtb3J5X3JlZ2lvbihzdGFydF9hdCwgbWVtX3NpemUsIEU4MjBfUkVTRVJWRUQpOworCQkJCX0gZWxzZSB7CisJCQkJCWxpbWl0X3JlZ2lvbnMobWVtX3NpemUpOworCQkJCQl1c2VyZGVmPTE7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAibm9leGVjPSIsIDcpKQorCQkJbm9leGVjX3NldHVwKGZyb20gKyA3KTsKKworCisjaWZkZWYgIENPTkZJR19YODZfU01QCisJCS8qCisJCSAqIElmIHRoZSBCSU9TIGVudW1lcmF0ZXMgcGh5c2ljYWwgcHJvY2Vzc29ycyBiZWZvcmUgbG9naWNhbCwKKwkJICogbWF4Y3B1cz1OIGF0IGVudW1lcmF0aW9uLXRpbWUgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBIVC4KKwkJICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgIm1heGNwdXM9IiwgOCkpIHsKKwkJCWV4dGVybiB1bnNpZ25lZCBpbnQgbWF4Y3B1czsKKworCQkJbWF4Y3B1cyA9IHNpbXBsZV9zdHJ0b3VsKGZyb20gKyA4LCBOVUxMLCAwKTsKKwkJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQUNQSV9CT09UCisJCS8qICJhY3BpPW9mZiIgZGlzYWJsZXMgYm90aCBBQ1BJIHRhYmxlIHBhcnNpbmcgYW5kIGludGVycHJldGVyICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGk9b2ZmIiwgOCkpIHsKKwkJCWRpc2FibGVfYWNwaSgpOworCQl9CisKKwkJLyogYWNwaT1mb3JjZSB0byBvdmVyLXJpZGUgYmxhY2stbGlzdCAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpPWZvcmNlIiwgMTApKSB7CisJCQlhY3BpX2ZvcmNlID0gMTsKKwkJCWFjcGlfaHQgPSAxOworCQkJYWNwaV9kaXNhYmxlZCA9IDA7CisJCX0KKworCQkvKiBhY3BpPXN0cmljdCBkaXNhYmxlcyBvdXQtb2Ytc3BlYyB3b3JrYXJvdW5kcyAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpPXN0cmljdCIsIDExKSkgeworCQkJYWNwaV9zdHJpY3QgPSAxOworCQl9CisKKwkJLyogTGltaXQgQUNQSSBqdXN0IHRvIGJvb3QtdGltZSB0byBlbmFibGUgSFQgKi8KKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaT1odCIsIDcpKSB7CisJCQlpZiAoIWFjcGlfZm9yY2UpCisJCQkJZGlzYWJsZV9hY3BpKCk7CisJCQlhY3BpX2h0ID0gMTsKKwkJfQorCQkKKwkJLyogInBjaT1ub2FjcGkiIGRpc2FibGUgQUNQSSBJUlEgcm91dGluZyBhbmQgUENJIHNjYW4gKi8KKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAicGNpPW5vYWNwaSIsIDEwKSkgeworCQkJYWNwaV9kaXNhYmxlX3BjaSgpOworCQl9CisJCS8qICJhY3BpPW5vaXJxIiBkaXNhYmxlcyBBQ1BJIGludGVycnVwdCByb3V0aW5nICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGk9bm9pcnEiLCAxMCkpIHsKKwkJCWFjcGlfbm9pcnFfc2V0KCk7CisJCX0KKworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpX3NjaT1lZGdlIiwgMTMpKQorCQkJYWNwaV9zY2lfZmxhZ3MudHJpZ2dlciA9ICAxOworCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGlfc2NpPWxldmVsIiwgMTQpKQorCQkJYWNwaV9zY2lfZmxhZ3MudHJpZ2dlciA9IDM7CisKKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaV9zY2k9aGlnaCIsIDEzKSkKKwkJCWFjcGlfc2NpX2ZsYWdzLnBvbGFyaXR5ID0gMTsKKworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpX3NjaT1sb3ciLCAxMikpCisJCQlhY3BpX3NjaV9mbGFncy5wb2xhcml0eSA9IDM7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlIiwgMjQpKQorCQkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJCS8qIGRpc2FibGUgSU8tQVBJQyAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJub2FwaWMiLCA2KSkKKwkJCWRpc2FibGVfaW9hcGljX3NldHVwKCk7CisjZW5kaWYgLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCisjZW5kaWYgLyogQ09ORklHX0FDUElfQk9PVCAqLworCisJCS8qCisJCSAqIGhpZ2htZW09c2l6ZSBmb3JjZXMgaGlnaG1lbSB0byBiZSBleGFjdGx5ICdzaXplJyBieXRlcy4KKwkJICogVGhpcyB3b3JrcyBldmVuIG9uIGJveGVzIHRoYXQgaGF2ZSBubyBoaWdobWVtIG90aGVyd2lzZS4KKwkJICogVGhpcyBhbHNvIHdvcmtzIHRvIHJlZHVjZSBoaWdobWVtIHNpemUgb24gYmlnZ2VyIGJveGVzLgorCQkgKi8KKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiaGlnaG1lbT0iLCA4KSkKKwkJCWhpZ2htZW1fcGFnZXMgPSBtZW1wYXJzZShmcm9tKzgsICZmcm9tKSA+PiBQQUdFX1NISUZUOworCQorCQkvKgorCQkgKiB2bWFsbG9jPXNpemUgZm9yY2VzIHRoZSB2bWFsbG9jIGFyZWEgdG8gYmUgZXhhY3RseSAnc2l6ZScKKwkJICogYnl0ZXMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5jcmVhc2UgKG9yIGRlY3JlYXNlKSB0aGUKKwkJICogdm1hbGxvYyBhcmVhIC0gdGhlIGRlZmF1bHQgaXMgMTI4bS4KKwkJICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgInZtYWxsb2M9IiwgOCkpCisJCQlfX1ZNQUxMT0NfUkVTRVJWRSA9IG1lbXBhcnNlKGZyb20rOCwgJmZyb20pOworCisJbmV4dF9jaGFyOgorCQljID0gKihmcm9tKyspOworCQlpZiAoIWMpCisJCQlicmVhazsKKwkJaWYgKENPTU1BTkRfTElORV9TSVpFIDw9ICsrbGVuKQorCQkJYnJlYWs7CisJCSoodG8rKykgPSBjOworCX0KKwkqdG8gPSAnXDAnOworCSpjbWRsaW5lX3AgPSBjb21tYW5kX2xpbmU7CisJaWYgKHVzZXJkZWYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidXNlci1kZWZpbmVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKKwkJcHJpbnRfbWVtb3J5X21hcCgidXNlciIpOworCX0KK30KKworLyoKKyAqIENhbGxiYWNrIGZvciBlZmlfbWVtb3J5X3dhbGsuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CitlZmlfZmluZF9tYXhfcGZuKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB2b2lkICphcmcpCit7CisJdW5zaWduZWQgbG9uZyAqbWF4X3BmbiA9IGFyZywgcGZuOworCisJaWYgKHN0YXJ0IDwgZW5kKSB7CisJCXBmbiA9IFBGTl9VUChlbmQgLTEpOworCQlpZiAocGZuID4gKm1heF9wZm4pCisJCQkqbWF4X3BmbiA9IHBmbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUKKyAqLwordm9pZCBfX2luaXQgZmluZF9tYXhfcGZuKHZvaWQpCit7CisJaW50IGk7CisKKwltYXhfcGZuID0gMDsKKwlpZiAoZWZpX2VuYWJsZWQpIHsKKwkJZWZpX21lbW1hcF93YWxrKGVmaV9maW5kX21heF9wZm4sICZtYXhfcGZuKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKwkJLyogUkFNPyAqLworCQlpZiAoZTgyMC5tYXBbaV0udHlwZSAhPSBFODIwX1JBTSkKKwkJCWNvbnRpbnVlOworCQlzdGFydCA9IFBGTl9VUChlODIwLm1hcFtpXS5hZGRyKTsKKwkJZW5kID0gUEZOX0RPV04oZTgyMC5tYXBbaV0uYWRkciArIGU4MjAubWFwW2ldLnNpemUpOworCQlpZiAoc3RhcnQgPj0gZW5kKQorCQkJY29udGludWU7CisJCWlmIChlbmQgPiBtYXhfcGZuKQorCQkJbWF4X3BmbiA9IGVuZDsKKwl9Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgbG93IGFuZCBoaWdoIG1lbW9yeSByYW5nZXM6CisgKi8KK3Vuc2lnbmVkIGxvbmcgX19pbml0IGZpbmRfbWF4X2xvd19wZm4odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuOworCisJbWF4X2xvd19wZm4gPSBtYXhfcGZuOworCWlmIChtYXhfbG93X3BmbiA+IE1BWE1FTV9QRk4pIHsKKwkJaWYgKGhpZ2htZW1fcGFnZXMgPT0gLTEpCisJCQloaWdobWVtX3BhZ2VzID0gbWF4X3BmbiAtIE1BWE1FTV9QRk47CisJCWlmIChoaWdobWVtX3BhZ2VzICsgTUFYTUVNX1BGTiA8IG1heF9wZm4pCisJCQltYXhfcGZuID0gTUFYTUVNX1BGTiArIGhpZ2htZW1fcGFnZXM7CisJCWlmIChoaWdobWVtX3BhZ2VzICsgTUFYTUVNX1BGTiA+IG1heF9wZm4pIHsKKwkJCXByaW50aygib25seSAlbHVNQiBoaWdobWVtIHBhZ2VzIGF2YWlsYWJsZSwgaWdub3JpbmcgaGlnaG1lbSBzaXplIG9mICV1TUIuXG4iLCBwYWdlc190b19tYihtYXhfcGZuIC0gTUFYTUVNX1BGTiksIHBhZ2VzX3RvX21iKGhpZ2htZW1fcGFnZXMpKTsKKwkJCWhpZ2htZW1fcGFnZXMgPSAwOworCQl9CisJCW1heF9sb3dfcGZuID0gTUFYTUVNX1BGTjsKKyNpZm5kZWYgQ09ORklHX0hJR0hNRU0KKwkJLyogTWF4aW11bSBtZW1vcnkgdXNhYmxlIGlzIHdoYXQgaXMgZGlyZWN0bHkgYWRkcmVzc2FibGUgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZyBvbmx5ICVsZE1CIHdpbGwgYmUgdXNlZC5cbiIsCisJCQkJCU1BWE1FTT4+MjApOworCQlpZiAobWF4X3BmbiA+IE1BWF9OT05QQUVfUEZOKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVXNlIGEgUEFFIGVuYWJsZWQga2VybmVsLlxuIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVzZSBhIEhJR0hNRU0gZW5hYmxlZCBrZXJuZWwuXG4iKTsKKwkJbWF4X3BmbiA9IE1BWE1FTV9QRk47CisjZWxzZSAvKiAhQ09ORklHX0hJR0hNRU0gKi8KKyNpZm5kZWYgQ09ORklHX1g4Nl9QQUUKKwkJaWYgKG1heF9wZm4gPiBNQVhfTk9OUEFFX1BGTikgeworCQkJbWF4X3BmbiA9IE1BWF9OT05QQUVfUEZOOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZyBvbmx5IDRHQiB3aWxsIGJlIHVzZWQuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVzZSBhIFBBRSBlbmFibGVkIGtlcm5lbC5cbiIpOworCQl9CisjZW5kaWYgLyogIUNPTkZJR19YODZfUEFFICovCisjZW5kaWYgLyogIUNPTkZJR19ISUdITUVNICovCisJfSBlbHNlIHsKKwkJaWYgKGhpZ2htZW1fcGFnZXMgPT0gLTEpCisJCQloaWdobWVtX3BhZ2VzID0gMDsKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCQlpZiAoaGlnaG1lbV9wYWdlcyA+PSBtYXhfcGZuKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImhpZ2htZW0gc2l6ZSBzcGVjaWZpZWQgKCV1TUIpIGlzIGJpZ2dlciB0aGFuIHBhZ2VzIGF2YWlsYWJsZSAoJWx1TUIpIS5cbiIsIHBhZ2VzX3RvX21iKGhpZ2htZW1fcGFnZXMpLCBwYWdlc190b19tYihtYXhfcGZuKSk7CisJCQloaWdobWVtX3BhZ2VzID0gMDsKKwkJfQorCQlpZiAoaGlnaG1lbV9wYWdlcykgeworCQkJaWYgKG1heF9sb3dfcGZuLWhpZ2htZW1fcGFnZXMgPCA2NCoxMDI0KjEwMjQvUEFHRV9TSVpFKXsKKwkJCQlwcmludGsoS0VSTl9FUlIgImhpZ2htZW0gc2l6ZSAldU1CIHJlc3VsdHMgaW4gc21hbGxlciB0aGFuIDY0TUIgbG93bWVtLCBpZ25vcmluZyBpdC5cbiIsIHBhZ2VzX3RvX21iKGhpZ2htZW1fcGFnZXMpKTsKKwkJCQloaWdobWVtX3BhZ2VzID0gMDsKKwkJCX0KKwkJCW1heF9sb3dfcGZuIC09IGhpZ2htZW1fcGFnZXM7CisJCX0KKyNlbHNlCisJCWlmIChoaWdobWVtX3BhZ2VzKQorCQkJcHJpbnRrKEtFUk5fRVJSICJpZ25vcmluZyBoaWdobWVtIHNpemUgb24gbm9uLWhpZ2htZW0ga2VybmVsIVxuIik7CisjZW5kaWYKKwl9CisJcmV0dXJuIG1heF9sb3dfcGZuOworfQorCisvKgorICogRnJlZSBhbGwgYXZhaWxhYmxlIG1lbW9yeSBmb3IgYm9vdCB0aW1lIGFsbG9jYXRpb24uICBVc2VkCisgKiBhcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGJ5IGVmaV9tZW1vcnlfd2FsaygpCisgKi8KKworc3RhdGljIGludCBfX2luaXQKK2ZyZWVfYXZhaWxhYmxlX21lbW9yeSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgdm9pZCAqYXJnKQoreworCS8qIGNoZWNrIG1heF9sb3dfcGZuICovCisJaWYgKHN0YXJ0ID49ICgobWF4X2xvd19wZm4gKyAxKSA8PCBQQUdFX1NISUZUKSkKKwkJcmV0dXJuIDA7CisJaWYgKGVuZCA+PSAoKG1heF9sb3dfcGZuICsgMSkgPDwgUEFHRV9TSElGVCkpCisJCWVuZCA9IChtYXhfbG93X3BmbiArIDEpIDw8IFBBR0VfU0hJRlQ7CisJaWYgKHN0YXJ0IDwgZW5kKQorCQlmcmVlX2Jvb3RtZW0oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKworCXJldHVybiAwOworfQorLyoKKyAqIFJlZ2lzdGVyIGZ1bGx5IGF2YWlsYWJsZSBsb3cgUkFNIHBhZ2VzIHdpdGggdGhlIGJvb3RtZW0gYWxsb2NhdG9yLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcmVnaXN0ZXJfYm9vdG1lbV9sb3dfcGFnZXModW5zaWduZWQgbG9uZyBtYXhfbG93X3BmbikKK3sKKwlpbnQgaTsKKworCWlmIChlZmlfZW5hYmxlZCkgeworCQllZmlfbWVtbWFwX3dhbGsoZnJlZV9hdmFpbGFibGVfbWVtb3J5LCBOVUxMKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGN1cnJfcGZuLCBsYXN0X3Bmbiwgc2l6ZTsKKwkJLyoKKwkJICogUmVzZXJ2ZSB1c2FibGUgbG93IG1lbW9yeQorCQkgKi8KKwkJaWYgKGU4MjAubWFwW2ldLnR5cGUgIT0gRTgyMF9SQU0pCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogV2UgYXJlIHJvdW5kaW5nIHVwIHRoZSBzdGFydCBhZGRyZXNzIG9mIHVzYWJsZSBtZW1vcnk6CisJCSAqLworCQljdXJyX3BmbiA9IFBGTl9VUChlODIwLm1hcFtpXS5hZGRyKTsKKwkJaWYgKGN1cnJfcGZuID49IG1heF9sb3dfcGZuKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIC4uLiBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgdXNhYmxlIHJhbmdlIGRvd253YXJkczoKKwkJICovCisJCWxhc3RfcGZuID0gUEZOX0RPV04oZTgyMC5tYXBbaV0uYWRkciArIGU4MjAubWFwW2ldLnNpemUpOworCisJCWlmIChsYXN0X3BmbiA+IG1heF9sb3dfcGZuKQorCQkJbGFzdF9wZm4gPSBtYXhfbG93X3BmbjsKKworCQkvKgorCQkgKiAuLiBmaW5hbGx5LCBkaWQgYWxsIHRoZSByb3VuZGluZyBhbmQgcGxheWluZworCQkgKiBhcm91bmQganVzdCBtYWtlIHRoZSBhcmVhIGdvIGF3YXk/CisJCSAqLworCQlpZiAobGFzdF9wZm4gPD0gY3Vycl9wZm4pCisJCQljb250aW51ZTsKKworCQlzaXplID0gbGFzdF9wZm4gLSBjdXJyX3BmbjsKKwkJZnJlZV9ib290bWVtKFBGTl9QSFlTKGN1cnJfcGZuKSwgUEZOX1BIWVMoc2l6ZSkpOworCX0KK30KKworLyoKKyAqIHdvcmthcm91bmQgZm9yIERlbGwgc3lzdGVtcyB0aGF0IG5lZ2xlY3QgdG8gcmVzZXJ2ZSBFQkRBCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByZXNlcnZlX2ViZGFfcmVnaW9uKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGFkZHI7CisJYWRkciA9IGdldF9iaW9zX2ViZGEoKTsKKwlpZiAoYWRkcikKKwkJcmVzZXJ2ZV9ib290bWVtKGFkZHIsIFBBR0VfU0laRSk7CQorfQorCisjaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKHZvaWQpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IHNldHVwX21lbW9yeSh2b2lkKQoreworCS8qCisJICogcGFydGlhbGx5IHVzZWQgcGFnZXMgYXJlIG5vdCB1c2FibGUgLSB0aHVzCisJICogd2UgYXJlIHJvdW5kaW5nIHVwd2FyZHM6CisJICovCisJbWluX2xvd19wZm4gPSBQRk5fVVAoaW5pdF9wZ190YWJsZXNfZW5kKTsKKworCWZpbmRfbWF4X3BmbigpOworCisJbWF4X2xvd19wZm4gPSBmaW5kX21heF9sb3dfcGZuKCk7CisKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCWhpZ2hzdGFydF9wZm4gPSBoaWdoZW5kX3BmbiA9IG1heF9wZm47CisJaWYgKG1heF9wZm4gPiBtYXhfbG93X3BmbikgeworCQloaWdoc3RhcnRfcGZuID0gbWF4X2xvd19wZm47CisJfQorCXByaW50ayhLRVJOX05PVElDRSAiJWxkTUIgSElHSE1FTSBhdmFpbGFibGUuXG4iLAorCQlwYWdlc190b19tYihoaWdoZW5kX3BmbiAtIGhpZ2hzdGFydF9wZm4pKTsKKyNlbmRpZgorCXByaW50ayhLRVJOX05PVElDRSAiJWxkTUIgTE9XTUVNIGF2YWlsYWJsZS5cbiIsCisJCQlwYWdlc190b19tYihtYXhfbG93X3BmbikpOworCisJc2V0dXBfYm9vdG1lbV9hbGxvY2F0b3IoKTsKKworCXJldHVybiBtYXhfbG93X3BmbjsKK30KKwordm9pZCBfX2luaXQgem9uZV9zaXplc19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU10gPSB7MCwgMCwgMH07CisJdW5zaWduZWQgaW50IG1heF9kbWEsIGxvdzsKKworCW1heF9kbWEgPSB2aXJ0X3RvX3BoeXMoKGNoYXIgKilNQVhfRE1BX0FERFJFU1MpID4+IFBBR0VfU0hJRlQ7CisJbG93ID0gbWF4X2xvd19wZm47CisKKwlpZiAobG93IDwgbWF4X2RtYSkKKwkJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBsb3c7CisJZWxzZSB7CisJCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gbWF4X2RtYTsKKwkJem9uZXNfc2l6ZVtaT05FX05PUk1BTF0gPSBsb3cgLSBtYXhfZG1hOworI2lmZGVmIENPTkZJR19ISUdITUVNCisJCXpvbmVzX3NpemVbWk9ORV9ISUdITUVNXSA9IGhpZ2hlbmRfcGZuIC0gbG93OworI2VuZGlmCisJfQorCWZyZWVfYXJlYV9pbml0KHpvbmVzX3NpemUpOworfQorI2Vsc2UKK2V4dGVybiB1bnNpZ25lZCBsb25nIHNldHVwX21lbW9yeSh2b2lkKTsKK2V4dGVybiB2b2lkIHpvbmVfc2l6ZXNfaW5pdCh2b2lkKTsKKyNlbmRpZiAvKiAhQ09ORklHX0RJU0NPTlRJR01FTSAqLworCit2b2lkIF9faW5pdCBzZXR1cF9ib290bWVtX2FsbG9jYXRvcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9zaXplOworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgYm9vdC10aW1lIGFsbG9jYXRvciAod2l0aCBsb3cgbWVtb3J5IG9ubHkpOgorCSAqLworCWJvb3RtYXBfc2l6ZSA9IGluaXRfYm9vdG1lbShtaW5fbG93X3BmbiwgbWF4X2xvd19wZm4pOworCisJcmVnaXN0ZXJfYm9vdG1lbV9sb3dfcGFnZXMobWF4X2xvd19wZm4pOworCisJLyoKKwkgKiBSZXNlcnZlIHRoZSBib290bWVtIGJpdG1hcCBpdHNlbGYgYXMgd2VsbC4gV2UgZG8gdGhpcyBpbiB0d28KKwkgKiBzdGVwcyAoZmlyc3Qgc3RlcCB3YXMgaW5pdF9ib290bWVtKCkpIGJlY2F1c2UgdGhpcyBjYXRjaGVzCisJICogdGhlICh2ZXJ5IHVubGlrZWx5KSBjYXNlIG9mIHVzIGFjY2lkZW50YWxseSBpbml0aWFsaXppbmcgdGhlCisJICogYm9vdG1lbSBhbGxvY2F0b3Igd2l0aCBhbiBpbnZhbGlkIFJBTSBhcmVhLgorCSAqLworCXJlc2VydmVfYm9vdG1lbShISUdIX01FTU9SWSwgKFBGTl9QSFlTKG1pbl9sb3dfcGZuKSArCisJCQkgYm9vdG1hcF9zaXplICsgUEFHRV9TSVpFLTEpIC0gKEhJR0hfTUVNT1JZKSk7CisKKwkvKgorCSAqIHJlc2VydmUgcGh5c2ljYWwgcGFnZSAwIC0gaXQncyBhIHNwZWNpYWwgQklPUyBwYWdlIG9uIG1hbnkgYm94ZXMsCisJICogZW5hYmxpbmcgY2xlYW4gcmVib290cywgU01QIG9wZXJhdGlvbiwgbGFwdG9wIGZ1bmN0aW9ucy4KKwkgKi8KKwlyZXNlcnZlX2Jvb3RtZW0oMCwgUEFHRV9TSVpFKTsKKworCS8qIHJlc2VydmUgRUJEQSByZWdpb24sIGl0J3MgYSA0SyByZWdpb24gKi8KKwlyZXNlcnZlX2ViZGFfcmVnaW9uKCk7CisKKyAgICAvKiBjb3VsZCBiZSBhbiBBTUQgNzY4TVBYIGNoaXBzZXQuIFJlc2VydmUgYSBwYWdlICBiZWZvcmUgVkdBIHRvIHByZXZlbnQKKyAgICAgICBQQ0kgcHJlZmV0Y2ggaW50byBpdCAoZXJyYXRhICM1NikuIFVzdWFsbHkgdGhlIHBhZ2UgaXMgcmVzZXJ2ZWQgYW55d2F5cywKKyAgICAgICB1bmxlc3MgeW91IGhhdmUgbm8gUFMvMiBtb3VzZSBwbHVnZ2VkIGluLiAqLworCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQgJiYKKwkgICAgYm9vdF9jcHVfZGF0YS54ODYgPT0gNikKKwkgICAgIHJlc2VydmVfYm9vdG1lbSgweGEwMDAwIC0gNDA5NiwgNDA5Nik7CisKKyNpZmRlZiBDT05GSUdfU01QCisJLyoKKwkgKiBCdXQgZmlyc3QgcGluY2ggYSBmZXcgZm9yIHRoZSBzdGFjay90cmFtcG9saW5lIHN0dWZmCisJICogRklYTUU6IERvbid0IG5lZWQgdGhlIGV4dHJhIHBhZ2UgYXQgNEssIGJ1dCBuZWVkIHRvIGZpeAorCSAqIHRyYW1wb2xpbmUgYmVmb3JlIHJlbW92aW5nIGl0LiAoc2VlIHRoZSBHRFQgc3R1ZmYpCisJICovCisJcmVzZXJ2ZV9ib290bWVtKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCisJLyoKKwkgKiBSZXNlcnZlIGxvdyBtZW1vcnkgcmVnaW9uIGZvciBzbGVlcCBzdXBwb3J0LgorCSAqLworCWFjcGlfcmVzZXJ2ZV9ib290bWVtKCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2X0ZJTkRfU01QX0NPTkZJRworCS8qCisJICogRmluZCBhbmQgcmVzZXJ2ZSBwb3NzaWJsZSBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb246CisJICovCisJZmluZF9zbXBfY29uZmlnKCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCWlmIChMT0FERVJfVFlQRSAmJiBJTklUUkRfU1RBUlQpIHsKKwkJaWYgKElOSVRSRF9TVEFSVCArIElOSVRSRF9TSVpFIDw9IChtYXhfbG93X3BmbiA8PCBQQUdFX1NISUZUKSkgeworCQkJcmVzZXJ2ZV9ib290bWVtKElOSVRSRF9TVEFSVCwgSU5JVFJEX1NJWkUpOworCQkJaW5pdHJkX3N0YXJ0ID0KKwkJCQlJTklUUkRfU1RBUlQgPyBJTklUUkRfU1RBUlQgKyBQQUdFX09GRlNFVCA6IDA7CisJCQlpbml0cmRfZW5kID0gaW5pdHJkX3N0YXJ0K0lOSVRSRF9TSVpFOworCQl9CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpbml0cmQgZXh0ZW5kcyBiZXlvbmQgZW5kIG9mIG1lbW9yeSAiCisJCQkgICAgIigweCUwOGx4ID4gMHglMDhseClcbmRpc2FibGluZyBpbml0cmRcbiIsCisJCQkgICAgSU5JVFJEX1NUQVJUICsgSU5JVFJEX1NJWkUsCisJCQkgICAgbWF4X2xvd19wZm4gPDwgUEFHRV9TSElGVCk7CisJCQlpbml0cmRfc3RhcnQgPSAwOworCQl9CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBUaGUgbm9kZSAwIHBnZGF0IGlzIGluaXRpYWxpemVkIGJlZm9yZSBhbGwgb2YgdGhlc2UgYmVjYXVzZQorICogaXQncyBuZWVkZWQgZm9yIGJvb3RtZW0uICBub2RlPjAgcGdkYXRzIGhhdmUgdGhlaXIgdmlydHVhbAorICogc3BhY2UgYWxsb2NhdGVkIGJlZm9yZSB0aGUgcGFnZXRhYmxlcyBhcmUgaW4gcGxhY2UgdG8gYWNjZXNzCisgKiB0aGVtLCBzbyB0aGV5IGNhbid0IGJlIGNsZWFyZWQgdGhlbi4KKyAqCisgKiBUaGlzIHNob3VsZCBhbGwgY29tcGlsZSBkb3duIHRvIG5vdGhpbmcgd2hlbiBOVU1BIGlzIG9mZi4KKyAqLwordm9pZCBfX2luaXQgcmVtYXBwZWRfcGdkYXRfaW5pdCh2b2lkKQoreworCWludCBuaWQ7CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJaWYgKG5pZCAhPSAwKQorCQkJbWVtc2V0KE5PREVfREFUQShuaWQpLCAwLCBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisJfQorfQorCisvKgorICogUmVxdWVzdCBhZGRyZXNzIHNwYWNlIGZvciBhbGwgc3RhbmRhcmQgUkFNIGFuZCBST00gcmVzb3VyY2VzCisgKiBhbmQgYWxzbyBmb3IgcmVnaW9ucyByZXBvcnRlZCBhcyByZXNlcnZlZCBieSB0aGUgZTgyMC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0CitsZWdhY3lfaW5pdF9pb21lbV9yZXNvdXJjZXMoc3RydWN0IHJlc291cmNlICpjb2RlX3Jlc291cmNlLCBzdHJ1Y3QgcmVzb3VyY2UgKmRhdGFfcmVzb3VyY2UpCit7CisJaW50IGk7CisKKwlwcm9iZV9yb21zKCk7CisJZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpyZXM7CisJCWlmIChlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSA+IDB4MTAwMDAwMDAwVUxMKQorCQkJY29udGludWU7CisJCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwkJc3dpdGNoIChlODIwLm1hcFtpXS50eXBlKSB7CisJCWNhc2UgRTgyMF9SQU06CXJlcy0+bmFtZSA9ICJTeXN0ZW0gUkFNIjsgYnJlYWs7CisJCWNhc2UgRTgyMF9BQ1BJOglyZXMtPm5hbWUgPSAiQUNQSSBUYWJsZXMiOyBicmVhazsKKwkJY2FzZSBFODIwX05WUzoJcmVzLT5uYW1lID0gIkFDUEkgTm9uLXZvbGF0aWxlIFN0b3JhZ2UiOyBicmVhazsKKwkJZGVmYXVsdDoJcmVzLT5uYW1lID0gInJlc2VydmVkIjsKKwkJfQorCQlyZXMtPnN0YXJ0ID0gZTgyMC5tYXBbaV0uYWRkcjsKKwkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgZTgyMC5tYXBbaV0uc2l6ZSAtIDE7CisJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7CisJCWlmIChlODIwLm1hcFtpXS50eXBlID09IEU4MjBfUkFNKSB7CisJCQkvKgorCQkJICogIFdlIGRvbid0IGtub3cgd2hpY2ggUkFNIHJlZ2lvbiBjb250YWlucyBrZXJuZWwgZGF0YSwKKwkJCSAqICBzbyB3ZSB0cnkgaXQgcmVwZWF0ZWRseSBhbmQgbGV0IHRoZSByZXNvdXJjZSBtYW5hZ2VyCisJCQkgKiAgdGVzdCBpdC4KKwkJCSAqLworCQkJcmVxdWVzdF9yZXNvdXJjZShyZXMsIGNvZGVfcmVzb3VyY2UpOworCQkJcmVxdWVzdF9yZXNvdXJjZShyZXMsIGRhdGFfcmVzb3VyY2UpOworCQl9CisJfQorfQorCisvKgorICogUmVxdWVzdCBhZGRyZXNzIHNwYWNlIGZvciBhbGwgc3RhbmRhcmQgcmVzb3VyY2VzCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByZWdpc3Rlcl9tZW1vcnkodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGdhcHN0YXJ0LCBnYXBzaXplOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0OworCWludAkgICAgICBpOworCisJaWYgKGVmaV9lbmFibGVkKQorCQllZmlfaW5pdGlhbGl6ZV9pb21lbV9yZXNvdXJjZXMoJmNvZGVfcmVzb3VyY2UsICZkYXRhX3Jlc291cmNlKTsKKwllbHNlCisJCWxlZ2FjeV9pbml0X2lvbWVtX3Jlc291cmNlcygmY29kZV9yZXNvdXJjZSwgJmRhdGFfcmVzb3VyY2UpOworCisJLyogRUZJIHN5c3RlbXMgbWF5IHN0aWxsIGhhdmUgVkdBICovCisJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZ2aWRlb19yYW1fcmVzb3VyY2UpOworCisJLyogcmVxdWVzdCBJL08gc3BhY2UgZm9yIGRldmljZXMgdXNlZCBvbiBhbGwgaVszNDVdODYgUENzICovCisJZm9yIChpID0gMDsgaSA8IFNUQU5EQVJEX0lPX1JFU09VUkNFUzsgaSsrKQorCQlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZzdGFuZGFyZF9pb19yZXNvdXJjZXNbaV0pOworCisJLyoKKwkgKiBTZWFyY2ggZm9yIHRoZSBiaWdlc3QgZ2FwIGluIHRoZSBsb3cgMzIgYml0cyBvZiB0aGUgZTgyMAorCSAqIG1lbW9yeSBzcGFjZS4KKwkgKi8KKwlsYXN0ID0gMHgxMDAwMDAwMDB1bGw7CisJZ2Fwc3RhcnQgPSAweDEwMDAwMDAwOworCWdhcHNpemUgPSAweDQwMDAwMDsKKwlpID0gZTgyMC5ucl9tYXA7CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCA9IGU4MjAubWFwW2ldLmFkZHI7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBlbmQgPSBzdGFydCArIGU4MjAubWFwW2ldLnNpemU7CisKKwkJLyoKKwkJICogU2luY2UgImxhc3QiIGlzIGF0IG1vc3QgNEdCLCB3ZSBrbm93IHdlJ2xsCisJCSAqIGZpdCBpbiAzMiBiaXRzIGlmIHRoaXMgY29uZGl0aW9uIGlzIHRydWUKKwkJICovCisJCWlmIChsYXN0ID4gZW5kKSB7CisJCQl1bnNpZ25lZCBsb25nIGdhcCA9IGxhc3QgLSBlbmQ7CisKKwkJCWlmIChnYXAgPiBnYXBzaXplKSB7CisJCQkJZ2Fwc2l6ZSA9IGdhcDsKKwkJCQlnYXBzdGFydCA9IGVuZDsKKwkJCX0KKwkJfQorCQlpZiAoc3RhcnQgPCBsYXN0KQorCQkJbGFzdCA9IHN0YXJ0OworCX0KKworCS8qCisJICogU3RhcnQgYWxsb2NhdGluZyBkeW5hbWljIFBDSSBtZW1vcnkgYSBiaXQgaW50byB0aGUgZ2FwLAorCSAqIGFsaWduZWQgdXAgdG8gdGhlIG5lYXJlc3QgbWVnYWJ5dGUuCisJICoKKwkgKiBRdWVzdGlvbjogc2hvdWxkIHdlIHRyeSB0byBwYWQgaXQgdXAgYSBiaXQgKGRvIHNvbWV0aGluZworCSAqIGxpa2UgIiArIChnYXBzaXplID4+IDMpIiBpbiB0aGVyZSB0b28/KS4gV2Ugbm93IGhhdmUgdGhlCisJICogdGVjaG5vbG9neS4KKwkgKi8KKwlwY2lfbWVtX3N0YXJ0ID0gKGdhcHN0YXJ0ICsgMHhmZmZmZikgJiB+MHhmZmZmZjsKKworCXByaW50aygiQWxsb2NhdGluZyBQQ0kgcmVzb3VyY2VzIHN0YXJ0aW5nIGF0ICUwOGx4IChnYXA6ICUwOGx4OiUwOGx4KVxuIiwKKwkJcGNpX21lbV9zdGFydCwgZ2Fwc3RhcnQsIGdhcHNpemUpOworfQorCisvKiBVc2UgaW5saW5lIGFzc2VtYmx5IHRvIGRlZmluZSB0aGlzIGJlY2F1c2UgdGhlIG5vcHMgYXJlIGRlZmluZWQgCisgICBhcyBpbmxpbmUgYXNzZW1ibHkgc3RyaW5ncyBpbiB0aGUgaW5jbHVkZSBmaWxlcyBhbmQgd2UgY2Fubm90IAorICAgZ2V0IHRoZW0gZWFzaWx5IGludG8gc3RyaW5ncy4gKi8KK2FzbSgiXHQuZGF0YVxuaW50ZWxub3BzOiAiIAorICAgIEdFTkVSSUNfTk9QMSBHRU5FUklDX05PUDIgR0VORVJJQ19OT1AzIEdFTkVSSUNfTk9QNCBHRU5FUklDX05PUDUgR0VORVJJQ19OT1A2CisgICAgR0VORVJJQ19OT1A3IEdFTkVSSUNfTk9QOCk7IAorYXNtKCJcdC5kYXRhXG5rOG5vcHM6ICIgCisgICAgSzhfTk9QMSBLOF9OT1AyIEs4X05PUDMgSzhfTk9QNCBLOF9OT1A1IEs4X05PUDYKKyAgICBLOF9OT1A3IEs4X05PUDgpOyAKK2FzbSgiXHQuZGF0YVxuazdub3BzOiAiIAorICAgIEs3X05PUDEgSzdfTk9QMiBLN19OT1AzIEs3X05PUDQgSzdfTk9QNSBLN19OT1A2CisgICAgSzdfTk9QNyBLN19OT1A4KTsgCisgICAgCitleHRlcm4gdW5zaWduZWQgY2hhciBpbnRlbG5vcHNbXSwgazhub3BzW10sIGs3bm9wc1tdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmludGVsX25vcHNbQVNNX05PUF9NQVgrMV0gPSB7IAorICAgICBOVUxMLAorICAgICBpbnRlbG5vcHMsCisgICAgIGludGVsbm9wcyArIDEsCisgICAgIGludGVsbm9wcyArIDEgKyAyLAorICAgICBpbnRlbG5vcHMgKyAxICsgMiArIDMsCisgICAgIGludGVsbm9wcyArIDEgKyAyICsgMyArIDQsCisgICAgIGludGVsbm9wcyArIDEgKyAyICsgMyArIDQgKyA1LAorICAgICBpbnRlbG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYsCisgICAgIGludGVsbm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiArIDcsCit9OyAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICprOF9ub3BzW0FTTV9OT1BfTUFYKzFdID0geyAKKyAgICAgTlVMTCwKKyAgICAgazhub3BzLAorICAgICBrOG5vcHMgKyAxLAorICAgICBrOG5vcHMgKyAxICsgMiwKKyAgICAgazhub3BzICsgMSArIDIgKyAzLAorICAgICBrOG5vcHMgKyAxICsgMiArIDMgKyA0LAorICAgICBrOG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSwKKyAgICAgazhub3BzICsgMSArIDIgKyAzICsgNCArIDUgKyA2LAorICAgICBrOG5vcHMgKyAxICsgMiArIDMgKyA0ICsgNSArIDYgKyA3LAorfTsgCitzdGF0aWMgdW5zaWduZWQgY2hhciAqazdfbm9wc1tBU01fTk9QX01BWCsxXSA9IHsgCisgICAgIE5VTEwsCisgICAgIGs3bm9wcywKKyAgICAgazdub3BzICsgMSwKKyAgICAgazdub3BzICsgMSArIDIsCisgICAgIGs3bm9wcyArIDEgKyAyICsgMywKKyAgICAgazdub3BzICsgMSArIDIgKyAzICsgNCwKKyAgICAgazdub3BzICsgMSArIDIgKyAzICsgNCArIDUsCisgICAgIGs3bm9wcyArIDEgKyAyICsgMyArIDQgKyA1ICsgNiwKKyAgICAgazdub3BzICsgMSArIDIgKyAzICsgNCArIDUgKyA2ICsgNywKK307IAorc3RhdGljIHN0cnVjdCBub3AgeyAKKyAgICAgaW50IGNwdWlkOyAKKyAgICAgdW5zaWduZWQgY2hhciAqKm5vcHRhYmxlOyAKK30gbm9wdHlwZXNbXSA9IHsgCisgICAgIHsgWDg2X0ZFQVRVUkVfSzgsIGs4X25vcHMgfSwgCisgICAgIHsgWDg2X0ZFQVRVUkVfSzcsIGs3X25vcHMgfSwgCisgICAgIHsgLTEsIE5VTEwgfQorfTsgCisKKy8qIFJlcGxhY2UgaW5zdHJ1Y3Rpb25zIHdpdGggYmV0dGVyIGFsdGVybmF0aXZlcyBmb3IgdGhpcyBDUFUgdHlwZS4KKworICAgVGhpcyBydW5zIGJlZm9yZSBTTVAgaXMgaW5pdGlhbGl6ZWQgdG8gYXZvaWQgU01QIHByb2JsZW1zIHdpdGgKKyAgIHNlbGYgbW9kaWZ5aW5nIGNvZGUuIFRoaXMgaW1wbGllcyB0aGF0IGFzc3ltZXRyaWMgc3lzdGVtcyB3aGVyZQorICAgQVBzIGhhdmUgbGVzcyBjYXBhYmlsaXRpZXMgdGhhbiB0aGUgYm9vdCBwcm9jZXNzb3IgYXJlIG5vdCBoYW5kbGVkLiAKKyAgIEluIHRoaXMgY2FzZSBib290IHdpdGggIm5vcmVwbGFjZW1lbnQiLiAqLyAKK3ZvaWQgYXBwbHlfYWx0ZXJuYXRpdmVzKHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpIAoreyAKKwlzdHJ1Y3QgYWx0X2luc3RyICphOyAKKwlpbnQgZGlmZiwgaSwgazsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqKm5vcHRhYmxlID0gaW50ZWxfbm9wczsgCisJZm9yIChpID0gMDsgbm9wdHlwZXNbaV0uY3B1aWQgPj0gMDsgaSsrKSB7IAorCQlpZiAoYm9vdF9jcHVfaGFzKG5vcHR5cGVzW2ldLmNwdWlkKSkgeyAKKwkJCW5vcHRhYmxlID0gbm9wdHlwZXNbaV0ubm9wdGFibGU7CisJCQlicmVhazsKKwkJfQorCX0gCisJZm9yIChhID0gc3RhcnQ7ICh2b2lkICopYSA8IGVuZDsgYSsrKSB7IAorCQlpZiAoIWJvb3RfY3B1X2hhcyhhLT5jcHVpZCkpCisJCQljb250aW51ZTsKKwkJQlVHX09OKGEtPnJlcGxhY2VtZW50bGVuID4gYS0+aW5zdHJsZW4pOyAKKwkJbWVtY3B5KGEtPmluc3RyLCBhLT5yZXBsYWNlbWVudCwgYS0+cmVwbGFjZW1lbnRsZW4pOyAKKwkJZGlmZiA9IGEtPmluc3RybGVuIC0gYS0+cmVwbGFjZW1lbnRsZW47IAorCQkvKiBQYWQgdGhlIHJlc3Qgd2l0aCBub3BzICovCisJCWZvciAoaSA9IGEtPnJlcGxhY2VtZW50bGVuOyBkaWZmID4gMDsgZGlmZiAtPSBrLCBpICs9IGspIHsKKwkJCWsgPSBkaWZmOworCQkJaWYgKGsgPiBBU01fTk9QX01BWCkKKwkJCQlrID0gQVNNX05PUF9NQVg7CisJCQltZW1jcHkoYS0+aW5zdHIgKyBpLCBub3B0YWJsZVtrXSwgayk7IAorCQl9IAorCX0KK30gCisKK3N0YXRpYyBpbnQgbm9fcmVwbGFjZW1lbnQgX19pbml0ZGF0YSA9IDA7IAorIAordm9pZCBfX2luaXQgYWx0ZXJuYXRpdmVfaW5zdHJ1Y3Rpb25zKHZvaWQpCit7CisJZXh0ZXJuIHN0cnVjdCBhbHRfaW5zdHIgX19hbHRfaW5zdHJ1Y3Rpb25zW10sIF9fYWx0X2luc3RydWN0aW9uc19lbmRbXTsKKwlpZiAobm9fcmVwbGFjZW1lbnQpIAorCQlyZXR1cm47CisJYXBwbHlfYWx0ZXJuYXRpdmVzKF9fYWx0X2luc3RydWN0aW9ucywgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG5vcmVwbGFjZW1lbnRfc2V0dXAoY2hhciAqcykKK3sgCisgICAgIG5vX3JlcGxhY2VtZW50ID0gMTsgCisgICAgIHJldHVybiAwOyAKK30gCisKK19fc2V0dXAoIm5vcmVwbGFjZW1lbnQiLCBub3JlcGxhY2VtZW50X3NldHVwKTsgCisKK3N0YXRpYyBjaGFyICogX19pbml0IG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKHZvaWQpOworCisjaWZkZWYgQ09ORklHX01DQQorc3RhdGljIHZvaWQgc2V0X21jYV9idXMoaW50IHgpCit7CisJTUNBX2J1cyA9IHg7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgc2V0X21jYV9idXMoaW50IHgpIHsgfQorI2VuZGlmCisKKy8qCisgKiBEZXRlcm1pbmUgaWYgd2Ugd2VyZSBsb2FkZWQgYnkgYW4gRUZJIGxvYWRlci4gIElmIHNvLCB0aGVuIHdlIGhhdmUgYWxzbyBiZWVuCisgKiBwYXNzZWQgdGhlIGVmaSBtZW1tYXAsIHN5c3RhYiwgZXRjLiwgc28gd2Ugc2hvdWxkIHVzZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMKKyAqIGZvciBpbml0aWFsaXphdGlvbi4gIE5vdGUsIHRoZSBlZmkgaW5pdCBjb2RlIHBhdGggaXMgZGV0ZXJtaW5lZCBieSB0aGUKKyAqIGdsb2JhbCBlZmlfZW5hYmxlZC4gVGhpcyBhbGxvd3MgdGhlIHNhbWUga2VybmVsIGltYWdlIHRvIGJlIHVzZWQgb24gZXhpc3RpbmcKKyAqIHN5c3RlbXMgKHdpdGggYSB0cmFkaXRpb25hbCBCSU9TKSBhcyB3ZWxsIGFzIG9uIEVGSSBzeXN0ZW1zLgorICovCit2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCit7CisJdW5zaWduZWQgbG9uZyBtYXhfbG93X3BmbjsKKworCW1lbWNweSgmYm9vdF9jcHVfZGF0YSwgJm5ld19jcHVfZGF0YSwgc2l6ZW9mKG5ld19jcHVfZGF0YSkpOworCXByZV9zZXR1cF9hcmNoX2hvb2soKTsKKwllYXJseV9jcHVfaW5pdCgpOworCisJLyoKKwkgKiBGSVhNRTogVGhpcyBpc24ndCBhbiBvZmZpY2lhbCBsb2FkZXJfdHlwZSByaWdodAorCSAqIG5vdyBidXQgZG9lcyBjdXJyZW50bHkgd29yayB3aXRoIGVsaWxvLgorCSAqIElmIHdlIHdlcmUgY29uZmlndXJlZCBhcyBhbiBFRkkga2VybmVsLCBjaGVjayB0byBtYWtlCisJICogc3VyZSB0aGF0IHdlIHdlcmUgbG9hZGVkIGNvcnJlY3RseSBmcm9tIGVsaWxvIGFuZCB0aGF0CisJICogdGhlIHN5c3RlbSB0YWJsZSBpcyB2YWxpZC4gIElmIG5vdCwgdGhlbiBpbml0aWFsaXplIG5vcm1hbGx5LgorCSAqLworI2lmZGVmIENPTkZJR19FRkkKKwlpZiAoKExPQURFUl9UWVBFID09IDB4NTApICYmIEVGSV9TWVNUQUIpCisJCWVmaV9lbmFibGVkID0gMTsKKyNlbmRpZgorCisgCVJPT1RfREVWID0gb2xkX2RlY29kZV9kZXYoT1JJR19ST09UX0RFVik7CisgCWRyaXZlX2luZm8gPSBEUklWRV9JTkZPOworIAlzY3JlZW5faW5mbyA9IFNDUkVFTl9JTkZPOworCWVkaWRfaW5mbyA9IEVESURfSU5GTzsKKwlhcG1faW5mby5iaW9zID0gQVBNX0JJT1NfSU5GTzsKKwlpc3RfaW5mbyA9IElTVF9JTkZPOworCXNhdmVkX3ZpZGVvbW9kZSA9IFZJREVPX01PREU7CisJaWYoIFNZU19ERVNDX1RBQkxFLmxlbmd0aCAhPSAwICkgeworCQlzZXRfbWNhX2J1cyhTWVNfREVTQ19UQUJMRS50YWJsZVszXSAmIDB4Mik7CisJCW1hY2hpbmVfaWQgPSBTWVNfREVTQ19UQUJMRS50YWJsZVswXTsKKwkJbWFjaGluZV9zdWJtb2RlbF9pZCA9IFNZU19ERVNDX1RBQkxFLnRhYmxlWzFdOworCQlCSU9TX3JldmlzaW9uID0gU1lTX0RFU0NfVEFCTEUudGFibGVbMl07CisJfQorCWJvb3Rsb2FkZXJfdHlwZSA9IExPQURFUl9UWVBFOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfUkFNCisJcmRfaW1hZ2Vfc3RhcnQgPSBSQU1ESVNLX0ZMQUdTICYgUkFNRElTS19JTUFHRV9TVEFSVF9NQVNLOworCXJkX3Byb21wdCA9ICgoUkFNRElTS19GTEFHUyAmIFJBTURJU0tfUFJPTVBUX0ZMQUcpICE9IDApOworCXJkX2RvbG9hZCA9ICgoUkFNRElTS19GTEFHUyAmIFJBTURJU0tfTE9BRF9GTEFHKSAhPSAwKTsKKyNlbmRpZgorCUFSQ0hfU0VUVVAKKwlpZiAoZWZpX2VuYWJsZWQpCisJCWVmaV9pbml0KCk7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIkJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOworCQlwcmludF9tZW1vcnlfbWFwKG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKCkpOworCX0KKworCWNvcHlfZWRkKCk7CisKKwlpZiAoIU1PVU5UX1JPT1RfUkRPTkxZKQorCQlyb290X21vdW50ZmxhZ3MgJj0gfk1TX1JET05MWTsKKwlpbml0X21tLnN0YXJ0X2NvZGUgPSAodW5zaWduZWQgbG9uZykgX3RleHQ7CisJaW5pdF9tbS5lbmRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSBfZXRleHQ7CisJaW5pdF9tbS5lbmRfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBfZWRhdGE7CisJaW5pdF9tbS5icmsgPSBpbml0X3BnX3RhYmxlc19lbmQgKyBQQUdFX09GRlNFVDsKKworCWNvZGVfcmVzb3VyY2Uuc3RhcnQgPSB2aXJ0X3RvX3BoeXMoX3RleHQpOworCWNvZGVfcmVzb3VyY2UuZW5kID0gdmlydF90b19waHlzKF9ldGV4dCktMTsKKwlkYXRhX3Jlc291cmNlLnN0YXJ0ID0gdmlydF90b19waHlzKF9ldGV4dCk7CisJZGF0YV9yZXNvdXJjZS5lbmQgPSB2aXJ0X3RvX3BoeXMoX2VkYXRhKS0xOworCisJcGFyc2VfY21kbGluZV9lYXJseShjbWRsaW5lX3ApOworCisJbWF4X2xvd19wZm4gPSBzZXR1cF9tZW1vcnkoKTsKKworCS8qCisJICogTk9URTogYmVmb3JlIHRoaXMgcG9pbnQgX25vYm9keV8gaXMgYWxsb3dlZCB0byBhbGxvY2F0ZQorCSAqIGFueSBtZW1vcnkgdXNpbmcgdGhlIGJvb3RtZW0gYWxsb2NhdG9yLiAgQWx0aG91Z2ggdGhlCisJICogYWxsb2N0b3IgaXMgbm93IGluaXRpYWxpc2VkIG9ubHkgdGhlIGZpcnN0IDhNYiBvZiB0aGUga2VybmVsCisJICogdmlydHVhbCBhZGRyZXNzIHNwYWNlIGhhcyBiZWVuIG1hcHBlZC4gIEFsbCBhbGxvY2F0aW9ucyBiZWZvcmUKKwkgKiBwYWdpbmdfaW5pdCgpIGhhcyBjb21wbGV0ZWQgbXVzdCB1c2UgdGhlIGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKCkKKwkgKiB2YXJpYW50ICh3aGljaCBhbGxvY2F0ZXMgRE1BJ2FibGUgbWVtb3J5KSBhbmQgY2FyZSBtdXN0IGJlIHRha2VuCisJICogbm90IHRvIGV4Y2VlZCB0aGUgOE1iIGxpbWl0LgorCSAqLworCisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF9hbGxvY19tZW1vcnkoKTsgLyogQVAgcHJvY2Vzc29yIHJlYWxtb2RlIHN0YWNrcyBpbiBsb3cgbWVtb3J5Ki8KKyNlbmRpZgorCXBhZ2luZ19pbml0KCk7CisJcmVtYXBwZWRfcGdkYXRfaW5pdCgpOworCXpvbmVfc2l6ZXNfaW5pdCgpOworCisJLyoKKwkgKiBOT1RFOiBhdCB0aGlzIHBvaW50IHRoZSBib290bWVtIGFsbG9jYXRvciBpcyBmdWxseSBhdmFpbGFibGUuCisJICovCisKKyNpZmRlZiBDT05GSUdfRUFSTFlfUFJJTlRLCisJeworCQljaGFyICpzID0gc3Ryc3RyKCpjbWRsaW5lX3AsICJlYXJseXByaW50az0iKTsKKwkJaWYgKHMpIHsKKwkJCWV4dGVybiB2b2lkIHNldHVwX2Vhcmx5X3ByaW50ayhjaGFyICopOworCisJCQlzZXR1cF9lYXJseV9wcmludGsocyk7CisJCQlwcmludGsoImVhcmx5IGNvbnNvbGUgZW5hYmxlZFxuIik7CisJCX0KKwl9CisjZW5kaWYKKworCisJZG1pX3NjYW5fbWFjaGluZSgpOworCisjaWZkZWYgQ09ORklHX1g4Nl9HRU5FUklDQVJDSAorCWdlbmVyaWNfYXBpY19wcm9iZSgqY21kbGluZV9wKTsKKyNlbmRpZgkKKwlpZiAoZWZpX2VuYWJsZWQpCisJCWVmaV9tYXBfbWVtbWFwKCk7CisKKwkvKgorCSAqIFBhcnNlIHRoZSBBQ1BJIHRhYmxlcyBmb3IgcG9zc2libGUgYm9vdC10aW1lIFNNUCBjb25maWd1cmF0aW9uLgorCSAqLworCWFjcGlfYm9vdF90YWJsZV9pbml0KCk7CisJYWNwaV9ib290X2luaXQoKTsKKworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCWlmIChzbXBfZm91bmRfY29uZmlnKQorCQlnZXRfc21wX2NvbmZpZygpOworI2VuZGlmCisKKwlyZWdpc3Rlcl9tZW1vcnkoKTsKKworI2lmZGVmIENPTkZJR19WVAorI2lmIGRlZmluZWQoQ09ORklHX1ZHQV9DT05TT0xFKQorCWlmICghZWZpX2VuYWJsZWQgfHwgKGVmaV9tZW1fdHlwZSgweGEwMDAwKSAhPSBFRklfQ09OVkVOVElPTkFMX01FTU9SWSkpCisJCWNvbnN3aXRjaHAgPSAmdmdhX2NvbjsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0RVTU1ZX0NPTlNPTEUpCisJY29uc3dpdGNocCA9ICZkdW1teV9jb247CisjZW5kaWYKKyNlbmRpZgorfQorCisjaW5jbHVkZSAic2V0dXBfYXJjaF9wb3N0LmgiCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTpjCisgKiBjLWZpbGUtc3R5bGU6ImsmciIKKyAqIGMtYmFzaWMtb2Zmc2V0OjgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zaWdmcmFtZS5oIGIvYXJjaC9pMzg2L2tlcm5lbC9zaWdmcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMWIxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3NpZ2ZyYW1lLmgKQEAgLTAsMCArMSwyMSBAQAorc3RydWN0IHNpZ2ZyYW1lCit7CisJY2hhciAqcHJldGNvZGU7CisJaW50IHNpZzsKKwlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKKwlzdHJ1Y3QgX2Zwc3RhdGUgZnBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGV4dHJhbWFza1tfTlNJR19XT1JEUy0xXTsKKwljaGFyIHJldGNvZGVbOF07Cit9OworCitzdHJ1Y3QgcnRfc2lnZnJhbWUKK3sKKwljaGFyICpwcmV0Y29kZTsKKwlpbnQgc2lnOworCXN0cnVjdCBzaWdpbmZvICpwaW5mbzsKKwl2b2lkICpwdWM7CisJc3RydWN0IHNpZ2luZm8gaW5mbzsKKwlzdHJ1Y3QgdWNvbnRleHQgdWM7CisJc3RydWN0IF9mcHN0YXRlIGZwc3RhdGU7CisJY2hhciByZXRjb2RlWzhdOworfTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2kzODYva2VybmVsL3NpZ25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzYwMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3NpZ25hbC5jCkBAIC0wLDAgKzEsNjY1IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvc2lnbmFsLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICAxOTk3LTExLTI4ICBNb2RpZmllZCBmb3IgUE9TSVguMWIgc2lnbmFscyBieSBSaWNoYXJkIEhlbmRlcnNvbgorICogIDIwMDAtMDYtMjAgIFBlbnRpdW0gSUlJIEZYU1IsIFNTRSBzdXBwb3J0IGJ5IEdhcmV0aCBIdWdoZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpbmNsdWRlICJzaWdmcmFtZS5oIgorCisjZGVmaW5lIERFQlVHX1NJRyAwCisKKyNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCisKKy8qCisgKiBBdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgorICovCithc21saW5rYWdlIGludAorc3lzX3NpZ3N1c3BlbmQoaW50IGhpc3RvcnkwLCBpbnQgaGlzdG9yeTEsIG9sZF9zaWdzZXRfdCBtYXNrKQoreworCXN0cnVjdCBwdF9yZWdzICogcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAmaGlzdG9yeTA7CisJc2lnc2V0X3Qgc2F2ZXNldDsKKworCW1hc2sgJj0gX0JMT0NLQUJMRTsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKwlzaWdpbml0c2V0KCZjdXJyZW50LT5ibG9ja2VkLCBtYXNrKTsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlyZWdzLT5lYXggPSAtRUlOVFI7CisJd2hpbGUgKDEpIHsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlKCk7CisJCWlmIChkb19zaWduYWwocmVncywgJnNhdmVzZXQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKwl9Cit9CisKK2FzbWxpbmthZ2UgaW50CitzeXNfcnRfc2lnc3VzcGVuZChzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXNpZ3NldF90IHNhdmVzZXQsIG5ld3NldDsKKworCS8qIFhYWDogRG9uJ3QgcHJlY2x1ZGUgaGFuZGxpbmcgZGlmZmVyZW50IHNpemVkIHNpZ3NldF90J3MuICAqLworCWlmIChyZWdzLmVjeCAhPSBzaXplb2Yoc2lnc2V0X3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3c2V0LCAoc2lnc2V0X3QgX191c2VyICopcmVncy5lYngsIHNpemVvZihuZXdzZXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc2lnZGVsc2V0bWFzaygmbmV3c2V0LCB+X0JMT0NLQUJMRSk7CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKwljdXJyZW50LT5ibG9ja2VkID0gbmV3c2V0OworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCXJlZ3MuZWF4ID0gLUVJTlRSOworCXdoaWxlICgxKSB7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZSgpOworCQlpZiAoZG9fc2lnbmFsKCZyZWdzLCAmc2F2ZXNldCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KK30KKworYXNtbGlua2FnZSBpbnQgCitzeXNfc2lnYWN0aW9uKGludCBzaWcsIGNvbnN0IHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqYWN0LAorCSAgICAgIHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqb2FjdCkKK3sKKwlzdHJ1Y3Qga19zaWdhY3Rpb24gbmV3X2thLCBvbGRfa2E7CisJaW50IHJldDsKKworCWlmIChhY3QpIHsKKwkJb2xkX3NpZ3NldF90IG1hc2s7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhY3QsIHNpemVvZigqYWN0KSkgfHwKKwkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2hhbmRsZXIsICZhY3QtPnNhX2hhbmRsZXIpIHx8CisJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9yZXN0b3JlciwgJmFjdC0+c2FfcmVzdG9yZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCV9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncyk7CisJCV9fZ2V0X3VzZXIobWFzaywgJmFjdC0+c2FfbWFzayk7CisJCXNpZ2luaXRzZXQoJm5ld19rYS5zYS5zYV9tYXNrLCBtYXNrKTsKKwl9CisKKwlyZXQgPSBkb19zaWdhY3Rpb24oc2lnLCBhY3QgPyAmbmV3X2thIDogTlVMTCwgb2FjdCA/ICZvbGRfa2EgOiBOVUxMKTsKKworCWlmICghcmV0ICYmIG9hY3QpIHsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBvYWN0LCBzaXplb2YoKm9hY3QpKSB8fAorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfaGFuZGxlciwgJm9hY3QtPnNhX2hhbmRsZXIpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9yZXN0b3JlciwgJm9hY3QtPnNhX3Jlc3RvcmVyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKTsKKwkJX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0sICZvYWN0LT5zYV9tYXNrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIGludAorc3lzX3NpZ2FsdHN0YWNrKHVuc2lnbmVkIGxvbmcgZWJ4KQoreworCS8qIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgZ2NjIHJlYWxpemUgaXQgZG9lc24ndCBvd24gdGhlICJzdHJ1Y3QgcHRfcmVncyIgKi8KKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSZlYng7CisJY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcyA9IChjb25zdCBzdGFja190IF9fdXNlciAqKWVieDsKKwlzdGFja190IF9fdXNlciAqdW9zcyA9IChzdGFja190IF9fdXNlciAqKXJlZ3MtPmVjeDsKKworCXJldHVybiBkb19zaWdhbHRzdGFjayh1c3MsIHVvc3MsIHJlZ3MtPmVzcCk7Cit9CisKKworLyoKKyAqIERvIGEgc2lnbmFsIHJldHVybjsgdW5kbyB0aGUgc2lnbmFsIHN0YWNrLgorICovCisKK3N0YXRpYyBpbnQKK3Jlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywgaW50ICpwZWF4KQoreworCXVuc2lnbmVkIGludCBlcnIgPSAwOworCisJLyogQWx3YXlzIG1ha2UgYW55IHBlbmRpbmcgcmVzdGFydGVkIHN5c3RlbSBjYWxscyByZXR1cm4gLUVJTlRSICovCisJY3VycmVudF90aHJlYWRfaW5mbygpLT5yZXN0YXJ0X2Jsb2NrLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOworCisjZGVmaW5lIENPUFkoeCkJCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPngsICZzYy0+eCkKKworI2RlZmluZSBDT1BZX1NFRyhzZWcpCQkJCQkJCVwKKwl7IHVuc2lnbmVkIHNob3J0IHRtcDsJCQkJCQlcCisJICBlcnIgfD0gX19nZXRfdXNlcih0bXAsICZzYy0+c2VnKTsJCQkJXAorCSAgcmVncy0+eCMjc2VnID0gdG1wOyB9CisKKyNkZWZpbmUgQ09QWV9TRUdfU1RSSUNUKHNlZykJCQkJCQlcCisJeyB1bnNpZ25lZCBzaG9ydCB0bXA7CQkJCQkJXAorCSAgZXJyIHw9IF9fZ2V0X3VzZXIodG1wLCAmc2MtPnNlZyk7CQkJCVwKKwkgIHJlZ3MtPngjI3NlZyA9IHRtcHwzOyB9CisKKyNkZWZpbmUgR0VUX1NFRyhzZWcpCQkJCQkJCVwKKwl7IHVuc2lnbmVkIHNob3J0IHRtcDsJCQkJCQlcCisJICBlcnIgfD0gX19nZXRfdXNlcih0bXAsICZzYy0+c2VnKTsJCQkJXAorCSAgbG9hZHNlZ21lbnQoc2VnLHRtcCk7IH0KKworI2RlZmluZQlGSVhfRUZMQUdTCShYODZfRUZMQUdTX0FDIHwgWDg2X0VGTEFHU19PRiB8IFg4Nl9FRkxBR1NfREYgfCBcCisJCQkgWDg2X0VGTEFHU19URiB8IFg4Nl9FRkxBR1NfU0YgfCBYODZfRUZMQUdTX1pGIHwgXAorCQkJIFg4Nl9FRkxBR1NfQUYgfCBYODZfRUZMQUdTX1BGIHwgWDg2X0VGTEFHU19DRikKKworCUdFVF9TRUcoZ3MpOworCUdFVF9TRUcoZnMpOworCUNPUFlfU0VHKGVzKTsKKwlDT1BZX1NFRyhkcyk7CisJQ09QWShlZGkpOworCUNPUFkoZXNpKTsKKwlDT1BZKGVicCk7CisJQ09QWShlc3ApOworCUNPUFkoZWJ4KTsKKwlDT1BZKGVkeCk7CisJQ09QWShlY3gpOworCUNPUFkoZWlwKTsKKwlDT1BZX1NFR19TVFJJQ1QoY3MpOworCUNPUFlfU0VHX1NUUklDVChzcyk7CisJCisJeworCQl1bnNpZ25lZCBpbnQgdG1wZmxhZ3M7CisJCWVyciB8PSBfX2dldF91c2VyKHRtcGZsYWdzLCAmc2MtPmVmbGFncyk7CisJCXJlZ3MtPmVmbGFncyA9IChyZWdzLT5lZmxhZ3MgJiB+RklYX0VGTEFHUykgfCAodG1wZmxhZ3MgJiBGSVhfRUZMQUdTKTsKKwkJcmVncy0+b3JpZ19lYXggPSAtMTsJCS8qIGRpc2FibGUgc3lzY2FsbCBjaGVja3MgKi8KKwl9CisKKwl7CisJCXN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKiBidWY7CisJCWVyciB8PSBfX2dldF91c2VyKGJ1ZiwgJnNjLT5mcHN0YXRlKTsKKwkJaWYgKGJ1ZikgeworCQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1Ziwgc2l6ZW9mKCpidWYpKSkKKwkJCQlnb3RvIGJhZGZyYW1lOworCQkJZXJyIHw9IHJlc3RvcmVfaTM4NyhidWYpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHRhc2tfc3RydWN0ICptZSA9IGN1cnJlbnQ7CisJCQlpZiAodXNlZF9tYXRoKCkpIHsKKwkJCQljbGVhcl9mcHUobWUpOworCQkJCWNsZWFyX3VzZWRfbWF0aCgpOworCQkJfQorCQl9CisJfQorCisJZXJyIHw9IF9fZ2V0X3VzZXIoKnBlYXgsICZzYy0+ZWF4KTsKKwlyZXR1cm4gZXJyOworCitiYWRmcmFtZToKKwlyZXR1cm4gMTsKK30KKworYXNtbGlua2FnZSBpbnQgc3lzX3NpZ3JldHVybih1bnNpZ25lZCBsb25nIF9fdW51c2VkKQoreworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICZfX3VudXNlZDsKKwlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICopKHJlZ3MtPmVzcCAtIDgpOworCXNpZ3NldF90IHNldDsKKwlpbnQgZWF4OworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJCWdvdG8gYmFkZnJhbWU7CisJaWYgKF9fZ2V0X3VzZXIoc2V0LnNpZ1swXSwgJmZyYW1lLT5zYy5vbGRtYXNrKQorCSAgICB8fCAoX05TSUdfV09SRFMgPiAxCisJCSYmIF9fY29weV9mcm9tX3VzZXIoJnNldC5zaWdbMV0sICZmcmFtZS0+ZXh0cmFtYXNrLAorCQkJCSAgICBzaXplb2YoZnJhbWUtPmV4dHJhbWFzaykpKSkKKwkJZ290byBiYWRmcmFtZTsKKworCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQorCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT5zYywgJmVheCkpCisJCWdvdG8gYmFkZnJhbWU7CisJcmV0dXJuIGVheDsKKworYmFkZnJhbWU6CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAwOworfQkKKworYXNtbGlua2FnZSBpbnQgc3lzX3J0X3NpZ3JldHVybih1bnNpZ25lZCBsb25nIF9fdW51c2VkKQoreworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopICZfX3VudXNlZDsKKwlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopKHJlZ3MtPmVzcCAtIDQpOworCXNpZ3NldF90IHNldDsKKwlpbnQgZWF4OworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJCWdvdG8gYmFkZnJhbWU7CisJaWYgKF9fY29weV9mcm9tX3VzZXIoJnNldCwgJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzaXplb2Yoc2V0KSkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlzaWdkZWxzZXRtYXNrKCZzZXQsIH5fQkxPQ0tBQkxFKTsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwljdXJyZW50LT5ibG9ja2VkID0gc2V0OworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkKKwlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQsICZlYXgpKQorCQlnb3RvIGJhZGZyYW1lOworCisJaWYgKGRvX3NpZ2FsdHN0YWNrKCZmcmFtZS0+dWMudWNfc3RhY2ssIE5VTEwsIHJlZ3MtPmVzcCkgPT0gLUVGQVVMVCkKKwkJZ290byBiYWRmcmFtZTsKKworCXJldHVybiBlYXg7CisKK2JhZGZyYW1lOgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30JCisKKy8qCisgKiBTZXQgdXAgYSBzaWduYWwgZnJhbWUuCisgKi8KKworc3RhdGljIGludAorc2V0dXBfc2lnY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjLCBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICpmcHN0YXRlLAorCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlpbnQgdG1wLCBlcnIgPSAwOworCisJdG1wID0gMDsKKwlfX2FzbV9fKCJtb3ZsICUlZ3MsJTAiIDogIj1yIih0bXApOiAiMCIodG1wKSk7CisJZXJyIHw9IF9fcHV0X3VzZXIodG1wLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSZzYy0+Z3MpOworCV9fYXNtX18oIm1vdmwgJSVmcywlMCIgOiAiPXIiKHRtcCk6ICIwIih0bXApKTsKKwllcnIgfD0gX19wdXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5mcyk7CisKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT54ZXMsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5lcyk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+eGRzLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSZzYy0+ZHMpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVkaSwgJnNjLT5lZGkpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVzaSwgJnNjLT5lc2kpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVicCwgJnNjLT5lYnApOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVzcCwgJnNjLT5lc3ApOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVieCwgJnNjLT5lYngpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVkeCwgJnNjLT5lZHgpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVjeCwgJnNjLT5lY3gpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPmVheCwgJnNjLT5lYXgpOworCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnRocmVhZC50cmFwX25vLCAmc2MtPnRyYXBubyk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUsICZzYy0+ZXJyKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT5laXAsICZzYy0+ZWlwKTsKKwllcnIgfD0gX19wdXRfdXNlcihyZWdzLT54Y3MsICh1bnNpZ25lZCBpbnQgX191c2VyICopJnNjLT5jcyk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZWZsYWdzLCAmc2MtPmVmbGFncyk7CisJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+ZXNwLCAmc2MtPmVzcF9hdF9zaWduYWwpOworCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPnhzcywgKHVuc2lnbmVkIGludCBfX3VzZXIgKikmc2MtPnNzKTsKKworCXRtcCA9IHNhdmVfaTM4NyhmcHN0YXRlKTsKKwlpZiAodG1wIDwgMCkKKwkgIGVyciA9IDE7CisJZWxzZQorCSAgZXJyIHw9IF9fcHV0X3VzZXIodG1wID8gZnBzdGF0ZSA6IE5VTEwsICZzYy0+ZnBzdGF0ZSk7CisKKwkvKiBub24taUJDUzIgZXh0ZW5zaW9ucy4uICovCisJZXJyIHw9IF9fcHV0X3VzZXIobWFzaywgJnNjLT5vbGRtYXNrKTsKKwllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuY3IyLCAmc2MtPmNyMik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogRGV0ZXJtaW5lIHdoaWNoIHN0YWNrIHRvIHVzZS4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3VzZXIgKgorZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICogcmVncywgc2l6ZV90IGZyYW1lX3NpemUpCit7CisJdW5zaWduZWQgbG9uZyBlc3A7CisKKwkvKiBEZWZhdWx0IHRvIHVzaW5nIG5vcm1hbCBzdGFjayAqLworCWVzcCA9IHJlZ3MtPmVzcDsKKworCS8qIFRoaXMgaXMgdGhlIFgvT3BlbiBzYW5jdGlvbmVkIHNpZ25hbCBzdGFjayBzd2l0Y2hpbmcuICAqLworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTlNUQUNLKSB7CisJCWlmIChzYXNfc3NfZmxhZ3MoZXNwKSA9PSAwKQorCQkJZXNwID0gY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemU7CisJfQorCisJLyogVGhpcyBpcyB0aGUgbGVnYWN5IHNpZ25hbCBzdGFjayBzd2l0Y2hpbmcuICovCisJZWxzZSBpZiAoKHJlZ3MtPnhzcyAmIDB4ZmZmZikgIT0gX19VU0VSX0RTICYmCisJCSAhKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKSAmJgorCQkga2EtPnNhLnNhX3Jlc3RvcmVyKSB7CisJCWVzcCA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfcmVzdG9yZXI7CisJfQorCisJcmV0dXJuICh2b2lkIF9fdXNlciAqKSgoZXNwIC0gZnJhbWVfc2l6ZSkgJiAtOHVsKTsKK30KKworLyogVGhlc2Ugc3ltYm9scyBhcmUgZGVmaW5lZCB3aXRoIHRoZSBhZGRyZXNzZXMgaW4gdGhlIHZzeXNjYWxsIHBhZ2UuCisgICBTZWUgdnN5c2NhbGwtc2lncmV0dXJuLlMuICAqLworZXh0ZXJuIHZvaWQgX191c2VyIF9fa2VybmVsX3NpZ3JldHVybjsKK2V4dGVybiB2b2lkIF9fdXNlciBfX2tlcm5lbF9ydF9zaWdyZXR1cm47CisKK3N0YXRpYyB2b2lkIHNldHVwX2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCQlzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdm9pZCBfX3VzZXIgKnJlc3RvcmVyOworCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOworCWludCBlcnIgPSAwOworCWludCB1c2lnOworCisJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpKTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwl1c2lnID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbgorCQkmJiBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwCisJCSYmIHNpZyA8IDMyCisJCT8gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddCisJCTogc2lnOworCisJZXJyID0gX19wdXRfdXNlcih1c2lnLCAmZnJhbWUtPnNpZyk7CisJaWYgKGVycikKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwllcnIgPSBzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+c2MsICZmcmFtZS0+ZnBzdGF0ZSwgcmVncywgc2V0LT5zaWdbMF0pOworCWlmIChlcnIpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJaWYgKF9OU0lHX1dPUkRTID4gMSkgeworCQllcnIgPSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPmV4dHJhbWFzaywgJnNldC0+c2lnWzFdLAorCQkJCSAgICAgIHNpemVvZihmcmFtZS0+ZXh0cmFtYXNrKSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGdpdmVfc2lnc2VndjsKKwl9CisKKwlyZXN0b3JlciA9ICZfX2tlcm5lbF9zaWdyZXR1cm47CisJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKQorCQlyZXN0b3JlciA9IGthLT5zYS5zYV9yZXN0b3JlcjsKKworCS8qIFNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICAqLworCWVyciB8PSBfX3B1dF91c2VyKHJlc3RvcmVyLCAmZnJhbWUtPnByZXRjb2RlKTsKKwkgCisJLyoKKwkgKiBUaGlzIGlzIHBvcGwgJWVheCA7IG1vdmwgJCwlZWF4IDsgaW50ICQweDgwCisJICoKKwkgKiBXRSBETyBOT1QgVVNFIElUIEFOWSBNT1JFISBJdCdzIG9ubHkgbGVmdCBoZXJlIGZvciBoaXN0b3JpY2FsCisJICogcmVhc29ucyBhbmQgYmVjYXVzZSBnZGIgdXNlcyBpdCBhcyBhIHNpZ25hdHVyZSB0byBub3RpY2UKKwkgKiBzaWduYWwgaGFuZGxlciBzdGFjayBmcmFtZXMuCisJICovCisJZXJyIHw9IF9fcHV0X3VzZXIoMHhiODU4LCAoc2hvcnQgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzApKTsKKwllcnIgfD0gX19wdXRfdXNlcihfX05SX3NpZ3JldHVybiwgKGludCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrMikpOworCWVyciB8PSBfX3B1dF91c2VyKDB4ODBjZCwgKHNob3J0IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSs2KSk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCisJcmVncy0+ZXNwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKKwlyZWdzLT5lYXggPSAodW5zaWduZWQgbG9uZykgc2lnOworCXJlZ3MtPmVkeCA9ICh1bnNpZ25lZCBsb25nKSAwOworCXJlZ3MtPmVjeCA9ICh1bnNpZ25lZCBsb25nKSAwOworCisJc2V0X2ZzKFVTRVJfRFMpOworCXJlZ3MtPnhkcyA9IF9fVVNFUl9EUzsKKwlyZWdzLT54ZXMgPSBfX1VTRVJfRFM7CisJcmVncy0+eHNzID0gX19VU0VSX0RTOworCXJlZ3MtPnhjcyA9IF9fVVNFUl9DUzsKKworCS8qCisJICogQ2xlYXIgVEYgd2hlbiBlbnRlcmluZyB0aGUgc2lnbmFsIGhhbmRsZXIsIGJ1dAorCSAqIG5vdGlmeSBhbnkgdHJhY2VyIHRoYXQgd2FzIHNpbmdsZS1zdGVwcGluZyBpdC4KKwkgKiBUaGUgdHJhY2VyIG1heSB3YW50IHRvIHNpbmdsZS1zdGVwIGluc2lkZSB0aGUKKwkgKiBoYW5kbGVyIHRvby4KKwkgKi8KKwlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKQorCQlwdHJhY2Vfbm90aWZ5KFNJR1RSQVApOworCisjaWYgREVCVUdfU0lHCisJcHJpbnRrKCJTSUcgZGVsaXZlciAoJXM6JWQpOiBzcD0lcCBwYz0lcCByYT0lcFxuIiwKKwkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwgcmVncy0+ZWlwLCBmcmFtZS0+cHJldGNvZGUpOworI2VuZGlmCisKKwlyZXR1cm47CisKK2dpdmVfc2lnc2VndjoKKwlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3J0X2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKKwkJCSAgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwl2b2lkIF9fdXNlciAqcmVzdG9yZXI7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CisJaW50IGVyciA9IDA7CisJaW50IHVzaWc7CisKKwlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkpOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCXVzaWcgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCisJCSYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKKwkJJiYgc2lnIDwgMzIKKwkJPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ10KKwkJOiBzaWc7CisKKwllcnIgfD0gX19wdXRfdXNlcih1c2lnLCAmZnJhbWUtPnNpZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT5pbmZvLCAmZnJhbWUtPnBpbmZvKTsKKwllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPnVjLCAmZnJhbWUtPnB1Yyk7CisJZXJyIHw9IGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgaW5mbyk7CisJaWYgKGVycikKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwkvKiBDcmVhdGUgdGhlIHVjb250ZXh0LiAgKi8KKwllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcigwLCAmZnJhbWUtPnVjLnVjX2xpbmspOworCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnNhc19zc19zcCwgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zcCk7CisJZXJyIHw9IF9fcHV0X3VzZXIoc2FzX3NzX2ZsYWdzKHJlZ3MtPmVzcCksCisJCQkgICZmcmFtZS0+dWMudWNfc3RhY2suc3NfZmxhZ3MpOworCWVyciB8PSBfX3B1dF91c2VyKGN1cnJlbnQtPnNhc19zc19zaXplLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NpemUpOworCWVyciB8PSBzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+dWMudWNfbWNvbnRleHQsICZmcmFtZS0+ZnBzdGF0ZSwKKwkJCSAgICAgICAgcmVncywgc2V0LT5zaWdbMF0pOworCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIFNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICAqLworCXJlc3RvcmVyID0gJl9fa2VybmVsX3J0X3NpZ3JldHVybjsKKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVE9SRVIpCisJCXJlc3RvcmVyID0ga2EtPnNhLnNhX3Jlc3RvcmVyOworCWVyciB8PSBfX3B1dF91c2VyKHJlc3RvcmVyLCAmZnJhbWUtPnByZXRjb2RlKTsKKwkgCisJLyoKKwkgKiBUaGlzIGlzIG1vdmwgJCwlZWF4IDsgaW50ICQweDgwCisJICoKKwkgKiBXRSBETyBOT1QgVVNFIElUIEFOWSBNT1JFISBJdCdzIG9ubHkgbGVmdCBoZXJlIGZvciBoaXN0b3JpY2FsCisJICogcmVhc29ucyBhbmQgYmVjYXVzZSBnZGIgdXNlcyBpdCBhcyBhIHNpZ25hdHVyZSB0byBub3RpY2UKKwkgKiBzaWduYWwgaGFuZGxlciBzdGFjayBmcmFtZXMuCisJICovCisJZXJyIHw9IF9fcHV0X3VzZXIoMHhiOCwgKGNoYXIgX191c2VyICopKGZyYW1lLT5yZXRjb2RlKzApKTsKKwllcnIgfD0gX19wdXRfdXNlcihfX05SX3J0X3NpZ3JldHVybiwgKGludCBfX3VzZXIgKikoZnJhbWUtPnJldGNvZGUrMSkpOworCWVyciB8PSBfX3B1dF91c2VyKDB4ODBjZCwgKHNob3J0IF9fdXNlciAqKShmcmFtZS0+cmV0Y29kZSs1KSk7CisKKwlpZiAoZXJyKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCisJcmVncy0+ZXNwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKKwlyZWdzLT5lYXggPSAodW5zaWduZWQgbG9uZykgdXNpZzsKKwlyZWdzLT5lZHggPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT5pbmZvOworCXJlZ3MtPmVjeCA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnVjOworCisJc2V0X2ZzKFVTRVJfRFMpOworCXJlZ3MtPnhkcyA9IF9fVVNFUl9EUzsKKwlyZWdzLT54ZXMgPSBfX1VTRVJfRFM7CisJcmVncy0+eHNzID0gX19VU0VSX0RTOworCXJlZ3MtPnhjcyA9IF9fVVNFUl9DUzsKKworCS8qCisJICogQ2xlYXIgVEYgd2hlbiBlbnRlcmluZyB0aGUgc2lnbmFsIGhhbmRsZXIsIGJ1dAorCSAqIG5vdGlmeSBhbnkgdHJhY2VyIHRoYXQgd2FzIHNpbmdsZS1zdGVwcGluZyBpdC4KKwkgKiBUaGUgdHJhY2VyIG1heSB3YW50IHRvIHNpbmdsZS1zdGVwIGluc2lkZSB0aGUKKwkgKiBoYW5kbGVyIHRvby4KKwkgKi8KKwlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKQorCQlwdHJhY2Vfbm90aWZ5KFNJR1RSQVApOworCisjaWYgREVCVUdfU0lHCisJcHJpbnRrKCJTSUcgZGVsaXZlciAoJXM6JWQpOiBzcD0lcCBwYz0lcCByYT0lcFxuIiwKKwkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwgcmVncy0+ZWlwLCBmcmFtZS0+cHJldGNvZGUpOworI2VuZGlmCisKKwlyZXR1cm47CisKK2dpdmVfc2lnc2VndjoKKwlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7Cit9CisKKy8qCisgKiBPSywgd2UncmUgaW52b2tpbmcgYSBoYW5kbGVyCisgKi8JCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfc2lnbmFsKHVuc2lnbmVkIGxvbmcgc2lnLCBzaWdpbmZvX3QgKmluZm8sIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJICAgICAgc2lnc2V0X3QgKm9sZHNldCwJc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCS8qIEFyZSB3ZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCisJaWYgKHJlZ3MtPm9yaWdfZWF4ID49IDApIHsKKwkJLyogSWYgc28sIGNoZWNrIHN5c3RlbSBjYWxsIHJlc3RhcnRpbmcuLiAqLworCQlzd2l0Y2ggKHJlZ3MtPmVheCkgeworCQkgICAgICAgIGNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKKwkJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgorCQkJCXJlZ3MtPmVheCA9IC1FSU5UUjsKKwkJCQlicmVhazsKKworCQkJY2FzZSAtRVJFU1RBUlRTWVM6CisJCQkJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfUkVTVEFSVCkpIHsKKwkJCQkJcmVncy0+ZWF4ID0gLUVJTlRSOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CisJCQkJcmVncy0+ZWF4ID0gcmVncy0+b3JpZ19lYXg7CisJCQkJcmVncy0+ZWlwIC09IDI7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIFRGIGlzIHNldCBkdWUgdG8gYSBkZWJ1Z2dlciAoUFRfRFRSQUNFKSwgY2xlYXIgdGhlIFRGIGZsYWcgc28KKwkgKiB0aGF0IHJlZ2lzdGVyIGluZm9ybWF0aW9uIGluIHRoZSBzaWdjb250ZXh0IGlzIGNvcnJlY3QuCisJICovCisJaWYgKHVubGlrZWx5KHJlZ3MtPmVmbGFncyAmIFRGX01BU0spCisJICAgICYmIGxpa2VseShjdXJyZW50LT5wdHJhY2UgJiBQVF9EVFJBQ0UpKSB7CisJCWN1cnJlbnQtPnB0cmFjZSAmPSB+UFRfRFRSQUNFOworCQlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CisJfQorCisJLyogU2V0IHVwIHRoZSBzdGFjayBmcmFtZSAqLworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQorCQlzZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOworCWVsc2UKKwkJc2V0dXBfZnJhbWUoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKKworCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKSB7CisJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsJmN1cnJlbnQtPmJsb2NrZWQsJmthLT5zYS5zYV9tYXNrKTsKKwkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLHNpZyk7CisJCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJfQorfQorCisvKgorICogTm90ZSB0aGF0ICdpbml0JyBpcyBhIHNwZWNpYWwgcHJvY2VzczogaXQgZG9lc24ndCBnZXQgc2lnbmFscyBpdCBkb2Vzbid0CisgKiB3YW50IHRvIGhhbmRsZS4gVGh1cyB5b3UgY2Fubm90IGtpbGwgaW5pdCBldmVuIHdpdGggYSBTSUdLSUxMIGV2ZW4gYnkKKyAqIG1pc3Rha2UuCisgKi8KK2ludCBmYXN0Y2FsbCBkb19zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHNpZ3NldF90ICpvbGRzZXQpCit7CisJc2lnaW5mb190IGluZm87CisJaW50IHNpZ25yOworCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKKworCS8qCisJICogV2Ugd2FudCB0aGUgY29tbW9uIGNhc2UgdG8gZ28gZmFzdCwgd2hpY2gKKwkgKiBpcyB3aHkgd2UgbWF5IGluIGNlcnRhaW4gY2FzZXMgZ2V0IGhlcmUgZnJvbQorCSAqIGtlcm5lbCBtb2RlLiBKdXN0IHJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nCisJICogaWYgc28uCisJICovCisJaWYgKChyZWdzLT54Y3MgJiAzKSAhPSAzKQorCQlyZXR1cm4gMTsKKworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkgeworCQlyZWZyaWdlcmF0b3IoMCk7CisJCWdvdG8gbm9fc2lnbmFsOworCX0KKworCWlmICghb2xkc2V0KQorCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKKworCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOworCWlmIChzaWduciA+IDApIHsKKwkJLyogUmVlbmFibGUgYW55IHdhdGNocG9pbnRzIGJlZm9yZSBkZWxpdmVyaW5nIHRoZQorCQkgKiBzaWduYWwgdG8gdXNlciBzcGFjZS4gVGhlIHByb2Nlc3NvciByZWdpc3RlciB3aWxsCisJCSAqIGhhdmUgYmVlbiBjbGVhcmVkIGlmIHRoZSB3YXRjaHBvaW50IHRyaWdnZXJlZAorCQkgKiBpbnNpZGUgdGhlIGtlcm5lbC4KKwkJICovCisJCWlmICh1bmxpa2VseShjdXJyZW50LT50aHJlYWQuZGVidWdyZWdbN10pKSB7CisJCQlfX2FzbV9fKCJtb3ZsICUwLCUlZGI3Igk6IDogInIiIChjdXJyZW50LT50aHJlYWQuZGVidWdyZWdbN10pKTsKKwkJfQorCisJCS8qIFdoZWUhICBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLworCQloYW5kbGVfc2lnbmFsKHNpZ25yLCAmaW5mbywgJmthLCBvbGRzZXQsIHJlZ3MpOworCQlyZXR1cm4gMTsKKwl9CisKKyBub19zaWduYWw6CisJLyogRGlkIHdlIGNvbWUgZnJvbSBhIHN5c3RlbSBjYWxsPyAqLworCWlmIChyZWdzLT5vcmlnX2VheCA+PSAwKSB7CisJCS8qIFJlc3RhcnQgdGhlIHN5c3RlbSBjYWxsIC0gbm8gaGFuZGxlcnMgcHJlc2VudCAqLworCQlpZiAocmVncy0+ZWF4ID09IC1FUkVTVEFSVE5PSEFORCB8fAorCQkgICAgcmVncy0+ZWF4ID09IC1FUkVTVEFSVFNZUyB8fAorCQkgICAgcmVncy0+ZWF4ID09IC1FUkVTVEFSVE5PSU5UUikgeworCQkJcmVncy0+ZWF4ID0gcmVncy0+b3JpZ19lYXg7CisJCQlyZWdzLT5laXAgLT0gMjsKKwkJfQorCQlpZiAocmVncy0+ZWF4ID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0speworCQkJcmVncy0+ZWF4ID0gX19OUl9yZXN0YXJ0X3N5c2NhbGw7CisJCQlyZWdzLT5laXAgLT0gMjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG5vdGlmaWNhdGlvbiBvZiB1c2Vyc3BhY2UgZXhlY3V0aW9uIHJlc3VtcHRpb24KKyAqIC0gdHJpZ2dlcmVkIGJ5IGN1cnJlbnQtPndvcmsubm90aWZ5X3Jlc3VtZQorICovCitfX2F0dHJpYnV0ZV9fKChyZWdwYXJtKDMpKSkKK3ZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgKm9sZHNldCwKKwkJICAgICAgX191MzIgdGhyZWFkX2luZm9fZmxhZ3MpCit7CisJLyogUGVuZGluZyBzaW5nbGUtc3RlcD8gKi8KKwlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiBfVElGX1NJTkdMRVNURVApIHsKKwkJcmVncy0+ZWZsYWdzIHw9IFRGX01BU0s7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKTsKKwl9CisJLyogZGVhbCB3aXRoIHBlbmRpbmcgc2lnbmFsIGRlbGl2ZXJ5ICovCisJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQorCQlkb19zaWduYWwocmVncyxvbGRzZXQpOworCQorCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9JUkVUKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wLmMgYi9hcmNoL2kzODYva2VybmVsL3NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjNjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3NtcC5jCkBAIC0wLDAgKzEsNjEyIEBACisvKgorICoJSW50ZWwgU01QIHN1cHBvcnQgcm91dGluZXMuCisgKgorICoJKGMpIDE5OTUgQWxhbiBDb3gsIEJ1aWxkaW5nICMzIDxhbGFuQHJlZGhhdC5jb20+CisgKgkoYykgMTk5OC05OSwgMjAwMCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKglUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvcgorICoJbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgorCisvKgorICoJU29tZSBub3RlcyBvbiB4ODYgcHJvY2Vzc29yIGJ1Z3MgYWZmZWN0aW5nIFNNUCBvcGVyYXRpb246CisgKgorICoJUGVudGl1bSwgUGVudGl1bSBQcm8sIElJLCBJSUkgKGFuZCBhbGwgQ1BVcykgaGF2ZSBidWdzLgorICoJVGhlIExpbnV4IGltcGxpY2F0aW9ucyBmb3IgU01QIGFyZSBoYW5kbGVkIGFzIGZvbGxvd3M6CisgKgorICoJUGVudGl1bSBJSUkgLyBbWGVvbl0KKyAqCQlOb25lIG9mIHRoZSBFMUFQLUUzQVAgZXJyYXRhIGFyZSB2aXNpYmxlIHRvIHRoZSB1c2VyLgorICoKKyAqCUUxQVAuCXNlZSBQSUkgQTFBUAorICoJRTJBUC4Jc2VlIFBJSSBBMkFQCisgKglFM0FQLglzZWUgUElJIEEzQVAKKyAqCisgKglQZW50aXVtIElJIC8gW1hlb25dCisgKgkJTm9uZSBvZiB0aGUgQTFBUC1BM0FQIGVycmF0YSBhcmUgdmlzaWJsZSB0byB0aGUgdXNlci4KKyAqCisgKglBMUFQLglzZWUgUFBybyAxQVAKKyAqCUEyQVAuCXNlZSBQUHJvIDJBUAorICoJQTNBUC4Jc2VlIFBQcm8gN0FQCisgKgorICoJUGVudGl1bSBQcm8KKyAqCQlOb25lIG9mIDFBUC05QVAgZXJyYXRhIGFyZSB2aXNpYmxlIHRvIHRoZSBub3JtYWwgdXNlciwKKyAqCWV4Y2VwdCBvY2Nhc2lvbmFsIGRlbGl2ZXJ5IG9mICdzcHVyaW91cyBpbnRlcnJ1cHQnIGFzIHRyYXAgIzE1LgorICoJVGhpcyBpcyB2ZXJ5IHJhcmUgYW5kIGEgbm9uLXByb2JsZW0uCisgKgorICoJMUFQLglMaW51eCBtYXBzIEFQSUMgYXMgbm9uLWNhY2hlYWJsZQorICoJMkFQLgl3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgkzQVAuCWZpeGVkIGluIEMwIGFuZCBhYm92ZSBzdGVwcGluZ3MgbWljcm9jb2RlIHVwZGF0ZS4KKyAqCQlMaW51eCBkb2VzIG5vdCB1c2UgZXhjZXNzaXZlIFNUQVJUVVBfSVBJcy4KKyAqCTRBUC4Jd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJNUFQLglzeW1tZXRyaWMgSU8gbW9kZSAobm9ybWFsIExpbnV4IG9wZXJhdGlvbikgbm90IGFmZmVjdGVkLgorICoJCSdub2FwaWMnIG1vZGUgaGFzIHZlY3RvciAweGYgZmlsbGVkIG91dCBwcm9wZXJseS4KKyAqCTZBUC4JJ25vYXBpYycgbW9kZSBtaWdodCBiZSBhZmZlY3RlZCAtIGZpeGVkIGluIGxhdGVyIHN0ZXBwaW5ncworICoJN0FQLglXZSBkbyBub3QgYXNzdW1lIHdyaXRlcyB0byB0aGUgTFZUIGRlYXNzZXJpbmcgSVJRcworICoJOEFQLglXZSBkbyBub3QgZW5hYmxlIGxvdyBwb3dlciBtb2RlIChkZWVwIHNsZWVwKSBkdXJpbmcgTVAgYm9vdHVwCisgKgk5QVAuCVdlIGRvIG5vdCB1c2UgbWl4ZWQgbW9kZQorICoKKyAqCVBlbnRpdW0KKyAqCQlUaGVyZSBpcyBhIG1hcmdpbmFsIGNhc2Ugd2hlcmUgUkVQIE1PVlMgb24gMTAwTUh6IFNNUAorICoJbWFjaGluZXMgd2l0aCBCIHN0ZXBwaW5nIHByb2Nlc3NvcnMgY2FuIGZhaWwuIFhYWCBzaG91bGQgcHJvdmlkZQorICoJYW4gTDFjYWNoZT1Xcml0ZXRocm91Z2ggb3IgTDFjYWNoZT1vZmYgb3B0aW9uLgorICoKKyAqCQlCIHN0ZXBwaW5nIENQVXMgbWF5IGhhbmcuIFRoZXJlIGFyZSBoYXJkd2FyZSB3b3JrIGFyb3VuZHMKKyAqCWZvciB0aGlzLiBXZSB3YXJuIGFib3V0IGl0IGluIGNhc2UgeW91ciBib2FyZCBkb2Vzbid0IGhhdmUgdGhlIHdvcmsKKyAqCWFyb3VuZHMuIEJhc2ljYWxseSB0aGF0cyBzbyBJIGNhbiB0ZWxsIGFueW9uZSB3aXRoIGEgQiBzdGVwcGluZworICoJQ1BVIGFuZCBTTVAgcHJvYmxlbXMgInRvdWdoIi4KKyAqCisgKglTcGVjaWZpYyBpdGVtcyBbRnJvbSBQZW50aXVtIFByb2Nlc3NvciBTcGVjaWZpY2F0aW9uIFVwZGF0ZV0KKyAqCisgKgkxQVAuCUxpbnV4IGRvZXNuJ3QgdXNlIHJlbW90ZSByZWFkCisgKgkyQVAuCUxpbnV4IGRvZXNuJ3QgdHJ1c3QgQVBJQyBlcnJvcnMKKyAqCTNBUC4JV2Ugd29yayBhcm91bmQgdGhpcworICoJNEFQLglMaW51eCBuZXZlciBnZW5lcmF0ZWQgMyBpbnRlcnJ1cHRzIG9mIHRoZSBzYW1lIHByaW9yaXR5CisgKgkJdG8gY2F1c2UgYSBsb3N0IGxvY2FsIGludGVycnVwdC4KKyAqCTVBUC4JUmVtb3RlIHJlYWQgaXMgbmV2ZXIgdXNlZAorICoJNkFQLglub3QgYWZmZWN0ZWQgLSB3b3JrZWQgYXJvdW5kIGluIGhhcmR3YXJlCisgKgk3QVAuCW5vdCBhZmZlY3RlZCAtIHdvcmtlZCBhcm91bmQgaW4gaGFyZHdhcmUKKyAqCThBUC4Jd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZSAtIHdlIGdldCBleHBsaWNpdCBDUyBlcnJvcnMgaWYgbm90CisgKgk5QVAuCW9ubHkgJ25vYXBpYycgbW9kZSBhZmZlY3RlZC4gTWlnaHQgZ2VuZXJhdGUgc3B1cmlvdXMKKyAqCQlpbnRlcnJ1cHRzLCB3ZSBsb2cgb25seSB0aGUgZmlyc3Qgb25lIGFuZCBjb3VudCB0aGUKKyAqCQlyZXN0IHNpbGVudGx5LgorICoJMTBBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTFBUC4JTGludXggcmVhZHMgdGhlIEFQSUMgYmV0d2VlbiB3cml0ZXMgdG8gYXZvaWQgdGhpcywgYXMgcGVyCisgKgkJdGhlIGRvY3VtZW50YXRpb24uIE1ha2Ugc3VyZSB5b3UgcHJlc2VydmUgdGhpcyBhcyBpdCBhZmZlY3RzCisgKgkJdGhlIEMgc3RlcHBpbmcgY2hpcHMgdG9vLgorICoJMTJBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTNBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTRBUC4Jd2UgYWx3YXlzIGRlYXNzZXJ0IElOSVQgZHVyaW5nIGJvb3R1cAorICoJMTVBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTZBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTdBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMThBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZQorICoJMTlBUC4Jbm90IGFmZmVjdGVkIC0gd29ya2VkIGFyb3VuZCBpbiBCSU9TCisgKgorICoJSWYgdGhpcyBzb3VuZHMgd29ycnlpbmcgYmVsaWV2ZSBtZSB0aGVzZSBidWdzIGFyZSBlaXRoZXIgX19fUkFSRV9fXywKKyAqCW9yIGFyZSBzaWduYWwgdGltaW5nIGJ1Z3Mgd29ya2VkIGFyb3VuZCBpbiBoYXJkd2FyZSBhbmQgdGhlcmUncworICoJYWJvdXQgbm90aGluZyBvZiBub3RlIHdpdGggQyBzdGVwcGluZyB1cHdhcmRzLgorICovCisKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCB0bGJfc3RhdGUsIGNwdV90bGJzdGF0ZSkgX19fX2NhY2hlbGluZV9hbGlnbmVkID0geyAmaW5pdF9tbSwgMCwgfTsKKworLyoKKyAqIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGRlYWwgd2l0aCBzZW5kaW5nIElQSXMgYmV0d2VlbiBDUFVzLgorICoKKyAqIFdlIHVzZSAnYnJvYWRjYXN0JywgQ1BVLT5DUFUgSVBJcyBhbmQgc2VsZi1JUElzIHRvby4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBfX3ByZXBhcmVfSUNSICh1bnNpZ25lZCBpbnQgc2hvcnRjdXQsIGludCB2ZWN0b3IpCit7CisJcmV0dXJuIEFQSUNfRE1fRklYRUQgfCBzaG9ydGN1dCB8IHZlY3RvciB8IEFQSUNfREVTVF9MT0dJQ0FMOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3ByZXBhcmVfSUNSMiAodW5zaWduZWQgaW50IG1hc2spCit7CisJcmV0dXJuIFNFVF9BUElDX0RFU1RfRklFTEQobWFzayk7Cit9CisKK3ZvaWQgX19zZW5kX0lQSV9zaG9ydGN1dCh1bnNpZ25lZCBpbnQgc2hvcnRjdXQsIGludCB2ZWN0b3IpCit7CisJLyoKKwkgKiBTdWJ0bGUuIEluIHRoZSBjYXNlIG9mIHRoZSAnbmV2ZXIgZG8gZG91YmxlIHdyaXRlcycgd29ya2Fyb3VuZAorCSAqIHdlIGhhdmUgdG8gbG9jayBvdXQgaW50ZXJydXB0cyB0byBiZSBzYWZlLiAgQXMgd2UgZG9uJ3QgY2FyZQorCSAqIG9mIHRoZSB2YWx1ZSByZWFkIHdlIHVzZSBhbiBhdG9taWMgcm13IGFjY2VzcyB0byBhdm9pZCBjb3N0bHkKKwkgKiBjbGkvc3RpLiAgT3RoZXJ3aXNlIHdlIHVzZSBhbiBldmVuIGNoZWFwZXIgc2luZ2xlIGF0b21pYyB3cml0ZQorCSAqIHRvIHRoZSBBUElDLgorCSAqLworCXVuc2lnbmVkIGludCBjZmc7CisKKwkvKgorCSAqIFdhaXQgZm9yIGlkbGUuCisJICovCisJYXBpY193YWl0X2ljcl9pZGxlKCk7CisKKwkvKgorCSAqIE5vIG5lZWQgdG8gdG91Y2ggdGhlIHRhcmdldCBjaGlwIGZpZWxkCisJICovCisJY2ZnID0gX19wcmVwYXJlX0lDUihzaG9ydGN1dCwgdmVjdG9yKTsKKworCS8qCisJICogU2VuZCB0aGUgSVBJLiBUaGUgd3JpdGUgdG8gQVBJQ19JQ1IgZmlyZXMgdGhpcyBvZmYuCisJICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IsIGNmZyk7Cit9CisKK3ZvaWQgZmFzdGNhbGwgc2VuZF9JUElfc2VsZihpbnQgdmVjdG9yKQoreworCV9fc2VuZF9JUElfc2hvcnRjdXQoQVBJQ19ERVNUX1NFTEYsIHZlY3Rvcik7Cit9CisKKy8qCisgKiBUaGlzIGlzIG9ubHkgdXNlZCBvbiBzbWFsbGVyIG1hY2hpbmVzLgorICovCit2b2lkIHNlbmRfSVBJX21hc2tfYml0bWFzayhjcHVtYXNrX3QgY3B1bWFzaywgaW50IHZlY3RvcikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSBjcHVzX2FkZHIoY3B1bWFzaylbMF07CisJdW5zaWduZWQgbG9uZyBjZmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCisJLyoKKwkgKiBXYWl0IGZvciBpZGxlLgorCSAqLworCWFwaWNfd2FpdF9pY3JfaWRsZSgpOworCQkKKwkvKgorCSAqIHByZXBhcmUgdGFyZ2V0IGNoaXAgZmllbGQKKwkgKi8KKwljZmcgPSBfX3ByZXBhcmVfSUNSMihtYXNrKTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUjIsIGNmZyk7CisJCQorCS8qCisJICogcHJvZ3JhbSB0aGUgSUNSIAorCSAqLworCWNmZyA9IF9fcHJlcGFyZV9JQ1IoMCwgdmVjdG9yKTsKKwkJCQorCS8qCisJICogU2VuZCB0aGUgSVBJLiBUaGUgd3JpdGUgdG8gQVBJQ19JQ1IgZmlyZXMgdGhpcyBvZmYuCisJICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IsIGNmZyk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3ZvaWQgc2VuZF9JUElfbWFza19zZXF1ZW5jZShjcHVtYXNrX3QgbWFzaywgaW50IHZlY3RvcikKK3sKKwl1bnNpZ25lZCBsb25nIGNmZywgZmxhZ3M7CisJdW5zaWduZWQgaW50IHF1ZXJ5X2NwdTsKKworCS8qCisJICogSGFjay4gVGhlIGNsdXN0ZXJlZCBBUElDIGFkZHJlc3NpbmcgbW9kZSBkb2Vzbid0IGFsbG93IHVzIHRvIHNlbmQgCisJICogdG8gYW4gYXJiaXRyYXJ5IG1hc2ssIHNvIEkgZG8gYSB1bmljYXN0cyB0byBlYWNoIENQVSBpbnN0ZWFkLiBUaGlzIAorCSAqIHNob3VsZCBiZSBtb2RpZmllZCB0byBkbyAxIG1lc3NhZ2UgcGVyIGNsdXN0ZXIgSUQgLSBtYmxpZ2gKKwkgKi8gCisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlmb3IgKHF1ZXJ5X2NwdSA9IDA7IHF1ZXJ5X2NwdSA8IE5SX0NQVVM7ICsrcXVlcnlfY3B1KSB7CisJCWlmIChjcHVfaXNzZXQocXVlcnlfY3B1LCBtYXNrKSkgeworCQkKKwkJCS8qCisJCQkgKiBXYWl0IGZvciBpZGxlLgorCQkJICovCisJCQlhcGljX3dhaXRfaWNyX2lkbGUoKTsKKwkJCisJCQkvKgorCQkJICogcHJlcGFyZSB0YXJnZXQgY2hpcCBmaWVsZAorCQkJICovCisJCQljZmcgPSBfX3ByZXBhcmVfSUNSMihjcHVfdG9fbG9naWNhbF9hcGljaWQocXVlcnlfY3B1KSk7CisJCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUjIsIGNmZyk7CisJCQorCQkJLyoKKwkJCSAqIHByb2dyYW0gdGhlIElDUiAKKwkJCSAqLworCQkJY2ZnID0gX19wcmVwYXJlX0lDUigwLCB2ZWN0b3IpOworCQkJCisJCQkvKgorCQkJICogU2VuZCB0aGUgSVBJLiBUaGUgd3JpdGUgdG8gQVBJQ19JQ1IgZmlyZXMgdGhpcyBvZmYuCisJCQkgKi8KKwkJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSLCBjZmcpOworCQl9CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworI2luY2x1ZGUgPG1hY2hfaXBpLmg+IC8qIG11c3QgY29tZSBhZnRlciB0aGUgc2VuZF9JUEkgZnVuY3Rpb25zIGFib3ZlIGZvciBpbmxpbmluZyAqLworCisvKgorICoJU21hcnRlciBTTVAgZmx1c2hpbmcgbWFjcm9zLiAKKyAqCQljL28gTGludXMgVG9ydmFsZHMuCisgKgorICoJVGhlc2UgbWVhbiB5b3UgY2FuIHJlYWxseSBkZWZpbml0ZWx5IHV0dGVybHkgZm9yZ2V0IGFib3V0CisgKgl3cml0aW5nIHRvIHVzZXIgc3BhY2UgZnJvbSBpbnRlcnJ1cHRzLiAoSXRzIG5vdCBhbGxvd2VkIGFueXdheSkuCisgKgorICoJT3B0aW1pemF0aW9ucyBNYW5mcmVkIFNwcmF1bCA8bWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tPgorICovCisKK3N0YXRpYyBjcHVtYXNrX3QgZmx1c2hfY3B1bWFzazsKK3N0YXRpYyBzdHJ1Y3QgbW1fc3RydWN0ICogZmx1c2hfbW07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBmbHVzaF92YTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGxic3RhdGVfbG9jayk7CisjZGVmaW5lIEZMVVNIX0FMTAkweGZmZmZmZmZmCisKKy8qCisgKiBXZSBjYW5ub3QgY2FsbCBtbWRyb3AoKSBiZWNhdXNlIHdlIGFyZSBpbiBpbnRlcnJ1cHQgY29udGV4dCwgCisgKiBpbnN0ZWFkIHVwZGF0ZSBtbS0+Y3B1X3ZtX21hc2suCisgKgorICogV2UgbmVlZCB0byByZWxvYWQgJWNyMyBzaW5jZSB0aGUgcGFnZSB0YWJsZXMgbWF5IGJlIGdvaW5nCisgKiBhd2F5IGZyb20gdW5kZXIgdXMuLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGVhdmVfbW0gKHVuc2lnbmVkIGxvbmcgY3B1KQoreworCWlmIChwZXJfY3B1KGNwdV90bGJzdGF0ZSwgY3B1KS5zdGF0ZSA9PSBUTEJTVEFURV9PSykKKwkJQlVHKCk7CisJY3B1X2NsZWFyKGNwdSwgcGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuYWN0aXZlX21tLT5jcHVfdm1fbWFzayk7CisJbG9hZF9jcjMoc3dhcHBlcl9wZ19kaXIpOworfQorCisvKgorICoKKyAqIFRoZSBmbHVzaCBJUEkgYXNzdW1lcyB0aGF0IGEgdGhyZWFkIHN3aXRjaCBoYXBwZW5zIGluIHRoaXMgb3JkZXI6CisgKiBbY3B1MDogdGhlIGNwdSB0aGF0IHN3aXRjaGVzXQorICogMSkgc3dpdGNoX21tKCkgZWl0aGVyIDFhKSBvciAxYikKKyAqIDFhKSB0aHJlYWQgc3dpdGNoIHRvIGEgZGlmZmVyZW50IG1tCisgKiAxYTEpIGNwdV9jbGVhcihjcHUsIG9sZF9tbS0+Y3B1X3ZtX21hc2spOworICogCVN0b3AgaXBpIGRlbGl2ZXJ5IGZvciB0aGUgb2xkIG1tLiBUaGlzIGlzIG5vdCBzeW5jaHJvbml6ZWQgd2l0aAorICogCXRoZSBvdGhlciBjcHVzLCBidXQgc21wX2ludmFsaWRhdGVfaW50ZXJydXB0IGlnbm9yZSBmbHVzaCBpcGlzCisgKiAJZm9yIHRoZSB3cm9uZyBtbSwgYW5kIGluIHRoZSB3b3JzdCBjYXNlIHdlIHBlcmZvcm0gYSBzdXBlcmZsb3VzCisgKiAJdGxiIGZsdXNoLgorICogMWEyKSBzZXQgY3B1X3RsYnN0YXRlIHRvIFRMQlNUQVRFX09LCisgKiAJTm93IHRoZSBzbXBfaW52YWxpZGF0ZV9pbnRlcnJ1cHQgd29uJ3QgY2FsbCBsZWF2ZV9tbSBpZiBjcHUwCisgKgl3YXMgaW4gbGF6eSB0bGIgbW9kZS4KKyAqIDFhMykgdXBkYXRlIGNwdV90bGJzdGF0ZVtdLmFjdGl2ZV9tbQorICogCU5vdyBjcHUwIGFjY2VwdHMgdGxiIGZsdXNoZXMgZm9yIHRoZSBuZXcgbW0uCisgKiAxYTQpIGNwdV9zZXQoY3B1LCBuZXdfbW0tPmNwdV92bV9tYXNrKTsKKyAqIAlOb3cgdGhlIG90aGVyIGNwdXMgd2lsbCBzZW5kIHRsYiBmbHVzaCBpcGlzLgorICogMWE0KSBjaGFuZ2UgY3IzLgorICogMWIpIHRocmVhZCBzd2l0Y2ggd2l0aG91dCBtbSBjaGFuZ2UKKyAqCWNwdV90bGJzdGF0ZVtdLmFjdGl2ZV9tbSBpcyBjb3JyZWN0LCBjcHUwIGFscmVhZHkgaGFuZGxlcworICoJZmx1c2ggaXBpcy4KKyAqIDFiMSkgc2V0IGNwdV90bGJzdGF0ZSB0byBUTEJTVEFURV9PSworICogMWIyKSB0ZXN0X2FuZF9zZXQgdGhlIGNwdSBiaXQgaW4gY3B1X3ZtX21hc2suCisgKiAJQXRvbWljYWxseSBzZXQgdGhlIGJpdCBbb3RoZXIgY3B1cyB3aWxsIHN0YXJ0IHNlbmRpbmcgZmx1c2ggaXBpc10sCisgKiAJYW5kIHRlc3QgdGhlIGJpdC4KKyAqIDFiMykgaWYgdGhlIGJpdCB3YXMgMDogbGVhdmVfbW0gd2FzIGNhbGxlZCwgZmx1c2ggdGhlIHRsYi4KKyAqIDIpIHN3aXRjaCAlJWVzcCwgaWUgY3VycmVudAorICoKKyAqIFRoZSBpbnRlcnJ1cHQgbXVzdCBoYW5kbGUgMiBzcGVjaWFsIGNhc2VzOgorICogLSBjcjMgaXMgY2hhbmdlZCBiZWZvcmUgJSVlc3AsIGllLiBpdCBjYW5ub3QgdXNlIGN1cnJlbnQtPnthY3RpdmVfLH1tbS4KKyAqIC0gdGhlIGNwdSBwZXJmb3JtcyBzcGVjdWxhdGl2ZSB0bGIgcmVhZHMsIGkuZS4gZXZlbiBpZiB0aGUgY3B1IG9ubHkKKyAqICAgcnVucyBpbiBrZXJuZWwgc3BhY2UsIHRoZSBjcHUgY291bGQgbG9hZCB0bGIgZW50cmllcyBmb3IgdXNlciBzcGFjZQorICogICBwYWdlcy4KKyAqCisgKiBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgY3B1X3RsYnN0YXRlIGlzIGxvY2FsIHRvIGVhY2ggY3B1LCBubworICogd3JpdGUvcmVhZCBvcmRlcmluZyBwcm9ibGVtcy4KKyAqLworCisvKgorICogVExCIGZsdXNoIElQSToKKyAqCisgKiAxKSBGbHVzaCB0aGUgdGxiIGVudHJpZXMgaWYgdGhlIGNwdSB1c2VzIHRoZSBtbSB0aGF0J3MgYmVpbmcgZmx1c2hlZC4KKyAqIDIpIExlYXZlIHRoZSBtbSBpZiB3ZSBhcmUgaW4gdGhlIGxhenkgdGxiIG1vZGUuCisgKi8KKworZmFzdGNhbGwgdm9pZCBzbXBfaW52YWxpZGF0ZV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBjcHU7CisKKwljcHUgPSBnZXRfY3B1KCk7CisKKwlpZiAoIWNwdV9pc3NldChjcHUsIGZsdXNoX2NwdW1hc2spKQorCQlnb3RvIG91dDsKKwkJLyogCisJCSAqIFRoaXMgd2FzIGEgQlVHKCkgYnV0IHVudGlsIHNvbWVvbmUgY2FuIHF1b3RlIG1lIHRoZQorCQkgKiBsaW5lIGZyb20gdGhlIGludGVsIG1hbnVhbCB0aGF0IGd1YXJhbnRlZXMgYW4gSVBJIHRvCisJCSAqIG11bHRpcGxlIENQVXMgaXMgcmV0cmllZCBfb25seV8gb24gdGhlIGVycm9yaW5nIENQVXMKKwkJICogaXRzIHN0YXlpbmcgYXMgYSByZXR1cm4KKwkJICoKKwkJICogQlVHKCk7CisJCSAqLworCQkgCisJaWYgKGZsdXNoX21tID09IHBlcl9jcHUoY3B1X3RsYnN0YXRlLCBjcHUpLmFjdGl2ZV9tbSkgeworCQlpZiAocGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuc3RhdGUgPT0gVExCU1RBVEVfT0spIHsKKwkJCWlmIChmbHVzaF92YSA9PSBGTFVTSF9BTEwpCisJCQkJbG9jYWxfZmx1c2hfdGxiKCk7CisJCQllbHNlCisJCQkJX19mbHVzaF90bGJfb25lKGZsdXNoX3ZhKTsKKwkJfSBlbHNlCisJCQlsZWF2ZV9tbShjcHUpOworCX0KKwlhY2tfQVBJQ19pcnEoKTsKKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwljcHVfY2xlYXIoY3B1LCBmbHVzaF9jcHVtYXNrKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworb3V0OgorCXB1dF9jcHVfbm9fcmVzY2hlZCgpOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF90bGJfb3RoZXJzKGNwdW1hc2tfdCBjcHVtYXNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgdmEpCit7CisJY3B1bWFza190IHRtcDsKKwkvKgorCSAqIEEgY291cGxlIG9mICh0byBiZSByZW1vdmVkKSBzYW5pdHkgY2hlY2tzOgorCSAqCisJICogLSB3ZSBkbyBub3Qgc2VuZCBJUElzIHRvIG5vdC15ZXQgYm9vdGVkIENQVXMuCisJICogLSBjdXJyZW50IENQVSBtdXN0IG5vdCBiZSBpbiBtYXNrCisJICogLSBtYXNrIG11c3QgZXhpc3QgOikKKwkgKi8KKwlCVUdfT04oY3B1c19lbXB0eShjcHVtYXNrKSk7CisKKwljcHVzX2FuZCh0bXAsIGNwdW1hc2ssIGNwdV9vbmxpbmVfbWFwKTsKKwlCVUdfT04oIWNwdXNfZXF1YWwoY3B1bWFzaywgdG1wKSk7CisJQlVHX09OKGNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdW1hc2spKTsKKwlCVUdfT04oIW1tKTsKKworCS8qCisJICogaSdtIG5vdCBoYXBweSBhYm91dCB0aGlzIGdsb2JhbCBzaGFyZWQgc3BpbmxvY2sgaW4gdGhlCisJICogTU0gaG90IHBhdGgsIGJ1dCB3ZSdsbCBzZWUgaG93IGNvbnRlbmRlZCBpdCBpcy4KKwkgKiBUZW1wb3JhcmlseSB0aGlzIHR1cm5zIElSUXMgb2ZmLCBzbyB0aGF0IGxvY2t1cHMgYXJlCisJICogZGV0ZWN0ZWQgYnkgdGhlIE5NSSB3YXRjaGRvZy4KKwkgKi8KKwlzcGluX2xvY2soJnRsYnN0YXRlX2xvY2spOworCQorCWZsdXNoX21tID0gbW07CisJZmx1c2hfdmEgPSB2YTsKKyNpZiBOUl9DUFVTIDw9IEJJVFNfUEVSX0xPTkcKKwlhdG9taWNfc2V0X21hc2soY3B1bWFzaywgJmZsdXNoX2NwdW1hc2spOworI2Vsc2UKKwl7CisJCWludCBrOworCQl1bnNpZ25lZCBsb25nICpmbHVzaF9tYXNrID0gKHVuc2lnbmVkIGxvbmcgKikmZmx1c2hfY3B1bWFzazsKKwkJdW5zaWduZWQgbG9uZyAqY3B1X21hc2sgPSAodW5zaWduZWQgbG9uZyAqKSZjcHVtYXNrOworCQlmb3IgKGsgPSAwOyBrIDwgQklUU19UT19MT05HUyhOUl9DUFVTKTsgKytrKQorCQkJYXRvbWljX3NldF9tYXNrKGNwdV9tYXNrW2tdLCAmZmx1c2hfbWFza1trXSk7CisJfQorI2VuZGlmCisJLyoKKwkgKiBXZSBoYXZlIHRvIHNlbmQgdGhlIElQSSBvbmx5IHRvCisJICogQ1BVcyBhZmZlY3RlZC4KKwkgKi8KKwlzZW5kX0lQSV9tYXNrKGNwdW1hc2ssIElOVkFMSURBVEVfVExCX1ZFQ1RPUik7CisKKwl3aGlsZSAoIWNwdXNfZW1wdHkoZmx1c2hfY3B1bWFzaykpCisJCS8qIG5vdGhpbmcuIGxvY2t1cCBkZXRlY3Rpb24gZG9lcyBub3QgYmVsb25nIGhlcmUgKi8KKwkJbWIoKTsKKworCWZsdXNoX21tID0gTlVMTDsKKwlmbHVzaF92YSA9IDA7CisJc3Bpbl91bmxvY2soJnRsYnN0YXRlX2xvY2spOworfQorCQordm9pZCBmbHVzaF90bGJfY3VycmVudF90YXNrKHZvaWQpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwljcHVtYXNrX3QgY3B1X21hc2s7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwljcHVfbWFzayA9IG1tLT5jcHVfdm1fbWFzazsKKwljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfbWFzayk7CisKKwlsb2NhbF9mbHVzaF90bGIoKTsKKwlpZiAoIWNwdXNfZW1wdHkoY3B1X21hc2spKQorCQlmbHVzaF90bGJfb3RoZXJzKGNwdV9tYXNrLCBtbSwgRkxVU0hfQUxMKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCit2b2lkIGZsdXNoX3RsYl9tbSAoc3RydWN0IG1tX3N0cnVjdCAqIG1tKQoreworCWNwdW1hc2tfdCBjcHVfbWFzazsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWNwdV9tYXNrID0gbW0tPmNwdV92bV9tYXNrOworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9tYXNrKTsKKworCWlmIChjdXJyZW50LT5hY3RpdmVfbW0gPT0gbW0pIHsKKwkJaWYgKGN1cnJlbnQtPm1tKQorCQkJbG9jYWxfZmx1c2hfdGxiKCk7CisJCWVsc2UKKwkJCWxlYXZlX21tKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJfQorCWlmICghY3B1c19lbXB0eShjcHVfbWFzaykpCisJCWZsdXNoX3RsYl9vdGhlcnMoY3B1X21hc2ssIG1tLCBGTFVTSF9BTEwpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKwordm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsIHVuc2lnbmVkIGxvbmcgdmEpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCWNwdW1hc2tfdCBjcHVfbWFzazsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWNwdV9tYXNrID0gbW0tPmNwdV92bV9tYXNrOworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9tYXNrKTsKKworCWlmIChjdXJyZW50LT5hY3RpdmVfbW0gPT0gbW0pIHsKKwkJaWYoY3VycmVudC0+bW0pCisJCQlfX2ZsdXNoX3RsYl9vbmUodmEpOworCQkgZWxzZQorCQkgCWxlYXZlX21tKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJfQorCisJaWYgKCFjcHVzX2VtcHR5KGNwdV9tYXNrKSkKKwkJZmx1c2hfdGxiX290aGVycyhjcHVfbWFzaywgbW0sIHZhKTsKKworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2ZsdXNoX3RsYl9hbGwodm9pZCogaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCV9fZmx1c2hfdGxiX2FsbCgpOworCWlmIChwZXJfY3B1KGNwdV90bGJzdGF0ZSwgY3B1KS5zdGF0ZSA9PSBUTEJTVEFURV9MQVpZKQorCQlsZWF2ZV9tbShjcHUpOworfQorCit2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCkKK3sKKwlvbl9lYWNoX2NwdShkb19mbHVzaF90bGJfYWxsLCBOVUxMLCAxLCAxKTsKK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gc2VuZHMgYSAncmVzY2hlZHVsZScgSVBJIHRvIGFub3RoZXIgQ1BVLgorICogaXQgZ29lcyBzdHJhaWdodCB0aHJvdWdoIGFuZCB3YXN0ZXMgbm8gdGltZSBzZXJpYWxpemluZworICogYW55dGhpbmcuIFdvcnN0IGNhc2UgaXMgdGhhdCB3ZSBsb3NlIGEgcmVzY2hlZHVsZSAuLi4KKyAqLwordm9pZCBzbXBfc2VuZF9yZXNjaGVkdWxlKGludCBjcHUpCit7CisJc2VuZF9JUElfbWFzayhjcHVtYXNrX29mX2NwdShjcHUpLCBSRVNDSEVEVUxFX1ZFQ1RPUik7Cit9CisKKy8qCisgKiBTdHJ1Y3R1cmUgYW5kIGRhdGEgZm9yIHNtcF9jYWxsX2Z1bmN0aW9uKCkuIFRoaXMgaXMgZGVzaWduZWQgdG8gbWluaW1pc2UKKyAqIHN0YXRpYyBtZW1vcnkgcmVxdWlyZW1lbnRzLiBJdCBhbHNvIGxvb2tzIGNsZWFuZXIuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2FsbF9sb2NrKTsKKworc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgeworCXZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyk7CisJdm9pZCAqaW5mbzsKKwlhdG9taWNfdCBzdGFydGVkOworCWF0b21pY190IGZpbmlzaGVkOworCWludCB3YWl0OworfTsKKworc3RhdGljIHN0cnVjdCBjYWxsX2RhdGFfc3RydWN0ICogY2FsbF9kYXRhOworCisvKgorICogdGhpcyBmdW5jdGlvbiBzZW5kcyBhICdnZW5lcmljIGNhbGwgZnVuY3Rpb24nIElQSSB0byBhbGwgb3RoZXIgQ1BVcworICogaW4gdGhlIHN5c3RlbS4KKyAqLworCitpbnQgc21wX2NhbGxfZnVuY3Rpb24gKHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sIGludCBub25hdG9taWMsCisJCQlpbnQgd2FpdCkKKy8qCisgKiBbU1VNTUFSWV0gUnVuIGEgZnVuY3Rpb24gb24gYWxsIG90aGVyIENQVXMuCisgKiA8ZnVuYz4gVGhlIGZ1bmN0aW9uIHRvIHJ1bi4gVGhpcyBtdXN0IGJlIGZhc3QgYW5kIG5vbi1ibG9ja2luZy4KKyAqIDxpbmZvPiBBbiBhcmJpdHJhcnkgcG9pbnRlciB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi4KKyAqIDxub25hdG9taWM+IGN1cnJlbnRseSB1bnVzZWQuCisgKiA8d2FpdD4gSWYgdHJ1ZSwgd2FpdCAoYXRvbWljYWxseSkgdW50aWwgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCBvbiBvdGhlciBDUFVzLgorICogW1JFVFVSTlNdIDAgb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIHN0YXR1cyBjb2RlLiBEb2VzIG5vdCByZXR1cm4gdW50aWwKKyAqIHJlbW90ZSBDUFVzIGFyZSBuZWFybHkgcmVhZHkgdG8gZXhlY3V0ZSA8PGZ1bmM+PiBvciBhcmUgb3IgaGF2ZSBleGVjdXRlZC4KKyAqCisgKiBZb3UgbXVzdCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cyBvciBmcm9tIGEKKyAqIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIG9yIGZyb20gYSBib3R0b20gaGFsZiBoYW5kbGVyLgorICovCit7CisJc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgZGF0YTsKKwlpbnQgY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpLTE7CisKKwlpZiAoIWNwdXMpCisJCXJldHVybiAwOworCisJLyogQ2FuIGRlYWRsb2NrIHdoZW4gY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLworCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKKworCWRhdGEuZnVuYyA9IGZ1bmM7CisJZGF0YS5pbmZvID0gaW5mbzsKKwlhdG9taWNfc2V0KCZkYXRhLnN0YXJ0ZWQsIDApOworCWRhdGEud2FpdCA9IHdhaXQ7CisJaWYgKHdhaXQpCisJCWF0b21pY19zZXQoJmRhdGEuZmluaXNoZWQsIDApOworCisJc3Bpbl9sb2NrKCZjYWxsX2xvY2spOworCWNhbGxfZGF0YSA9ICZkYXRhOworCW1iKCk7CisJCisJLyogU2VuZCBhIG1lc3NhZ2UgdG8gYWxsIG90aGVyIENQVXMgYW5kIHdhaXQgZm9yIHRoZW0gdG8gcmVzcG9uZCAqLworCXNlbmRfSVBJX2FsbGJ1dHNlbGYoQ0FMTF9GVU5DVElPTl9WRUNUT1IpOworCisJLyogV2FpdCBmb3IgcmVzcG9uc2UgKi8KKwl3aGlsZSAoYXRvbWljX3JlYWQoJmRhdGEuc3RhcnRlZCkgIT0gY3B1cykKKwkJY3B1X3JlbGF4KCk7CisKKwlpZiAod2FpdCkKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZkYXRhLmZpbmlzaGVkKSAhPSBjcHVzKQorCQkJY3B1X3JlbGF4KCk7CisJc3Bpbl91bmxvY2soJmNhbGxfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RvcF90aGlzX2NwdSAodm9pZCAqIGR1bW15KQoreworCS8qCisJICogUmVtb3ZlIHRoaXMgQ1BVOgorCSAqLworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWRpc2FibGVfbG9jYWxfQVBJQygpOworCWlmIChjcHVfZGF0YVtzbXBfcHJvY2Vzc29yX2lkKCldLmhsdF93b3Jrc19vaykKKwkJZm9yKDs7KSBfX2FzbV9fKCJobHQiKTsKKwlmb3IgKDs7KTsKK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlICdzdG9wJyBmdW5jdGlvbiBvbiBhbGwgb3RoZXIgQ1BVcyBpbiB0aGUgc3lzdGVtLgorICovCisKK3ZvaWQgc21wX3NlbmRfc3RvcCh2b2lkKQoreworCXNtcF9jYWxsX2Z1bmN0aW9uKHN0b3BfdGhpc19jcHUsIE5VTEwsIDEsIDApOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlkaXNhYmxlX2xvY2FsX0FQSUMoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKy8qCisgKiBSZXNjaGVkdWxlIGNhbGwgYmFjay4gTm90aGluZyB0byBkbywKKyAqIGFsbCB0aGUgd29yayBpcyBkb25lIGF1dG9tYXRpY2FsbHkgd2hlbgorICogd2UgcmV0dXJuIGZyb20gdGhlIGludGVycnVwdC4KKyAqLworZmFzdGNhbGwgdm9pZCBzbXBfcmVzY2hlZHVsZV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJYWNrX0FQSUNfaXJxKCk7Cit9CisKK2Zhc3RjYWxsIHZvaWQgc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbykgPSBjYWxsX2RhdGEtPmZ1bmM7CisJdm9pZCAqaW5mbyA9IGNhbGxfZGF0YS0+aW5mbzsKKwlpbnQgd2FpdCA9IGNhbGxfZGF0YS0+d2FpdDsKKworCWFja19BUElDX2lycSgpOworCS8qCisJICogTm90aWZ5IGluaXRpYXRpbmcgQ1BVIHRoYXQgSSd2ZSBncmFiYmVkIHRoZSBkYXRhIGFuZCBhbQorCSAqIGFib3V0IHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uCisJICovCisJbWIoKTsKKwlhdG9taWNfaW5jKCZjYWxsX2RhdGEtPnN0YXJ0ZWQpOworCS8qCisJICogQXQgdGhpcyBwb2ludCB0aGUgaW5mbyBzdHJ1Y3R1cmUgbWF5IGJlIG91dCBvZiBzY29wZSB1bmxlc3Mgd2FpdD09MQorCSAqLworCWlycV9lbnRlcigpOworCSgqZnVuYykoaW5mbyk7CisJaXJxX2V4aXQoKTsKKworCWlmICh3YWl0KSB7CisJCW1iKCk7CisJCWF0b21pY19pbmMoJmNhbGxfZGF0YS0+ZmluaXNoZWQpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzJlZTdhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKQEAgLTAsMCArMSwxMTQ1IEBACisvKgorICoJeDg2IFNNUCBib290aW5nIGZ1bmN0aW9ucworICoKKyAqCShjKSAxOTk1IEFsYW4gQ294LCBCdWlsZGluZyAjMyA8YWxhbkByZWRoYXQuY29tPgorICoJKGMpIDE5OTgsIDE5OTksIDIwMDAgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKgorICoJTXVjaCBvZiB0aGUgY29yZSBTTVAgd29yayBpcyBiYXNlZCBvbiBwcmV2aW91cyB3b3JrIGJ5IFRob21hcyBSYWRrZSwgdG8KKyAqCXdob20gYSBncmVhdCBtYW55IHRoYW5rcyBhcmUgZXh0ZW5kZWQuCisgKgorICoJVGhhbmtzIHRvIEludGVsIGZvciBtYWtpbmcgYXZhaWxhYmxlIHNldmVyYWwgZGlmZmVyZW50IFBlbnRpdW0sCisgKglQZW50aXVtIFBybyBhbmQgUGVudGl1bS1JSS9YZW9uIE1QIG1hY2hpbmVzLgorICoJT3JpZ2luYWwgZGV2ZWxvcG1lbnQgb2YgTGludXggU01QIGNvZGUgc3VwcG9ydGVkIGJ5IENhbGRlcmEuCisgKgorICoJVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb3IKKyAqCWxhdGVyLgorICoKKyAqCUZpeGVzCisgKgkJRmVsaXggS29vcAk6CU5SX0NQVVMgdXNlZCBwcm9wZXJseQorICoJCUpvc2UgUmVuYXUJOglIYW5kbGUgc2luZ2xlIENQVSBjYXNlLgorICoJCUFsYW4gQ294CToJQnkgcmVwZWF0ZWQgcmVxdWVzdCA4KSAtIFRvdGFsIEJvZ29NSVBTIHJlcG9ydC4KKyAqCQlHcmVnIFdyaWdodAk6CUZpeCBmb3Iga2VybmVsIHN0YWNrcyBwYW5pYy4KKyAqCQlFcmljaCBCb2xleW4JOglNUCB2MS40IGFuZCBhZGRpdGlvbmFsIGNoYW5nZXMuCisgKglNYXR0aGlhcyBTYXR0bGVyCToJQ2hhbmdlcyBmb3IgMi4xIGtlcm5lbCBtYXAuCisgKglNaWNoZWwgTGVzcGluYXNzZQk6CUNoYW5nZXMgZm9yIDIuMSBrZXJuZWwgbWFwLgorICoJTWljaGFlbCBDaGFzdGFpbgk6CUNoYW5nZSB0cmFtcG9saW5lLlMgdG8gZ251IGFzLgorICoJCUFsYW4gQ294CToJRHVtYiBidWc6ICdCJyBzdGVwIFBQcm8ncyBhcmUgZmluZQorICoJCUluZ28gTW9sbmFyCToJQWRkZWQgQVBJQyB0aW1lcnMsIGJhc2VkIG9uIGNvZGUKKyAqCQkJCQlmcm9tIEpvc2UgUmVuYXUKKyAqCQlJbmdvIE1vbG5hcgk6CXZhcmlvdXMgY2xlYW51cHMgYW5kIHJld3JpdGVzCisgKgkJVGlncmFuIEFpdmF6aWFuCToJZml4ZWQgIjAuMDAgaW4gL3Byb2MvdXB0aW1lIG9uIFNNUCIgYnVnLgorICoJTWFjaWVqIFcuIFJvenlja2kJOglCaXRzIGZvciBnZW51aW5lIDgyNDg5RFggQVBJQ3MKKyAqCQlNYXJ0aW4gSi4gQmxpZ2gJOiAJQWRkZWQgc3VwcG9ydCBmb3IgbXVsdGktcXVhZCBzeXN0ZW1zCisgKgkJRGF2ZSBKb25lcwk6CVJlcG9ydCBpbnZhbGlkIGNvbWJpbmF0aW9ucyBvZiBBdGhsb24gQ1BVcy4KKyoJCVJ1c3R5IFJ1c3NlbGwJOglIYWNrZWQgaW50byBzaGFwZSBmb3IgbmV3ICJob3RwbHVnIiBib290IHByb2Nlc3MuICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKyNpbmNsdWRlIDxtYWNoX3dha2VjcHUuaD4KKyNpbmNsdWRlIDxzbXBib290X2hvb2tzLmg+CisKKy8qIFNldCBpZiB3ZSBmaW5kIGEgQiBzdGVwcGluZyBDUFUgKi8KK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzbXBfYl9zdGVwcGluZzsKKworLyogTnVtYmVyIG9mIHNpYmxpbmdzIHBlciBDUFUgcGFja2FnZSAqLworaW50IHNtcF9udW1fc2libGluZ3MgPSAxOworaW50IHBoeXNfcHJvY19pZFtOUl9DUFVTXTsgLyogUGFja2FnZSBJRCBvZiBlYWNoIGxvZ2ljYWwgQ1BVICovCitFWFBPUlRfU1lNQk9MKHBoeXNfcHJvY19pZCk7CisKKy8qIGJpdG1hcCBvZiBvbmxpbmUgY3B1cyAqLworY3B1bWFza190IGNwdV9vbmxpbmVfbWFwOworCitjcHVtYXNrX3QgY3B1X2NhbGxpbl9tYXA7CitjcHVtYXNrX3QgY3B1X2NhbGxvdXRfbWFwOworc3RhdGljIGNwdW1hc2tfdCBzbXBfY29tbWVuY2VkX21hc2s7CisKKy8qIFBlciBDUFUgYm9nb21pcHMgYW5kIG90aGVyIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBjcHVpbmZvX3g4NiBjcHVfZGF0YVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworCit1OCB4ODZfY3B1X3RvX2FwaWNpZFtOUl9DUFVTXSA9CisJCQl7IFswIC4uLiBOUl9DUFVTLTFdID0gMHhmZiB9OworRVhQT1JUX1NZTUJPTCh4ODZfY3B1X3RvX2FwaWNpZCk7CisKKy8qCisgKiBUcmFtcG9saW5lIDgweDg2IHByb2dyYW0gYXMgYW4gYXJyYXkuCisgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdHJhbXBvbGluZV9kYXRhIFtdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdHJhbXBvbGluZV9lbmQgIFtdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnRyYW1wb2xpbmVfYmFzZTsKK3N0YXRpYyBpbnQgdHJhbXBvbGluZV9leGVjOworCitzdGF0aWMgdm9pZCBtYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKHZvaWQpOworCisvKgorICogQ3VycmVudGx5IHRyaXZpYWwuIFdyaXRlIHRoZSByZWFsLT5wcm90ZWN0ZWQgbW9kZQorICogYm9vdHN0cmFwIGludG8gdGhlIHBhZ2UgY29uY2VybmVkLiBUaGUgY2FsbGVyCisgKiBoYXMgbWFkZSBzdXJlIGl0J3Mgc3VpdGFibHkgYWxpZ25lZC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgc2V0dXBfdHJhbXBvbGluZSh2b2lkKQoreworCW1lbWNweSh0cmFtcG9saW5lX2Jhc2UsIHRyYW1wb2xpbmVfZGF0YSwgdHJhbXBvbGluZV9lbmQgLSB0cmFtcG9saW5lX2RhdGEpOworCXJldHVybiB2aXJ0X3RvX3BoeXModHJhbXBvbGluZV9iYXNlKTsKK30KKworLyoKKyAqIFdlIGFyZSBjYWxsZWQgdmVyeSBlYXJseSB0byBnZXQgdGhlIGxvdyBtZW1vcnkgZm9yIHRoZQorICogU01QIGJvb3R1cCB0cmFtcG9saW5lIHBhZ2UuCisgKi8KK3ZvaWQgX19pbml0IHNtcF9hbGxvY19tZW1vcnkodm9pZCkKK3sKKwl0cmFtcG9saW5lX2Jhc2UgPSAodm9pZCAqKSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhQQUdFX1NJWkUpOworCS8qCisJICogSGFzIHRvIGJlIGluIHZlcnkgbG93IG1lbW9yeSBzbyB3ZSBjYW4gZXhlY3V0ZQorCSAqIHJlYWwtbW9kZSBBUCBjb2RlLgorCSAqLworCWlmIChfX3BhKHRyYW1wb2xpbmVfYmFzZSkgPj0gMHg5RjAwMCkKKwkJQlVHKCk7CisJLyoKKwkgKiBNYWtlIHRoZSBTTVAgdHJhbXBvbGluZSBleGVjdXRhYmxlOgorCSAqLworCXRyYW1wb2xpbmVfZXhlYyA9IHNldF9rZXJuZWxfZXhlYygodW5zaWduZWQgbG9uZyl0cmFtcG9saW5lX2Jhc2UsIDEpOworfQorCisvKgorICogVGhlIGJvb3RzdHJhcCBrZXJuZWwgZW50cnkgY29kZSBoYXMgc2V0IHRoZXNlIHVwLiBTYXZlIHRoZW0gZm9yCisgKiBhIGdpdmVuIENQVQorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfc3RvcmVfY3B1X2luZm8oaW50IGlkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhICsgaWQ7CisKKwkqYyA9IGJvb3RfY3B1X2RhdGE7CisJaWYgKGlkIT0wKQorCQlpZGVudGlmeV9jcHUoYyk7CisJLyoKKwkgKiBNYXNrIEIsIFBlbnRpdW0sIGJ1dCBub3QgUGVudGl1bSBNTVgKKwkgKi8KKwlpZiAoYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMICYmCisJICAgIGMtPng4NiA9PSA1ICYmCisJICAgIGMtPng4Nl9tYXNrID49IDEgJiYgYy0+eDg2X21hc2sgPD0gNCAmJgorCSAgICBjLT54ODZfbW9kZWwgPD0gMykKKwkJLyoKKwkJICogUmVtZW1iZXIgd2UgaGF2ZSBCIHN0ZXAgUGVudGlhIHdpdGggYnVncworCQkgKi8KKwkJc21wX2Jfc3RlcHBpbmcgPSAxOworCisJLyoKKwkgKiBDZXJ0YWluIEF0aGxvbnMgbWlnaHQgd29yayAoZm9yIHZhcmlvdXMgdmFsdWVzIG9mICd3b3JrJykgaW4gU01QCisJICogYnV0IHRoZXkgYXJlIG5vdCBjZXJ0aWZpZWQgYXMgTVAgY2FwYWJsZS4KKwkgKi8KKwlpZiAoKGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpICYmIChjLT54ODYgPT0gNikpIHsKKworCQkvKiBBdGhsb24gNjYwLzY2MSBpcyB2YWxpZC4gKi8JCisJCWlmICgoYy0+eDg2X21vZGVsPT02KSAmJiAoKGMtPng4Nl9tYXNrPT0wKSB8fCAoYy0+eDg2X21hc2s9PTEpKSkKKwkJCWdvdG8gdmFsaWRfazc7CisKKwkJLyogRHVyb24gNjcwIGlzIHZhbGlkICovCisJCWlmICgoYy0+eDg2X21vZGVsPT03KSAmJiAoYy0+eDg2X21hc2s9PTApKQorCQkJZ290byB2YWxpZF9rNzsKKworCQkvKgorCQkgKiBBdGhsb24gNjYyLCBEdXJvbiA2NzEsIGFuZCBBdGhsb24gPm1vZGVsIDcgaGF2ZSBjYXBhYmlsaXR5IGJpdC4KKwkJICogSXQncyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgQTUgc3RlcHBpbmcgKDY2Mikgb2Ygc29tZSBBdGhsb24gWFAncworCQkgKiBoYXZlIHRoZSBNUCBiaXQgc2V0LgorCQkgKiBTZWUgaHR0cDovL3d3dy5oZWlzZS5kZS9uZXdzdGlja2VyL2RhdGEvam93LTE4LjEwLjAxLTAwMCBmb3IgbW9yZS4KKwkJICovCisJCWlmICgoKGMtPng4Nl9tb2RlbD09NikgJiYgKGMtPng4Nl9tYXNrPj0yKSkgfHwKKwkJICAgICgoYy0+eDg2X21vZGVsPT03KSAmJiAoYy0+eDg2X21hc2s+PTEpKSB8fAorCQkgICAgIChjLT54ODZfbW9kZWw+IDcpKQorCQkJaWYgKGNwdV9oYXNfbXApCisJCQkJZ290byB2YWxpZF9rNzsKKworCQkvKiBJZiB3ZSBnZXQgaGVyZSwgaXQncyBub3QgYSBjZXJ0aWZpZWQgU01QIGNhcGFibGUgQU1EIHN5c3RlbS4gKi8KKwkJdGFpbnRlZCB8PSBUQUlOVF9VTlNBRkVfU01QOworCX0KKwordmFsaWRfazc6CisJOworfQorCisvKgorICogVFNDIHN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBXZSBmaXJzdCBjaGVjayB3aGV0aGVyIGFsbCBDUFVzIGhhdmUgdGhlaXIgVFNDJ3Mgc3luY2hyb25pemVkLAorICogdGhlbiB3ZSBwcmludCBhIHdhcm5pbmcgaWYgbm90LCBhbmQgYWx3YXlzIHJlc3luYy4KKyAqLworCitzdGF0aWMgYXRvbWljX3QgdHNjX3N0YXJ0X2ZsYWcgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBhdG9taWNfdCB0c2NfY291bnRfc3RhcnQgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBhdG9taWNfdCB0c2NfY291bnRfc3RvcCA9IEFUT01JQ19JTklUKDApOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0c2NfdmFsdWVzW05SX0NQVVNdOworCisjZGVmaW5lIE5SX0xPT1BTIDUKKworc3RhdGljIHZvaWQgX19pbml0IHN5bmNocm9uaXplX3RzY19icCAodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdDA7CisJdW5zaWduZWQgbG9uZyBsb25nIHN1bSwgYXZnOworCWxvbmcgbG9uZyBkZWx0YTsKKwl1bnNpZ25lZCBsb25nIG9uZV91c2VjOworCWludCBidWdneSA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJjaGVja2luZyBUU0Mgc3luY2hyb25pemF0aW9uIGFjcm9zcyAldSBDUFVzOiAiLCBudW1fYm9vdGluZ19jcHVzKCkpOworCisJLyogY29udmVydCBmcm9tIGtjeWMvc2VjIHRvIGN5Yy91c2VjICovCisJb25lX3VzZWMgPSBjcHVfa2h6IC8gMTAwMDsKKworCWF0b21pY19zZXQoJnRzY19zdGFydF9mbGFnLCAxKTsKKwl3bWIoKTsKKworCS8qCisJICogV2UgbG9vcCBhIGZldyB0aW1lcyB0byBnZXQgYSBwcmltZWQgaW5zdHJ1Y3Rpb24gY2FjaGUsCisJICogdGhlbiB0aGUgbGFzdCBwYXNzIGlzIG1vcmUgb3IgbGVzcyBzeW5jaHJvbml6ZWQgYW5kCisJICogdGhlIEJQIGFuZCBBUHMgc2V0IHRoZWlyIGN5Y2xlIGNvdW50ZXJzIHRvIHplcm8gYWxsIGF0CisJICogb25jZS4gVGhpcyByZWR1Y2VzIHRoZSBjaGFuY2Ugb2YgaGF2aW5nIHJhbmRvbSBvZmZzZXRzCisJICogYmV0d2VlbiB0aGUgcHJvY2Vzc29ycywgYW5kIGd1YXJhbnRlZXMgdGhhdCB0aGUgbWF4aW11bQorCSAqIGRlbGF5IGJldHdlZW4gdGhlIGN5Y2xlIGNvdW50ZXJzIGlzIG5ldmVyIGJpZ2dlciB0aGFuCisJICogdGhlIGxhdGVuY3kgb2YgaW5mb3JtYXRpb24tcGFzc2luZyAoY2FjaGVsaW5lcykgYmV0d2VlbgorCSAqIHR3byBDUFVzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9MT09QUzsgaSsrKSB7CisJCS8qCisJCSAqIGFsbCBBUHMgc3luY2hyb25pemUgYnV0IHRoZXkgbG9vcCBvbiAnPT0gbnVtX2NwdXMnCisJCSAqLworCQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzY19jb3VudF9zdGFydCkgIT0gbnVtX2Jvb3RpbmdfY3B1cygpLTEpCisJCQltYigpOworCQlhdG9taWNfc2V0KCZ0c2NfY291bnRfc3RvcCwgMCk7CisJCXdtYigpOworCQkvKgorCQkgKiB0aGlzIGxldHMgdGhlIEFQcyBzYXZlIHRoZWlyIGN1cnJlbnQgVFNDOgorCQkgKi8KKwkJYXRvbWljX2luYygmdHNjX2NvdW50X3N0YXJ0KTsKKworCQlyZHRzY2xsKHRzY192YWx1ZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXSk7CisJCS8qCisJCSAqIFdlIGNsZWFyIHRoZSBUU0MgaW4gdGhlIGxhc3QgbG9vcDoKKwkJICovCisJCWlmIChpID09IE5SX0xPT1BTLTEpCisJCQl3cml0ZV90c2MoMCwgMCk7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgYWxsIEFQcyB0byBsZWF2ZSB0aGUgc3luY2hyb25pemF0aW9uIHBvaW50OgorCQkgKi8KKwkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2NfY291bnRfc3RvcCkgIT0gbnVtX2Jvb3RpbmdfY3B1cygpLTEpCisJCQltYigpOworCQlhdG9taWNfc2V0KCZ0c2NfY291bnRfc3RhcnQsIDApOworCQl3bWIoKTsKKwkJYXRvbWljX2luYygmdHNjX2NvdW50X3N0b3ApOworCX0KKworCXN1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoY3B1X2lzc2V0KGksIGNwdV9jYWxsb3V0X21hcCkpIHsKKwkJCXQwID0gdHNjX3ZhbHVlc1tpXTsKKwkJCXN1bSArPSB0MDsKKwkJfQorCX0KKwlhdmcgPSBzdW07CisJZG9fZGl2KGF2ZywgbnVtX2Jvb3RpbmdfY3B1cygpKTsKKworCXN1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoIWNwdV9pc3NldChpLCBjcHVfY2FsbG91dF9tYXApKQorCQkJY29udGludWU7CisJCWRlbHRhID0gdHNjX3ZhbHVlc1tpXSAtIGF2ZzsKKwkJaWYgKGRlbHRhIDwgMCkKKwkJCWRlbHRhID0gLWRlbHRhOworCQkvKgorCQkgKiBXZSByZXBvcnQgYmlnZ2VyIHRoYW4gMiBtaWNyb3NlY29uZHMgY2xvY2sgZGlmZmVyZW5jZXMuCisJCSAqLworCQlpZiAoZGVsdGEgPiAyKm9uZV91c2VjKSB7CisJCQlsb25nIHJlYWxkZWx0YTsKKwkJCWlmICghYnVnZ3kpIHsKKwkJCQlidWdneSA9IDE7CisJCQkJcHJpbnRrKCJcbiIpOworCQkJfQorCQkJcmVhbGRlbHRhID0gZGVsdGE7CisJCQlkb19kaXYocmVhbGRlbHRhLCBvbmVfdXNlYyk7CisJCQlpZiAodHNjX3ZhbHVlc1tpXSA8IGF2ZykKKwkJCQlyZWFsZGVsdGEgPSAtcmVhbGRlbHRhOworCisJCQlwcmludGsoS0VSTl9JTkZPICJDUFUjJWQgaGFkICVsZCB1c2VjcyBUU0Mgc2tldywgZml4ZWQgaXQgdXAuXG4iLCBpLCByZWFsZGVsdGEpOworCQl9CisKKwkJc3VtICs9IGRlbHRhOworCX0KKwlpZiAoIWJ1Z2d5KQorCQlwcmludGsoInBhc3NlZC5cbiIpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc3luY2hyb25pemVfdHNjX2FwICh2b2lkKQoreworCWludCBpOworCisJLyoKKwkgKiBOb3QgZXZlcnkgY3B1IGlzIG9ubGluZSBhdCB0aGUgdGltZQorCSAqIHRoaXMgZ2V0cyBjYWxsZWQsIHNvIHdlIGZpcnN0IHdhaXQgZm9yIHRoZSBCUCB0bworCSAqIGZpbmlzaCBTTVAgaW5pdGlhbGl6YXRpb246CisJICovCisJd2hpbGUgKCFhdG9taWNfcmVhZCgmdHNjX3N0YXJ0X2ZsYWcpKSBtYigpOworCisJZm9yIChpID0gMDsgaSA8IE5SX0xPT1BTOyBpKyspIHsKKwkJYXRvbWljX2luYygmdHNjX2NvdW50X3N0YXJ0KTsKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2NfY291bnRfc3RhcnQpICE9IG51bV9ib290aW5nX2NwdXMoKSkKKwkJCW1iKCk7CisKKwkJcmR0c2NsbCh0c2NfdmFsdWVzW3NtcF9wcm9jZXNzb3JfaWQoKV0pOworCQlpZiAoaSA9PSBOUl9MT09QUy0xKQorCQkJd3JpdGVfdHNjKDAsIDApOworCisJCWF0b21pY19pbmMoJnRzY19jb3VudF9zdG9wKTsKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2NfY291bnRfc3RvcCkgIT0gbnVtX2Jvb3RpbmdfY3B1cygpKSBtYigpOworCX0KK30KKyN1bmRlZiBOUl9MT09QUworCitleHRlcm4gdm9pZCBjYWxpYnJhdGVfZGVsYXkodm9pZCk7CisKK3N0YXRpYyBhdG9taWNfdCBpbml0X2RlYXNzZXJ0ZWQ7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfY2FsbGluKHZvaWQpCit7CisJaW50IGNwdWlkLCBwaHlzX2lkOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCS8qCisJICogSWYgd2FrZW4gdXAgYnkgYW4gSU5JVCBpbiBhbiA4MjQ4OURYIGNvbmZpZ3VyYXRpb24KKwkgKiB3ZSBtYXkgZ2V0IGhlcmUgYmVmb3JlIGFuIElOSVQtZGVhc3NlcnQgSVBJIHJlYWNoZXMKKwkgKiBvdXIgbG9jYWwgQVBJQy4gIFdlIGhhdmUgdG8gd2FpdCBmb3IgdGhlIElQSSBvciB3ZSdsbAorCSAqIGxvY2sgdXAgb24gYW4gQVBJQyBhY2Nlc3MuCisJICovCisJd2FpdF9mb3JfaW5pdF9kZWFzc2VydCgmaW5pdF9kZWFzc2VydGVkKTsKKworCS8qCisJICogKFRoaXMgd29ya3MgZXZlbiBpZiB0aGUgQVBJQyBpcyBub3QgZW5hYmxlZC4pCisJICovCisJcGh5c19pZCA9IEdFVF9BUElDX0lEKGFwaWNfcmVhZChBUElDX0lEKSk7CisJY3B1aWQgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaWYgKGNwdV9pc3NldChjcHVpZCwgY3B1X2NhbGxpbl9tYXApKSB7CisJCXByaW50aygiaHVoLCBwaHlzIENQVSMlZCwgQ1BVIyVkIGFscmVhZHkgcHJlc2VudD8/XG4iLAorCQkJCQlwaHlzX2lkLCBjcHVpZCk7CisJCUJVRygpOworCX0KKwlEcHJpbnRrKCJDUFUjJWQgKHBoeXMgSUQ6ICVkKSB3YWl0aW5nIGZvciBDQUxMT1VUXG4iLCBjcHVpZCwgcGh5c19pZCk7CisKKwkvKgorCSAqIFNUQVJUVVAgSVBJcyBhcmUgZnJhZ2lsZSBiZWFzdHMgYXMgdGhleSBtaWdodCBzb21ldGltZXMKKwkgKiB0cmlnZ2VyIHNvbWUgZ2x1ZSBtb3RoZXJib2FyZCBsb2dpYy4gQ29tcGxldGUgQVBJQyBidXMKKwkgKiBzaWxlbmNlIGZvciAxIHNlY29uZCwgdGhpcyBvdmVyZXN0aW1hdGVzIHRoZSB0aW1lIHRoZQorCSAqIGJvb3QgQ1BVIGlzIHNwZW5kaW5nIHRvIHNlbmQgdGhlIHVwIHRvIDIgU1RBUlRVUCBJUElzCisJICogYnkgYSBmYWN0b3Igb2YgdHdvLiBUaGlzIHNob3VsZCBiZSBlbm91Z2guCisJICovCisKKwkvKgorCSAqIFdhaXRpbmcgMnMgdG90YWwgZm9yIHN0YXJ0dXAgKHVkZWxheSBpcyBub3QgeWV0IHdvcmtpbmcpCisJICovCisJdGltZW91dCA9IGppZmZpZXMgKyAyKkhaOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkvKgorCQkgKiBIYXMgdGhlIGJvb3QgQ1BVIGZpbmlzaGVkIGl0J3MgU1RBUlRVUCBzZXF1ZW5jZT8KKwkJICovCisJCWlmIChjcHVfaXNzZXQoY3B1aWQsIGNwdV9jYWxsb3V0X21hcCkpCisJCQlicmVhazsKKwkJcmVwX25vcCgpOworCX0KKworCWlmICghdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJcHJpbnRrKCJCVUc6IENQVSVkIHN0YXJ0ZWQgdXAgYnV0IGRpZCBub3QgZ2V0IGEgY2FsbG91dCFcbiIsCisJCQljcHVpZCk7CisJCUJVRygpOworCX0KKworCS8qCisJICogdGhlIGJvb3QgQ1BVIGhhcyBmaW5pc2hlZCB0aGUgaW5pdCBzdGFnZSBhbmQgaXMgc3Bpbm5pbmcKKwkgKiBvbiBjYWxsaW5fbWFwIHVudGlsIHdlIGZpbmlzaC4gV2UgYXJlIGZyZWUgdG8gc2V0IHVwIHRoaXMKKwkgKiBDUFUsIGZpcnN0IHRoZSBBUElDLiAodGhpcyBpcyBwcm9iYWJseSByZWR1bmRhbnQgb24gbW9zdAorCSAqIGJvYXJkcykKKwkgKi8KKworCURwcmludGsoIkNBTExJTiwgYmVmb3JlIHNldHVwX2xvY2FsX0FQSUMoKS5cbiIpOworCXNtcF9jYWxsaW5fY2xlYXJfbG9jYWxfYXBpYygpOworCXNldHVwX2xvY2FsX0FQSUMoKTsKKwltYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKCk7CisKKwkvKgorCSAqIEdldCBvdXIgYm9nb21pcHMuCisJICovCisJY2FsaWJyYXRlX2RlbGF5KCk7CisJRHByaW50aygiU3RhY2sgYXQgYWJvdXQgJXBcbiIsJmNwdWlkKTsKKworCS8qCisJICogU2F2ZSBvdXIgcHJvY2Vzc29yIHBhcmFtZXRlcnMKKwkgKi8KKyAJc21wX3N0b3JlX2NwdV9pbmZvKGNwdWlkKTsKKworCWRpc2FibGVfQVBJQ190aW1lcigpOworCisJLyoKKwkgKiBBbGxvdyB0aGUgbWFzdGVyIHRvIGNvbnRpbnVlLgorCSAqLworCWNwdV9zZXQoY3B1aWQsIGNwdV9jYWxsaW5fbWFwKTsKKworCS8qCisJICogICAgICBTeW5jaHJvbml6ZSB0aGUgVFNDIHdpdGggdGhlIEJQCisJICovCisJaWYgKGNwdV9oYXNfdHNjICYmIGNwdV9raHopCisJCXN5bmNocm9uaXplX3RzY19hcCgpOworfQorCitzdGF0aWMgaW50IGNwdWNvdW50OworCisvKgorICogQWN0aXZhdGUgYSBzZWNvbmRhcnkgcHJvY2Vzc29yLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc3RhcnRfc2Vjb25kYXJ5KHZvaWQgKnVudXNlZCkKK3sKKwkvKgorCSAqIERvbnQgcHV0IGFueXRoaW5nIGJlZm9yZSBzbXBfY2FsbGluKCksIFNNUAorCSAqIGJvb3RpbmcgaXMgdG9vIGZyYWdpbGUgdGhhdCB3ZSB3YW50IHRvIGxpbWl0IHRoZQorCSAqIHRoaW5ncyBkb25lIGhlcmUgdG8gdGhlIG1vc3QgbmVjZXNzYXJ5IHRoaW5ncy4KKwkgKi8KKwljcHVfaW5pdCgpOworCXNtcF9jYWxsaW4oKTsKKwl3aGlsZSAoIWNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIHNtcF9jb21tZW5jZWRfbWFzaykpCisJCXJlcF9ub3AoKTsKKwlzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jaygpOworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKKwkJZGlzYWJsZV84MjU5QV9pcnEoMCk7CisJCWVuYWJsZV9OTUlfdGhyb3VnaF9MVlQwKE5VTEwpOworCQllbmFibGVfODI1OUFfaXJxKDApOworCX0KKwllbmFibGVfQVBJQ190aW1lcigpOworCS8qCisJICogbG93LW1lbW9yeSBtYXBwaW5ncyBoYXZlIGJlZW4gY2xlYXJlZCwgZmx1c2ggdGhlbSBmcm9tCisJICogdGhlIGxvY2FsIFRMQnMgdG9vLgorCSAqLworCWxvY2FsX2ZsdXNoX3RsYigpOworCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CisKKwkvKiBXZSBjYW4gdGFrZSBpbnRlcnJ1cHRzIG5vdzogd2UncmUgb2ZmaWNpYWxseSAidXAiLiAqLworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXdtYigpOworCWNwdV9pZGxlKCk7Cit9CisKKy8qCisgKiBFdmVyeXRoaW5nIGhhcyBiZWVuIHNldCB1cCBmb3IgdGhlIHNlY29uZGFyeQorICogQ1BVcyAtIHRoZXkganVzdCBuZWVkIHRvIHJlbG9hZCBldmVyeXRoaW5nCisgKiBmcm9tIHRoZSB0YXNrIHN0cnVjdHVyZQorICogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCByZXR1cm4uCisgKi8KK3ZvaWQgX19pbml0IGluaXRpYWxpemVfc2Vjb25kYXJ5KHZvaWQpCit7CisJLyoKKwkgKiBXZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGxvYWQgdGhlIGZ1bGwgVFNTLAorCSAqIGJhc2ljYWxseSBqdXN0IHRoZSBzdGFjayBwb2ludGVyIGFuZCB0aGUgZWlwLgorCSAqLworCisJYXNtIHZvbGF0aWxlKAorCQkibW92bCAlMCwlJWVzcFxuXHQiCisJCSJqbXAgKiUxIgorCQk6CisJCToiciIgKGN1cnJlbnQtPnRocmVhZC5lc3ApLCJyIiAoY3VycmVudC0+dGhyZWFkLmVpcCkpOworfQorCitleHRlcm4gc3RydWN0IHsKKwl2b2lkICogZXNwOworCXVuc2lnbmVkIHNob3J0IHNzOworfSBzdGFja19zdGFydDsKKworI2lmZGVmIENPTkZJR19OVU1BCisKKy8qIHdoaWNoIGxvZ2ljYWwgQ1BVcyBhcmUgb24gd2hpY2ggbm9kZXMgKi8KK2NwdW1hc2tfdCBub2RlXzJfY3B1X21hc2tbTUFYX05VTU5PREVTXSA9CisJCQkJeyBbMCAuLi4gTUFYX05VTU5PREVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OworLyogd2hpY2ggbm9kZSBlYWNoIGxvZ2ljYWwgQ1BVIGlzIG9uICovCitpbnQgY3B1XzJfbm9kZVtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSAwIH07CitFWFBPUlRfU1lNQk9MKGNwdV8yX25vZGUpOworCisvKiBzZXQgdXAgYSBtYXBwaW5nIGJldHdlZW4gY3B1IGFuZCBub2RlLiAqLworc3RhdGljIGlubGluZSB2b2lkIG1hcF9jcHVfdG9fbm9kZShpbnQgY3B1LCBpbnQgbm9kZSkKK3sKKwlwcmludGsoIk1hcHBpbmcgY3B1ICVkIHRvIG5vZGUgJWRcbiIsIGNwdSwgbm9kZSk7CisJY3B1X3NldChjcHUsIG5vZGVfMl9jcHVfbWFza1tub2RlXSk7CisJY3B1XzJfbm9kZVtjcHVdID0gbm9kZTsKK30KKworLyogdW5kbyBhIG1hcHBpbmcgYmV0d2VlbiBjcHUgYW5kIG5vZGUuICovCitzdGF0aWMgaW5saW5lIHZvaWQgdW5tYXBfY3B1X3RvX25vZGUoaW50IGNwdSkKK3sKKwlpbnQgbm9kZTsKKworCXByaW50aygiVW5tYXBwaW5nIGNwdSAlZCBmcm9tIGFsbCBub2Rlc1xuIiwgY3B1KTsKKwlmb3IgKG5vZGUgPSAwOyBub2RlIDwgTUFYX05VTU5PREVTOyBub2RlICsrKQorCQljcHVfY2xlYXIoY3B1LCBub2RlXzJfY3B1X21hc2tbbm9kZV0pOworCWNwdV8yX25vZGVbY3B1XSA9IDA7Cit9CisjZWxzZSAvKiAhQ09ORklHX05VTUEgKi8KKworI2RlZmluZSBtYXBfY3B1X3RvX25vZGUoY3B1LCBub2RlKQkoe30pCisjZGVmaW5lIHVubWFwX2NwdV90b19ub2RlKGNwdSkJKHt9KQorCisjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KKwordTggY3B1XzJfbG9naWNhbF9hcGljaWRbTlJfQ1BVU10gPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRCB9OworCitzdGF0aWMgdm9pZCBtYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpbnQgYXBpY2lkID0gbG9naWNhbF9zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwljcHVfMl9sb2dpY2FsX2FwaWNpZFtjcHVdID0gYXBpY2lkOworCW1hcF9jcHVfdG9fbm9kZShjcHUsIGFwaWNpZF90b19ub2RlKGFwaWNpZCkpOworfQorCitzdGF0aWMgdm9pZCB1bm1hcF9jcHVfdG9fbG9naWNhbF9hcGljaWQoaW50IGNwdSkKK3sKKwljcHVfMl9sb2dpY2FsX2FwaWNpZFtjcHVdID0gQkFEX0FQSUNJRDsKKwl1bm1hcF9jcHVfdG9fbm9kZShjcHUpOworfQorCisjaWYgQVBJQ19ERUJVRworc3RhdGljIGlubGluZSB2b2lkIF9faW5xdWlyZV9yZW1vdGVfYXBpYyhpbnQgYXBpY2lkKQoreworCWludCBpLCByZWdzW10gPSB7IEFQSUNfSUQgPj4gNCwgQVBJQ19MVlIgPj4gNCwgQVBJQ19TUElWID4+IDQgfTsKKwljaGFyICpuYW1lc1tdID0geyAiSUQiLCAiVkVSU0lPTiIsICJTUElWIiB9OworCWludCB0aW1lb3V0LCBzdGF0dXM7CisKKwlwcmludGsoIklucXVpcmluZyByZW1vdGUgQVBJQyAjJWQuLi5cbiIsIGFwaWNpZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHJlZ3MpIC8gc2l6ZW9mKCpyZWdzKTsgaSsrKSB7CisJCXByaW50aygiLi4uIEFQSUMgIyVkICVzOiAiLCBhcGljaWQsIG5hbWVzW2ldKTsKKworCQkvKgorCQkgKiBXYWl0IGZvciBpZGxlLgorCQkgKi8KKwkJYXBpY193YWl0X2ljcl9pZGxlKCk7CisKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IyLCBTRVRfQVBJQ19ERVNUX0ZJRUxEKGFwaWNpZCkpOworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgQVBJQ19ETV9SRU1SRCB8IHJlZ3NbaV0pOworCisJCXRpbWVvdXQgPSAwOworCQlkbyB7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCXN0YXR1cyA9IGFwaWNfcmVhZChBUElDX0lDUikgJiBBUElDX0lDUl9SUl9NQVNLOworCQl9IHdoaWxlIChzdGF0dXMgPT0gQVBJQ19JQ1JfUlJfSU5QUk9HICYmIHRpbWVvdXQrKyA8IDEwMDApOworCisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgQVBJQ19JQ1JfUlJfVkFMSUQ6CisJCQlzdGF0dXMgPSBhcGljX3JlYWQoQVBJQ19SUlIpOworCQkJcHJpbnRrKCIlMDh4XG4iLCBzdGF0dXMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoImZhaWxlZFxuIik7CisJCX0KKwl9Cit9CisjZW5kaWYKKworI2lmZGVmIFdBS0VfU0VDT05EQVJZX1ZJQV9OTUkKKy8qIAorICogUG9rZSB0aGUgb3RoZXIgQ1BVIGluIHRoZSBleWUgdmlhIE5NSSB0byB3YWtlIGl0IHVwLiBSZW1lbWJlciB0aGF0IHRoZSBub3JtYWwKKyAqIElOSVQsIElOSVQsIFNUQVJUVVAgc2VxdWVuY2Ugd2lsbCByZXNldCB0aGUgY2hpcCBoYXJkIGZvciB1cywgYW5kIHRoaXMKKyAqIHdvbid0IC4uLiByZW1lbWJlciB0byBjbGVhciBkb3duIHRoZSBBUElDLCBldGMgbGF0ZXIuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0Cit3YWtldXBfc2Vjb25kYXJ5X2NwdShpbnQgbG9naWNhbF9hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfZWlwKQoreworCXVuc2lnbmVkIGxvbmcgc2VuZF9zdGF0dXMgPSAwLCBhY2NlcHRfc3RhdHVzID0gMDsKKwlpbnQgdGltZW91dCwgbWF4bHZ0OworCisJLyogVGFyZ2V0IGNoaXAgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUjIsIFNFVF9BUElDX0RFU1RfRklFTEQobG9naWNhbF9hcGljaWQpKTsKKworCS8qIEJvb3Qgb24gdGhlIHN0YWNrICovCisJLyogS2ljayB0aGUgc2Vjb25kICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IsIEFQSUNfRE1fTk1JIHwgQVBJQ19ERVNUX0xPR0lDQUwpOworCisJRHByaW50aygiV2FpdGluZyBmb3Igc2VuZCB0byBmaW5pc2guLi5cbiIpOworCXRpbWVvdXQgPSAwOworCWRvIHsKKwkJRHByaW50aygiKyIpOworCQl1ZGVsYXkoMTAwKTsKKwkJc2VuZF9zdGF0dXMgPSBhcGljX3JlYWQoQVBJQ19JQ1IpICYgQVBJQ19JQ1JfQlVTWTsKKwl9IHdoaWxlIChzZW5kX3N0YXR1cyAmJiAodGltZW91dCsrIDwgMTAwMCkpOworCisJLyoKKwkgKiBHaXZlIHRoZSBvdGhlciBDUFUgc29tZSB0aW1lIHRvIGFjY2VwdCB0aGUgSVBJLgorCSAqLworCXVkZWxheSgyMDApOworCS8qCisJICogRHVlIHRvIHRoZSBQZW50aXVtIGVycmF0dW0gM0FQLgorCSAqLworCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKwlpZiAobWF4bHZ0ID4gMykgeworCQlhcGljX3JlYWRfYXJvdW5kKEFQSUNfU1BJVik7CisJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCX0KKwlhY2NlcHRfc3RhdHVzID0gKGFwaWNfcmVhZChBUElDX0VTUikgJiAweEVGKTsKKwlEcHJpbnRrKCJOTUkgc2VudC5cbiIpOworCisJaWYgKHNlbmRfc3RhdHVzKQorCQlwcmludGsoIkFQSUMgbmV2ZXIgZGVsaXZlcmVkPz8/XG4iKTsKKwlpZiAoYWNjZXB0X3N0YXR1cykKKwkJcHJpbnRrKCJBUElDIGRlbGl2ZXJ5IGVycm9yICglbHgpLlxuIiwgYWNjZXB0X3N0YXR1cyk7CisKKwlyZXR1cm4gKHNlbmRfc3RhdHVzIHwgYWNjZXB0X3N0YXR1cyk7Cit9CisjZW5kaWYJLyogV0FLRV9TRUNPTkRBUllfVklBX05NSSAqLworCisjaWZkZWYgV0FLRV9TRUNPTkRBUllfVklBX0lOSVQKK3N0YXRpYyBpbnQgX19pbml0Cit3YWtldXBfc2Vjb25kYXJ5X2NwdShpbnQgcGh5c19hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfZWlwKQoreworCXVuc2lnbmVkIGxvbmcgc2VuZF9zdGF0dXMgPSAwLCBhY2NlcHRfc3RhdHVzID0gMDsKKwlpbnQgbWF4bHZ0LCB0aW1lb3V0LCBudW1fc3RhcnRzLCBqOworCisJLyoKKwkgKiBCZSBwYXJhbm9pZCBhYm91dCBjbGVhcmluZyBBUElDIGVycm9ycy4KKwkgKi8KKwlpZiAoQVBJQ19JTlRFR1JBVEVEKGFwaWNfdmVyc2lvbltwaHlzX2FwaWNpZF0pKSB7CisJCWFwaWNfcmVhZF9hcm91bmQoQVBJQ19TUElWKTsKKwkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCWFwaWNfcmVhZChBUElDX0VTUik7CisJfQorCisJRHByaW50aygiQXNzZXJ0aW5nIElOSVQuXG4iKTsKKworCS8qCisJICogVHVybiBJTklUIG9uIHRhcmdldCBjaGlwCisJICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IyLCBTRVRfQVBJQ19ERVNUX0ZJRUxEKHBoeXNfYXBpY2lkKSk7CisKKwkvKgorCSAqIFNlbmQgSVBJCisJICovCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19JQ1IsIEFQSUNfSU5UX0xFVkVMVFJJRyB8IEFQSUNfSU5UX0FTU0VSVAorCQkJCXwgQVBJQ19ETV9JTklUKTsKKworCURwcmludGsoIldhaXRpbmcgZm9yIHNlbmQgdG8gZmluaXNoLi4uXG4iKTsKKwl0aW1lb3V0ID0gMDsKKwlkbyB7CisJCURwcmludGsoIisiKTsKKwkJdWRlbGF5KDEwMCk7CisJCXNlbmRfc3RhdHVzID0gYXBpY19yZWFkKEFQSUNfSUNSKSAmIEFQSUNfSUNSX0JVU1k7CisJfSB3aGlsZSAoc2VuZF9zdGF0dXMgJiYgKHRpbWVvdXQrKyA8IDEwMDApKTsKKworCW1kZWxheSgxMCk7CisKKwlEcHJpbnRrKCJEZWFzc2VydGluZyBJTklULlxuIik7CisKKwkvKiBUYXJnZXQgY2hpcCAqLworCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSMiwgU0VUX0FQSUNfREVTVF9GSUVMRChwaHlzX2FwaWNpZCkpOworCisJLyogU2VuZCBJUEkgKi8KKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgQVBJQ19JTlRfTEVWRUxUUklHIHwgQVBJQ19ETV9JTklUKTsKKworCURwcmludGsoIldhaXRpbmcgZm9yIHNlbmQgdG8gZmluaXNoLi4uXG4iKTsKKwl0aW1lb3V0ID0gMDsKKwlkbyB7CisJCURwcmludGsoIisiKTsKKwkJdWRlbGF5KDEwMCk7CisJCXNlbmRfc3RhdHVzID0gYXBpY19yZWFkKEFQSUNfSUNSKSAmIEFQSUNfSUNSX0JVU1k7CisJfSB3aGlsZSAoc2VuZF9zdGF0dXMgJiYgKHRpbWVvdXQrKyA8IDEwMDApKTsKKworCWF0b21pY19zZXQoJmluaXRfZGVhc3NlcnRlZCwgMSk7CisKKwkvKgorCSAqIFNob3VsZCB3ZSBzZW5kIFNUQVJUVVAgSVBJcyA/CisJICoKKwkgKiBEZXRlcm1pbmUgdGhpcyBiYXNlZCBvbiB0aGUgQVBJQyB2ZXJzaW9uLgorCSAqIElmIHdlIGRvbid0IGhhdmUgYW4gaW50ZWdyYXRlZCBBUElDLCBkb24ndCBzZW5kIHRoZSBTVEFSVFVQIElQSXMuCisJICovCisJaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bcGh5c19hcGljaWRdKSkKKwkJbnVtX3N0YXJ0cyA9IDI7CisJZWxzZQorCQludW1fc3RhcnRzID0gMDsKKworCS8qCisJICogUnVuIFNUQVJUVVAgSVBJIGxvb3AuCisJICovCisJRHByaW50aygiI3N0YXJ0dXAgbG9vcHM6ICVkLlxuIiwgbnVtX3N0YXJ0cyk7CisKKwltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisKKwlmb3IgKGogPSAxOyBqIDw9IG51bV9zdGFydHM7IGorKykgeworCQlEcHJpbnRrKCJTZW5kaW5nIFNUQVJUVVAgIyVkLlxuIixqKTsKKwkJYXBpY19yZWFkX2Fyb3VuZChBUElDX1NQSVYpOworCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKKwkJYXBpY19yZWFkKEFQSUNfRVNSKTsKKwkJRHByaW50aygiQWZ0ZXIgYXBpY193cml0ZS5cbiIpOworCisJCS8qCisJCSAqIFNUQVJUVVAgSVBJCisJCSAqLworCisJCS8qIFRhcmdldCBjaGlwICovCisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfSUNSMiwgU0VUX0FQSUNfREVTVF9GSUVMRChwaHlzX2FwaWNpZCkpOworCisJCS8qIEJvb3Qgb24gdGhlIHN0YWNrICovCisJCS8qIEtpY2sgdGhlIHNlY29uZCAqLworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0lDUiwgQVBJQ19ETV9TVEFSVFVQCisJCQkJCXwgKHN0YXJ0X2VpcCA+PiAxMikpOworCisJCS8qCisJCSAqIEdpdmUgdGhlIG90aGVyIENQVSBzb21lIHRpbWUgdG8gYWNjZXB0IHRoZSBJUEkuCisJCSAqLworCQl1ZGVsYXkoMzAwKTsKKworCQlEcHJpbnRrKCJTdGFydHVwIHBvaW50IDEuXG4iKTsKKworCQlEcHJpbnRrKCJXYWl0aW5nIGZvciBzZW5kIHRvIGZpbmlzaC4uLlxuIik7CisJCXRpbWVvdXQgPSAwOworCQlkbyB7CisJCQlEcHJpbnRrKCIrIik7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCXNlbmRfc3RhdHVzID0gYXBpY19yZWFkKEFQSUNfSUNSKSAmIEFQSUNfSUNSX0JVU1k7CisJCX0gd2hpbGUgKHNlbmRfc3RhdHVzICYmICh0aW1lb3V0KysgPCAxMDAwKSk7CisKKwkJLyoKKwkJICogR2l2ZSB0aGUgb3RoZXIgQ1BVIHNvbWUgdGltZSB0byBhY2NlcHQgdGhlIElQSS4KKwkJICovCisJCXVkZWxheSgyMDApOworCQkvKgorCQkgKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuCisJCSAqLworCQlpZiAobWF4bHZ0ID4gMykgeworCQkJYXBpY19yZWFkX2Fyb3VuZChBUElDX1NQSVYpOworCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CisJCX0KKwkJYWNjZXB0X3N0YXR1cyA9IChhcGljX3JlYWQoQVBJQ19FU1IpICYgMHhFRik7CisJCWlmIChzZW5kX3N0YXR1cyB8fCBhY2NlcHRfc3RhdHVzKQorCQkJYnJlYWs7CisJfQorCURwcmludGsoIkFmdGVyIFN0YXJ0dXAuXG4iKTsKKworCWlmIChzZW5kX3N0YXR1cykKKwkJcHJpbnRrKCJBUElDIG5ldmVyIGRlbGl2ZXJlZD8/P1xuIik7CisJaWYgKGFjY2VwdF9zdGF0dXMpCisJCXByaW50aygiQVBJQyBkZWxpdmVyeSBlcnJvciAoJWx4KS5cbiIsIGFjY2VwdF9zdGF0dXMpOworCisJcmV0dXJuIChzZW5kX3N0YXR1cyB8IGFjY2VwdF9zdGF0dXMpOworfQorI2VuZGlmCS8qIFdBS0VfU0VDT05EQVJZX1ZJQV9JTklUICovCisKK2V4dGVybiBjcHVtYXNrX3QgY3B1X2luaXRpYWxpemVkOworCitzdGF0aWMgaW50IF9faW5pdCBkb19ib290X2NwdShpbnQgYXBpY2lkKQorLyoKKyAqIE5PVEUgLSBvbiBtb3N0IHN5c3RlbXMgdGhpcyBpcyBhIFBIWVNJQ0FMIGFwaWMgSUQsIGJ1dCBvbiBtdWx0aXF1YWQKKyAqIChpZSBjbHVzdGVyZWQgYXBpYyBhZGRyZXNzaW5nIG1vZGUpLCB0aGlzIGlzIGEgTE9HSUNBTCBhcGljIElELgorICogUmV0dXJucyB6ZXJvIGlmIENQVSBib290ZWQgT0ssIGVsc2UgZXJyb3IgY29kZSBmcm9tIHdha2V1cF9zZWNvbmRhcnlfY3B1LgorICovCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOworCXVuc2lnbmVkIGxvbmcgYm9vdF9lcnJvcjsKKwlpbnQgdGltZW91dCwgY3B1OworCXVuc2lnbmVkIGxvbmcgc3RhcnRfZWlwOworCXVuc2lnbmVkIHNob3J0IG5taV9oaWdoID0gMCwgbm1pX2xvdyA9IDA7CisKKwljcHUgPSArK2NwdWNvdW50OworCS8qCisJICogV2UgY2FuJ3QgdXNlIGtlcm5lbF90aHJlYWQgc2luY2Ugd2UgbXVzdCBhdm9pZCB0bworCSAqIHJlc2NoZWR1bGUgdGhlIGNoaWxkLgorCSAqLworCWlkbGUgPSBmb3JrX2lkbGUoY3B1KTsKKwlpZiAoSVNfRVJSKGlkbGUpKQorCQlwYW5pYygiZmFpbGVkIGZvcmsgZm9yIENQVSAlZCIsIGNwdSk7CisJaWRsZS0+dGhyZWFkLmVpcCA9ICh1bnNpZ25lZCBsb25nKSBzdGFydF9zZWNvbmRhcnk7CisJLyogc3RhcnRfZWlwIGhhZCBiZXR0ZXIgYmUgcGFnZS1hbGlnbmVkISAqLworCXN0YXJ0X2VpcCA9IHNldHVwX3RyYW1wb2xpbmUoKTsKKworCS8qIFNvIHdlIHNlZSB3aGF0J3MgdXAgICAqLworCXByaW50aygiQm9vdGluZyBwcm9jZXNzb3IgJWQvJWQgZWlwICVseFxuIiwgY3B1LCBhcGljaWQsIHN0YXJ0X2VpcCk7CisJLyogU3RhY2sgZm9yIHN0YXJ0dXBfMzIgY2FuIGJlIGp1c3QgYXMgZm9yIHN0YXJ0X3NlY29uZGFyeSBvbndhcmRzICovCisJc3RhY2tfc3RhcnQuZXNwID0gKHZvaWQgKikgaWRsZS0+dGhyZWFkLmVzcDsKKworCWlycV9jdHhfaW5pdChjcHUpOworCisJLyoKKwkgKiBUaGlzIGdydW5nZSBydW5zIHRoZSBzdGFydHVwIHByb2Nlc3MgZm9yCisJICogdGhlIHRhcmdldGVkIHByb2Nlc3Nvci4KKwkgKi8KKworCWF0b21pY19zZXQoJmluaXRfZGVhc3NlcnRlZCwgMCk7CisKKwlEcHJpbnRrKCJTZXR0aW5nIHdhcm0gcmVzZXQgY29kZSBhbmQgdmVjdG9yLlxuIik7CisKKwlzdG9yZV9OTUlfdmVjdG9yKCZubWlfaGlnaCwgJm5taV9sb3cpOworCisJc21wYm9vdF9zZXR1cF93YXJtX3Jlc2V0X3ZlY3RvcihzdGFydF9laXApOworCisJLyoKKwkgKiBTdGFydGluZyBhY3R1YWwgSVBJIHNlcXVlbmNlLi4uCisJICovCisJYm9vdF9lcnJvciA9IHdha2V1cF9zZWNvbmRhcnlfY3B1KGFwaWNpZCwgc3RhcnRfZWlwKTsKKworCWlmICghYm9vdF9lcnJvcikgeworCQkvKgorCQkgKiBhbGxvdyBBUHMgdG8gc3RhcnQgaW5pdGlhbGl6aW5nLgorCQkgKi8KKwkJRHByaW50aygiQmVmb3JlIENhbGxvdXQgJWQuXG4iLCBjcHUpOworCQljcHVfc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKKwkJRHByaW50aygiQWZ0ZXIgQ2FsbG91dCAlZC5cbiIsIGNwdSk7CisKKwkJLyoKKwkJICogV2FpdCA1cyB0b3RhbCBmb3IgYSByZXNwb25zZQorCQkgKi8KKwkJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDUwMDAwOyB0aW1lb3V0KyspIHsKKwkJCWlmIChjcHVfaXNzZXQoY3B1LCBjcHVfY2FsbGluX21hcCkpCisJCQkJYnJlYWs7CS8qIEl0IGhhcyBib290ZWQgKi8KKwkJCXVkZWxheSgxMDApOworCQl9CisKKwkJaWYgKGNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkgeworCQkJLyogbnVtYmVyIENQVXMgbG9naWNhbGx5LCBzdGFydGluZyBmcm9tIDEgKEJTUCBpcyAwKSAqLworCQkJRHByaW50aygiT0suXG4iKTsKKwkJCXByaW50aygiQ1BVJWQ6ICIsIGNwdSk7CisJCQlwcmludF9jcHVfaW5mbygmY3B1X2RhdGFbY3B1XSk7CisJCQlEcHJpbnRrKCJDUFUgaGFzIGJvb3RlZC5cbiIpOworCQl9IGVsc2UgeworCQkJYm9vdF9lcnJvcj0gMTsKKwkJCWlmICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopdHJhbXBvbGluZV9iYXNlKQorCQkJCQk9PSAweEE1KQorCQkJCS8qIHRyYW1wb2xpbmUgc3RhcnRlZCBidXQuLi4/ICovCisJCQkJcHJpbnRrKCJTdHVjayA/P1xuIik7CisJCQllbHNlCisJCQkJLyogdHJhbXBvbGluZSBjb2RlIG5vdCBydW4gKi8KKwkJCQlwcmludGsoIk5vdCByZXNwb25kaW5nLlxuIik7CisJCQlpbnF1aXJlX3JlbW90ZV9hcGljKGFwaWNpZCk7CisJCX0KKwl9CisJeDg2X2NwdV90b19hcGljaWRbY3B1XSA9IGFwaWNpZDsKKwlpZiAoYm9vdF9lcnJvcikgeworCQkvKiBUcnkgdG8gcHV0IHRoaW5ncyBiYWNrIHRoZSB3YXkgdGhleSB3ZXJlIGJlZm9yZSAuLi4gKi8KKwkJdW5tYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKGNwdSk7CisJCWNwdV9jbGVhcihjcHUsIGNwdV9jYWxsb3V0X21hcCk7IC8qIHdhcyBzZXQgaGVyZSAoZG9fYm9vdF9jcHUoKSkgKi8KKwkJY3B1X2NsZWFyKGNwdSwgY3B1X2luaXRpYWxpemVkKTsgLyogd2FzIHNldCBieSBjcHVfaW5pdCgpICovCisJCWNwdWNvdW50LS07CisJfQorCisJLyogbWFyayAic3R1Y2siIGFyZWEgYXMgbm90IHN0dWNrICovCisJKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXRyYW1wb2xpbmVfYmFzZSkgPSAwOworCisJcmV0dXJuIGJvb3RfZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIHNtcF90dW5lX3NjaGVkdWxpbmcgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjYWNoZXNpemU7ICAgICAgIC8qIGtCICAgKi8KKwl1bnNpZ25lZCBsb25nIGJhbmR3aWR0aCA9IDM1MDsgLyogTUIvcyAqLworCS8qCisJICogUm91Z2ggZXN0aW1hdGlvbiBmb3IgU01QIHNjaGVkdWxpbmcsIHRoaXMgaXMgdGhlIG51bWJlciBvZgorCSAqIGN5Y2xlcyBpdCB0YWtlcyBmb3IgYSBmdWxseSBtZW1vcnktbGltaXRlZCBwcm9jZXNzIHRvIGZsdXNoCisJICogdGhlIFNNUC1sb2NhbCBjYWNoZS4KKwkgKgorCSAqIChGb3IgYSBQNSB0aGlzIHByZXR0eSBtdWNoIG1lYW5zIHdlIHdpbGwgY2hvb3NlIGFub3RoZXIgaWRsZQorCSAqICBDUFUgYWxtb3N0IGFsd2F5cyBhdCB3YWtldXAgdGltZSAodGhpcyBpcyBkdWUgdG8gdGhlIHNtYWxsCisJICogIEwxIGNhY2hlKSwgb24gUElJcyBpdCdzIGFyb3VuZCA1MC0xMDAgdXNlY3MsIGRlcGVuZGluZyBvbgorCSAqICB0aGUgY2FjaGUgc2l6ZSkKKwkgKi8KKworCWlmICghY3B1X2toeikgeworCQkvKgorCQkgKiB0aGlzIGJhc2ljYWxseSBkaXNhYmxlcyBwcm9jZXNzb3ItYWZmaW5pdHkKKwkJICogc2NoZWR1bGluZyBvbiBTTVAgd2l0aG91dCBhIFRTQy4KKwkJICovCisJCXJldHVybjsKKwl9IGVsc2UgeworCQljYWNoZXNpemUgPSBib290X2NwdV9kYXRhLng4Nl9jYWNoZV9zaXplOworCQlpZiAoY2FjaGVzaXplID09IC0xKSB7CisJCQljYWNoZXNpemUgPSAxNjsgLyogUGVudGl1bXMsIDJ4OGtCIGNhY2hlICovCisJCQliYW5kd2lkdGggPSAxMDA7CisJCX0KKwl9Cit9CisKKy8qCisgKiBDeWNsZSB0aHJvdWdoIHRoZSBwcm9jZXNzb3JzIHNlbmRpbmcgQVBJQyBJUElzIHRvIGJvb3QgZWFjaC4KKyAqLworCitzdGF0aWMgaW50IGJvb3RfY3B1X2xvZ2ljYWxfYXBpY2lkOworLyogV2hlcmUgdGhlIElPIGFyZWEgd2FzIG1hcHBlZCBvbiBtdWx0aXF1YWQsIGFsd2F5cyAwIG90aGVyd2lzZSAqLwordm9pZCAqeHF1YWRfcG9ydGlvOworCitjcHVtYXNrX3QgY3B1X3NpYmxpbmdfbWFwW05SX0NQVVNdIF9fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfYm9vdF9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwlpbnQgYXBpY2lkLCBjcHUsIGJpdCwga2lja2VkOworCXVuc2lnbmVkIGxvbmcgYm9nb3N1bSA9IDA7CisKKwkvKgorCSAqIFNldHVwIGJvb3QgQ1BVIGluZm9ybWF0aW9uCisJICovCisJc21wX3N0b3JlX2NwdV9pbmZvKDApOyAvKiBGaW5hbCBmdWxsIHZlcnNpb24gb2YgdGhlIGRhdGEgKi8KKwlwcmludGsoIkNQVSVkOiAiLCAwKTsKKwlwcmludF9jcHVfaW5mbygmY3B1X2RhdGFbMF0pOworCisJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKKwlib290X2NwdV9sb2dpY2FsX2FwaWNpZCA9IGxvZ2ljYWxfc21wX3Byb2Nlc3Nvcl9pZCgpOworCXg4Nl9jcHVfdG9fYXBpY2lkWzBdID0gYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkOworCisJY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHUgPSAwOworCXNtcF90dW5lX3NjaGVkdWxpbmcoKTsKKwljcHVzX2NsZWFyKGNwdV9zaWJsaW5nX21hcFswXSk7CisJY3B1X3NldCgwLCBjcHVfc2libGluZ19tYXBbMF0pOworCisJLyoKKwkgKiBJZiB3ZSBjb3VsZG4ndCBmaW5kIGFuIFNNUCBjb25maWd1cmF0aW9uIGF0IGJvb3QgdGltZSwKKwkgKiBnZXQgb3V0IG9mIGhlcmUgbm93IQorCSAqLworCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiAhYWNwaV9sYXBpYykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNNUCBtb3RoZXJib2FyZCBub3QgZGV0ZWN0ZWQuXG4iKTsKKwkJc21wYm9vdF9jbGVhcl9pb19hcGljX2lycXMoKTsKKwkJcGh5c19jcHVfcHJlc2VudF9tYXAgPSBwaHlzaWRfbWFza19vZl9waHlzaWQoMCk7CisJCWlmIChBUElDX2luaXRfdW5pcHJvY2Vzc29yKCkpCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkxvY2FsIEFQSUMgbm90IGRldGVjdGVkLiIKKwkJCQkJICAgIiBVc2luZyBkdW1teSBBUElDIGVtdWxhdGlvbi5cbiIpOworCQltYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE1QIHRhYmxlIHNob3VsZCBsaXN0IHRoZSBib290CisJICogQ1BVIHRvbywgYnV0IHdlIGRvIGl0IGZvciB0aGUgc2FrZSBvZiByb2J1c3RuZXNzIGFueXdheS4KKwkgKiBNYWtlcyBubyBzZW5zZSB0byBkbyB0aGlzIGNoZWNrIGluIGNsdXN0ZXJlZCBhcGljIG1vZGUsIHNvIHNraXAgaXQKKwkgKi8KKwlpZiAoIWNoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKSkgeworCQlwcmludGsoIndlaXJkLCBib290IENQVSAoIyVkKSBub3QgbGlzdGVkIGJ5IHRoZSBCSU9TLlxuIiwKKwkJCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQpOworCQlwaHlzaWRfc2V0KGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBjb3VsZG4ndCBmaW5kIGEgbG9jYWwgQVBJQywgdGhlbiBnZXQgb3V0IG9mIGhlcmUgbm93IQorCSAqLworCWlmIChBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pICYmICFjcHVfaGFzX2FwaWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1ZywgbG9jYWwgQVBJQyAjJWQgbm90IGRldGVjdGVkIS4uLlxuIiwKKwkJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CisJCXByaW50ayhLRVJOX0VSUiAiLi4uIGZvcmNpbmcgdXNlIG9mIGR1bW15IEFQSUMgZW11bGF0aW9uLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIpOworCQlzbXBib290X2NsZWFyX2lvX2FwaWNfaXJxcygpOworCQlwaHlzX2NwdV9wcmVzZW50X21hcCA9IHBoeXNpZF9tYXNrX29mX3BoeXNpZCgwKTsKKwkJcmV0dXJuOworCX0KKworCXZlcmlmeV9sb2NhbF9BUElDKCk7CisKKwkvKgorCSAqIElmIFNNUCBzaG91bGQgYmUgZGlzYWJsZWQsIHRoZW4gcmVhbGx5IGRpc2FibGUgaXQhCisJICovCisJaWYgKCFtYXhfY3B1cykgeworCQlzbXBfZm91bmRfY29uZmlnID0gMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU01QIG1vZGUgZGVhY3RpdmF0ZWQsIGZvcmNpbmcgdXNlIG9mIGR1bW15IEFQSUMgZW11bGF0aW9uLlxuIik7CisJCXNtcGJvb3RfY2xlYXJfaW9fYXBpY19pcnFzKCk7CisJCXBoeXNfY3B1X3ByZXNlbnRfbWFwID0gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKDApOworCQlyZXR1cm47CisJfQorCisJY29ubmVjdF9ic3BfQVBJQygpOworCXNldHVwX2xvY2FsX0FQSUMoKTsKKwltYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKCk7CisKKworCXNldHVwX3BvcnRpb19yZW1hcCgpOworCisJLyoKKwkgKiBTY2FuIHRoZSBDUFUgcHJlc2VudCBtYXAgYW5kIGZpcmUgdXAgdGhlIG90aGVyIENQVXMgdmlhIGRvX2Jvb3RfY3B1CisJICoKKwkgKiBJbiBjbHVzdGVyZWQgYXBpYyBtb2RlLCBwaHlzX2NwdV9wcmVzZW50X21hcCBpcyBhIGNvbnN0cnVjdGVkIHRodXM6CisJICogYml0cyAwLTMgYXJlIHF1YWQwLCA0LTcgYXJlIHF1YWQxLCBldGMuIEEgcGVydmVyc2UgdHdpc3Qgb24gdGhlIAorCSAqIGNsdXN0ZXJlZCBhcGljIElELgorCSAqLworCURwcmludGsoIkNQVSBwcmVzZW50IG1hcDogJWx4XG4iLCBwaHlzaWRzX2NvZXJjZShwaHlzX2NwdV9wcmVzZW50X21hcCkpOworCisJa2lja2VkID0gMTsKKwlmb3IgKGJpdCA9IDA7IGtpY2tlZCA8IE5SX0NQVVMgJiYgYml0IDwgTUFYX0FQSUNTOyBiaXQrKykgeworCQlhcGljaWQgPSBjcHVfcHJlc2VudF90b19hcGljaWQoYml0KTsKKwkJLyoKKwkJICogRG9uJ3QgZXZlbiBhdHRlbXB0IHRvIHN0YXJ0IHRoZSBib290IENQVSEKKwkJICovCisJCWlmICgoYXBpY2lkID09IGJvb3RfY3B1X2FwaWNpZCkgfHwgKGFwaWNpZCA9PSBCQURfQVBJQ0lEKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghY2hlY2tfYXBpY2lkX3ByZXNlbnQoYml0KSkKKwkJCWNvbnRpbnVlOworCQlpZiAobWF4X2NwdXMgPD0gY3B1Y291bnQrMSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkb19ib290X2NwdShhcGljaWQpKQorCQkJcHJpbnRrKCJDUFUgIyVkIG5vdCByZXNwb25kaW5nIC0gY2Fubm90IHVzZSBpdC5cbiIsCisJCQkJCQkJCWFwaWNpZCk7CisJCWVsc2UKKwkJCSsra2lja2VkOworCX0KKworCS8qCisJICogQ2xlYW51cCBwb3NzaWJsZSBkYW5nbGluZyBlbmRzLi4uCisJICovCisJc21wYm9vdF9yZXN0b3JlX3dhcm1fcmVzZXRfdmVjdG9yKCk7CisKKwkvKgorCSAqIEFsbG93IHRoZSB1c2VyIHRvIGltcHJlc3MgZnJpZW5kcy4KKwkgKi8KKwlEcHJpbnRrKCJCZWZvcmUgYm9nb21pcHMuXG4iKTsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQorCQlpZiAoY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKSkKKwkJCWJvZ29zdW0gKz0gY3B1X2RhdGFbY3B1XS5sb29wc19wZXJfamlmZnk7CisJcHJpbnRrKEtFUk5fSU5GTworCQkiVG90YWwgb2YgJWQgcHJvY2Vzc29ycyBhY3RpdmF0ZWQgKCVsdS4lMDJsdSBCb2dvTUlQUykuXG4iLAorCQljcHVjb3VudCsxLAorCQlib2dvc3VtLyg1MDAwMDAvSFopLAorCQkoYm9nb3N1bS8oNTAwMC9IWikpJTEwMCk7CisJCisJRHByaW50aygiQmVmb3JlIGJvZ29jb3VudCAtIHNldHRpbmcgYWN0aXZhdGVkPTEuXG4iKTsKKworCWlmIChzbXBfYl9zdGVwcGluZykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV0FSTklORzogU01QIG9wZXJhdGlvbiBtYXkgYmUgdW5yZWxpYWJsZSB3aXRoIEIgc3RlcHBpbmcgcHJvY2Vzc29ycy5cbiIpOworCisJLyoKKwkgKiBEb24ndCB0YWludCBpZiB3ZSBhcmUgcnVubmluZyBTTVAga2VybmVsIG9uIGEgc2luZ2xlIG5vbi1NUAorCSAqIGFwcHJvdmVkIEF0aGxvbgorCSAqLworCWlmICh0YWludGVkICYgVEFJTlRfVU5TQUZFX1NNUCkgeworCQlpZiAoY3B1Y291bnQpCisJCQlwcmludGsgKEtFUk5fSU5GTyAiV0FSTklORzogVGhpcyBjb21iaW5hdGlvbiBvZiBBTUQgcHJvY2Vzc29ycyBpcyBub3Qgc3VpdGFibGUgZm9yIFNNUC5cbiIpOworCQllbHNlCisJCQl0YWludGVkICY9IH5UQUlOVF9VTlNBRkVfU01QOworCX0KKworCURwcmludGsoIkJvb3QgZG9uZS5cbiIpOworCisJLyoKKwkgKiBjb25zdHJ1Y3QgY3B1X3NpYmxpbmdfbWFwW10sIHNvIHRoYXQgd2UgY2FuIHRlbGwgc2libGluZyBDUFVzCisJICogZWZmaWNpZW50bHkuCisJICovCisJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykKKwkJY3B1c19jbGVhcihjcHVfc2libGluZ19tYXBbY3B1XSk7CisKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKSB7CisJCWludCBzaWJsaW5ncyA9IDA7CisJCWludCBpOworCQlpZiAoIWNwdV9pc3NldChjcHUsIGNwdV9jYWxsb3V0X21hcCkpCisJCQljb250aW51ZTsKKworCQlpZiAoc21wX251bV9zaWJsaW5ncyA+IDEpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJCQlpZiAoIWNwdV9pc3NldChpLCBjcHVfY2FsbG91dF9tYXApKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocGh5c19wcm9jX2lkW2NwdV0gPT0gcGh5c19wcm9jX2lkW2ldKSB7CisJCQkJCXNpYmxpbmdzKys7CisJCQkJCWNwdV9zZXQoaSwgY3B1X3NpYmxpbmdfbWFwW2NwdV0pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNpYmxpbmdzKys7CisJCQljcHVfc2V0KGNwdSwgY3B1X3NpYmxpbmdfbWFwW2NwdV0pOworCQl9CisKKwkJaWYgKHNpYmxpbmdzICE9IHNtcF9udW1fc2libGluZ3MpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiAlZCBzaWJsaW5ncyBmb3VuZCBmb3IgQ1BVJWQsIHNob3VsZCBiZSAlZFxuIiwgc2libGluZ3MsIGNwdSwgc21wX251bV9zaWJsaW5ncyk7CisJfQorCisJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQykKKwkJY2hlY2tfbm1pX3dhdGNoZG9nKCk7CisKKwlzbXBib290X3NldHVwX2lvX2FwaWMoKTsKKworCXNldHVwX2Jvb3RfQVBJQ19jbG9jaygpOworCisJLyoKKwkgKiBTeW5jaHJvbml6ZSB0aGUgVFNDIHdpdGggdGhlIEFQCisJICovCisJaWYgKGNwdV9oYXNfdHNjICYmIGNwdWNvdW50ICYmIGNwdV9raHopCisJCXN5bmNocm9uaXplX3RzY19icCgpOworfQorCisvKiBUaGVzZSBhcmUgd3JhcHBlcnMgdG8gaW50ZXJmYWNlIHRvIHRoZSBuZXcgYm9vdCBwcm9jZXNzLiAgU29tZW9uZQorICAgd2hvIHVuZGVyc3RhbmRzIGFsbCB0aGlzIHN0dWZmIHNob3VsZCByZXdyaXRlIGl0IHByb3Blcmx5LiAtLVJSIDE1L0p1bC8wMiAqLwordm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJc21wX2Jvb3RfY3B1cyhtYXhfY3B1cyk7Cit9CisKK3ZvaWQgX19kZXZpbml0IHNtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCit7CisJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKKwljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X2NhbGxvdXRfbWFwKTsKK30KKworaW50IF9fZGV2aW5pdCBfX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qIFRoaXMgb25seSB3b3JrcyBhdCBib290IGZvciB4ODYuICBTZWUgInJld3JpdGUiIGFib3ZlLiAqLworCWlmIChjcHVfaXNzZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spKSB7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJLyogSW4gY2FzZSBvbmUgZGlkbid0IGNvbWUgdXAgKi8KKwlpZiAoIWNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkgeworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWxvY2FsX2lycV9lbmFibGUoKTsKKwkvKiBVbmxlYXNoIHRoZSBDUFUhICovCisJY3B1X3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzayk7CisJd2hpbGUgKCFjcHVfaXNzZXQoY3B1LCBjcHVfb25saW5lX21hcCkpCisJCW1iKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IHNtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQoreworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCXNldHVwX2lvYXBpY19kZXN0KCk7CisjZW5kaWYKKwl6YXBfbG93X21hcHBpbmdzKCk7CisJLyoKKwkgKiBEaXNhYmxlIGV4ZWN1dGFiaWxpdHkgb2YgdGhlIFNNUCB0cmFtcG9saW5lOgorCSAqLworCXNldF9rZXJuZWxfZXhlYygodW5zaWduZWQgbG9uZyl0cmFtcG9saW5lX2Jhc2UsIHRyYW1wb2xpbmVfZXhlYyk7Cit9CisKK3ZvaWQgX19pbml0IHNtcF9pbnRyX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIElSUTAgbXVzdCBiZSBnaXZlbiBhIGZpeGVkIGFzc2lnbm1lbnQgYW5kIGluaXRpYWxpemVkLAorCSAqIGJlY2F1c2UgaXQncyB1c2VkIGJlZm9yZSB0aGUgSU8tQVBJQyBpcyBzZXQgdXAuCisJICovCisJc2V0X2ludHJfZ2F0ZShGSVJTVF9ERVZJQ0VfVkVDVE9SLCBpbnRlcnJ1cHRbMF0pOworCisJLyoKKwkgKiBUaGUgcmVzY2hlZHVsZSBpbnRlcnJ1cHQgaXMgYSBDUFUtdG8tQ1BVIHJlc2NoZWR1bGUtaGVscGVyCisJICogSVBJLCBkcml2ZW4gYnkgd2FrZXVwLgorCSAqLworCXNldF9pbnRyX2dhdGUoUkVTQ0hFRFVMRV9WRUNUT1IsIHJlc2NoZWR1bGVfaW50ZXJydXB0KTsKKworCS8qIElQSSBmb3IgaW52YWxpZGF0aW9uICovCisJc2V0X2ludHJfZ2F0ZShJTlZBTElEQVRFX1RMQl9WRUNUT1IsIGludmFsaWRhdGVfaW50ZXJydXB0KTsKKworCS8qIElQSSBmb3IgZ2VuZXJpYyBmdW5jdGlvbiBjYWxsICovCisJc2V0X2ludHJfZ2F0ZShDQUxMX0ZVTkNUSU9OX1ZFQ1RPUiwgY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zcmF0LmMgYi9hcmNoL2kzODYva2VybmVsL3NyYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNiMjdkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zcmF0LmMKQEAgLTAsMCArMSw0NTYgQEAKKy8qCisgKiBTb21lIG9mIHRoZSBjb2RlIGluIHRoaXMgZmlsZSBoYXMgYmVlbiBnbGVhbmVkIGZyb20gdGhlIDY0IGJpdCAKKyAqIGRpc2NvbnRpZ21lbSBzdXBwb3J0IGNvZGUgYmFzZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFNlbmQgZmVlZGJhY2sgdG8gUGF0IEdhdWdoZW4gPGdvbmVAdXMuaWJtLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGFzbS9zcmF0Lmg+CisjaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+CisKKy8qCisgKiBwcm94aW1pdHkgbWFjcm9zIGFuZCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIE5PREVfQVJSQVlfSU5ERVgoeCkJKCh4KSAvIDgpCS8qIDggYml0cy9jaGFyICovCisjZGVmaW5lIE5PREVfQVJSQVlfT0ZGU0VUKHgpCSgoeCkgJSA4KQkvKiA4IGJpdHMvY2hhciAqLworI2RlZmluZSBCTUFQX1NFVChibWFwLCBiaXQpCSgoYm1hcClbTk9ERV9BUlJBWV9JTkRFWChiaXQpXSB8PSAxIDw8IE5PREVfQVJSQVlfT0ZGU0VUKGJpdCkpCisjZGVmaW5lIEJNQVBfVEVTVChibWFwLCBiaXQpCSgoYm1hcClbTk9ERV9BUlJBWV9JTkRFWChiaXQpXSAmICgxIDw8IE5PREVfQVJSQVlfT0ZGU0VUKGJpdCkpKQorI2RlZmluZSBNQVhfUFhNX0RPTUFJTlMJCTI1NgkvKiAxIGJ5dGUgYW5kIG5vIHByb21pc2VzIGFib3V0IHZhbHVlcyAqLworLyogYml0bWFwIGxlbmd0aDsgX1BYTSBpcyBhdCBtb3N0IDI1NSAqLworI2RlZmluZSBQWE1fQklUTUFQX0xFTiAoTUFYX1BYTV9ET01BSU5TIC8gOCkgCitzdGF0aWMgdTggcHhtX2JpdG1hcFtQWE1fQklUTUFQX0xFTl07CS8qIGJpdG1hcCBvZiBwcm94aW1pdHkgZG9tYWlucyAqLworCisjZGVmaW5lIE1BWF9DSFVOS1NfUEVSX05PREUJNAorI2RlZmluZSBNQVhDSFVOS1MJCShNQVhfQ0hVTktTX1BFUl9OT0RFICogTUFYX05VTU5PREVTKQorc3RydWN0IG5vZGVfbWVtb3J5X2NodW5rX3MgeworCXVuc2lnbmVkIGxvbmcJc3RhcnRfcGZuOworCXVuc2lnbmVkIGxvbmcJZW5kX3BmbjsKKwl1OAlweG07CQkvLyBwcm94aW1pdHkgZG9tYWluIG9mIG5vZGUKKwl1OAluaWQ7CQkvLyB3aGljaCBjbm9kZSBjb250YWlucyB0aGlzIGNodW5rPworCXU4CWJhbms7CQkvLyB3aGljaCBtZW0gYmFuayBvbiB0aGlzIG5vZGUKK307CitzdGF0aWMgc3RydWN0IG5vZGVfbWVtb3J5X2NodW5rX3Mgbm9kZV9tZW1vcnlfY2h1bmtbTUFYQ0hVTktTXTsKKworc3RhdGljIGludCBudW1fbWVtb3J5X2NodW5rczsJCS8qIHRvdGFsIG51bWJlciBvZiBtZW1vcnkgY2h1bmtzICovCitzdGF0aWMgaW50IHpob2xlc19zaXplX2luaXQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB6aG9sZXNfc2l6ZVtNQVhfTlVNTk9ERVMgKiBNQVhfTlJfWk9ORVNdOworCitleHRlcm4gdm9pZCAqIGJvb3RfaW9yZW1hcCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKKworLyogSWRlbnRpZnkgQ1BVIHByb3hpbWl0eSBkb21haW5zICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGFyc2VfY3B1X2FmZmluaXR5X3N0cnVjdHVyZShjaGFyICpwKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqY3B1X2FmZmluaXR5ID0gCisJCQkJKHN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqKSBwOworCisJaWYgKCFjcHVfYWZmaW5pdHktPmZsYWdzLmVuYWJsZWQpCisJCXJldHVybjsJCS8qIGVtcHR5IGVudHJ5ICovCisKKwkvKiBtYXJrIHRoaXMgbm9kZSBhcyAic2VlbiIgaW4gbm9kZSBiaXRtYXAgKi8KKwlCTUFQX1NFVChweG1fYml0bWFwLCBjcHVfYWZmaW5pdHktPnByb3hpbWl0eV9kb21haW4pOworCisJcHJpbnRrKCJDUFUgMHglMDJYIGluIHByb3hpbWl0eSBkb21haW4gMHglMDJYXG4iLAorCQljcHVfYWZmaW5pdHktPmFwaWNfaWQsIGNwdV9hZmZpbml0eS0+cHJveGltaXR5X2RvbWFpbik7Cit9CisKKy8qCisgKiBJZGVudGlmeSBtZW1vcnkgcHJveGltaXR5IGRvbWFpbnMgYW5kIGhvdC1yZW1vdmUgY2FwYWJpbGl0aWVzLgorICogRmlsbCBub2RlIG1lbW9yeSBjaHVuayBsaXN0IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHBhcnNlX21lbW9yeV9hZmZpbml0eV9zdHJ1Y3R1cmUgKGNoYXIgKnNyYXRwKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBwYWRkciwgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsgCisJdTggcHhtOworCXN0cnVjdCBub2RlX21lbW9yeV9jaHVua19zICpwLCAqcSwgKnBlbmQ7CisJc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICptZW1vcnlfYWZmaW5pdHkgPQorCQkJKHN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSAqKSBzcmF0cDsKKworCWlmICghbWVtb3J5X2FmZmluaXR5LT5mbGFncy5lbmFibGVkKQorCQlyZXR1cm47CQkvKiBlbXB0eSBlbnRyeSAqLworCisJLyogbWFyayB0aGlzIG5vZGUgYXMgInNlZW4iIGluIG5vZGUgYml0bWFwICovCisJQk1BUF9TRVQocHhtX2JpdG1hcCwgbWVtb3J5X2FmZmluaXR5LT5wcm94aW1pdHlfZG9tYWluKTsKKworCS8qIGNhbGN1bGF0ZSBpbmZvIGZvciBtZW1vcnkgY2h1bmsgc3RydWN0dXJlICovCisJcGFkZHIgPSBtZW1vcnlfYWZmaW5pdHktPmJhc2VfYWRkcl9oaTsKKwlwYWRkciA9IChwYWRkciA8PCAzMikgfCBtZW1vcnlfYWZmaW5pdHktPmJhc2VfYWRkcl9sbzsKKwlzaXplID0gbWVtb3J5X2FmZmluaXR5LT5sZW5ndGhfaGk7CisJc2l6ZSA9IChzaXplIDw8IDMyKSB8IG1lbW9yeV9hZmZpbml0eS0+bGVuZ3RoX2xvOworCQorCXN0YXJ0X3BmbiA9IHBhZGRyID4+IFBBR0VfU0hJRlQ7CisJZW5kX3BmbiA9IChwYWRkciArIHNpemUpID4+IFBBR0VfU0hJRlQ7CisJCisJcHhtID0gbWVtb3J5X2FmZmluaXR5LT5wcm94aW1pdHlfZG9tYWluOworCisJaWYgKG51bV9tZW1vcnlfY2h1bmtzID49IE1BWENIVU5LUykgeworCQlwcmludGsoIlRvbyBtYW55IG1lbSBjaHVua3MgaW4gU1JBVC4gSWdub3JpbmcgJWxsZCBNQnl0ZXMgYXQgJWxseFxuIiwKKwkJCXNpemUvKDEwMjQqMTAyNCksIHBhZGRyKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEluc2VydGlvbiBzb3J0IGJhc2VkIG9uIGJhc2UgYWRkcmVzcyAqLworCXBlbmQgPSAmbm9kZV9tZW1vcnlfY2h1bmtbbnVtX21lbW9yeV9jaHVua3NdOworCWZvciAocCA9ICZub2RlX21lbW9yeV9jaHVua1swXTsgcCA8IHBlbmQ7IHArKykgeworCQlpZiAoc3RhcnRfcGZuIDwgcC0+c3RhcnRfcGZuKQorCQkJYnJlYWs7CisJfQorCWlmIChwIDwgcGVuZCkgeworCQlmb3IgKHEgPSBwZW5kOyBxID49IHA7IHEtLSkKKwkJCSoocSArIDEpID0gKnE7CisJfQorCXAtPnN0YXJ0X3BmbiA9IHN0YXJ0X3BmbjsKKwlwLT5lbmRfcGZuID0gZW5kX3BmbjsKKwlwLT5weG0gPSBweG07CisKKwludW1fbWVtb3J5X2NodW5rcysrOworCisJcHJpbnRrKCJNZW1vcnkgcmFuZ2UgMHglbFggdG8gMHglbFggKHR5cGUgMHglWCkgaW4gcHJveGltaXR5IGRvbWFpbiAweCUwMlggJXNcbiIsCisJCXN0YXJ0X3BmbiwgZW5kX3BmbiwKKwkJbWVtb3J5X2FmZmluaXR5LT5tZW1vcnlfdHlwZSwKKwkJbWVtb3J5X2FmZmluaXR5LT5wcm94aW1pdHlfZG9tYWluLAorCQkobWVtb3J5X2FmZmluaXR5LT5mbGFncy5ob3RfcGx1Z2dhYmxlID8KKwkJICJlbmFibGVkIGFuZCByZW1vdmFibGUiIDogImVuYWJsZWQiICkgKTsKK30KKworI2lmIE1BWF9OUl9aT05FUyAhPSAzCisjZXJyb3IgIk1BWF9OUl9aT05FUyAhPSAzLCBjaHVua190b196b25lIHJlcXVpcmVzIHJldmlldyIKKyNlbmRpZgorLyogVGFrZSBhIGNodW5rIG9mIHBhZ2VzIGZyb20gcGFnZSBmcmFtZSBjc3RhcnQgdG8gY2VuZCBhbmQgY291bnQgdGhlIG51bWJlcgorICogb2YgcGFnZXMgaW4gZWFjaCB6b25lLCByZXR1cm5lZCB2aWEgem9uZXNbXS4KKyAqLworc3RhdGljIF9faW5pdCB2b2lkIGNodW5rX3RvX3pvbmVzKHVuc2lnbmVkIGxvbmcgY3N0YXJ0LCB1bnNpZ25lZCBsb25nIGNlbmQsIAorCQl1bnNpZ25lZCBsb25nICp6b25lcykKK3sKKwl1bnNpZ25lZCBsb25nIG1heF9kbWE7CisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWF4X2xvd19wZm47CisKKwlpbnQgejsKKwl1bnNpZ25lZCBsb25nIHJlbmQ7CisKKwkvKiBGSVhNRTogTUFYX0RNQV9BRERSRVNTIGFuZCBtYXhfbG93X3BmbiBhcmUgdHJ5aW5nIHRvIHByb3ZpZGUKKwkgKiBzaW1pbGFybHkgc2NvcGVkIGluZm9ybWF0aW9uIGFuZCBzaG91bGQgYmUgaGFuZGxlZCBpbiBhIGNvbnNpc3RhbnQKKwkgKiBtYW5uZXIuCisJICovCisJbWF4X2RtYSA9IHZpcnRfdG9fcGh5cygoY2hhciAqKU1BWF9ETUFfQUREUkVTUykgPj4gUEFHRV9TSElGVDsKKworCS8qIFNwbGl0IHRoZSBob2xlIGludG8gdGhlIHpvbmVzIGluIHdoaWNoIGl0IGZhbGxzLiAgUmVwZWF0ZWRseQorCSAqIHRha2UgdGhlIHNlZ21lbnQgaW4gd2hpY2ggdGhlIHJlbWFpbmluZyBob2xlIHN0YXJ0cywgcm91bmQgaXQKKwkgKiB0byB0aGUgZW5kIG9mIHRoYXQgem9uZS4KKwkgKi8KKwltZW1zZXQoem9uZXMsIDAsIE1BWF9OUl9aT05FUyAqIHNpemVvZihsb25nKSk7CisJd2hpbGUgKGNzdGFydCA8IGNlbmQpIHsKKwkJaWYgKGNzdGFydCA8IG1heF9kbWEpIHsKKwkJCXogPSBaT05FX0RNQTsKKwkJCXJlbmQgPSAoY2VuZCA8IG1heF9kbWEpPyBjZW5kIDogbWF4X2RtYTsKKworCQl9IGVsc2UgaWYgKGNzdGFydCA8IG1heF9sb3dfcGZuKSB7CisJCQl6ID0gWk9ORV9OT1JNQUw7CisJCQlyZW5kID0gKGNlbmQgPCBtYXhfbG93X3Bmbik/IGNlbmQgOiBtYXhfbG93X3BmbjsKKworCQl9IGVsc2UgeworCQkJeiA9IFpPTkVfSElHSE1FTTsKKwkJCXJlbmQgPSBjZW5kOworCQl9CisJCXpvbmVzW3pdICs9IHJlbmQgLSBjc3RhcnQ7CisJCWNzdGFydCA9IHJlbmQ7CisJfQorfQorCisvKgorICogVGhlIFNSQVQgdGFibGUgYWx3YXlzIGxpc3RzIGFzY2VuZGluZyBhZGRyZXNzZXMsIHNvIGNhbiBhbHdheXMKKyAqIGFzc3VtZSB0aGF0IHRoZSBmaXJzdCAic3RhcnQiIGFkZHJlc3MgdGhhdCB5b3Ugc2VlIGlzIHRoZSByZWFsCisgKiBzdGFydCBvZiB0aGUgbm9kZSwgYW5kIHRoYXQgdGhlIGN1cnJlbnQgImVuZCIgYWRkcmVzcyBpcyBhZnRlcgorICogdGhlIHByZXZpb3VzIG9uZS4KKyAqLworc3RhdGljIF9faW5pdCB2b2lkIG5vZGVfcmVhZF9jaHVuayhpbnQgbmlkLCBzdHJ1Y3Qgbm9kZV9tZW1vcnlfY2h1bmtfcyAqbWVtb3J5X2NodW5rKQoreworCS8qCisJICogT25seSBhZGQgcHJlc2VudCBtZW1vcnkgYXMgdG9sZCBieSB0aGUgZTgyMC4KKwkgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgZnJvbSB0aGUgU1JBVCB0aGF0IHRoZSBtZW1vcnkgaXQKKwkgKiBlbnVtZXJhdGVzIGlzIHByZXNlbnQgYXQgYm9vdCB0aW1lIGJlY2F1c2UgaXQgcmVwcmVzZW50cworCSAqICpwb3NzaWJsZSogbWVtb3J5IGhvdHBsdWcgYXJlYXMgdGhlIHNhbWUgYXMgbm9ybWFsIFJBTS4KKwkgKi8KKwlpZiAobWVtb3J5X2NodW5rLT5zdGFydF9wZm4gPj0gbWF4X3BmbikgeworCQlwcmludGsgKEtFUk5fSU5GTyAiSWdub3JpbmcgU1JBVCBwZm5zOiAweCUwOGx4IC0+ICUwOGx4XG4iLAorCQkJbWVtb3J5X2NodW5rLT5zdGFydF9wZm4sIG1lbW9yeV9jaHVuay0+ZW5kX3Bmbik7CisJCXJldHVybjsKKwl9CisJaWYgKG1lbW9yeV9jaHVuay0+bmlkICE9IG5pZCkKKwkJcmV0dXJuOworCisJaWYgKCFub2RlX2hhc19vbmxpbmVfbWVtKG5pZCkpCisJCW5vZGVfc3RhcnRfcGZuW25pZF0gPSBtZW1vcnlfY2h1bmstPnN0YXJ0X3BmbjsKKworCWlmIChub2RlX3N0YXJ0X3BmbltuaWRdID4gbWVtb3J5X2NodW5rLT5zdGFydF9wZm4pCisJCW5vZGVfc3RhcnRfcGZuW25pZF0gPSBtZW1vcnlfY2h1bmstPnN0YXJ0X3BmbjsKKworCWlmIChub2RlX2VuZF9wZm5bbmlkXSA8IG1lbW9yeV9jaHVuay0+ZW5kX3BmbikKKwkJbm9kZV9lbmRfcGZuW25pZF0gPSBtZW1vcnlfY2h1bmstPmVuZF9wZm47Cit9CisKKy8qIFBhcnNlIHRoZSBBQ1BJIFN0YXRpYyBSZXNvdXJjZSBBZmZpbml0eSBUYWJsZSAqLworc3RhdGljIGludCBfX2luaXQgYWNwaTIwX3BhcnNlX3NyYXQoc3RydWN0IGFjcGlfdGFibGVfc3JhdCAqc3JhdHApCit7CisJdTggKnN0YXJ0LCAqZW5kLCAqcDsKKwlpbnQgaSwgaiwgbmlkOworCXU4IHB4bV90b19uaWRfbWFwW01BWF9QWE1fRE9NQUlOU107LyogX1BYTSB0byBsb2dpY2FsIG5vZGUgSUQgbWFwICovCisJdTggbmlkX3RvX3B4bV9tYXBbTUFYX05VTU5PREVTXTsvKiBsb2dpY2FsIG5vZGUgSUQgdG8gX1BYTSBtYXAgKi8KKworCXN0YXJ0ID0gKHU4ICopKCYoc3JhdHAtPnJlc2VydmVkKSArIDEpOwkvKiBza2lwIGhlYWRlciAqLworCXAgPSBzdGFydDsKKwllbmQgPSAodTggKilzcmF0cCArIHNyYXRwLT5oZWFkZXIubGVuZ3RoOworCisJbWVtc2V0KHB4bV9iaXRtYXAsIDAsIHNpemVvZihweG1fYml0bWFwKSk7CS8qIGluaXQgcHJveGltaXR5IGRvbWFpbiBiaXRtYXAgKi8KKwltZW1zZXQobm9kZV9tZW1vcnlfY2h1bmssIDAsIHNpemVvZihub2RlX21lbW9yeV9jaHVuaykpOworCW1lbXNldCh6aG9sZXNfc2l6ZSwgMCwgc2l6ZW9mKHpob2xlc19zaXplKSk7CisKKwkvKiAtMSBpbiB0aGVzZSBtYXBzIG1lYW5zIG5vdCBhdmFpbGFibGUgKi8KKwltZW1zZXQocHhtX3RvX25pZF9tYXAsIC0xLCBzaXplb2YocHhtX3RvX25pZF9tYXApKTsKKwltZW1zZXQobmlkX3RvX3B4bV9tYXAsIC0xLCBzaXplb2YobmlkX3RvX3B4bV9tYXApKTsKKworCW51bV9tZW1vcnlfY2h1bmtzID0gMDsKKwl3aGlsZSAocCA8IGVuZCkgeworCQlzd2l0Y2ggKCpwKSB7CisJCWNhc2UgQUNQSV9TUkFUX1BST0NFU1NPUl9BRkZJTklUWToKKwkJCXBhcnNlX2NwdV9hZmZpbml0eV9zdHJ1Y3R1cmUocCk7CisJCQlicmVhazsKKwkJY2FzZSBBQ1BJX1NSQVRfTUVNT1JZX0FGRklOSVRZOgorCQkJcGFyc2VfbWVtb3J5X2FmZmluaXR5X3N0cnVjdHVyZShwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJBQ1BJIDIuMCBTUkFUOiB1bmtub3duIGVudHJ5IHNraXBwZWQ6IHR5cGU9MHglMDJYLCBsZW49JWRcbiIsIHBbMF0sIHBbMV0pOworCQkJYnJlYWs7CisJCX0KKwkJcCArPSBwWzFdOworCQlpZiAocFsxXSA9PSAwKSB7CisJCQlwcmludGsoImFjcGkyMF9wYXJzZV9zcmF0OiBFbnRyeSBsZW5ndGggdmFsdWUgaXMgemVybzsiCisJCQkJIiBjYW4ndCBwYXJzZSBhbnkgZnVydGhlciFcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobnVtX21lbW9yeV9jaHVua3MgPT0gMCkgeworCQlwcmludGsoImNvdWxkIG5vdCBmaW55IGFueSBBQ1BJIFNSQVQgbWVtb3J5IGFyZWFzLlxuIik7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJLyogQ2FsY3VsYXRlIHRvdGFsIG51bWJlciBvZiBub2RlcyBpbiBzeXN0ZW0gZnJvbSBQWE0gYml0bWFwIGFuZCBjcmVhdGUKKwkgKiBhIHNldCBvZiBzZXF1ZW50aWFsIG5vZGUgSURzIHN0YXJ0aW5nIGF0IHplcm8uICAoQUNQSSBkb2Vzbid0IHNlZW0KKwkgKiB0byBzcGVjaWZ5IHRoZSByYW5nZSBvZiBfUFhNIHZhbHVlcy4pCisJICovCisJLyoKKwkgKiBNQ0QgLSB3ZSBubyBsb25nZXIgSEFWRSB0byBudW1iZXIgbm9kZXMgc2VxdWVudGlhbGx5LiAgUFhNIGRvbWFpbgorCSAqIG51bWJlcnMgY291bGQgZ28gYXMgaGlnaCBhcyAyNTYsIGFuZCBNQVhfTlVNTk9ERVMgZm9yIGkzODYgaXMgdHlwaWNhbGx5CisJICogMzIsIHNvIHdlIHdpbGwgY29udGludWUgbnVtYmVyaW5nIHRoZW0gaW4gdGhpcyBtYW5uZXIgdW50aWwgTUFYX05VTU5PREVTCisJICogYXBwcm9hY2hlcyBNQVhfUFhNX0RPTUFJTlMgZm9yIGkzODYuCisJICovCisJbm9kZXNfY2xlYXIobm9kZV9vbmxpbmVfbWFwKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1BYTV9ET01BSU5TOyBpKyspIHsKKwkJaWYgKEJNQVBfVEVTVChweG1fYml0bWFwLCBpKSkgeworCQkJbmlkID0gbnVtX29ubGluZV9ub2RlcygpOworCQkJcHhtX3RvX25pZF9tYXBbaV0gPSBuaWQ7CisJCQluaWRfdG9fcHhtX21hcFtuaWRdID0gaTsKKwkJCW5vZGVfc2V0X29ubGluZShuaWQpOworCQl9CisJfQorCUJVR19PTihudW1fb25saW5lX25vZGVzKCkgPT0gMCk7CisKKwkvKiBzZXQgY25vZGUgaWQgaW4gbWVtb3J5IGNodW5rIHN0cnVjdHVyZSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fbWVtb3J5X2NodW5rczsgaSsrKQorCQlub2RlX21lbW9yeV9jaHVua1tpXS5uaWQgPSBweG1fdG9fbmlkX21hcFtub2RlX21lbW9yeV9jaHVua1tpXS5weG1dOworCisJcHJpbnRrKCJweG0gYml0bWFwOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHB4bV9iaXRtYXApOyBpKyspIHsKKwkJcHJpbnRrKCIlMDJYICIsIHB4bV9iaXRtYXBbaV0pOworCX0KKwlwcmludGsoIlxuIik7CisJcHJpbnRrKCJOdW1iZXIgb2YgbG9naWNhbCBub2RlcyBpbiBzeXN0ZW0gPSAlZFxuIiwgbnVtX29ubGluZV9ub2RlcygpKTsKKwlwcmludGsoIk51bWJlciBvZiBtZW1vcnkgY2h1bmtzIGluIHN5c3RlbSA9ICVkXG4iLCBudW1fbWVtb3J5X2NodW5rcyk7CisKKwlmb3IgKGogPSAwOyBqIDwgbnVtX21lbW9yeV9jaHVua3M7IGorKyl7CisJCXN0cnVjdCBub2RlX21lbW9yeV9jaHVua19zICogY2h1bmsgPSAmbm9kZV9tZW1vcnlfY2h1bmtbal07CisJCXByaW50aygiY2h1bmsgJWQgbmlkICVkIHN0YXJ0X3BmbiAlMDhseCBlbmRfcGZuICUwOGx4XG4iLAorCQkgICAgICAgaiwgY2h1bmstPm5pZCwgY2h1bmstPnN0YXJ0X3BmbiwgY2h1bmstPmVuZF9wZm4pOworCQlub2RlX3JlYWRfY2h1bmsoY2h1bmstPm5pZCwgY2h1bmspOworCX0KKyAKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCA9IG5vZGVfc3RhcnRfcGZuW25pZF07CisJCXVuc2lnbmVkIGxvbmcgZW5kID0gbm9kZV9lbmRfcGZuW25pZF07CisKKwkJbWVtb3J5X3ByZXNlbnQobmlkLCBzdGFydCwgZW5kKTsKKwkJbm9kZV9yZW1hcF9zaXplW25pZF0gPSBub2RlX21lbW1hcF9zaXplX2J5dGVzKG5pZCwgc3RhcnQsIGVuZCk7CisJfQorCXJldHVybiAxOworb3V0X2ZhaWw6CisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgZ2V0X21lbWNmZ19mcm9tX3NyYXQodm9pZCkKK3sKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciA9IE5VTEw7CisJc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqcnNkcCA9IE5VTEw7CisJc3RydWN0IGFjcGlfdGFibGVfcnNkdCAqcnNkdCA9IE5VTEw7CisJc3RydWN0IGFjcGlfcG9pbnRlciAqcnNkcF9hZGRyZXNzID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0IHNhdmVkX3JzZHQ7CisJaW50IHRhYmxlcyA9IDA7CisJaW50IGkgPSAwOworCisJYWNwaV9maW5kX3Jvb3RfcG9pbnRlcihBQ1BJX1BIWVNJQ0FMX0FERFJFU1NJTkcsIHJzZHBfYWRkcmVzcyk7CisKKwlpZiAocnNkcF9hZGRyZXNzLT5wb2ludGVyX3R5cGUgPT0gQUNQSV9QSFlTSUNBTF9QT0lOVEVSKSB7CisJCXByaW50aygiJXM6IGFzc2lnbmluZyBhZGRyZXNzIHRvIHJzZHBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJzZHAgPSAoc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqKQorCQkJCSh1MzIpcnNkcF9hZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsOworCX0gZWxzZSB7CisJCXByaW50aygiJXM6IHJzZHBfYWRkcmVzcyBpcyBub3QgYSBwaHlzaWNhbCBwb2ludGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9lcnI7CisJfQorCWlmICghcnNkcCkgeworCQlwcmludGsoIiVzOiBEaWRuJ3QgZmluZCBBQ1BJIHJvb3QhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJS44cyB2JWQgWyUuNnNdXG4iLCByc2RwLT5zaWduYXR1cmUsIHJzZHAtPnJldmlzaW9uLAorCQlyc2RwLT5vZW1faWQpOworCisJaWYgKHN0cm5jbXAocnNkcC0+c2lnbmF0dXJlLCBSU0RQX1NJRyxzdHJsZW4oUlNEUF9TSUcpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlNEUCB0YWJsZSBzaWduYXR1cmUgaW5jb3JyZWN0XG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcnNkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0ICopCisJICAgIGJvb3RfaW9yZW1hcChyc2RwLT5yc2R0X2FkZHJlc3MsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0KSk7CisKKwlpZiAoIXJzZHQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBBQ1BJOiBJbnZhbGlkIHJvb3Qgc3lzdGVtIGRlc2NyaXB0aW9uIHRhYmxlcyAoUlNEVClcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJaGVhZGVyID0gJiByc2R0LT5oZWFkZXI7CisKKwlpZiAoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgUlNEVF9TSUcsIHN0cmxlbihSU0RUX1NJRykpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFDUEk6IFJTRFQgc2lnbmF0dXJlIGluY29ycmVjdFxuIik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiAKKwkgKiBUaGUgbnVtYmVyIG9mIHRhYmxlcyBpcyBjb21wdXRlZCBieSB0YWtpbmcgdGhlIAorCSAqIHNpemUgb2YgYWxsIGVudHJpZXMgKGhlYWRlciBzaXplIG1pbnVzIHRvdGFsIAorCSAqIHNpemUgb2YgUlNEVCkgZGl2aWRlZCBieSB0aGUgc2l6ZSBvZiBlYWNoIGVudHJ5CisJICogKDQtYnl0ZSB0YWJsZSBwb2ludGVycykuCisJICovCisJdGFibGVzID0gKGhlYWRlci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIC8gNDsKKworCWlmICghdGFibGVzKQorCQlnb3RvIG91dF9lcnI7CisKKwltZW1jcHkoJnNhdmVkX3JzZHQsIHJzZHQsIHNpemVvZihzYXZlZF9yc2R0KSk7CisKKwlpZiAoc2F2ZWRfcnNkdC5oZWFkZXIubGVuZ3RoID4gc2l6ZW9mKHNhdmVkX3JzZHQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFDUEk6IFRvbyBiaWcgbGVuZ3RoIGluIFJTRFQ6ICVkXG4iLAorCQkgICAgICAgc2F2ZWRfcnNkdC5oZWFkZXIubGVuZ3RoKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCXByaW50aygiQmVnaW4gU1JBVCB0YWJsZSBzY2FuLi4uLlxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGFibGVzOyBpKyspIHsKKwkJLyogTWFwIGluIGhlYWRlciwgdGhlbiBtYXAgaW4gZnVsbCB0YWJsZSBsZW5ndGguICovCisJCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKKwkJCWJvb3RfaW9yZW1hcChzYXZlZF9yc2R0LmVudHJ5W2ldLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCWlmICghaGVhZGVyKQorCQkJYnJlYWs7CisJCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKKwkJCWJvb3RfaW9yZW1hcChzYXZlZF9yc2R0LmVudHJ5W2ldLCBoZWFkZXItPmxlbmd0aCk7CisJCWlmICghaGVhZGVyKQorCQkJYnJlYWs7CisKKwkJaWYgKHN0cm5jbXAoKGNoYXIgKikgJmhlYWRlci0+c2lnbmF0dXJlLCAiU1JBVCIsIDQpKQorCQkJY29udGludWU7CisKKwkJLyogd2UndmUgZm91bmQgdGhlIHNyYXQgdGFibGUuIGRvbid0IG5lZWQgdG8gbG9vayBhdCBhbnkgbW9yZSB0YWJsZXMgKi8KKwkJcmV0dXJuIGFjcGkyMF9wYXJzZV9zcmF0KChzdHJ1Y3QgYWNwaV90YWJsZV9zcmF0ICopaGVhZGVyKTsKKwl9CitvdXRfZXJyOgorCXByaW50aygiZmFpbGVkIHRvIGdldCBOVU1BIG1lbW9yeSBpbmZvcm1hdGlvbiBmcm9tIFNSQVQgdGFibGVcbiIpOworCXJldHVybiAwOworfQorCisvKiBGb3IgZWFjaCBub2RlIHJ1biB0aGUgbWVtb3J5IGxpc3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgYXJlCisgKiBhbnkgbWVtb3J5IGhvbGVzLiAgRm9yIGVhY2ggaG9sZSBkZXRlcm1pbmUgd2hpY2ggWk9ORSB0aGV5IGZhbGwKKyAqIGludG8uCisgKgorICogTk9URSMxOiB0aGlzIHJlcXVpcmVzIGtub3dsZWRnZSBvZiB0aGUgem9uZSBib3VuZHJpZXMgYW5kIHNvCisgKiBfY2Fubm90XyBiZSBwZXJmb3JtZWQgYmVmb3JlIHRob3NlIGFyZSBjYWxjdWxhdGVkIGluIHNldHVwX21lbW9yeS4KKyAqIAorICogTk9URSMyOiB3ZSByZWx5IG9uIHRoZSBmYWN0IHRoYXQgdGhlIG1lbW9yeSBjaHVua3MgYXJlIG9yZGVyZWQgYnkKKyAqIHN0YXJ0IHBmbiBudW1iZXIgZHVyaW5nIHNldHVwLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgZ2V0X3pob2xlc19pbml0KHZvaWQpCit7CisJaW50IG5pZDsKKwlpbnQgYzsKKwlpbnQgZmlyc3Q7CisJdW5zaWduZWQgbG9uZyBlbmQgPSAwOworCisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCWZpcnN0ID0gMTsKKwkJZm9yIChjID0gMDsgYyA8IG51bV9tZW1vcnlfY2h1bmtzOyBjKyspeworCQkJaWYgKG5vZGVfbWVtb3J5X2NodW5rW2NdLm5pZCA9PSBuaWQpIHsKKwkJCQlpZiAoZmlyc3QpIHsKKwkJCQkJZW5kID0gbm9kZV9tZW1vcnlfY2h1bmtbY10uZW5kX3BmbjsKKwkJCQkJZmlyc3QgPSAwOworCisJCQkJfSBlbHNlIHsKKwkJCQkJLyogUmVjb3JkIGFueSBnYXAgYmV0d2VlbiB0aGlzIGNodW5rCisJCQkJCSAqIGFuZCB0aGUgcHJldmlvdXMgY2h1bmsgb24gdGhpcyBub2RlCisJCQkJCSAqIGFnYWluc3QgdGhlIHpvbmVzIGl0IHNwYW5zLgorCQkJCQkgKi8KKwkJCQkJY2h1bmtfdG9fem9uZXMoZW5kLAorCQkJCQkJbm9kZV9tZW1vcnlfY2h1bmtbY10uc3RhcnRfcGZuLAorCQkJCQkJJnpob2xlc19zaXplW25pZCAqIE1BWF9OUl9aT05FU10pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKwordW5zaWduZWQgbG9uZyAqIF9faW5pdCBnZXRfemhvbGVzX3NpemUoaW50IG5pZCkKK3sKKwlpZiAoIXpob2xlc19zaXplX2luaXQpIHsKKwkJemhvbGVzX3NpemVfaW5pdCsrOworCQlnZXRfemhvbGVzX2luaXQoKTsKKwl9CisJaWYgKG5pZCA+PSBNQVhfTlVNTk9ERVMgfHwgIW5vZGVfb25saW5lKG5pZCkpCisJCXByaW50aygiJXM6IG5pZCA9ICVkIGlzIGludmFsaWQvb2ZmbGluZS4gbnVtX29ubGluZV9ub2RlcyA9ICVkIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgbmlkLCBudW1fb25saW5lX25vZGVzKCkpOworCXJldHVybiAmemhvbGVzX3NpemVbbmlkICogTUFYX05SX1pPTkVTXTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc3VtbWl0LmMgYi9hcmNoL2kzODYva2VybmVsL3N1bW1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTAxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3N1bW1pdC5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogYXJjaC9pMzg2L2tlcm5lbC9zdW1taXQuYyAtIElCTSBTdW1taXQtU3BlY2lmaWMgQ29kZQorICoKKyAqIFdyaXR0ZW4gQnk6IE1hdHRoZXcgRG9ic29uLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnAuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTZW5kIGZlZWRiYWNrIHRvIDxjb2xwYXRjaEB1cy5pYm0uY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtc3VtbWl0L21hY2hfbXBwYXJzZS5oPgorCitzdGF0aWMgc3RydWN0IHJpb190YWJsZV9oZHIgKnJpb190YWJsZV9oZHIgX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3Qgc2NhbF9kZXRhaWwgICAqc2NhbF9kZXZzW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgcmlvX2RldGFpbCAgICAqcmlvX2RldnNbTUFYX05VTU5PREVTKjRdIF9faW5pdGRhdGE7CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3BjaV9ub2RlX21hcF9mb3Jfd3BlZyhpbnQgd3BlZ19udW0sIGludCBsYXN0X2J1cykKK3sKKwlpbnQgdHdpc3RlciA9IDAsIG5vZGUgPSAwOworCWludCBpLCBidXMsIG51bV9idXNlczsKKworCWZvcihpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9yaW9fZGV2OyBpKyspeworCQlpZiAocmlvX2RldnNbaV0tPm5vZGVfaWQgPT0gcmlvX2RldnNbd3BlZ19udW1dLT5vd25lcl9pZCl7CisJCQl0d2lzdGVyID0gcmlvX2RldnNbaV0tPm93bmVyX2lkOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXYpeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZG4ndCBmaW5kIG93bmVyIEN5Y2xvbmUgZm9yIFdpbm5pcGVnIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIGxhc3RfYnVzOworCX0KKworCWZvcihpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9zY2FsX2RldjsgaSsrKXsKKwkJaWYgKHNjYWxfZGV2c1tpXS0+bm9kZV9pZCA9PSB0d2lzdGVyKXsKKwkJCW5vZGUgPSBzY2FsX2RldnNbaV0tPm5vZGVfaWQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSByaW9fdGFibGVfaGRyLT5udW1fc2NhbF9kZXYpeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZG4ndCBmaW5kIG93bmVyIFR3aXN0ZXIgZm9yIEN5Y2xvbmUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gbGFzdF9idXM7CisJfQorCisJc3dpdGNoIChyaW9fZGV2c1t3cGVnX251bV0tPnR5cGUpeworCWNhc2UgQ29tcGF0V1BFRzoKKwkJLyogVGhlIENvbXBhdGFiaWxpdHkgV2lubmlwZWcgY29udHJvbHMgdGhlIDIgbGVnYWN5IGJ1c2VzLAorCQkgKiB0aGUgNjZNSHogUENJIGJ1cyBbMiBzbG90c10gYW5kIHRoZSAyICJleHRyYSIgYnVzZXMgaW4gY2FzZQorCQkgKiBhIFBDSS1QQ0kgYnJpZGdlIGNhcmQgaXMgdXNlZCBpbiBlaXRoZXIgc2xvdDogdG90YWwgNSBidXNlcy4KKwkJICovCisJCW51bV9idXNlcyA9IDU7CisJCWJyZWFrOworCWNhc2UgQWx0V1BFRzoKKwkJLyogVGhlIEFsdGVybmF0ZSBXaW5uaXBlZyBjb250cm9scyB0aGUgMiAxMzNNSHogYnVzZXMgWzEgc2xvdAorCQkgKiBlYWNoXSwgdGhlaXIgMiAiZXh0cmEiIGJ1c2VzLCB0aGUgMTAwTUh6IGJ1cyBbMiBzbG90c10gYW5kCisJCSAqIHRoZSAiZXh0cmEiIGJ1c2VzIGZvciBlYWNoIG9mIHRob3NlIHNsb3RzOiB0b3RhbCA3IGJ1c2VzLgorCQkgKi8KKwkJbnVtX2J1c2VzID0gNzsKKwkJYnJlYWs7CisJY2FzZSBMb29rT3V0QVdQRUc6CisJY2FzZSBMb29rT3V0QldQRUc6CisJCS8qIEEgTG9va291dCBXaW5uaXBlZyBjb250cm9scyAzIDEwME1IeiBidXNlcyBbMiBzbG90cyBlYWNoXQorCQkgKiAmIHRoZSAiZXh0cmEiIGJ1c2VzIGZvciBlYWNoIG9mIHRob3NlIHNsb3RzOiB0b3RhbCA5IGJ1c2VzLgorCQkgKi8KKwkJbnVtX2J1c2VzID0gOTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuc3VwcG9ydGVkIFdpbm5pcGVnIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gbGFzdF9idXM7CisJfQorCisJZm9yKGJ1cyA9IGxhc3RfYnVzOyBidXMgPCBsYXN0X2J1cyArIG51bV9idXNlczsgYnVzKyspCisJCW1wX2J1c19pZF90b19ub2RlW2J1c10gPSBub2RlOworCXJldHVybiBidXM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGJ1aWxkX2RldGFpbF9hcnJheXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwlpbnQgaSwgc2NhbF9kZXRhaWxfc2l6ZSwgcmlvX2RldGFpbF9zaXplOworCisJaWYgKHJpb190YWJsZV9oZHItPm51bV9zY2FsX2RldiA+IE1BWF9OVU1OT0RFUyl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNQVhfTlVNTk9ERVMgdG9vIGxvdyEgIERlZmluZWQgYXMgJWQsIGJ1dCBzeXN0ZW0gaGFzICVkIG5vZGVzLlxuIiwgX19GVU5DVElPTl9fLCBNQVhfTlVNTk9ERVMsIHJpb190YWJsZV9oZHItPm51bV9zY2FsX2Rldik7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAocmlvX3RhYmxlX2hkci0+dmVyc2lvbil7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgUmlvIEdyYW5kZSBUYWJsZSBWZXJzaW9uOiAlZFxuIiwgX19GVU5DVElPTl9fLCByaW9fdGFibGVfaGRyLT52ZXJzaW9uKTsKKwkJcmV0dXJuIDA7CisJY2FzZSAyOgorCQlzY2FsX2RldGFpbF9zaXplID0gMTE7CisJCXJpb19kZXRhaWxfc2l6ZSA9IDEzOworCQlicmVhazsKKwljYXNlIDM6CisJCXNjYWxfZGV0YWlsX3NpemUgPSAxMjsKKwkJcmlvX2RldGFpbF9zaXplID0gMTU7CisJCWJyZWFrOworCX0KKworCXB0ciA9ICh1bnNpZ25lZCBsb25nKXJpb190YWJsZV9oZHIgKyAzOworCWZvcihpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9zY2FsX2RldjsgaSsrLCBwdHIgKz0gc2NhbF9kZXRhaWxfc2l6ZSkKKwkJc2NhbF9kZXZzW2ldID0gKHN0cnVjdCBzY2FsX2RldGFpbCAqKXB0cjsKKworCWZvcihpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9yaW9fZGV2OyBpKyssIHB0ciArPSByaW9fZGV0YWlsX3NpemUpCisJCXJpb19kZXZzW2ldID0gKHN0cnVjdCByaW9fZGV0YWlsICopcHRyOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgX19pbml0IHNldHVwX3N1bW1pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcJCXB0cjsKKwl1bnNpZ25lZCBzaG9ydAkJb2Zmc2V0OworCWludAkJCWksIG5leHRfd3BlZywgbmV4dF9idXMgPSAwOworCisJLyogVGhlIHBvaW50ZXIgdG8gdGhlIEVCREEgaXMgc3RvcmVkIGluIHRoZSB3b3JkIEAgcGh5cyAweDQwRSg0MDowRSkgKi8KKwlwdHIgPSAqKHVuc2lnbmVkIHNob3J0ICopcGh5c190b192aXJ0KDB4NDBFdWwpOworCXB0ciA9ICh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChwdHIgPDwgNCk7CisKKwlyaW9fdGFibGVfaGRyID0gTlVMTDsKKwlvZmZzZXQgPSAweDE4MDsKKwl3aGlsZSAob2Zmc2V0KXsKKwkJLyogVGhlIGJsb2NrIGlkIGlzIHN0b3JlZCBpbiB0aGUgMm5kIHdvcmQgKi8KKwkJaWYgKCooKHVuc2lnbmVkIHNob3J0ICopKHB0ciArIG9mZnNldCArIDIpKSA9PSAweDQ3NTIpeworCQkJLyogc2V0IHRoZSBwb2ludGVyIHBhc3QgdGhlIG9mZnNldCAmIGJsb2NrIGlkICovCisJCQlyaW9fdGFibGVfaGRyID0gKHN0cnVjdCByaW9fdGFibGVfaGRyICopKHB0ciArIG9mZnNldCArIDQpOworCQkJYnJlYWs7CisJCX0KKwkJLyogVGhlIG5leHQgb2Zmc2V0IGlzIHN0b3JlZCBpbiB0aGUgMXN0IHdvcmQuICAwIG1lYW5zIG5vIG1vcmUgKi8KKwkJb2Zmc2V0ID0gKigodW5zaWduZWQgc2hvcnQgKikocHRyICsgb2Zmc2V0KSk7CisJfQorCWlmICghcmlvX3RhYmxlX2hkcil7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBsb2NhdGUgUmlvIEdyYW5kZSBUYWJsZSBpbiBFQkRBIC0gYmFpbGluZyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWJ1aWxkX2RldGFpbF9hcnJheXMoKSkKKwkJcmV0dXJuOworCisJLyogVGhlIGZpcnN0IFdpbm5pcGVnIHdlJ3JlIGxvb2tpbmcgZm9yIGhhcyBhbiBpbmRleCBvZiAwICovCisJbmV4dF93cGVnID0gMDsKKwlkbyB7CisJCWZvcihpID0gMDsgaSA8IHJpb190YWJsZV9oZHItPm51bV9yaW9fZGV2OyBpKyspeworCQkJaWYgKGlzX1dQRUcocmlvX2RldnNbaV0pICYmIHJpb19kZXZzW2ldLT5XUF9pbmRleCA9PSBuZXh0X3dwZWcpeworCQkJCS8qIEl0J3MgdGhlIFdpbm5pcGVnIHdlJ3JlIGxvb2tpbmcgZm9yISAqLworCQkJCW5leHRfYnVzID0gc2V0dXBfcGNpX25vZGVfbWFwX2Zvcl93cGVnKGksIG5leHRfYnVzKTsKKwkJCQluZXh0X3dwZWcrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBJZiB3ZSBnbyB0aHJvdWdoIGFsbCBSaW8gZGV2aWNlcyBhbmQgZG9uJ3QgZmluZCBvbmUgd2l0aAorCQkgKiB0aGUgbmV4dCBpbmRleCwgaXQgbWVhbnMgd2UndmUgZm91bmQgYWxsIHRoZSBXaW5uaXBlZ3MsCisJCSAqIGFuZCB0aHVzIGFsbCB0aGUgUENJIGJ1c2VzLgorCQkgKi8KKwkJaWYgKGkgPT0gcmlvX3RhYmxlX2hkci0+bnVtX3Jpb19kZXYpCisJCQluZXh0X3dwZWcgPSAwOworCX0gd2hpbGUgKG5leHRfd3BlZyAhPSAwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzX2kzODYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzX2kzODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGE2MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNfaTM4Ni5jCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogbGludXgvYXJjaC9pMzg2L2tlcm5lbC9zeXNfaTM4Ni5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHZhcmlvdXMgcmFuZG9tIHN5c3RlbSBjYWxscyB0aGF0CisgKiBoYXZlIGEgbm9uLXN0YW5kYXJkIGNhbGxpbmcgc2VxdWVuY2Ugb24gdGhlIExpbnV4L2kzODYKKyAqIHBsYXRmb3JtLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L21zZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NobS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXBjLmg+CisKKy8qCisgKiBzeXNfcGlwZSgpIGlzIHRoZSBub3JtYWwgQyBjYWxsaW5nIHN0YW5kYXJkIGZvciBjcmVhdGluZworICogYSBwaXBlLiBJdCdzIG5vdCB0aGUgd2F5IFVuaXggdHJhZGl0aW9uYWxseSBkb2VzIHRoaXMsIHRob3VnaC4KKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX3BpcGUodW5zaWduZWQgbG9uZyBfX3VzZXIgKiBmaWxkZXMpCit7CisJaW50IGZkWzJdOworCWludCBlcnJvcjsKKworCWVycm9yID0gZG9fcGlwZShmZCk7CisJaWYgKCFlcnJvcikgeworCQlpZiAoY29weV90b191c2VyKGZpbGRlcywgZmQsIDIqc2l6ZW9mKGludCkpKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qIGNvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcyAqLworc3RhdGljIGlubGluZSBsb25nIGRvX21tYXAyKAorCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCXVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCit7CisJaW50IGVycm9yID0gLUVCQURGOworCXN0cnVjdCBmaWxlICogZmlsZSA9IE5VTEw7CisKKwlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7CisJaWYgKCEoZmxhZ3MgJiBNQVBfQU5PTllNT1VTKSkgeworCQlmaWxlID0gZmdldChmZCk7CisJCWlmICghZmlsZSkKKwkJCWdvdG8gb3V0OworCX0KKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJZXJyb3IgPSBkb19tbWFwX3Bnb2ZmKGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCWlmIChmaWxlKQorCQlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKKwl1bnNpZ25lZCBsb25nIGZkLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQoreworCXJldHVybiBkb19tbWFwMihhZGRyLCBsZW4sIHByb3QsIGZsYWdzLCBmZCwgcGdvZmYpOworfQorCisvKgorICogUGVyZm9ybSB0aGUgc2VsZWN0KG5kLCBpbiwgb3V0LCBleCwgdHYpIGFuZCBtbWFwKCkgc3lzdGVtCisgKiBjYWxscy4gTGludXgvaTM4NiBkaWRuJ3QgdXNlIHRvIGJlIGFibGUgdG8gaGFuZGxlIG1vcmUgdGhhbgorICogNCBzeXN0ZW0gY2FsbCBwYXJhbWV0ZXJzLCBzbyB0aGVzZSBzeXN0ZW0gY2FsbHMgdXNlZCBhIG1lbW9yeQorICogYmxvY2sgZm9yIHBhcmFtZXRlciBwYXNzaW5nLi4KKyAqLworCitzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgbG9uZyBwcm90OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmZDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKK307CisKK2FzbWxpbmthZ2UgaW50IG9sZF9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgX191c2VyICphcmcpCit7CisJc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBhOworCWludCBlcnIgPSAtRUZBVUxUOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZhLCBhcmcsIHNpemVvZihhKSkpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoYS5vZmZzZXQgJiB+UEFHRV9NQVNLKQorCQlnb3RvIG91dDsKKworCWVyciA9IGRvX21tYXAyKGEuYWRkciwgYS5sZW4sIGEucHJvdCwgYS5mbGFncywgYS5mZCwgYS5vZmZzZXQgPj4gUEFHRV9TSElGVCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCitzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbjsKKwlmZF9zZXQgX191c2VyICppbnAsICpvdXRwLCAqZXhwOworCXN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdHZwOworfTsKKworYXNtbGlua2FnZSBpbnQgb2xkX3NlbGVjdChzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgX191c2VyICphcmcpCit7CisJc3RydWN0IHNlbF9hcmdfc3RydWN0IGE7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmEsIGFyZywgc2l6ZW9mKGEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJLyogc3lzX3NlbGVjdCgpIGRvZXMgdGhlIGFwcHJvcHJpYXRlIGtlcm5lbCBsb2NraW5nICovCisJcmV0dXJuIHN5c19zZWxlY3QoYS5uLCBhLmlucCwgYS5vdXRwLCBhLmV4cCwgYS50dnApOworfQorCisvKgorICogc3lzX2lwYygpIGlzIHRoZSBkZS1tdWx0aXBsZXhlciBmb3IgdGhlIFN5c1YgSVBDIGNhbGxzLi4KKyAqCisgKiBUaGlzIGlzIHJlYWxseSBob3JyaWJseSB1Z2x5LgorICovCithc21saW5rYWdlIGludCBzeXNfaXBjICh1aW50IGNhbGwsIGludCBmaXJzdCwgaW50IHNlY29uZCwKKwkJCWludCB0aGlyZCwgdm9pZCBfX3VzZXIgKnB0ciwgbG9uZyBmaWZ0aCkKK3sKKwlpbnQgdmVyc2lvbiwgcmV0OworCisJdmVyc2lvbiA9IGNhbGwgPj4gMTY7IC8qIGhhY2sgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKwljYWxsICY9IDB4ZmZmZjsKKworCXN3aXRjaCAoY2FsbCkgeworCWNhc2UgU0VNT1A6CisJCXJldHVybiBzeXNfc2VtdGltZWRvcCAoZmlyc3QsIChzdHJ1Y3Qgc2VtYnVmIF9fdXNlciAqKXB0ciwgc2Vjb25kLCBOVUxMKTsKKwljYXNlIFNFTVRJTUVET1A6CisJCXJldHVybiBzeXNfc2VtdGltZWRvcChmaXJzdCwgKHN0cnVjdCBzZW1idWYgX191c2VyICopcHRyLCBzZWNvbmQsCisJCQkJCShjb25zdCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopZmlmdGgpOworCisJY2FzZSBTRU1HRVQ6CisJCXJldHVybiBzeXNfc2VtZ2V0IChmaXJzdCwgc2Vjb25kLCB0aGlyZCk7CisJY2FzZSBTRU1DVEw6IHsKKwkJdW5pb24gc2VtdW4gZm91cnRoOworCQlpZiAoIXB0cikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZ2V0X3VzZXIoZm91cnRoLl9fcGFkLCAodm9pZCBfX3VzZXIgKiBfX3VzZXIgKikgcHRyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gc3lzX3NlbWN0bCAoZmlyc3QsIHNlY29uZCwgdGhpcmQsIGZvdXJ0aCk7CisJfQorCisJY2FzZSBNU0dTTkQ6CisJCXJldHVybiBzeXNfbXNnc25kIChmaXJzdCwgKHN0cnVjdCBtc2didWYgX191c2VyICopIHB0ciwgCisJCQkJICAgc2Vjb25kLCB0aGlyZCk7CisJY2FzZSBNU0dSQ1Y6CisJCXN3aXRjaCAodmVyc2lvbikgeworCQljYXNlIDA6IHsKKwkJCXN0cnVjdCBpcGNfa2x1ZGdlIHRtcDsKKwkJCWlmICghcHRyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwKKwkJCQkJICAgKHN0cnVjdCBpcGNfa2x1ZGdlIF9fdXNlciAqKSBwdHIsIAorCQkJCQkgICBzaXplb2YgKHRtcCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIHN5c19tc2dyY3YgKGZpcnN0LCB0bXAubXNncCwgc2Vjb25kLAorCQkJCQkgICB0bXAubXNndHlwLCB0aGlyZCk7CisJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybiBzeXNfbXNncmN2IChmaXJzdCwKKwkJCQkJICAgKHN0cnVjdCBtc2didWYgX191c2VyICopIHB0ciwKKwkJCQkJICAgc2Vjb25kLCBmaWZ0aCwgdGhpcmQpOworCQl9CisJY2FzZSBNU0dHRVQ6CisJCXJldHVybiBzeXNfbXNnZ2V0ICgoa2V5X3QpIGZpcnN0LCBzZWNvbmQpOworCWNhc2UgTVNHQ1RMOgorCQlyZXR1cm4gc3lzX21zZ2N0bCAoZmlyc3QsIHNlY29uZCwgKHN0cnVjdCBtc3FpZF9kcyBfX3VzZXIgKikgcHRyKTsKKworCWNhc2UgU0hNQVQ6CisJCXN3aXRjaCAodmVyc2lvbikgeworCQlkZWZhdWx0OiB7CisJCQl1bG9uZyByYWRkcjsKKwkJCXJldCA9IGRvX3NobWF0IChmaXJzdCwgKGNoYXIgX191c2VyICopIHB0ciwgc2Vjb25kLCAmcmFkZHIpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIHB1dF91c2VyIChyYWRkciwgKHVsb25nIF9fdXNlciAqKSB0aGlyZCk7CisJCX0KKwkJY2FzZSAxOgkvKiBpQkNTMiBlbXVsYXRvciBlbnRyeSBwb2ludCAqLworCQkJaWYgKCFzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkvKiBUaGUgIih1bG9uZyAqKSB0aGlyZCIgaXMgdmFsaWQgX29ubHlfIGJlY2F1c2Ugb2YgdGhlIGtlcm5lbCBzZWdtZW50IHRoaW5nICovCisJCQlyZXR1cm4gZG9fc2htYXQgKGZpcnN0LCAoY2hhciBfX3VzZXIgKikgcHRyLCBzZWNvbmQsICh1bG9uZyAqKSB0aGlyZCk7CisJCX0KKwljYXNlIFNITURUOiAKKwkJcmV0dXJuIHN5c19zaG1kdCAoKGNoYXIgX191c2VyICopcHRyKTsKKwljYXNlIFNITUdFVDoKKwkJcmV0dXJuIHN5c19zaG1nZXQgKGZpcnN0LCBzZWNvbmQsIHRoaXJkKTsKKwljYXNlIFNITUNUTDoKKwkJcmV0dXJuIHN5c19zaG1jdGwgKGZpcnN0LCBzZWNvbmQsCisJCQkJICAgKHN0cnVjdCBzaG1pZF9kcyBfX3VzZXIgKikgcHRyKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9Cit9CisKKy8qCisgKiBPbGQgY3J1ZnQKKyAqLworYXNtbGlua2FnZSBpbnQgc3lzX3VuYW1lKHN0cnVjdCBvbGRfdXRzbmFtZSBfX3VzZXIgKiBuYW1lKQoreworCWludCBlcnI7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkb3duX3JlYWQoJnV0c19zZW0pOworCWVycj1jb3B5X3RvX3VzZXIobmFtZSwgJnN5c3RlbV91dHNuYW1lLCBzaXplb2YgKCpuYW1lKSk7CisJdXBfcmVhZCgmdXRzX3NlbSk7CisJcmV0dXJuIGVycj8tRUZBVUxUOjA7Cit9CisKK2FzbWxpbmthZ2UgaW50IHN5c19vbGR1bmFtZShzdHJ1Y3Qgb2xkb2xkX3V0c25hbWUgX191c2VyICogbmFtZSkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiAtRUZBVUxUOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSxuYW1lLHNpemVvZihzdHJ1Y3Qgb2xkb2xkX3V0c25hbWUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisgIAorICAJZG93bl9yZWFkKCZ1dHNfc2VtKTsKKwkKKwllcnJvciA9IF9fY29weV90b191c2VyKCZuYW1lLT5zeXNuYW1lLCZzeXN0ZW1fdXRzbmFtZS5zeXNuYW1lLF9fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fcHV0X3VzZXIoMCxuYW1lLT5zeXNuYW1lK19fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fY29weV90b191c2VyKCZuYW1lLT5ub2RlbmFtZSwmc3lzdGVtX3V0c25hbWUubm9kZW5hbWUsX19PTERfVVRTX0xFTik7CisJZXJyb3IgfD0gX19wdXRfdXNlcigwLG5hbWUtPm5vZGVuYW1lK19fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fY29weV90b191c2VyKCZuYW1lLT5yZWxlYXNlLCZzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlLF9fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fcHV0X3VzZXIoMCxuYW1lLT5yZWxlYXNlK19fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fY29weV90b191c2VyKCZuYW1lLT52ZXJzaW9uLCZzeXN0ZW1fdXRzbmFtZS52ZXJzaW9uLF9fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fcHV0X3VzZXIoMCxuYW1lLT52ZXJzaW9uK19fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fY29weV90b191c2VyKCZuYW1lLT5tYWNoaW5lLCZzeXN0ZW1fdXRzbmFtZS5tYWNoaW5lLF9fT0xEX1VUU19MRU4pOworCWVycm9yIHw9IF9fcHV0X3VzZXIoMCxuYW1lLT5tYWNoaW5lK19fT0xEX1VUU19MRU4pOworCQorCXVwX3JlYWQoJnV0c19zZW0pOworCQorCWVycm9yID0gZXJyb3IgPyAtRUZBVUxUIDogMDsKKworCXJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzZW50ZXIuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzZW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjBkOGJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNlbnRlci5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBsaW51eC9hcmNoL2kzODYva2VybmVsL3N5c2VudGVyLmMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG5lZWRlZCBpbml0aWFsaXphdGlvbnMgdG8gc3VwcG9ydCBzeXNlbnRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKworI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHN5c2VudGVyX2VudHJ5KHZvaWQpOworCit2b2lkIGVuYWJsZV9zZXBfY3B1KHZvaWQgKmluZm8pCit7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisKKwl0c3MtPnNzMSA9IF9fS0VSTkVMX0NTOworCXRzcy0+ZXNwMSA9IHNpemVvZihzdHJ1Y3QgdHNzX3N0cnVjdCkgKyAodW5zaWduZWQgbG9uZykgdHNzOworCXdybXNyKE1TUl9JQTMyX1NZU0VOVEVSX0NTLCBfX0tFUk5FTF9DUywgMCk7CisJd3Jtc3IoTVNSX0lBMzJfU1lTRU5URVJfRVNQLCB0c3MtPmVzcDEsIDApOworCXdybXNyKE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwgKHVuc2lnbmVkIGxvbmcpIHN5c2VudGVyX2VudHJ5LCAwKTsKKwlwdXRfY3B1KCk7CQorfQorCisvKgorICogVGhlc2Ugc3ltYm9scyBhcmUgZGVmaW5lZCBieSB2c3lzY2FsbC5vIHRvIG1hcmsgdGhlIGJvdW5kcworICogb2YgdGhlIEVMRiBEU08gaW1hZ2VzIGluY2x1ZGVkIHRoZXJlaW4uCisgKi8KK2V4dGVybiBjb25zdCBjaGFyIHZzeXNjYWxsX2ludDgwX3N0YXJ0LCB2c3lzY2FsbF9pbnQ4MF9lbmQ7CitleHRlcm4gY29uc3QgY2hhciB2c3lzY2FsbF9zeXNlbnRlcl9zdGFydCwgdnN5c2NhbGxfc3lzZW50ZXJfZW5kOworCitzdGF0aWMgaW50IF9faW5pdCBzeXNlbnRlcl9zZXR1cCh2b2lkKQoreworCXZvaWQgKnBhZ2UgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKKworCV9fc2V0X2ZpeG1hcChGSVhfVlNZU0NBTEwsIF9fcGEocGFnZSksIFBBR0VfUkVBRE9OTFlfRVhFQyk7CisKKwlpZiAoIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9TRVApKSB7CisJCW1lbWNweShwYWdlLAorCQkgICAgICAgJnZzeXNjYWxsX2ludDgwX3N0YXJ0LAorCQkgICAgICAgJnZzeXNjYWxsX2ludDgwX2VuZCAtICZ2c3lzY2FsbF9pbnQ4MF9zdGFydCk7CisJCXJldHVybiAwOworCX0KKworCW1lbWNweShwYWdlLAorCSAgICAgICAmdnN5c2NhbGxfc3lzZW50ZXJfc3RhcnQsCisJICAgICAgICZ2c3lzY2FsbF9zeXNlbnRlcl9lbmQgLSAmdnN5c2NhbGxfc3lzZW50ZXJfc3RhcnQpOworCisJb25fZWFjaF9jcHUoZW5hYmxlX3NlcF9jcHUsIE5VTEwsIDEsIDEpOworCXJldHVybiAwOworfQorCitfX2luaXRjYWxsKHN5c2VudGVyX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1NWUzMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCkBAIC0wLDAgKzEsNDc2IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5NSAgTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFBDLXNwZWNpZmljIHRpbWUgaGFuZGxpbmcgZGV0YWlsczoKKyAqIHJlYWRpbmcgdGhlIFJUQyBhdCBib290dXAsIGV0Yy4uCisgKiAxOTk0LTA3LTAyICAgIEFsYW4gTW9kcmEKKyAqCWZpeGVkIHNldF9ydGNfbW1zcywgZml4ZWQgdGltZS55ZWFyIGZvciA+PSAyMDAwLCBuZXcgbWt0aW1lCisgKiAxOTk1LTAzLTI2ICAgIE1hcmt1cyBLdWhuCisgKiAgICAgIGZpeGVkIDUwMCBtcyBidWcgYXQgY2FsbCB0byBzZXRfcnRjX21tc3MsIGZpeGVkIERTMTI4ODcKKyAqICAgICAgcHJlY2lzaW9uIENNT1MgY2xvY2sgdXBkYXRlCisgKiAxOTk2LTA1LTAzICAgIEluZ28gTW9sbmFyCisgKiAgICAgIGZpeGVkIHRpbWUgd2FycHMgaW4gZG9fW3Nsb3d8ZmFzdF1fZ2V0dGltZW9mZnNldCgpCisgKiAxOTk3LTA5LTEwCVVwZGF0ZWQgTlRQIGNvZGUgYWNjb3JkaW5nIHRvIHRlY2huaWNhbCBtZW1vcmFuZHVtIEphbiAnOTYKKyAqCQkiQSBLZXJuZWwgTW9kZWwgZm9yIFByZWNpc2lvbiBUaW1la2VlcGluZyIgYnkgRGF2ZSBNaWxscworICogMTk5OC0wOS0wNSAgICAoVmFyaW91cykKKyAqCU1vcmUgcm9idXN0IGRvX2Zhc3RfZ2V0dGltZW9mZnNldCgpIGFsZ29yaXRobSBpbXBsZW1lbnRlZAorICoJKHdvcmtzIHdpdGggQVBNLCBDeXJpeCA2eDg2TVggYW5kIENlbnRhdXIgQzYpLAorICoJbW9ub3RvbmljIGdldHRpbWVvZmRheSgpIHdpdGggZmFzdF9nZXRfdGltZW9mZnNldCgpLAorICoJZHJpZnQtcHJvb2YgcHJlY2lzaW9uIFRTQyBjYWxpYnJhdGlvbiBvbiBib290CisgKgkoQy4gU2NvdHQgQW5hbmlhbiA8Y2FuYW5pYW5AYWx1bW5pLnByaW5jZXRvbi5lZHU+LCBBbmRyZXcgRC4KKyAqCUJhbHNhIDxhbmRyZWJhbHNhQGFsdGVybi5vcmc+LCBQaGlsaXAgR2xhZHN0b25lIDxwaGlsaXBAcmFwdG9yLmNvbT47CisgKglwb3J0ZWQgZnJvbSAyLjAuMzUgSnVtYm8tOSBieSBNaWNoYWVsIEtyYXVzZSA8bS5rcmF1c2VAdHUtaGFyYnVyZy5kZT4pLgorICogMTk5OC0xMi0xNiAgICBBbmRyZWEgQXJjYW5nZWxpCisgKglGaXhlZCBKdW1iby05IGNvZGUgaW4gMi4xLjEzMTogZG9fZ2V0dGltZW9mZGF5IHdhcyBtaXNzaW5nIDEgamlmZnkKKyAqCWJlY2F1c2Ugd2FzIG5vdCBhY2NvdW50aW5nIGxvc3RfdGlja3MuCisgKiAxOTk4LTEyLTI0IENvcHlyaWdodCAoQykgMTk5OCAgQW5kcmVhIEFyY2FuZ2VsaQorICoJRml4ZWQgYSB4dGltZSBTTVAgcmFjZSAod2UgbmVlZCB0aGUgeHRpbWVfbG9jayBydyBzcGlubG9jayB0bworICoJc2VyaWFsaXplIGFjY2Vzc2VzIHRvIHh0aW1lL2xvc3RfdGlja3MpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKworI2luY2x1ZGUgIm1hY2hfdGltZS5oIgorCisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorCisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKworZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTlBX2xvY2s7CitpbnQgcGl0X2xhdGNoX2J1Z2d5OyAgICAgICAgICAgICAgLyogZXh0ZXJuICovCisKKyNpbmNsdWRlICJkb190aW1lci5oIgorCit1NjQgamlmZmllc182NCA9IElOSVRJQUxfSklGRklFUzsKKworRVhQT1JUX1NZTUJPTChqaWZmaWVzXzY0KTsKKwordW5zaWduZWQgbG9uZyBjcHVfa2h6OwkvKiBEZXRlY3RlZCBhcyB3ZSBjYWxpYnJhdGUgdGhlIFRTQyAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyB3YWxsX2ppZmZpZXM7CisKK0RFRklORV9TUElOTE9DSyhydGNfbG9jayk7CisKK0RFRklORV9TUElOTE9DSyhpODI1M19sb2NrKTsKK0VYUE9SVF9TWU1CT0woaTgyNTNfbG9jayk7CisKK3N0cnVjdCB0aW1lcl9vcHRzICpjdXJfdGltZXIgPSAmdGltZXJfbm9uZTsKKworLyoKKyAqIFRoaXMgaXMgYSBzcGVjaWFsIGxvY2sgdGhhdCBpcyBvd25lZCBieSB0aGUgQ1BVIGFuZCBob2xkcyB0aGUgaW5kZXgKKyAqIHJlZ2lzdGVyIHdlIGFyZSB3b3JraW5nIHdpdGguICBJdCBpcyByZXF1aXJlZCBmb3IgTk1JIGFjY2VzcyB0byB0aGUKKyAqIENNT1MvUlRDIHJlZ2lzdGVycy4gIFNlZSBpbmNsdWRlL2FzbS1pMzg2L21jMTQ2ODE4cnRjLmggZm9yIGRldGFpbHMuCisgKi8KK3ZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY21vc19sb2NrID0gMDsKK0VYUE9SVF9TWU1CT0woY21vc19sb2NrKTsKKworLyogUm91dGluZXMgZm9yIGFjY2Vzc2luZyB0aGUgQ01PUyBSQU0vUlRDLiAqLwordW5zaWduZWQgY2hhciBydGNfY21vc19yZWFkKHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwlsb2NrX2Ntb3NfcHJlZml4KGFkZHIpOworCW91dGJfcChhZGRyLCBSVENfUE9SVCgwKSk7CisJdmFsID0gaW5iX3AoUlRDX1BPUlQoMSkpOworCWxvY2tfY21vc19zdWZmaXgoYWRkcik7CisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0wocnRjX2Ntb3NfcmVhZCk7CisKK3ZvaWQgcnRjX2Ntb3Nfd3JpdGUodW5zaWduZWQgY2hhciB2YWwsIHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwlsb2NrX2Ntb3NfcHJlZml4KGFkZHIpOworCW91dGJfcChhZGRyLCBSVENfUE9SVCgwKSk7CisJb3V0Yl9wKHZhbCwgUlRDX1BPUlQoMSkpOworCWxvY2tfY21vc19zdWZmaXgoYWRkcik7Cit9CitFWFBPUlRfU1lNQk9MKHJ0Y19jbW9zX3dyaXRlKTsKKworLyoKKyAqIFRoaXMgdmVyc2lvbiBvZiBnZXR0aW1lb2ZkYXkgaGFzIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24KKyAqIGFuZCBiZXR0ZXIgdGhhbiBtaWNyb3NlY29uZCBwcmVjaXNpb24gb24gZmFzdCB4ODYgbWFjaGluZXMgd2l0aCBUU0MuCisgKi8KK3ZvaWQgZG9fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dikKK3sKKwl1bnNpZ25lZCBsb25nIHNlcTsKKwl1bnNpZ25lZCBsb25nIHVzZWMsIHNlYzsKKwl1bnNpZ25lZCBsb25nIG1heF9udHBfdGljazsKKworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBsb3N0OworCisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOworCisJCXVzZWMgPSBjdXJfdGltZXItPmdldF9vZmZzZXQoKTsKKwkJbG9zdCA9IGppZmZpZXMgLSB3YWxsX2ppZmZpZXM7CisKKwkJLyoKKwkJICogSWYgdGltZV9hZGp1c3QgaXMgbmVnYXRpdmUgdGhlbiBOVFAgaXMgc2xvd2luZyB0aGUgY2xvY2sKKwkJICogc28gbWFrZSBzdXJlIG5vdCB0byBnbyBpbnRvIG5leHQgcG9zc2libGUgaW50ZXJ2YWwuCisJCSAqIEJldHRlciB0byBsb3NlIHNvbWUgYWNjdXJhY3kgdGhhbiBoYXZlIHRpbWUgZ28gYmFja3dhcmRzLi4KKwkJICovCisJCWlmICh1bmxpa2VseSh0aW1lX2FkanVzdCA8IDApKSB7CisJCQltYXhfbnRwX3RpY2sgPSAoVVNFQ19QRVJfU0VDIC8gSFopIC0gdGlja2FkajsKKwkJCXVzZWMgPSBtaW4odXNlYywgbWF4X250cF90aWNrKTsKKworCQkJaWYgKGxvc3QpCisJCQkJdXNlYyArPSBsb3N0ICogbWF4X250cF90aWNrOworCQl9CisJCWVsc2UgaWYgKHVubGlrZWx5KGxvc3QpKQorCQkJdXNlYyArPSBsb3N0ICogKFVTRUNfUEVSX1NFQyAvIEhaKTsKKworCQlzZWMgPSB4dGltZS50dl9zZWM7CisJCXVzZWMgKz0gKHh0aW1lLnR2X25zZWMgLyAxMDAwKTsKKwl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKKworCXdoaWxlICh1c2VjID49IDEwMDAwMDApIHsKKwkJdXNlYyAtPSAxMDAwMDAwOworCQlzZWMrKzsKKwl9CisKKwl0di0+dHZfc2VjID0gc2VjOworCXR2LT50dl91c2VjID0gdXNlYzsKK30KKworRVhQT1JUX1NZTUJPTChkb19nZXR0aW1lb2ZkYXkpOworCitpbnQgZG9fc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpCit7CisJdGltZV90IHd0bV9zZWMsIHNlYyA9IHR2LT50dl9zZWM7CisJbG9uZyB3dG1fbnNlYywgbnNlYyA9IHR2LT50dl9uc2VjOworCisJaWYgKCh1bnNpZ25lZCBsb25nKXR2LT50dl9uc2VjID49IE5TRUNfUEVSX1NFQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9zZXFsb2NrX2lycSgmeHRpbWVfbG9jayk7CisJLyoKKwkgKiBUaGlzIGlzIHJldm9sdGluZy4gV2UgbmVlZCB0byBzZXQgInh0aW1lIiBjb3JyZWN0bHkuIEhvd2V2ZXIsIHRoZQorCSAqIHZhbHVlIGluIHRoaXMgbG9jYXRpb24gaXMgdGhlIHZhbHVlIGF0IHRoZSBtb3N0IHJlY2VudCB1cGRhdGUgb2YKKwkgKiB3YWxsIHRpbWUuICBEaXNjb3ZlciB3aGF0IGNvcnJlY3Rpb24gZ2V0dGltZW9mZGF5KCkgd291bGQgaGF2ZQorCSAqIG1hZGUsIGFuZCB0aGVuIHVuZG8gaXQhCisJICovCisJbnNlYyAtPSBjdXJfdGltZXItPmdldF9vZmZzZXQoKSAqIE5TRUNfUEVSX1VTRUM7CisJbnNlYyAtPSAoamlmZmllcyAtIHdhbGxfamlmZmllcykgKiBUSUNLX05TRUM7CisKKwl3dG1fc2VjICA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyArICh4dGltZS50dl9zZWMgLSBzZWMpOworCXd0bV9uc2VjID0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyArICh4dGltZS50dl9uc2VjIC0gbnNlYyk7CisKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7CisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7CisKKwl0aW1lX2FkanVzdCA9IDA7CQkvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KKwl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOworCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwljbG9ja193YXNfc2V0KCk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woZG9fc2V0dGltZW9mZGF5KTsKKworc3RhdGljIGludCBzZXRfcnRjX21tc3ModW5zaWduZWQgbG9uZyBub3d0aW1lKQoreworCWludCByZXR2YWw7CisKKwlXQVJOX09OKGlycXNfZGlzYWJsZWQoKSk7CisKKwkvKiBnZXRzIHJlY2FsbGVkIHdpdGggaXJxIGxvY2FsbHkgZGlzYWJsZWQgKi8KKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisJaWYgKGVmaV9lbmFibGVkKQorCQlyZXR2YWwgPSBlZmlfc2V0X3J0Y19tbXNzKG5vd3RpbWUpOworCWVsc2UKKwkJcmV0dmFsID0gbWFjaF9zZXRfcnRjX21tc3Mobm93dGltZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK2ludCB0aW1lcl9hY2s7CisKKy8qIG1vbm90b25pY19jbG9jaygpOiByZXR1cm5zICMgb2YgbmFub3NlY29uZHMgcGFzc2VkIHNpbmNlIHRpbWVfaW5pdCgpCisgKgkJTm90ZTogVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byByZXR1cm4gYWNjdXJhdGUKKyAqCQl0aW1lIGV2ZW4gaW4gdGhlIGFic2VuY2Ugb2YgbXVsdGlwbGUgdGltZXIgdGlja3MuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gY3VyX3RpbWVyLT5tb25vdG9uaWNfY2xvY2soKTsKK30KK0VYUE9SVF9TWU1CT0wobW9ub3RvbmljX2Nsb2NrKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKK3Vuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHBjID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKKworCWlmIChpbl9sb2NrX2Z1bmN0aW9ucyhwYykpCisJCXJldHVybiAqKHVuc2lnbmVkIGxvbmcgKikocmVncy0+ZWJwICsgNCk7CisKKwlyZXR1cm4gcGM7Cit9CitFWFBPUlRfU1lNQk9MKHByb2ZpbGVfcGMpOworI2VuZGlmCisKKy8qCisgKiB0aW1lcl9pbnRlcnJ1cHQoKSBuZWVkcyB0byBrZWVwIHVwIHRoZSByZWFsLXRpbWUgY2xvY2ssCisgKiBhcyB3ZWxsIGFzIGNhbGwgdGhlICJkb190aW1lcigpIiByb3V0aW5lIGV2ZXJ5IGNsb2NrdGljaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCisJaWYgKHRpbWVyX2FjaykgeworCQkvKgorCQkgKiBTdWJ0bGUsIHdoZW4gSS9PIEFQSUNzIGFyZSB1c2VkIHdlIGhhdmUgdG8gYWNrIHRpbWVyIElSUQorCQkgKiBtYW51YWxseSB0byByZXNldCB0aGUgSVJSIGJpdCBmb3IgZG9fc2xvd19nZXR0aW1lb2Zmc2V0KCkuCisJCSAqIFRoaXMgd2lsbCBhbHNvIGRlYXNzZXJ0IE5NSSBsaW5lcyBmb3IgdGhlIHdhdGNoZG9nIGlmIHJ1bgorCQkgKiBvbiBhbiA4MjQ4OURYLWJhc2VkIHN5c3RlbS4KKwkJICovCisJCXNwaW5fbG9jaygmaTgyNTlBX2xvY2spOworCQlvdXRiKDB4MGMsIFBJQ19NQVNURVJfT0NXMyk7CisJCS8qIEFjayB0aGUgSVJROyBBRU9JIHdpbGwgZW5kIGl0IGF1dG9tYXRpY2FsbHkuICovCisJCWluYihQSUNfTUFTVEVSX1BPTEwpOworCQlzcGluX3VubG9jaygmaTgyNTlBX2xvY2spOworCX0KKyNlbmRpZgorCisJZG9fdGltZXJfaW50ZXJydXB0X2hvb2socmVncyk7CisKKworCWlmIChNQ0FfYnVzKSB7CisJCS8qIFRoZSBQUy8yIHVzZXMgbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdHMuICBZb3UgY2FuJ3QKKwkJdHVybiB0aGVtIG9mZiwgbm9yIHdvdWxkIHlvdSB3YW50IHRvIChhbnkgYXR0ZW1wdCB0bworCQllbmFibGUgZWRnZS10cmlnZ2VyZWQgaW50ZXJydXB0cyB1c3VhbGx5IGdldHMgaW50ZXJjZXB0ZWQgYnkgYQorCQlzcGVjaWFsIGhhcmR3YXJlIGNpcmN1aXQpLiAgSGVuY2Ugd2UgaGF2ZSB0byBhY2tub3dsZWRnZQorCQl0aGUgdGltZXIgaW50ZXJydXB0LiAgVGhyb3VnaCBzb21lIGluY3JlZGlibHkgc3R1cGlkCisJCWRlc2lnbiBpZGVhLCB0aGUgcmVzZXQgZm9yIElSUSAwIGlzIGRvbmUgYnkgc2V0dGluZyB0aGUKKwkJaGlnaCBiaXQgb2YgdGhlIFBQSSBwb3J0IEIgKDB4NjEpLiAgTm90ZSB0aGF0IHNvbWUgUFMvMnMsCisJCW5vdGFibHkgdGhlIDU1U1gsIHdvcmsgZmluZSBpZiB0aGlzIGlzIHJlbW92ZWQuICAqLworCisJCWlycSA9IGluYl9wKCAweDYxICk7CS8qIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgKi8KKwkJb3V0Yl9wKCBpcnF8MHg4MCwgMHg2MSApOwkvKiByZXNldCB0aGUgSVJRICovCisJfQorfQorCisvKgorICogVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUsIGV4Y2VwdCB3ZSBfYWxzb18gc2F2ZSB0aGUgY3VycmVudAorICogVGltZSBTdGFtcCBDb3VudGVyIHZhbHVlIGF0IHRoZSB0aW1lIG9mIHRoZSB0aW1lciBpbnRlcnJ1cHQsIHNvIHRoYXQKKyAqIHdlIGxhdGVyIG9uIGNhbiBlc3RpbWF0ZSB0aGUgdGltZSBvZiBkYXkgbW9yZSBleGFjdGx5LgorICovCitpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKgorCSAqIEhlcmUgd2UgYXJlIGluIHRoZSB0aW1lciBpcnEgaGFuZGxlci4gV2UganVzdCBoYXZlIGlycXMgbG9jYWxseQorCSAqIGRpc2FibGVkIGJ1dCB3ZSBkb24ndCBrbm93IGlmIHRoZSB0aW1lcl9iaCBpcyBydW5uaW5nIG9uIHRoZSBvdGhlcgorCSAqIENQVS4gV2UgbmVlZCB0byBhdm9pZCB0byBTTVAgcmFjZSB3aXRoIGl0LiBOT1RFOiB3ZSBkb24nIHQgbmVlZAorCSAqIHRoZSBpcnEgdmVyc2lvbiBvZiB3cml0ZV9sb2NrIGJlY2F1c2UgYXMganVzdCBzYWlkIHdlIGhhdmUgaXJxCisJICogbG9jYWxseSBkaXNhYmxlZC4gLWFyY2EKKwkgKi8KKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKworCWN1cl90aW1lci0+bWFya19vZmZzZXQoKTsKKyAKKwlkb190aW1lcl9pbnRlcnJ1cHQoaXJxLCBOVUxMLCByZWdzKTsKKworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBub3Qgc3RhdGljOiBuZWVkZWQgYnkgQVBNICovCit1bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJldHZhbDsKKworCXNwaW5fbG9jaygmcnRjX2xvY2spOworCisJaWYgKGVmaV9lbmFibGVkKQorCQlyZXR2YWwgPSBlZmlfZ2V0X3RpbWUoKTsKKwllbHNlCisJCXJldHZhbCA9IG1hY2hfZ2V0X2Ntb3NfdGltZSgpOworCisJc3Bpbl91bmxvY2soJnJ0Y19sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CitzdGF0aWMgdm9pZCBzeW5jX2Ntb3NfY2xvY2sodW5zaWduZWQgbG9uZyBkdW1teSk7CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzeW5jX2Ntb3NfdGltZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FUl9JTklUSUFMSVpFUihzeW5jX2Ntb3NfY2xvY2ssIDAsIDApOworCitzdGF0aWMgdm9pZCBzeW5jX2Ntb3NfY2xvY2sodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBub3csIG5leHQ7CisJaW50IGZhaWwgPSAxOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFuIGV4dGVybmFsbHkgc3luY2hyb25pemVkIExpbnV4IGNsb2NrLCB0aGVuIHVwZGF0ZQorCSAqIENNT1MgY2xvY2sgYWNjb3JkaW5nbHkgZXZlcnkgfjExIG1pbnV0ZXMuIFNldF9ydGNfbW1zcygpIGhhcyB0byBiZQorCSAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byA1MDAgbXMgYmVmb3JlIHRoZSBuZXcgc2Vjb25kIHN0YXJ0cy4KKwkgKiBUaGlzIGNvZGUgaXMgcnVuIG9uIGEgdGltZXIuICBJZiB0aGUgY2xvY2sgaXMgc2V0LCB0aGF0IHRpbWVyCisJICogbWF5IG5vdCBleHBpcmUgYXQgdGhlIGNvcnJlY3QgdGltZS4gIFRodXMsIHdlIGFkanVzdC4uLgorCSAqLworCWlmICgodGltZV9zdGF0dXMgJiBTVEFfVU5TWU5DKSAhPSAwKQorCQkvKgorCQkgKiBOb3Qgc3luY2VkLCBleGl0LCBkbyBub3QgcmVzdGFydCBhIHRpbWVyIChpZiBvbmUgaXMKKwkJICogcnVubmluZywgbGV0IGl0IHJ1biBvdXQpLgorCQkgKi8KKwkJcmV0dXJuOworCisJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCWlmIChub3cudHZfdXNlYyA+PSBVU0VDX0FGVEVSIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKKwkgICAgbm93LnR2X3VzZWMgPD0gVVNFQ19CRUZPUkUgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikKKwkJZmFpbCA9IHNldF9ydGNfbW1zcyhub3cudHZfc2VjKTsKKworCW5leHQudHZfdXNlYyA9IFVTRUNfQUZURVIgLSBub3cudHZfdXNlYzsKKwlpZiAobmV4dC50dl91c2VjIDw9IDApCisJCW5leHQudHZfdXNlYyArPSBVU0VDX1BFUl9TRUM7CisKKwlpZiAoIWZhaWwpCisJCW5leHQudHZfc2VjID0gNjU5OworCWVsc2UKKwkJbmV4dC50dl9zZWMgPSAwOworCisJaWYgKG5leHQudHZfdXNlYyA+PSBVU0VDX1BFUl9TRUMpIHsKKwkJbmV4dC50dl9zZWMrKzsKKwkJbmV4dC50dl91c2VjIC09IFVTRUNfUEVSX1NFQzsKKwl9CisJbW9kX3RpbWVyKCZzeW5jX2Ntb3NfdGltZXIsIGppZmZpZXMgKyB0aW1ldmFsX3RvX2ppZmZpZXMoJm5leHQpKTsKK30KKwordm9pZCBub3RpZnlfYXJjaF9jbW9zX3RpbWVyKHZvaWQpCit7CisJbW9kX3RpbWVyKCZzeW5jX2Ntb3NfdGltZXIsIGppZmZpZXMgKyAxKTsKK30KKworc3RhdGljIGxvbmcgY2xvY2tfY21vc19kaWZmLCBzbGVlcF9zdGFydDsKKworc3RhdGljIGludCB0aW1lcl9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHUzMiBzdGF0ZSkKK3sKKwkvKgorCSAqIEVzdGltYXRlIHRpbWUgem9uZSBzbyB0aGF0IHNldF90aW1lIGNhbiB1cGRhdGUgdGhlIGNsb2NrCisJICovCisJY2xvY2tfY21vc19kaWZmID0gLWdldF9jbW9zX3RpbWUoKTsKKwljbG9ja19jbW9zX2RpZmYgKz0gZ2V0X3NlY29uZHMoKTsKKwlzbGVlcF9zdGFydCA9IGdldF9jbW9zX3RpbWUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aW1lcl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgc2VjOworCXVuc2lnbmVkIGxvbmcgc2xlZXBfbGVuZ3RoOworCisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKwlpZiAoaXNfaHBldF9lbmFibGVkKCkpCisJCWhwZXRfcmVlbmFibGUoKTsKKyNlbmRpZgorCXNlYyA9IGdldF9jbW9zX3RpbWUoKSArIGNsb2NrX2Ntb3NfZGlmZjsKKwlzbGVlcF9sZW5ndGggPSAoZ2V0X2Ntb3NfdGltZSgpIC0gc2xlZXBfc3RhcnQpICogSFo7CisJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJeHRpbWUudHZfc2VjID0gc2VjOworCXh0aW1lLnR2X25zZWMgPSAwOworCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJamlmZmllcyArPSBzbGVlcF9sZW5ndGg7CisJd2FsbF9qaWZmaWVzICs9IHNsZWVwX2xlbmd0aDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgdGltZXJfc3lzY2xhc3MgPSB7CisJLnJlc3VtZSA9IHRpbWVyX3Jlc3VtZSwKKwkuc3VzcGVuZCA9IHRpbWVyX3N1c3BlbmQsCisJc2V0X2tzZXRfbmFtZSgidGltZXIiKSwKK307CisKKworLyogWFhYIHRoaXMgZHJpdmVyZnMgc3R1ZmYgc2hvdWxkIHByb2JhYmx5IGdvIGVsc2V3aGVyZSBsYXRlciAtam9obiAqLworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIGRldmljZV90aW1lciA9IHsKKwkuaWQJPSAwLAorCS5jbHMJPSAmdGltZXJfc3lzY2xhc3MsCit9OworCitzdGF0aWMgaW50IHRpbWVfaW5pdF9kZXZpY2Uodm9pZCkKK3sKKwlpbnQgZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnRpbWVyX3N5c2NsYXNzKTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX3RpbWVyKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2RldmljZV9pbml0Y2FsbCh0aW1lX2luaXRfZGV2aWNlKTsKKworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCitleHRlcm4gdm9pZCAoKmxhdGVfdGltZV9pbml0KSh2b2lkKTsKKy8qIER1cGxpY2F0ZSBvZiB0aW1lX2luaXQoKSBiZWxvdywgd2l0aCBocGV0X2VuYWJsZSBwYXJ0IGFkZGVkICovCitzdGF0aWMgdm9pZCBfX2luaXQgaHBldF90aW1lX2luaXQodm9pZCkKK3sKKwl4dGltZS50dl9zZWMgPSBnZXRfY21vc190aW1lKCk7CisJeHRpbWUudHZfbnNlYyA9IChJTklUSUFMX0pJRkZJRVMgJSBIWikgKiAoTlNFQ19QRVJfU0VDIC8gSFopOworCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKKwkJLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOworCisJaWYgKGhwZXRfZW5hYmxlKCkgPj0gMCkgeworCQlwcmludGsoIlVzaW5nIEhQRVQgZm9yIGJhc2UtdGltZXJcbiIpOworCX0KKworCWN1cl90aW1lciA9IHNlbGVjdF90aW1lcigpOworCXByaW50ayhLRVJOX0lORk8gIlVzaW5nICVzIGZvciBoaWdoLXJlcyB0aW1lc291cmNlXG4iLGN1cl90aW1lci0+bmFtZSk7CisKKwl0aW1lX2luaXRfaG9vaygpOworfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJaWYgKGlzX2hwZXRfY2FwYWJsZSgpKSB7CisJCS8qCisJCSAqIEhQRVQgaW5pdGlhbGl6YXRpb24gbmVlZHMgdG8gZG8gbWVtb3J5LW1hcHBlZCBpby4gU28sIGxldAorCQkgKiB1cyBkbyBhIGxhdGUgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgbWVtX2luaXQoKS4KKwkJICovCisJCWxhdGVfdGltZV9pbml0ID0gaHBldF90aW1lX2luaXQ7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwl4dGltZS50dl9zZWMgPSBnZXRfY21vc190aW1lKCk7CisJeHRpbWUudHZfbnNlYyA9IChJTklUSUFMX0pJRkZJRVMgJSBIWikgKiAoTlNFQ19QRVJfU0VDIC8gSFopOworCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKKwkJLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOworCisJY3VyX3RpbWVyID0gc2VsZWN0X3RpbWVyKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgJXMgZm9yIGhpZ2gtcmVzIHRpbWVzb3VyY2VcbiIsY3VyX3RpbWVyLT5uYW1lKTsKKworCXRpbWVfaW5pdF9ob29rKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVfaHBldC5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDRhMzFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYwpAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYva2VybmVsL3RpbWVfaHBldC5jCisgKiAgVGhpcyBjb2RlIGxhcmdlbHkgY29waWVkIGZyb20gYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYworICogIFNlZSB0aGF0IGZpbGUgZm9yIGNyZWRpdHMuCisgKgorICogIDIwMDMtMDYtMzAgICAgVmVua2F0ZXNoIFBhbGxpcGFkaSAtIEFkZGl0aW9uYWwgY2hhbmdlcyBmb3IgSFBFVCBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGxpbnV4L2hwZXQuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7CS8qIGZzZWNzIC8gSFBFVCBjbG9jayAqLwordW5zaWduZWQgbG9uZyBocGV0X3RpY2s7CQkvKiBocGV0IGNsa3MgY291bnQgcGVyIHRpY2sgKi8KK3Vuc2lnbmVkIGxvbmcgaHBldF9hZGRyZXNzOwkJLyogaHBldCBtZW1vcnkgbWFwIHBoeXNpY2FsIGFkZHJlc3MgKi8KKworc3RhdGljIGludCB1c2VfaHBldDsgCQkvKiBjYW4gYmUgdXNlZCBmb3IgcnVudGltZSBjaGVjayBvZiBocGV0ICovCitzdGF0aWMgaW50IGJvb3RfaHBldF9kaXNhYmxlOyAJLyogYm9vdHRpbWUgb3ZlcnJpZGUgZm9yIEhQRVQgdGltZXIgKi8KK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBocGV0X3ZpcnRfYWRkcmVzczsJLyogaHBldCBrZXJuZWwgdmlydHVhbCBhZGRyZXNzICovCisKKyNkZWZpbmUgRlNFQ19UT19VU0VDICgxMDAwMDAwMDAwVUwpCisKK2ludCBocGV0X3JlYWRsKHVuc2lnbmVkIGxvbmcgYSkKK3sKKwlyZXR1cm4gcmVhZGwoaHBldF92aXJ0X2FkZHJlc3MgKyBhKTsKK30KKworc3RhdGljIHZvaWQgaHBldF93cml0ZWwodW5zaWduZWQgbG9uZyBkLCB1bnNpZ25lZCBsb25nIGEpCit7CisJd3JpdGVsKGQsIGhwZXRfdmlydF9hZGRyZXNzICsgYSk7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKy8qCisgKiBIUEVUIGNvdW50ZXJzIGRvbnQgd3JhcCBhcm91bmQgb24gZXZlcnkgdGljay4gVGhleSBqdXN0IGNoYW5nZSB0aGUKKyAqIGNvbXBhcmF0b3IgdmFsdWUgYW5kIGNvbnRpbnVlLiBOZXh0IHRpY2sgY2FuIGJlIGNhdWdodCBieSBjaGVja2luZworICogZm9yIGEgY2hhbmdlIGluIHRoZSBjb21wYXJhdG9yIHZhbHVlLiBVc2VkIGluIGFwaWMuYy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHdhaXRfaHBldF90aWNrKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHN0YXJ0X2NtcF92YWwsIGVuZF9jbXBfdmFsOworCisJc3RhcnRfY21wX3ZhbCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApOworCWRvIHsKKwkJZW5kX2NtcF92YWwgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ01QKTsKKwl9IHdoaWxlIChzdGFydF9jbXBfdmFsID09IGVuZF9jbXBfdmFsKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGhwZXRfdGltZXJfc3RvcF9zZXRfZ28odW5zaWduZWQgbG9uZyB0aWNrKQoreworCXVuc2lnbmVkIGludCBjZmc7CisKKwkvKgorCSAqIFN0b3AgdGhlIHRpbWVycyBhbmQgcmVzZXQgdGhlIG1haW4gY291bnRlci4KKwkgKi8KKwljZmcgPSBocGV0X3JlYWRsKEhQRVRfQ0ZHKTsKKwljZmcgJj0gfkhQRVRfQ0ZHX0VOQUJMRTsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKKwlocGV0X3dyaXRlbCgwLCBIUEVUX0NPVU5URVIpOworCWhwZXRfd3JpdGVsKDAsIEhQRVRfQ09VTlRFUiArIDQpOworCisJLyoKKwkgKiBTZXQgdXAgdGltZXIgMCwgYXMgcGVyaW9kaWMgd2l0aCBmaXJzdCBpbnRlcnJ1cHQgdG8gaGFwcGVuIGF0CisJICogaHBldF90aWNrLCBhbmQgcGVyaW9kIGFsc28gaHBldF90aWNrLgorCSAqLworCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DRkcpOworCWNmZyB8PSBIUEVUX1ROX0VOQUJMRSB8IEhQRVRfVE5fUEVSSU9ESUMgfAorCSAgICAgICBIUEVUX1ROX1NFVFZBTCB8IEhQRVRfVE5fMzJCSVQ7CisJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QwX0NGRyk7CisKKwkvKgorCSAqIFRoZSBmaXJzdCB3cml0ZSBhZnRlciB3cml0aW5nIFROX1NFVFZBTCB0byB0aGUgY29uZmlnIHJlZ2lzdGVyIHNldHMKKwkgKiB0aGUgY291bnRlciB2YWx1ZSwgdGhlIHNlY29uZCB3cml0ZSBzZXRzIHRoZSB0aHJlc2hvbGQuCisJICovCisJaHBldF93cml0ZWwodGljaywgSFBFVF9UMF9DTVApOworCWhwZXRfd3JpdGVsKHRpY2ssIEhQRVRfVDBfQ01QKTsKKworCS8qCisgCSAqIEdvIQorIAkgKi8KKwljZmcgPSBocGV0X3JlYWRsKEhQRVRfQ0ZHKTsKKwljZmcgfD0gSFBFVF9DRkdfRU5BQkxFIHwgSFBFVF9DRkdfTEVHQUNZOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIEhQRVQgd2FzIGZvdW5kIGJ5IEFDUEkgYm9vdCBwYXJzZS4gSWYgeWVzIHNldHVwIEhQRVQKKyAqIGNvdW50ZXIgMCBmb3Iga2VybmVsIGJhc2UgdGltZXIuCisgKi8KK2ludCBfX2luaXQgaHBldF9lbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdW5zaWduZWQgbG9uZyB0aWNrX2ZzZWNfbG93LCB0aWNrX2ZzZWNfaGlnaDsgLyogdGljayBpbiBmZW10byBzZWMgKi8KKwl1bnNpZ25lZCBsb25nIGhwZXRfdGlja19yZW07CisKKwlpZiAoYm9vdF9ocGV0X2Rpc2FibGUpCisJCXJldHVybiAtMTsKKworCWlmICghaHBldF9hZGRyZXNzKSB7CisJCXJldHVybiAtMTsKKwl9CisJaHBldF92aXJ0X2FkZHJlc3MgPSBpb3JlbWFwX25vY2FjaGUoaHBldF9hZGRyZXNzLCBIUEVUX01NQVBfU0laRSk7CisJLyoKKwkgKiBSZWFkIHRoZSBwZXJpb2QsIGNvbXB1dGUgdGljayBhbmQgcXVvdGllbnQuCisJICovCisJaWQgPSBocGV0X3JlYWRsKEhQRVRfSUQpOworCisJLyoKKwkgKiBXZSBhcmUgY2hlY2tpbmcgZm9yIHZhbHVlICcxJyBvciBtb3JlIGluIG51bWJlciBmaWVsZCBpZgorCSAqIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDIGlzIHNldCBiZWNhdXNlIHdlIHdpbGwgbmVlZCBhbgorCSAqIGFkZGl0aW9uYWwgdGltZXIgZm9yIFJUQyBlbXVsYXRpb24uCisJICogSG93ZXZlciwgd2UgY2FuIGRvIHdpdGggb25lIHRpbWVyIG90aGVyd2lzZSB1c2luZyB0aGUKKwkgKiB0aGUgc2luZ2xlIEhQRVQgdGltZXIgZm9yIHN5c3RlbSB0aW1lLgorCSAqLworCWlmICgKKyNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQworCQkhKGlkICYgSFBFVF9JRF9OVU1CRVIpIHx8CisjZW5kaWYKKwkgICAgIShpZCAmIEhQRVRfSURfTEVHU1VQKSkKKwkJcmV0dXJuIC0xOworCisJaHBldF9wZXJpb2QgPSBocGV0X3JlYWRsKEhQRVRfUEVSSU9EKTsKKwlpZiAoKGhwZXRfcGVyaW9kIDwgSFBFVF9NSU5fUEVSSU9EKSB8fCAoaHBldF9wZXJpb2QgPiBIUEVUX01BWF9QRVJJT0QpKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIDY0IGJpdCBtYXRoCisJICogRmlyc3QgY2hhbmdpbmcgdGljayBpbnRvIGZzZWMKKwkgKiBUaGVuIDY0IGJpdCBkaXYgdG8gZmluZCBudW1iZXIgb2YgaHBldCBjbGsgcGVyIHRpY2sKKwkgKi8KKwlBU01fTVVMNjRfUkVHKHRpY2tfZnNlY19sb3csIHRpY2tfZnNlY19oaWdoLAorCQkJS0VSTkVMX1RJQ0tfVVNFQywgRlNFQ19UT19VU0VDKTsKKwlBU01fRElWNjRfUkVHKGhwZXRfdGljaywgaHBldF90aWNrX3JlbSwKKwkJCWhwZXRfcGVyaW9kLCB0aWNrX2ZzZWNfbG93LCB0aWNrX2ZzZWNfaGlnaCk7CisKKwlpZiAoaHBldF90aWNrX3JlbSA+IChocGV0X3BlcmlvZCA+PiAxKSkKKwkJaHBldF90aWNrKys7IC8qIHJvdW5kaW5nIHRoZSByZXN1bHQgKi8KKworCWlmIChocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljaykpCisJCXJldHVybiAtMTsKKworCXVzZV9ocGV0ID0gMTsKKworI2lmZGVmCUNPTkZJR19IUEVUCisJeworCQlzdHJ1Y3QgaHBldF9kYXRhCWhkOworCQl1bnNpZ25lZCBpbnQgCQludGltZXI7CisKKwkJbWVtc2V0KCZoZCwgMCwgc2l6ZW9mIChoZCkpOworCisJCW50aW1lciA9IGhwZXRfcmVhZGwoSFBFVF9JRCk7CisJCW50aW1lciA9IChudGltZXIgJiBIUEVUX0lEX05VTUJFUikgPj4gSFBFVF9JRF9OVU1CRVJfU0hJRlQ7CisJCW50aW1lcisrOworCisJCS8qCisJCSAqIFJlZ2lzdGVyIHdpdGggZHJpdmVyLgorCQkgKiBUaW1lcjAgYW5kIFRpbWVyMSBpcyB1c2VkIGJ5IHBsYXRmb3JtLgorCQkgKi8KKwkJaGQuaGRfcGh5c19hZGRyZXNzID0gaHBldF9hZGRyZXNzOworCQloZC5oZF9hZGRyZXNzID0gaHBldF92aXJ0X2FkZHJlc3M7CisJCWhkLmhkX25pcnFzID0gbnRpbWVyOworCQloZC5oZF9mbGFncyA9IEhQRVRfREFUQV9QTEFURk9STTsKKwkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMCk7CisjaWZkZWYJQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKKwkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMSk7CisjZW5kaWYKKwkJaGQuaGRfaXJxWzBdID0gSFBFVF9MRUdBQ1lfODI1NDsKKwkJaGQuaGRfaXJxWzFdID0gSFBFVF9MRUdBQ1lfUlRDOworCQlpZiAobnRpbWVyID4gMikgeworCQkJc3RydWN0IGhwZXQgX19pb21lbQkqaHBldDsKKwkJCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOworCQkJaW50CQkJaTsKKworCQkJaHBldCA9IGhwZXRfdmlydF9hZGRyZXNzOworCisJCQlmb3IgKGkgPSAyLCB0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1syXTsgaSA8IG50aW1lcjsKKwkJCQl0aW1lcisrLCBpKyspCisJCQkJaGQuaGRfaXJxW2ldID0gKHRpbWVyLT5ocGV0X2NvbmZpZyAmCisJCQkJCVRuX0lOVF9ST1VURV9DTkZfTUFTSykgPj4KKwkJCQkJVG5fSU5UX1JPVVRFX0NORl9TSElGVDsKKworCQl9CisKKwkJaHBldF9hbGxvYygmaGQpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJd2FpdF90aW1lcl90aWNrID0gd2FpdF9ocGV0X3RpY2s7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworaW50IGhwZXRfcmVlbmFibGUodm9pZCkKK3sKKwlyZXR1cm4gaHBldF90aW1lcl9zdG9wX3NldF9nbyhocGV0X3RpY2spOworfQorCitpbnQgaXNfaHBldF9lbmFibGVkKHZvaWQpCit7CisJcmV0dXJuIHVzZV9ocGV0OworfQorCitpbnQgaXNfaHBldF9jYXBhYmxlKHZvaWQpCit7CisJaWYgKCFib290X2hwZXRfZGlzYWJsZSAmJiBocGV0X2FkZHJlc3MpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBocGV0X3NldHVwKGNoYXIqIHN0cikKK3sKKwlpZiAoc3RyKSB7CisJCWlmICghc3RybmNtcCgiZGlzYWJsZSIsIHN0ciwgNykpCisJCQlib290X2hwZXRfZGlzYWJsZSA9IDE7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJocGV0PSIsIGhwZXRfc2V0dXApOworCisjaWZkZWYgQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKKy8qIEhQRVQgaW4gTGVnYWN5UmVwbGFjZW1lbnQgTW9kZSBlYXRzIHVwIFJUQyBpbnRlcnJ1cHQgbGluZS4gV2hlbiwgSFBFVAorICogaXMgZW5hYmxlZCwgd2Ugc3VwcG9ydCBSVEMgaW50ZXJydXB0IGZ1bmN0aW9uYWxpdHkgaW4gc29mdHdhcmUuCisgKiBSVEMgaGFzIDMga2luZHMgb2YgaW50ZXJydXB0czoKKyAqIDEpIFVwZGF0ZSBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQsIGV2ZXJ5IHNlYywgd2hlbiBSVEMgY2xvY2sKKyAqICAgIGlzIHVwZGF0ZWQKKyAqIDIpIEFsYXJtIEludGVycnVwdCAtIGdlbmVyYXRlIGFuIGludGVycnVwdCBhdCBhIHNwZWNpZmljIHRpbWUgb2YgZGF5CisgKiAzKSBQZXJpb2RpYyBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBwZXJpb2RpYyBpbnRlcnJ1cHQsIHdpdGggZnJlcXVlbmNpZXMKKyAqICAgIDJIei04MTkySHogKDJIei02NEh6IGZvciBub24tcm9vdCB1c2VyKSAoYWxsIGZyZXFzIGluIHBvd2VycyBvZiAyKQorICogKDEpIGFuZCAoMikgYWJvdmUgYXJlIGltcGxlbWVudGVkIHVzaW5nIHBvbGxpbmcgYXQgYSBmcmVxdWVuY3kgb2YKKyAqIDY0IEh6LiBUaGUgZXhhY3QgZnJlcXVlbmN5IGlzIGEgdHJhZGVvZmYgYmV0d2VlbiBhY2N1cmFjeSBhbmQgaW50ZXJydXB0CisgKiBvdmVyaGVhZC4gKERFRkFVTFRfUlRDX0lOVF9GUkVRKQorICogRm9yICgzKSwgd2UgdXNlIGludGVycnVwdHMgYXQgNjRIeiBvciB1c2VyIHNwZWNpZmllZCBwZXJpb2RpYworICogZnJlcXVlbmN5LCB3aGljaGV2ZXIgaXMgaGlnaGVyLgorICovCisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworZXh0ZXJuIGlycXJldHVybl90IHJ0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKyNkZWZpbmUgREVGQVVMVF9SVENfSU5UX0ZSRVEgCTY0CisjZGVmaW5lIFJUQ19OVU1fSU5UUyAJCTEKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgVUlFX29uOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl91cGRhdGVfc2VjOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBBSUVfb247CitzdGF0aWMgc3RydWN0IHJ0Y190aW1lIGFsYXJtX3RpbWU7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9vbjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfY291bnQ7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfcnRjX2ludF9mcmVxOyAvKiBSVEMgaW50ZXJydXB0IGZyZXF1ZW5jeSAqLworCisvKgorICogVGltZXIgMSBmb3IgUlRDLCB3ZSBkbyBub3QgdXNlIHBlcmlvZGljIGludGVycnVwdCBmZWF0dXJlLAorICogZXZlbiBpZiBIUEVUIHN1cHBvcnRzIHBlcmlvZGljIGludGVycnVwdHMgb24gVGltZXIgMS4KKyAqIFRoZSByZWFzb24gYmVpbmcsIHRvIHNldCB1cCBhIHBlcmlvZGljIGludGVycnVwdCBpbiBIUEVULCB3ZSBuZWVkIHRvCisgKiBzdG9wIHRoZSBtYWluIGNvdW50ZXIuIEFuZCBpZiB3ZSBkbyB0aGF0IGV2ZXJ5dGltZSBzb21lb25lIGRpYWJsZXMvZW5hYmxlcworICogUlRDLCB3ZSB3aWxsIGhhdmUgYWR2ZXJzZSBlZmZlY3Qgb24gbWFpbiBrZXJuZWwgdGltZXIgcnVubmluZyBvbiBUaW1lciAwLgorICogU28sIGZvciB0aGUgdGltZSBiZWluZywgc2ltdWxhdGUgdGhlIHBlcmlvZGljIGludGVycnVwdCBpbiBzb2Z0d2FyZS4KKyAqCisgKiBocGV0X3J0Y190aW1lcl9pbml0KCkgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgZHVyaW5nIHN1YnNlcXVlbnQKKyAqIGludGVydXBwdHMgcmVpbml0IGhhcHBlbnMgdGhyb3VnaCBocGV0X3J0Y190aW1lcl9yZWluaXQoKS4KKyAqLworaW50IGhwZXRfcnRjX3RpbWVyX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY2ZnLCBjbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCS8qCisJICogU2V0IHRoZSBjb3VudGVyIDEgYW5kIGVuYWJsZSB0aGUgaW50ZXJydXB0cy4KKwkgKi8KKwlpZiAoUElFX29uICYmIChQSUVfZnJlcSA+IERFRkFVTFRfUlRDX0lOVF9GUkVRKSkKKwkJaHBldF9ydGNfaW50X2ZyZXEgPSBQSUVfZnJlcTsKKwllbHNlCisJCWhwZXRfcnRjX2ludF9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY250ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCWNudCArPSAoKGhwZXRfdGljaypIWikvaHBldF9ydGNfaW50X2ZyZXEpOworCWhwZXRfd3JpdGVsKGNudCwgSFBFVF9UMV9DTVApOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOworCWNmZyB8PSBIUEVUX1ROX0VOQUJMRSB8IEhQRVRfVE5fU0VUVkFMIHwgSFBFVF9UTl8zMkJJVDsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfVDFfQ0ZHKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBocGV0X3J0Y190aW1lcl9yZWluaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY2ZnLCBjbnQ7CisKKwlpZiAoIShQSUVfb24gfCBBSUVfb24gfCBVSUVfb24pKQorCQlyZXR1cm47CisKKwlpZiAoUElFX29uICYmIChQSUVfZnJlcSA+IERFRkFVTFRfUlRDX0lOVF9GUkVRKSkKKwkJaHBldF9ydGNfaW50X2ZyZXEgPSBQSUVfZnJlcTsKKwllbHNlCisJCWhwZXRfcnRjX2ludF9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CisKKwkvKiBJdCBpcyBtb3JlIGFjY3VyYXRlIHRvIHVzZSB0aGUgY29tcGFyYXRvciB2YWx1ZSB0aGFuIGN1cnJlbnQgY291bnQuKi8KKwljbnQgPSBocGV0X3JlYWRsKEhQRVRfVDFfQ01QKTsKKwljbnQgKz0gaHBldF90aWNrKkhaL2hwZXRfcnRjX2ludF9mcmVxOworCWhwZXRfd3JpdGVsKGNudCwgSFBFVF9UMV9DTVApOworCisJY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7CisJY2ZnIHw9IEhQRVRfVE5fRU5BQkxFIHwgSFBFVF9UTl9TRVRWQUwgfCBIUEVUX1ROXzMyQklUOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOworCisJcmV0dXJuOworfQorCisvKgorICogVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY2FsbGVkIGZyb20gcnRjIGRyaXZlci4KKyAqIFJldHVybiAwIGlmIEhQRVQgaXMgbm90IGJlaW5nIHVzZWQuCisgKiBPdGhlcndpc2UgZG8gdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIGFuZCByZXR1cm4gMS4KKyAqLworaW50IGhwZXRfbWFza19ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJaWYgKGJpdF9tYXNrICYgUlRDX1VJRSkKKwkJVUlFX29uID0gMDsKKwlpZiAoYml0X21hc2sgJiBSVENfUElFKQorCQlQSUVfb24gPSAwOworCWlmIChiaXRfbWFzayAmIFJUQ19BSUUpCisJCUFJRV9vbiA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGhwZXRfc2V0X3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCit7CisJaW50IHRpbWVyX2luaXRfcmVxZCA9IDA7CisKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCWlmICghKFBJRV9vbiB8IEFJRV9vbiB8IFVJRV9vbikpCisJCXRpbWVyX2luaXRfcmVxZCA9IDE7CisKKwlpZiAoYml0X21hc2sgJiBSVENfVUlFKSB7CisJCVVJRV9vbiA9IDE7CisJfQorCWlmIChiaXRfbWFzayAmIFJUQ19QSUUpIHsKKwkJUElFX29uID0gMTsKKwkJUElFX2NvdW50ID0gMDsKKwl9CisJaWYgKGJpdF9tYXNrICYgUlRDX0FJRSkgeworCQlBSUVfb24gPSAxOworCX0KKworCWlmICh0aW1lcl9pbml0X3JlcWQpCisJCWhwZXRfcnRjX3RpbWVyX2luaXQoKTsKKworCXJldHVybiAxOworfQorCitpbnQgaHBldF9zZXRfYWxhcm1fdGltZSh1bnNpZ25lZCBjaGFyIGhycywgdW5zaWduZWQgY2hhciBtaW4sIHVuc2lnbmVkIGNoYXIgc2VjKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJYWxhcm1fdGltZS50bV9ob3VyID0gaHJzOworCWFsYXJtX3RpbWUudG1fbWluID0gbWluOworCWFsYXJtX3RpbWUudG1fc2VjID0gc2VjOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9wZXJpb2RpY19mcmVxKHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCVBJRV9mcmVxID0gZnJlcTsKKwlQSUVfY291bnQgPSAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3J0Y19kcm9wcGVkX2lycSh2b2lkKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK2lycXJldHVybl90IGhwZXRfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBydGNfdGltZSBjdXJyX3RpbWU7CisJdW5zaWduZWQgbG9uZyBydGNfaW50X2ZsYWcgPSAwOworCWludCBjYWxsX3J0Y19pbnRlcnJ1cHQgPSAwOworCisJaHBldF9ydGNfdGltZXJfcmVpbml0KCk7CisKKwlpZiAoVUlFX29uIHwgQUlFX29uKSB7CisJCXJ0Y19nZXRfcnRjX3RpbWUoJmN1cnJfdGltZSk7CisJfQorCWlmIChVSUVfb24pIHsKKwkJaWYgKGN1cnJfdGltZS50bV9zZWMgIT0gcHJldl91cGRhdGVfc2VjKSB7CisJCQkvKiBTZXQgdXBkYXRlIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCisJCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOworCQkJcnRjX2ludF9mbGFnID0gUlRDX1VGOworCQkJcHJldl91cGRhdGVfc2VjID0gY3Vycl90aW1lLnRtX3NlYzsKKwkJfQorCX0KKwlpZiAoUElFX29uKSB7CisJCVBJRV9jb3VudCsrOworCQlpZiAoUElFX2NvdW50ID49IGhwZXRfcnRjX2ludF9mcmVxL1BJRV9mcmVxKSB7CisJCQkvKiBTZXQgcGVyaW9kaWMgaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KKwkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7CisJCQlydGNfaW50X2ZsYWcgfD0gUlRDX1BGOworCQkJUElFX2NvdW50ID0gMDsKKwkJfQorCX0KKwlpZiAoQUlFX29uKSB7CisJCWlmICgoY3Vycl90aW1lLnRtX3NlYyA9PSBhbGFybV90aW1lLnRtX3NlYykgJiYKKwkJICAgIChjdXJyX3RpbWUudG1fbWluID09IGFsYXJtX3RpbWUudG1fbWluKSAmJgorCQkgICAgKGN1cnJfdGltZS50bV9ob3VyID09IGFsYXJtX3RpbWUudG1faG91cikpIHsKKwkJCS8qIFNldCBhbGFybSBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLworCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKKwkJCXJ0Y19pbnRfZmxhZyB8PSBSVENfQUY7CisJCX0KKwl9CisJaWYgKGNhbGxfcnRjX2ludGVycnVwdCkgeworCQlydGNfaW50X2ZsYWcgfD0gKFJUQ19JUlFGIHwgKFJUQ19OVU1fSU5UUyA8PCA4KSk7CisJCXJ0Y19pbnRlcnJ1cHQocnRjX2ludF9mbGFnLCBkZXZfaWQsIHJlZ3MpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmExMmJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIE1ha2VmaWxlIGZvciB4ODYgdGltZXJzCisjCisKK29iai15IDo9IHRpbWVyLm8gdGltZXJfbm9uZS5vIHRpbWVyX3RzYy5vIHRpbWVyX3BpdC5vIGNvbW1vbi5vCisKK29iai0kKENPTkZJR19YODZfQ1lDTE9ORV9USU1FUikJKz0gdGltZXJfY3ljbG9uZS5vCitvYmotJChDT05GSUdfSFBFVF9USU1FUikJKz0gdGltZXJfaHBldC5vCitvYmotJChDT05GSUdfWDg2X1BNX1RJTUVSKQkrPSB0aW1lcl9wbS5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy9jb21tb24uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjkwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy9jb21tb24uYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqCUNvbW1vbiBmdW5jdGlvbnMgdXNlZCBhY3Jvc3MgdGhlIHRpbWVycyBnbyBoZXJlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKworI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKKworLyogLS0tLS0tIENhbGlicmF0ZSB0aGUgVFNDIC0tLS0tLS0KKyAqIFJldHVybiAyXjMyICogKDEgLyAoVFNDIGNsb2NrcyBwZXIgdXNlYykpIGZvciBkb19mYXN0X2dldHRpbWVvZmZzZXQoKS4KKyAqIFRvbyBtdWNoIDY0LWJpdCBhcml0aG1ldGljIGhlcmUgdG8gZG8gdGhpcyBjbGVhbmx5IGluIEMsIGFuZCBmb3IKKyAqIGFjY3VyYWN5J3Mgc2FrZSB3ZSB3YW50IHRvIGtlZXAgdGhlIG92ZXJoZWFkIG9uIHRoZSBDVEMgc3BlYWtlciAoY2hhbm5lbCAyKQorICogb3V0cHV0IGJ1c3kgbG9vcCBhcyBsb3cgYXMgcG9zc2libGUuIFdlIGF2b2lkIHJlYWRpbmcgdGhlIENUQyByZWdpc3RlcnMKKyAqIGRpcmVjdGx5IGJlY2F1c2Ugb2YgdGhlIGF3a3dhcmQgOC1iaXQgYWNjZXNzIG1lY2hhbmlzbSBvZiB0aGUgODJDNTQKKyAqIGRldmljZS4KKyAqLworCisjZGVmaW5lIENBTElCUkFURV9USU1FCSg1ICogMTAwMDAyMC9IWikKKwordW5zaWduZWQgbG9uZyBfX2luaXQgY2FsaWJyYXRlX3RzYyh2b2lkKQoreworCW1hY2hfcHJlcGFyZV9jb3VudGVyKCk7CisKKwl7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnRsb3csIHN0YXJ0aGlnaDsKKwkJdW5zaWduZWQgbG9uZyBlbmRsb3csIGVuZGhpZ2g7CisJCXVuc2lnbmVkIGxvbmcgY291bnQ7CisKKwkJcmR0c2Moc3RhcnRsb3csc3RhcnRoaWdoKTsKKwkJbWFjaF9jb3VudHVwKCZjb3VudCk7CisJCXJkdHNjKGVuZGxvdyxlbmRoaWdoKTsKKworCisJCS8qIEVycm9yOiBFQ1RDTkVWRVJTRVQgKi8KKwkJaWYgKGNvdW50IDw9IDEpCisJCQlnb3RvIGJhZF9jdGM7CisKKwkJLyogNjQtYml0IHN1YnRyYWN0IC0gZ2NjIGp1c3QgbWVzc2VzIHVwIHdpdGggbG9uZyBsb25ncyAqLworCQlfX2FzbV9fKCJzdWJsICUyLCUwXG5cdCIKKwkJCSJzYmJsICUzLCUxIgorCQkJOiI9YSIgKGVuZGxvdyksICI9ZCIgKGVuZGhpZ2gpCisJCQk6ImciIChzdGFydGxvdyksICJnIiAoc3RhcnRoaWdoKSwKKwkJCSAiMCIgKGVuZGxvdyksICIxIiAoZW5kaGlnaCkpOworCisJCS8qIEVycm9yOiBFQ1BVVE9PRkFTVCAqLworCQlpZiAoZW5kaGlnaCkKKwkJCWdvdG8gYmFkX2N0YzsKKworCQkvKiBFcnJvcjogRUNQVVRPT1NMT1cgKi8KKwkJaWYgKGVuZGxvdyA8PSBDQUxJQlJBVEVfVElNRSkKKwkJCWdvdG8gYmFkX2N0YzsKKworCQlfX2FzbV9fKCJkaXZsICUyIgorCQkJOiI9YSIgKGVuZGxvdyksICI9ZCIgKGVuZGhpZ2gpCisJCQk6InIiIChlbmRsb3cpLCAiMCIgKDApLCAiMSIgKENBTElCUkFURV9USU1FKSk7CisKKwkJcmV0dXJuIGVuZGxvdzsKKwl9CisKKwkvKgorCSAqIFRoZSBDVEMgd2Fzbid0IHJlbGlhYmxlOiB3ZSBnb3QgYSBoaXQgb24gdGhlIHZlcnkgZmlyc3QgcmVhZCwKKwkgKiBvciB0aGUgQ1BVIHdhcyBzbyBmYXN0L3Nsb3cgdGhhdCB0aGUgcXVvdGllbnQgd291bGRuJ3QgZml0IGluCisJICogMzIgYml0cy4uCisJICovCitiYWRfY3RjOgorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKy8qIC0tLS0tLSBDYWxpYnJhdGUgdGhlIFRTQyB1c2luZyBIUEVUIC0tLS0tLS0KKyAqIFJldHVybiAyXjMyICogKDEgLyAoVFNDIGNsb2NrcyBwZXIgdXNlYykpIGZvciBnZXR0aW5nIHRoZSBDUFUgZnJlcS4KKyAqIFNlY29uZCBvdXRwdXQgaXMgcGFyYW1ldGVyIDEgKHdoZW4gbm9uIE5VTEwpCisgKiBTZXQgMl4zMiAqICgxIC8gKHRzYyBwZXIgSFBFVCBjbGspKSBmb3IgZGVsYXlfaHBldCgpLgorICogY2FsaWJyYXRlX3RzYygpIGNhbGlicmF0ZXMgdGhlIHByb2Nlc3NvciBUU0MgYnkgY29tcGFyaW5nCisgKiBpdCB0byB0aGUgSFBFVCB0aW1lciBvZiBrbm93biBmcmVxdWVuY3kuCisgKiBUb28gbXVjaCA2NC1iaXQgYXJpdGhtZXRpYyBoZXJlIHRvIGRvIHRoaXMgY2xlYW5seSBpbiBDCisgKi8KKyNkZWZpbmUgQ0FMSUJSQVRFX0NOVF9IUEVUIAkoNSAqIGhwZXRfdGljaykKKyNkZWZpbmUgQ0FMSUJSQVRFX1RJTUVfSFBFVCAJKDUgKiBLRVJORUxfVElDS19VU0VDKQorCit1bnNpZ25lZCBsb25nIF9faW5pdCBjYWxpYnJhdGVfdHNjX2hwZXQodW5zaWduZWQgbG9uZyAqdHNjX2hwZXRfcXVvdGllbnRfcHRyKQoreworCXVuc2lnbmVkIGxvbmcgdHNjX3N0YXJ0bG93LCB0c2Nfc3RhcnRoaWdoOworCXVuc2lnbmVkIGxvbmcgdHNjX2VuZGxvdywgdHNjX2VuZGhpZ2g7CisJdW5zaWduZWQgbG9uZyBocGV0X3N0YXJ0LCBocGV0X2VuZDsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCwgcmVtYWluOworCisJaHBldF9zdGFydCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwlyZHRzYyh0c2Nfc3RhcnRsb3csIHRzY19zdGFydGhpZ2gpOworCWRvIHsKKwkJaHBldF9lbmQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJfSB3aGlsZSAoKGhwZXRfZW5kIC0gaHBldF9zdGFydCkgPCBDQUxJQlJBVEVfQ05UX0hQRVQpOworCXJkdHNjKHRzY19lbmRsb3csIHRzY19lbmRoaWdoKTsKKworCS8qIDY0LWJpdCBzdWJ0cmFjdCAtIGdjYyBqdXN0IG1lc3NlcyB1cCB3aXRoIGxvbmcgbG9uZ3MgKi8KKwlfX2FzbV9fKCJzdWJsICUyLCUwXG5cdCIKKwkJInNiYmwgJTMsJTEiCisJCToiPWEiICh0c2NfZW5kbG93KSwgIj1kIiAodHNjX2VuZGhpZ2gpCisJCToiZyIgKHRzY19zdGFydGxvdyksICJnIiAodHNjX3N0YXJ0aGlnaCksCisJCSAiMCIgKHRzY19lbmRsb3cpLCAiMSIgKHRzY19lbmRoaWdoKSk7CisKKwkvKiBFcnJvcjogRUNQVVRPT0ZBU1QgKi8KKwlpZiAodHNjX2VuZGhpZ2gpCisJCWdvdG8gYmFkX2NhbGlicmF0aW9uOworCisJLyogRXJyb3I6IEVDUFVUT09TTE9XICovCisJaWYgKHRzY19lbmRsb3cgPD0gQ0FMSUJSQVRFX1RJTUVfSFBFVCkKKwkJZ290byBiYWRfY2FsaWJyYXRpb247CisKKwlBU01fRElWNjRfUkVHKHJlc3VsdCwgcmVtYWluLCB0c2NfZW5kbG93LCAwLCBDQUxJQlJBVEVfVElNRV9IUEVUKTsKKwlpZiAocmVtYWluID4gKHRzY19lbmRsb3cgPj4gMSkpCisJCXJlc3VsdCsrOyAvKiByb3VuZGluZyB0aGUgcmVzdWx0ICovCisKKwlpZiAodHNjX2hwZXRfcXVvdGllbnRfcHRyKSB7CisJCXVuc2lnbmVkIGxvbmcgdHNjX2hwZXRfcXVvdGllbnQ7CisKKwkJQVNNX0RJVjY0X1JFRyh0c2NfaHBldF9xdW90aWVudCwgcmVtYWluLCB0c2NfZW5kbG93LCAwLAorCQkJQ0FMSUJSQVRFX0NOVF9IUEVUKTsKKwkJaWYgKHJlbWFpbiA+ICh0c2NfZW5kbG93ID4+IDEpKQorCQkJdHNjX2hwZXRfcXVvdGllbnQrKzsgLyogcm91bmRpbmcgdGhlIHJlc3VsdCAqLworCQkqdHNjX2hwZXRfcXVvdGllbnRfcHRyID0gdHNjX2hwZXRfcXVvdGllbnQ7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK2JhZF9jYWxpYnJhdGlvbjoKKwkvKgorCSAqIHRoZSBDUFUgd2FzIHNvIGZhc3Qvc2xvdyB0aGF0IHRoZSBxdW90aWVudCB3b3VsZG4ndCBmaXQgaW4KKwkgKiAzMiBiaXRzLi4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBjYWxjdWxhdGUgY3B1X2toeiAqLwordm9pZCBfX2luaXQgaW5pdF9jcHVfa2h6KHZvaWQpCit7CisJaWYgKGNwdV9oYXNfdHNjKSB7CisJCXVuc2lnbmVkIGxvbmcgdHNjX3F1b3RpZW50ID0gY2FsaWJyYXRlX3RzYygpOworCQlpZiAodHNjX3F1b3RpZW50KSB7CisJCQkvKiByZXBvcnQgQ1BVIGNsb2NrIHJhdGUgaW4gSHouCisJCQkgKiBUaGUgZm9ybXVsYSBpcyAoMTBeNiAqIDJeMzIpIC8gKDJeMzIgKiAxIC8gKGNsb2Nrcy91cykpID0KKwkJCSAqIGNsb2NrL3NlY29uZC4gT3VyIHByZWNpc2lvbiBpcyBhYm91dCAxMDAgcHBtLgorCQkJICovCisJCQl7CXVuc2lnbmVkIGxvbmcgZWF4PTAsIGVkeD0xMDAwOworCQkJCV9fYXNtX18oImRpdmwgJTIiCisJCSAgICAgICAJCToiPWEiIChjcHVfa2h6KSwgIj1kIiAoZWR4KQorICAgICAgICAJICAgICAgIAkJOiJyIiAodHNjX3F1b3RpZW50KSwKKwkgICAgICAgICAgICAgICAgCSIwIiAoZWF4KSwgIjEiIChlZHgpKTsKKwkJCQlwcmludGsoIkRldGVjdGVkICVsdS4lMDNsdSBNSHogcHJvY2Vzc29yLlxuIiwgY3B1X2toeiAvIDEwMDAsIGNwdV9raHogJSAxMDAwKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDZhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lci5jCkBAIC0wLDAgKzEsNjYgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorLyoKKyAqIEhQRVQgbWVtb3J5IHJlYWQgaXMgc2xvd2VyIHRoYW4gdHNjIHJlYWRzLCBidXQgaXMgbW9yZSBkZXBlbmRhYmxlIGFzIGl0CisgKiBhbHdheXMgcnVucyBhdCBjb25zdGFudCBmcmVxdWVuY3kgYW5kIHJlZHVjZXMgY29tcGxleGl0eSBkdWUgdG8KKyAqIGNwdWZyZXEuIFNvLCB3ZSBwcmVmZXIgSFBFVCB0aW1lciB0byB0c2MgYmFzZWQgb25lLiBBbHNvLCB3ZSBjYW5ub3QgdXNlCisgKiB0aW1lcl9waXQgd2hlbiBIUEVUIGlzIGFjdGl2ZS4gU28sIHdlIGRlZmF1bHQgdG8gdGltZXJfdHNjLgorICovCisjZW5kaWYKKy8qIGxpc3Qgb2YgdGltZXJzLCBvcmRlcmVkIGJ5IHByZWZlcmVuY2UsIE5VTEwgdGVybWluYXRlZCAqLworc3RhdGljIHN0cnVjdCBpbml0X3RpbWVyX29wdHMqIF9faW5pdGRhdGEgdGltZXJzW10gPSB7CisjaWZkZWYgQ09ORklHX1g4Nl9DWUNMT05FX1RJTUVSCisJJnRpbWVyX2N5Y2xvbmVfaW5pdCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJJnRpbWVyX2hwZXRfaW5pdCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKKwkmdGltZXJfcG10bXJfaW5pdCwKKyNlbmRpZgorCSZ0aW1lcl90c2NfaW5pdCwKKwkmdGltZXJfcGl0X2luaXQsCisJTlVMTCwKK307CisKK3N0YXRpYyBjaGFyIGNsb2NrX292ZXJyaWRlWzEwXSBfX2luaXRkYXRhOworCitzdGF0aWMgaW50IF9faW5pdCBjbG9ja19zZXR1cChjaGFyKiBzdHIpCit7CisJaWYgKHN0cikKKwkJc3RybGNweShjbG9ja19vdmVycmlkZSwgc3RyLCBzaXplb2YoY2xvY2tfb3ZlcnJpZGUpKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImNsb2NrPSIsIGNsb2NrX3NldHVwKTsKKworCisvKiBUaGUgY2hvc2VuIHRpbWVzb3VyY2UgaGFzIGJlZW4gZm91bmQgdG8gYmUgYmFkLgorICogRmFsbCBiYWNrIHRvIGEga25vd24gZ29vZCB0aW1lc291cmNlICh0aGUgUElUKQorICovCit2b2lkIGNsb2NrX2ZhbGxiYWNrKHZvaWQpCit7CisJY3VyX3RpbWVyID0gJnRpbWVyX3BpdDsKK30KKworLyogaXRlcmF0ZXMgdGhyb3VnaCB0aGUgbGlzdCBvZiB0aW1lcnMsIHJldHVybmluZyB0aGUgZmlyc3QgCisgKiBvbmUgdGhhdCBpbml0aWFsaXplcyBzdWNjZXNzZnVsbHkuCisgKi8KK3N0cnVjdCB0aW1lcl9vcHRzKiBfX2luaXQgc2VsZWN0X3RpbWVyKHZvaWQpCit7CisJaW50IGkgPSAwOworCQorCS8qIGZpbmQgbW9zdCBwcmVmZXJyZWQgd29ya2luZyB0aW1lciAqLworCXdoaWxlICh0aW1lcnNbaV0pIHsKKwkJaWYgKHRpbWVyc1tpXS0+aW5pdCkKKwkJCWlmICh0aW1lcnNbaV0tPmluaXQoY2xvY2tfb3ZlcnJpZGUpID09IDApCisJCQkJcmV0dXJuIHRpbWVyc1tpXS0+b3B0czsKKwkJKytpOworCX0KKwkJCisJcGFuaWMoInNlbGVjdF90aW1lcjogQ2Fubm90IGZpbmQgYSBzdWl0YWJsZSB0aW1lclxuIik7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9jeWNsb25lLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9jeWNsb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmMTIwNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2N5Y2xvbmUuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoJQ3ljbG9uZS10aW1lcjogCisgKgkJVGhpcyBjb2RlIGltcGxlbWVudHMgdGltZXJfb3BzIGZvciB0aGUgY3ljbG9uZSBjb3VudGVyIGZvdW5kCisgKgkJb24gSUJNIHg0NDAsIHgzNjAsIGFuZCBvdGhlciBTdW1taXQgYmFzZWQgc3lzdGVtcy4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDIgSUJNLCBKb2huIFN0dWx0eiAoam9obnN0dWxAdXMuaWJtLmNvbSkKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKworZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKworLyogTnVtYmVyIG9mIHVzZWNzIHRoYXQgdGhlIGxhc3QgaW50ZXJydXB0IHdhcyBkZWxheWVkICovCitzdGF0aWMgaW50IGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0OworCisjZGVmaW5lIENZQ0xPTkVfQ0JBUl9BRERSIDB4RkVCMDBDRDAKKyNkZWZpbmUgQ1lDTE9ORV9QTUNDX09GRlNFVCAweDUxQTAKKyNkZWZpbmUgQ1lDTE9ORV9NUE1DX09GRlNFVCAweDUxRDAKKyNkZWZpbmUgQ1lDTE9ORV9NUENTX09GRlNFVCAweDUxQTgKKyNkZWZpbmUgQ1lDTE9ORV9USU1FUl9GUkVRIDEwMDAwMDAwMAorI2RlZmluZSBDWUNMT05FX1RJTUVSX01BU0sgKCgodTY0KTE8PDQwKS0xKSAvKiA0MCBiaXQgbWFzayAqLworaW50IHVzZV9jeWNsb25lID0gMDsKKworc3RhdGljIHUzMiogdm9sYXRpbGUgY3ljbG9uZV90aW1lcjsJLyogQ3ljbG9uZSBNUE1DMCByZWdpc3RlciAqLworc3RhdGljIHUzMiBsYXN0X2N5Y2xvbmVfbG93Oworc3RhdGljIHUzMiBsYXN0X2N5Y2xvbmVfaGlnaDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Jhc2U7CitzdGF0aWMgc2VxbG9ja190IG1vbm90b25pY19sb2NrID0gU0VRTE9DS19VTkxPQ0tFRDsKKworLyogaGVscGVyIG1hY3JvIHRvIGF0b21pY2FsbHkgcmVhZCBib3RoIGN5Y2xvbmUgY291bnRlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgcmVhZF9jeWNsb25lX2NvdW50ZXIobG93LGhpZ2gpIFwKKwlkb3sgXAorCQloaWdoID0gY3ljbG9uZV90aW1lclsxXTsgbG93ID0gY3ljbG9uZV90aW1lclswXTsgXAorCX0gd2hpbGUgKGhpZ2ggIT0gY3ljbG9uZV90aW1lclsxXSk7CisKKworc3RhdGljIHZvaWQgbWFya19vZmZzZXRfY3ljbG9uZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9zdCwgZGVsYXk7CisJdW5zaWduZWQgbG9uZyBkZWx0YSA9IGxhc3RfY3ljbG9uZV9sb3c7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aGlzX29mZnNldCwgbGFzdF9vZmZzZXQ7CisKKwl3cml0ZV9zZXFsb2NrKCZtb25vdG9uaWNfbG9jayk7CisJbGFzdF9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X2N5Y2xvbmVfaGlnaDw8MzIpfGxhc3RfY3ljbG9uZV9sb3c7CisJCisJc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKKwlyZWFkX2N5Y2xvbmVfY291bnRlcihsYXN0X2N5Y2xvbmVfbG93LGxhc3RfY3ljbG9uZV9oaWdoKTsKKworCS8qIHJlYWQgdmFsdWVzIGZvciBkZWxheV9hdF9sYXN0X2ludGVycnVwdCAqLworCW91dGJfcCgweDAwLCAweDQzKTsgICAgIC8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCisKKwljb3VudCA9IGluYl9wKDB4NDApOyAgICAvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCisJY291bnQgfD0gaW5iKDB4NDApIDw8IDg7CisKKwkvKgorCSAqIFZJQTY4NmEgdGVzdCBjb2RlLi4uIHJlc2V0IHRoZSBsYXRjaCBpZiBjb3VudCA+IG1heCArIDEKKwkgKiBmcm9tIHRpbWVyX3BpdC5jIC0gY2piCisJICovCisJaWYgKGNvdW50ID4gTEFUQ0gpIHsKKwkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKKwkJb3V0Yl9wKExBVENIICYgMHhmZiwgUElUX0NIMCk7CisJCW91dGIoTEFUQ0ggPj4gOCwgUElUX0NIMCk7CisJCWNvdW50ID0gTEFUQ0ggLSAxOworCX0KKwlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7CisKKwkvKiBsb3N0IHRpY2sgY29tcGVuc2F0aW9uICovCisJZGVsdGEgPSBsYXN0X2N5Y2xvbmVfbG93IC0gZGVsdGE7CQorCWRlbHRhIC89IChDWUNMT05FX1RJTUVSX0ZSRVEvMTAwMDAwMCk7CisJZGVsdGEgKz0gZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7CisJbG9zdCA9IGRlbHRhLygxMDAwMDAwL0haKTsKKwlkZWxheSA9IGRlbHRhJSgxMDAwMDAwL0haKTsKKwlpZiAobG9zdCA+PSAyKQorCQlqaWZmaWVzXzY0ICs9IGxvc3QtMTsKKwkKKwkvKiB1cGRhdGUgdGhlIG1vbm90b25pYyBiYXNlIHZhbHVlICovCisJdGhpc19vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X2N5Y2xvbmVfaGlnaDw8MzIpfGxhc3RfY3ljbG9uZV9sb3c7CisJbW9ub3RvbmljX2Jhc2UgKz0gKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpICYgQ1lDTE9ORV9USU1FUl9NQVNLOworCXdyaXRlX3NlcXVubG9jaygmbW9ub3RvbmljX2xvY2spOworCisJLyogY2FsY3VsYXRlIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0ICovCisJY291bnQgPSAoKExBVENILTEpIC0gY291bnQpICogVElDS19TSVpFOworCWRlbGF5X2F0X2xhc3RfaW50ZXJydXB0ID0gKGNvdW50ICsgTEFUQ0gvMikgLyBMQVRDSDsKKworCisJLyogY2F0Y2ggY29ybmVyIGNhc2Ugd2hlcmUgdGljayByb2xsb3ZlciBvY2N1cmVkIAorCSAqIGJldHdlZW4gY3ljbG9uZSBhbmQgcGl0IHJlYWRzIChhcyBub3RlZCB3aGVuIAorCSAqIHVzZWMgZGVsdGEgaXMgPiA5MCUgIyBvZiB1c2Vjcy90aWNrKQorCSAqLworCWlmIChsb3N0ICYmIGFicyhkZWxheSAtIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0KSA+ICg5MDAwMDAvSFopKQorCQlqaWZmaWVzXzY0Kys7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfY3ljbG9uZSh2b2lkKQoreworCXUzMiBvZmZzZXQ7CisKKwlpZighY3ljbG9uZV90aW1lcikKKwkJcmV0dXJuIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0OworCisJLyogUmVhZCB0aGUgY3ljbG9uZSB0aW1lciAqLworCW9mZnNldCA9IGN5Y2xvbmVfdGltZXJbMF07CisKKwkvKiAuLiByZWxhdGl2ZSB0byBwcmV2aW91cyBqaWZmeSAqLworCW9mZnNldCA9IG9mZnNldCAtIGxhc3RfY3ljbG9uZV9sb3c7CisKKwkvKiBjb252ZXJ0IGN5Y2xvbmUgdGlja3MgdG8gbWljcm9zZWNvbmRzICovCQorCS8qIFhYWCBzbG93LCBjYW4gd2Ugc3BlZWQgdGhpcyB1cD8gKi8KKwlvZmZzZXQgPSBvZmZzZXQvKENZQ0xPTkVfVElNRVJfRlJFUS8xMDAwMDAwKTsKKworCS8qIG91ciBhZGp1c3RlZCB0aW1lIG9mZnNldCBpbiBtaWNyb3NlY29uZHMgKi8KKwlyZXR1cm4gZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Nsb2NrX2N5Y2xvbmUodm9pZCkKK3sKKwl1MzIgbm93X2xvdywgbm93X2hpZ2g7CisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Rfb2Zmc2V0LCB0aGlzX29mZnNldCwgYmFzZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmV0OworCXVuc2lnbmVkIHNlcTsKKworCS8qIGF0b21pY2FsbHkgcmVhZCBtb25vdG9uaWMgYmFzZSAmIGxhc3Rfb2Zmc2V0ICovCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZtb25vdG9uaWNfbG9jayk7CisJCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF9jeWNsb25lX2hpZ2g8PDMyKXxsYXN0X2N5Y2xvbmVfbG93OworCQliYXNlID0gbW9ub3RvbmljX2Jhc2U7CisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbW9ub3RvbmljX2xvY2ssIHNlcSkpOworCisKKwkvKiBSZWFkIHRoZSBjeWNsb25lIGNvdW50ZXIgKi8KKwlyZWFkX2N5Y2xvbmVfY291bnRlcihub3dfbG93LG5vd19oaWdoKTsKKwl0aGlzX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKW5vd19oaWdoPDwzMil8bm93X2xvdzsKKworCS8qIGNvbnZlcnQgdG8gbmFub3NlY29uZHMgKi8KKwlyZXQgPSBiYXNlICsgKCh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KSZDWUNMT05FX1RJTUVSX01BU0spOworCXJldHVybiByZXQgKiAoMTAwMDAwMDAwMCAvIENZQ0xPTkVfVElNRVJfRlJFUSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfY3ljbG9uZShjaGFyKiBvdmVycmlkZSkKK3sKKwl1MzIqIHJlZzsJCisJdTMyIGJhc2U7CQkvKiBzYXZlZCBjeWNsb25lIGJhc2UgYWRkcmVzcyAqLworCXUzMiBwYWdlYWRkcjsJLyogcGFnZSB0aGF0IGNvbnRhaW5zIGN5Y2xvbmVfdGltZXIgcmVnaXN0ZXIgKi8KKwl1MzIgb2Zmc2V0OwkJLyogb2Zmc2V0IGZyb20gcGFnZWFkZHIgdG8gY3ljbG9uZV90aW1lciByZWdpc3RlciAqLworCWludCBpOworCQorCS8qIGNoZWNrIGNsb2NrIG92ZXJyaWRlICovCisJaWYgKG92ZXJyaWRlWzBdICYmIHN0cm5jbXAob3ZlcnJpZGUsImN5Y2xvbmUiLDcpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKm1ha2Ugc3VyZSB3ZSdyZSBvbiBhIHN1bW1pdCBib3gqLworCWlmKCF1c2VfY3ljbG9uZSkgcmV0dXJuIC1FTk9ERVY7IAorCQorCXByaW50ayhLRVJOX0lORk8gIlN1bW1pdCBjaGlwc2V0OiBTdGFydGluZyBDeWNsb25lIENvdW50ZXIuXG4iKTsKKworCS8qIGZpbmQgYmFzZSBhZGRyZXNzICovCisJcGFnZWFkZHIgPSAoQ1lDTE9ORV9DQkFSX0FERFIpJlBBR0VfTUFTSzsKKwlvZmZzZXQgPSAoQ1lDTE9ORV9DQkFSX0FERFIpJih+UEFHRV9NQVNLKTsKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0NZQ0xPTkVfVElNRVIsIHBhZ2VhZGRyKTsKKwlyZWcgPSAodTMyKikoZml4X3RvX3ZpcnQoRklYX0NZQ0xPTkVfVElNRVIpICsgb2Zmc2V0KTsKKwlpZighcmVnKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiByZWdpc3Rlci5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJYmFzZSA9ICpyZWc7CQorCWlmKCFiYXNlKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgQ0JBUiB2YWx1ZS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJLyogc2V0dXAgUE1DQyAqLworCXBhZ2VhZGRyID0gKGJhc2UgKyBDWUNMT05FX1BNQ0NfT0ZGU0VUKSZQQUdFX01BU0s7CisJb2Zmc2V0ID0gKGJhc2UgKyBDWUNMT05FX1BNQ0NfT0ZGU0VUKSYoflBBR0VfTUFTSyk7CisJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9DWUNMT05FX1RJTUVSLCBwYWdlYWRkcik7CisJcmVnID0gKHUzMiopKGZpeF90b192aXJ0KEZJWF9DWUNMT05FX1RJTUVSKSArIG9mZnNldCk7CisJaWYoIXJlZyl7CisJCXByaW50ayhLRVJOX0VSUiAiU3VtbWl0IGNoaXBzZXQ6IENvdWxkIG5vdCBmaW5kIHZhbGlkIFBNQ0MgcmVnaXN0ZXIuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJlZ1swXSA9IDB4MDAwMDAwMDE7CisKKwkvKiBzZXR1cCBNUENTICovCisJcGFnZWFkZHIgPSAoYmFzZSArIENZQ0xPTkVfTVBDU19PRkZTRVQpJlBBR0VfTUFTSzsKKwlvZmZzZXQgPSAoYmFzZSArIENZQ0xPTkVfTVBDU19PRkZTRVQpJih+UEFHRV9NQVNLKTsKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0NZQ0xPTkVfVElNRVIsIHBhZ2VhZGRyKTsKKwlyZWcgPSAodTMyKikoZml4X3RvX3ZpcnQoRklYX0NZQ0xPTkVfVElNRVIpICsgb2Zmc2V0KTsKKwlpZighcmVnKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJTdW1taXQgY2hpcHNldDogQ291bGQgbm90IGZpbmQgdmFsaWQgTVBDUyByZWdpc3Rlci5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmVnWzBdID0gMHgwMDAwMDAwMTsKKworCS8qIG1hcCBpbiBjeWNsb25lX3RpbWVyICovCisJcGFnZWFkZHIgPSAoYmFzZSArIENZQ0xPTkVfTVBNQ19PRkZTRVQpJlBBR0VfTUFTSzsKKwlvZmZzZXQgPSAoYmFzZSArIENZQ0xPTkVfTVBNQ19PRkZTRVQpJih+UEFHRV9NQVNLKTsKKwlzZXRfZml4bWFwX25vY2FjaGUoRklYX0NZQ0xPTkVfVElNRVIsIHBhZ2VhZGRyKTsKKwljeWNsb25lX3RpbWVyID0gKHUzMiopKGZpeF90b192aXJ0KEZJWF9DWUNMT05FX1RJTUVSKSArIG9mZnNldCk7CisJaWYoIWN5Y2xvbmVfdGltZXIpeworCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VsZCBub3QgZmluZCB2YWxpZCBNUE1DIHJlZ2lzdGVyLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qcXVpY2sgdGVzdCB0byBtYWtlIHN1cmUgaXRzIHRpY2tpbmcqLworCWZvcihpPTA7IGk8MzsgaSsrKXsKKwkJdTMyIG9sZCA9IGN5Y2xvbmVfdGltZXJbMF07CisJCWludCBzdGFsbCA9IDEwMDsKKwkJd2hpbGUoc3RhbGwtLSkgYmFycmllcigpOworCQlpZihjeWNsb25lX3RpbWVyWzBdID09IG9sZCl7CisJCQlwcmludGsoS0VSTl9FUlIgIlN1bW1pdCBjaGlwc2V0OiBDb3VudGVyIG5vdCBjb3VudGluZyEgRElTQUJMRURcbiIpOworCQkJY3ljbG9uZV90aW1lciA9IDA7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCWluaXRfY3B1X2toeigpOworCisJLyogRXZlcnl0aGluZyBsb29rcyBnb29kISAqLworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGRlbGF5X2N5Y2xvbmUodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwl1bnNpZ25lZCBsb25nIGJjbG9jaywgbm93OworCWlmKCFjeWNsb25lX3RpbWVyKQorCQlyZXR1cm47CisJYmNsb2NrID0gY3ljbG9uZV90aW1lclswXTsKKwlkbyB7CisJCXJlcF9ub3AoKTsKKwkJbm93ID0gY3ljbG9uZV90aW1lclswXTsKKwl9IHdoaWxlICgobm93LWJjbG9jaykgPCBsb29wcyk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBjeWNsb25lIHRpbWVyX29wdHMgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IHRpbWVyX29wdHMgdGltZXJfY3ljbG9uZSA9IHsKKwkubmFtZSA9ICJjeWNsb25lIiwKKwkubWFya19vZmZzZXQgPSBtYXJrX29mZnNldF9jeWNsb25lLCAKKwkuZ2V0X29mZnNldCA9IGdldF9vZmZzZXRfY3ljbG9uZSwKKwkubW9ub3RvbmljX2Nsb2NrID0JbW9ub3RvbmljX2Nsb2NrX2N5Y2xvbmUsCisJLmRlbGF5ID0gZGVsYXlfY3ljbG9uZSwKK307CisKK3N0cnVjdCBpbml0X3RpbWVyX29wdHMgX19pbml0ZGF0YSB0aW1lcl9jeWNsb25lX2luaXQgPSB7CisJLmluaXQgPSBpbml0X2N5Y2xvbmUsCisJLm9wdHMgPSAmdGltZXJfY3ljbG9uZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzMTM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2hwZXQuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIFRoaXMgY29kZSBsYXJnZWx5IG1vdmVkIGZyb20gYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMuCisgKiBTZWUgY29tbWVudHMgdGhlcmUgZm9yIHByb3BlciBjcmVkaXRzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKyNpbmNsdWRlICJtYWNoX3RpbWVyLmgiCisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF91c2VjX3F1b3RpZW50OwkvKiBjb252ZXJ0IGhwZXQgY2xrcyB0byB1c2VjICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0c2NfaHBldF9xdW90aWVudDsJCS8qIGNvbnZlcnQgdHNjIHRvIGhwZXQgY2xrcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0OyAJLyogaHBldCBjb3VudGVyIHZhbHVlIGF0IGxhc3QgdGljayovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19sb3c7CS8qIGxzYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF90c2NfaGlnaDsgCS8qIG1zYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfYmFzZTsKK3N0YXRpYyBzZXFsb2NrX3QgbW9ub3RvbmljX2xvY2sgPSBTRVFMT0NLX1VOTE9DS0VEOworCisvKiBjb252ZXJ0IGZyb20gY3ljbGVzKDY0Yml0cykgPT4gbmFub3NlY29uZHMgKDY0Yml0cykKKyAqICBiYXNpYyBlcXVhdGlvbjoKKyAqCQlucyA9IGN5Y2xlcyAvIChmcmVxIC8gbnNfcGVyX3NlYykKKyAqCQlucyA9IGN5Y2xlcyAqIChuc19wZXJfc2VjIC8gZnJlcSkKKyAqCQlucyA9IGN5Y2xlcyAqICgxMF45IC8gKGNwdV9taHogKiAxMF42KSkKKyAqCQlucyA9IGN5Y2xlcyAqICgxMF4zIC8gY3B1X21oeikKKyAqCisgKglUaGVuIHdlIHVzZSBzY2FsaW5nIG1hdGggKHN1Z2dlc3RlZCBieSBnZW9yZ2VAbXZpc3RhLmNvbSkgdG8gZ2V0OgorICoJCW5zID0gY3ljbGVzICogKDEwXjMgKiBTQyAvIGNwdV9taHopIC8gU0MKKyAqCQlucyA9IGN5Y2xlcyAqIGN5YzJuc19zY2FsZSAvIFNDCisgKgorICoJQW5kIHNpbmNlIFNDIGlzIGEgY29uc3RhbnQgcG93ZXIgb2YgdHdvLCB3ZSBjYW4gY29udmVydCB0aGUgZGl2CisgKiAgaW50byBhIHNoaWZ0LgorICoJCQktam9obnN0dWxAdXMuaWJtLmNvbSAibWF0aCBpcyBoYXJkLCBsZXRzIGdvIHNob3BwaW5nISIKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3ljMm5zX3NjYWxlOworI2RlZmluZSBDWUMyTlNfU0NBTEVfRkFDVE9SIDEwIC8qIDJeMTAsIGNhcmVmdWxseSBjaG9zZW4gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9jeWMybnNfc2NhbGUodW5zaWduZWQgbG9uZyBjcHVfbWh6KQoreworCWN5YzJuc19zY2FsZSA9ICgxMDAwIDw8IENZQzJOU19TQ0FMRV9GQUNUT1IpL2NwdV9taHo7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc18yX25zKHVuc2lnbmVkIGxvbmcgbG9uZyBjeWMpCit7CisJcmV0dXJuIChjeWMgKiBjeWMybnNfc2NhbGUpID4+IENZQzJOU19TQ0FMRV9GQUNUT1I7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Nsb2NrX2hwZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdF9vZmZzZXQsIHRoaXNfb2Zmc2V0LCBiYXNlOworCXVuc2lnbmVkIHNlcTsKKworCS8qIGF0b21pY2FsbHkgcmVhZCBtb25vdG9uaWMgYmFzZSAmIGxhc3Rfb2Zmc2V0ICovCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZtb25vdG9uaWNfbG9jayk7CisJCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwkJYmFzZSA9IG1vbm90b25pY19iYXNlOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJm1vbm90b25pY19sb2NrLCBzZXEpKTsKKworCS8qIFJlYWQgdGhlIFRpbWUgU3RhbXAgQ291bnRlciAqLworCXJkdHNjbGwodGhpc19vZmZzZXQpOworCisJLyogcmV0dXJuIHRoZSB2YWx1ZSBpbiBucyAqLworCXJldHVybiBiYXNlICsgY3ljbGVzXzJfbnModGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfaHBldCh2b2lkKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgZWF4LCBlZHg7CisKKwllYXggPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJZWF4IC09IGhwZXRfbGFzdDsJLyogaHBldCBkZWx0YSAqLworCisJLyoKKyAgICAgICAgICogVGltZSBvZmZzZXQgPSAoaHBldCBkZWx0YSkgKiAoIHVzZWNzIHBlciBIUEVUIGNsb2NrICkKKwkgKiAgICAgICAgICAgICA9IChocGV0IGRlbHRhKSAqICggdXNlY3MgcGVyIHRpY2sgLyBIUEVUIGNsb2NrcyBwZXIgdGljaykKKwkgKiAgICAgICAgICAgICA9IChocGV0IGRlbHRhKSAqICggaHBldF91c2VjX3F1b3RpZW50ICkgLyAoMl4zMikKKwkgKgorCSAqIFdoZXJlLAorCSAqIGhwZXRfdXNlY19xdW90aWVudCA9ICgyXjMyICogdXNlY3MgcGVyIHRpY2spL0hQRVQgY2xvY2tzIHBlciB0aWNrCisJICoKKwkgKiBVc2luZyBhIG11bGwgaW5zdGVhZCBvZiBhIGRpdmwgc2F2ZXMgc29tZSBjeWNsZXMgaW4gY3JpdGljYWwgcGF0aC4KKyAgICAgICAgICovCisJQVNNX01VTDY0X1JFRyhlYXgsIGVkeCwgaHBldF91c2VjX3F1b3RpZW50LCBlYXgpOworCisJLyogb3VyIGFkanVzdGVkIHRpbWUgb2Zmc2V0IGluIG1pY3Jvc2Vjb25kcyAqLworCXJldHVybiBlZHg7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfb2Zmc2V0X2hwZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGhpc19vZmZzZXQsIGxhc3Rfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwlyZHRzYyhsYXN0X3RzY19sb3csIGxhc3RfdHNjX2hpZ2gpOworCisJb2Zmc2V0ID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCkgLSBocGV0X3RpY2s7CisJaWYgKHVubGlrZWx5KCgob2Zmc2V0IC0gaHBldF9sYXN0KSA+IGhwZXRfdGljaykgJiYgKGhwZXRfbGFzdCAhPSAwKSkpIHsKKwkJaW50IGxvc3RfdGlja3MgPSAob2Zmc2V0IC0gaHBldF9sYXN0KSAvIGhwZXRfdGljazsKKwkJamlmZmllc182NCArPSBsb3N0X3RpY2tzOworCX0KKwlocGV0X2xhc3QgPSBvZmZzZXQ7CisKKwkvKiB1cGRhdGUgdGhlIG1vbm90b25pYyBiYXNlIHZhbHVlICovCisJdGhpc19vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X3RzY19oaWdoPDwzMil8bGFzdF90c2NfbG93OworCW1vbm90b25pY19iYXNlICs9IGN5Y2xlc18yX25zKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpOworCXdyaXRlX3NlcXVubG9jaygmbW9ub3RvbmljX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBkZWxheV9ocGV0KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJdW5zaWduZWQgbG9uZyBocGV0X3N0YXJ0LCBocGV0X2VuZDsKKwl1bnNpZ25lZCBsb25nIGVheDsKKworCS8qIGxvb3BzIGlzIHRoZSBudW1iZXIgb2YgY3B1IGN5Y2xlcy4gQ29udmVydCBpdCB0byBocGV0IGNsb2NrcyAqLworCUFTTV9NVUw2NF9SRUcoZWF4LCBsb29wcywgdHNjX2hwZXRfcXVvdGllbnQsIGxvb3BzKTsKKworCWhwZXRfc3RhcnQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJZG8geworCQlyZXBfbm9wKCk7CisJCWhwZXRfZW5kID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCX0gd2hpbGUgKChocGV0X2VuZCAtIGhwZXRfc3RhcnQpIDwgKGxvb3BzKSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaHBldChjaGFyKiBvdmVycmlkZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCwgcmVtYWluOworCisJLyogY2hlY2sgY2xvY2sgb3ZlcnJpZGUgKi8KKwlpZiAob3ZlcnJpZGVbMF0gJiYgc3RybmNtcChvdmVycmlkZSwiaHBldCIsNCkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcmludGsoIlVzaW5nIEhQRVQgZm9yIGdldHRpbWVvZmRheVxuIik7CisJaWYgKGNwdV9oYXNfdHNjKSB7CisJCXVuc2lnbmVkIGxvbmcgdHNjX3F1b3RpZW50ID0gY2FsaWJyYXRlX3RzY19ocGV0KCZ0c2NfaHBldF9xdW90aWVudCk7CisJCWlmICh0c2NfcXVvdGllbnQpIHsKKwkJCS8qIHJlcG9ydCBDUFUgY2xvY2sgcmF0ZSBpbiBIei4KKwkJCSAqIFRoZSBmb3JtdWxhIGlzICgxMF42ICogMl4zMikgLyAoMl4zMiAqIDEgLyAoY2xvY2tzL3VzKSkgPQorCQkJICogY2xvY2svc2Vjb25kLiBPdXIgcHJlY2lzaW9uIGlzIGFib3V0IDEwMCBwcG0uCisJCQkgKi8KKwkJCXsJdW5zaWduZWQgbG9uZyBlYXg9MCwgZWR4PTEwMDA7CisJCQkJQVNNX0RJVjY0X1JFRyhjcHVfa2h6LCBlZHgsIHRzY19xdW90aWVudCwKKwkJCQkJCWVheCwgZWR4KTsKKwkJCQlwcmludGsoIkRldGVjdGVkICVsdS4lMDNsdSBNSHogcHJvY2Vzc29yLlxuIiwKKwkJCQkJY3B1X2toeiAvIDEwMDAsIGNwdV9raHogJSAxMDAwKTsKKwkJCX0KKwkJCXNldF9jeWMybnNfc2NhbGUoY3B1X2toei8xMDAwKTsKKwkJfQorCX0KKworCS8qCisJICogTWF0aCB0byBjYWxjdWxhdGUgaHBldCB0byB1c2VjIG11bHRpcGxpZXIKKwkgKiBMb29rIGZvciB0aGUgY29tbWVudHMgYXQgZ2V0X29mZnNldF9ocGV0KCkKKwkgKi8KKwlBU01fRElWNjRfUkVHKHJlc3VsdCwgcmVtYWluLCBocGV0X3RpY2ssIDAsIEtFUk5FTF9USUNLX1VTRUMpOworCWlmIChyZW1haW4gPiAoaHBldF90aWNrID4+IDEpKQorCQlyZXN1bHQrKzsgLyogcm91bmRpbmcgdGhlIHJlc3VsdCAqLworCWhwZXRfdXNlY19xdW90aWVudCA9IHJlc3VsdDsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB0c2MgdGltZXJfb3B0cyBzdHJ1Y3QgKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfb3B0cyB0aW1lcl9ocGV0ID0geworCS5uYW1lID0gCQkiaHBldCIsCisJLm1hcmtfb2Zmc2V0ID0JCW1hcmtfb2Zmc2V0X2hwZXQsCisJLmdldF9vZmZzZXQgPQkJZ2V0X29mZnNldF9ocGV0LAorCS5tb25vdG9uaWNfY2xvY2sgPQltb25vdG9uaWNfY2xvY2tfaHBldCwKKwkuZGVsYXkgPSAJCWRlbGF5X2hwZXQsCit9OworCitzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIF9faW5pdGRhdGEgdGltZXJfaHBldF9pbml0ID0geworCS5pbml0ID0JaW5pdF9ocGV0LAorCS5vcHRzID0gJnRpbWVyX2hwZXQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfbm9uZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfbm9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTJmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ub25lLmMKQEAgLTAsMCArMSwzOSBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKworc3RhdGljIHZvaWQgbWFya19vZmZzZXRfbm9uZSh2b2lkKQoreworCS8qIG5vdGhpbmcgbmVlZGVkICovCit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfbm9uZSh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9ja19ub25lKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGF5X25vbmUodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlpbnQgZDA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJcdGptcCAxZlxuIgorCQkiLmFsaWduIDE2XG4iCisJCSIxOlx0am1wIDJmXG4iCisJCSIuYWxpZ24gMTZcbiIKKwkJIjI6XHRkZWNsICUwXG5cdGpucyAyYiIKKwkJOiI9JmEiIChkMCkKKwkJOiIwIiAobG9vcHMpKTsKK30KKworLyogbm9uZSB0aW1lcl9vcHRzIHN0cnVjdCAqLworc3RydWN0IHRpbWVyX29wdHMgdGltZXJfbm9uZSA9IHsKKwkubmFtZSA9IAkibm9uZSIsCisJLm1hcmtfb2Zmc2V0ID0JbWFya19vZmZzZXRfbm9uZSwgCisJLmdldF9vZmZzZXQgPQlnZXRfb2Zmc2V0X25vbmUsCisJLm1vbm90b25pY19jbG9jayA9CW1vbm90b25pY19jbG9ja19ub25lLAorCS5kZWxheSA9IGRlbGF5X25vbmUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcGl0LmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9waXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjdkNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcGl0LmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBUaGlzIGNvZGUgbGFyZ2VseSBtb3ZlZCBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvdGltZS5jLgorICogU2VlIGNvbW1lbnRzIHRoZXJlIGZvciBwcm9wZXIgY3JlZGl0cy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKworZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTlBX2xvY2s7CitleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOworI2luY2x1ZGUgImRvX3RpbWVyLmgiCisjaW5jbHVkZSAiaW9fcG9ydHMuaCIKKworc3RhdGljIGludCBjb3VudF9wOyAvKiBjb3VudGVyIGluIGdldF9vZmZzZXRfcGl0KCkgKi8KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9waXQoY2hhciogb3ZlcnJpZGUpCit7CisgCS8qIGNoZWNrIGNsb2NrIG92ZXJyaWRlICovCisgCWlmIChvdmVycmlkZVswXSAmJiBzdHJuY21wKG92ZXJyaWRlLCJwaXQiLDMpKQorIAkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBjbG9jaz0gb3ZlcnJpZGUgZmFpbGVkLiBEZWZhdWx0aW5nIHRvIFBJVFxuIik7CisgCisJY291bnRfcCA9IExBVENIOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYXJrX29mZnNldF9waXQodm9pZCkKK3sKKwkvKiBub3RoaW5nIG5lZWRlZCAqLworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19jbG9ja19waXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVsYXlfcGl0KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJaW50IGQwOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiXHRqbXAgMWZcbiIKKwkJIi5hbGlnbiAxNlxuIgorCQkiMTpcdGptcCAyZlxuIgorCQkiLmFsaWduIDE2XG4iCisJCSIyOlx0ZGVjbCAlMFxuXHRqbnMgMmIiCisJCToiPSZhIiAoZDApCisJCToiMCIgKGxvb3BzKSk7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHh0aW1lX2xvY2sgaGVsZC4KKyAqIEl0IHdhcyBpbnNwaXJlZCBieSBTdGV2ZSBNY0Nhbm5lJ3MgbWljcm90aW1lLWkzODYgZm9yIEJTRC4gIC0tIGpycworICogCisgKiBIb3dldmVyLCB0aGUgcGMtYXVkaW8gc3BlYWtlciBkcml2ZXIgY2hhbmdlcyB0aGUgZGl2aXNvciBzbyB0aGF0CisgKiBpdCBnZXRzIGludGVycnVwdGVkIHJhdGhlciBtb3JlIG9mdGVuIC0gaXQgbG9hZHMgNjQgaW50byB0aGUKKyAqIGNvdW50ZXIgcmF0aGVyIHRoYW4gMTE5MzIhIFRoaXMgaGFzIGFuIGFkdmVyc2UgaW1wYWN0IG9uCisgKiBkb19nZXR0aW1lb2Zmc2V0KCkgLS0gaXQgc3RvcHMgd29ya2luZyEgV2hhdCBpcyBhbHNvIG5vdAorICogZ29vZCBpcyB0aGF0IHRoZSBpbnRlcnZhbCB0aGF0IG91ciB0aW1lciBmdW5jdGlvbiBnZXRzIGNhbGxlZAorICogaXMgbm8gbG9uZ2VyIDEwLjAwMDIgbXMsIGJ1dCA5Ljk3NjcgbXMuIFRvIGdldCBhcm91bmQgdGhpcworICogd291bGQgcmVxdWlyZSB1c2luZyBhIGRpZmZlcmVudCB0aW1pbmcgc291cmNlLiBNYXliZSBzb21lb25lCisgKiBjb3VsZCB1c2UgdGhlIFJUQyAtIEkga25vdyB0aGF0IHRoaXMgY2FuIGludGVycnVwdCBhdCBmcmVxdWVuY2llcworICogcmFuZ2luZyBmcm9tIDgxOTJIeiB0byAySHouIElmIEkgaGFkIHRoZSBlbmVyZ3ksIEknZCBzb21laG93IGZpeAorICogaXQgc28gdGhhdCBhdCBzdGFydHVwLCB0aGUgdGltZXIgY29kZSBpbiBzY2hlZC5jIHdvdWxkIHNlbGVjdAorICogdXNpbmcgZWl0aGVyIHRoZSBSVEMgb3IgdGhlIDgyNTMgdGltZXIuIFRoZSBkZWNpc2lvbiB3b3VsZCBiZQorICogYmFzZWQgb24gd2hldGhlciB0aGVyZSB3YXMgYW55IG90aGVyIGRldmljZSBhcm91bmQgdGhhdCBuZWVkZWQKKyAqIHRvIHRyYW1wbGUgb24gdGhlIDgyNTMuIEknZCBzZXQgdXAgdGhlIFJUQyB0byBpbnRlcnJ1cHQgYXQgMTAyNCBIeiwKKyAqIGFuZCB0aGVuIGRvIHNvbWUgamlnZ2VyeSB0byBoYXZlIGEgdmVyc2lvbiBvZiBkb190aW1lciB0aGF0IAorICogYWR2YW5jZWQgdGhlIGNsb2NrIGJ5IDEvMTAyNCBzLiBFdmVyeSB0aW1lIHRoYXQgcmVhY2hlZCBvdmVyIDEvMTAwCisgKiBvZiBhIHNlY29uZCwgdGhlbiBkbyBhbGwgdGhlIG9sZCBjb2RlLiBJZiB0aGUgdGltZSB3YXMga2VwdCBjb3JyZWN0CisgKiB0aGVuIGRvX2dldHRpbWVvZmZzZXQgY291bGQganVzdCByZXR1cm4gMCAtIHRoZXJlIGlzIG5vIGxvdyBvcmRlcgorICogZGl2aWRlciB0aGF0IGNhbiBiZSBhY2Nlc3NlZC4KKyAqCisgKiBJZGVhbGx5LCB5b3Ugd291bGQgYmUgYWJsZSB0byB1c2UgdGhlIFJUQyBmb3IgdGhlIHNwZWFrZXIgZHJpdmVyLAorICogYnV0IGl0IGFwcGVhcnMgdGhhdCB0aGUgc3BlYWtlciBkcml2ZXIgcmVhbGx5IG5lZWRzIGludGVycnVwdCBtb3JlCisgKiBvZnRlbiB0aGFuIGV2ZXJ5IDEyMCB1cyBvciBzby4KKyAqCisgKiBBbnl3YXksIHRoaXMgbmVlZHMgbW9yZSB0aG91Z2h0Li4uLgkJcGpzZyAoMTk5My0wOC0yOCkKKyAqIAorICogSWYgeW91IGFyZSByZWFsbHkgdGhhdCBpbnRlcmVzdGVkLCB5b3Ugc2hvdWxkIGJlIHJlYWRpbmcKKyAqIGNvbXAucHJvdG9jb2xzLnRpbWUubnRwIQorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfcGl0KHZvaWQpCit7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgamlmZmllc19wID0gMDsKKworCS8qCisJICogY2FjaGUgdm9sYXRpbGUgamlmZmllcyB0ZW1wb3JhcmlseTsgd2UgaGF2ZSB4dGltZV9sb2NrLiAKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7CisJLyogdGltZXIgY291bnQgbWF5IHVuZGVyZmxvdyByaWdodCBoZXJlICovCisJb3V0Yl9wKDB4MDAsIFBJVF9NT0RFKTsJLyogbGF0Y2ggdGhlIGNvdW50IEFTQVAgKi8KKworCWNvdW50ID0gaW5iX3AoUElUX0NIMCk7CS8qIHJlYWQgdGhlIGxhdGNoZWQgY291bnQgKi8KKworCS8qCisJICogV2UgZG8gdGhpcyBndWFyYW50ZWVkIGRvdWJsZSBtZW1vcnkgYWNjZXNzIGluc3RlYWQgb2YgYSBfcCAKKwkgKiBwb3N0Zml4IGluIHRoZSBwcmV2aW91cyBwb3J0IGFjY2Vzcy4gV2hlZWUsIGhhY2thZHkgaGFjaworCSAqLworIAlqaWZmaWVzX3QgPSBqaWZmaWVzOworCisJY291bnQgfD0gaW5iX3AoUElUX0NIMCkgPDwgODsKKwkKKyAgICAgICAgLyogVklBNjg2YSB0ZXN0IGNvZGUuLi4gcmVzZXQgdGhlIGxhdGNoIGlmIGNvdW50ID4gbWF4ICsgMSAqLworICAgICAgICBpZiAoY291bnQgPiBMQVRDSCkgeworICAgICAgICAgICAgICAgIG91dGJfcCgweDM0LCBQSVRfTU9ERSk7CisgICAgICAgICAgICAgICAgb3V0Yl9wKExBVENIICYgMHhmZiwgUElUX0NIMCk7CisgICAgICAgICAgICAgICAgb3V0YihMQVRDSCA+PiA4LCBQSVRfQ0gwKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IExBVENIIC0gMTsKKyAgICAgICAgfQorCQorCS8qCisJICogYXZvaWRpbmcgdGltZXIgaW5jb25zaXN0ZW5jaWVzICh0aGV5IGFyZSByYXJlLCBidXQgdGhleSBoYXBwZW4pLi4uCisJICogdGhlcmUgYXJlIHR3byBraW5kcyBvZiBwcm9ibGVtcyB0aGF0IG11c3QgYmUgYXZvaWRlZCBoZXJlOgorCSAqICAxLiB0aGUgdGltZXIgY291bnRlciB1bmRlcmZsb3dzCisJICogIDIuIGhhcmR3YXJlIHByb2JsZW0gd2l0aCB0aGUgdGltZXIsIG5vdCBnaXZpbmcgdXMgY29udGludW91cyB0aW1lLAorCSAqICAgICB0aGUgY291bnRlciBkb2VzIHNtYWxsICJqdW1wcyIgdXB3YXJkcyBvbiBzb21lIFBlbnRpdW0gc3lzdGVtcywKKwkgKiAgICAgKHNlZSBjJ3QgOTUvMTAgcGFnZSAzMzUgZm9yIE5lcHR1biBidWcuKQorCSAqLworCisJaWYoIGppZmZpZXNfdCA9PSBqaWZmaWVzX3AgKSB7CisJCWlmKCBjb3VudCA+IGNvdW50X3AgKSB7CisJCQkvKiB0aGUgbnV0Y2FzZSAqLworCQkJY291bnQgPSBkb190aW1lcl9vdmVyZmxvdyhjb3VudCk7CisJCX0KKwl9IGVsc2UKKwkJamlmZmllc19wID0gamlmZmllc190OworCisJY291bnRfcCA9IGNvdW50OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworCisJY291bnQgPSAoKExBVENILTEpIC0gY291bnQpICogVElDS19TSVpFOworCWNvdW50ID0gKGNvdW50ICsgTEFUQ0gvMikgLyBMQVRDSDsKKworCXJldHVybiBjb3VudDsKK30KKworCisvKiB0c2MgdGltZXJfb3B0cyBzdHJ1Y3QgKi8KK3N0cnVjdCB0aW1lcl9vcHRzIHRpbWVyX3BpdCA9IHsKKwkubmFtZSA9ICJwaXQiLAorCS5tYXJrX29mZnNldCA9IG1hcmtfb2Zmc2V0X3BpdCwgCisJLmdldF9vZmZzZXQgPSBnZXRfb2Zmc2V0X3BpdCwKKwkubW9ub3RvbmljX2Nsb2NrID0gbW9ub3RvbmljX2Nsb2NrX3BpdCwKKwkuZGVsYXkgPSBkZWxheV9waXQsCit9OworCitzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIF9faW5pdGRhdGEgdGltZXJfcGl0X2luaXQgPSB7CisJLmluaXQgPSBpbml0X3BpdCwgCisJLm9wdHMgPSAmdGltZXJfcGl0LAorfTsKKwordm9pZCBzZXR1cF9waXRfdGltZXIodm9pZCkKK3sKKwlleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTNfbG9jaywgZmxhZ3MpOworCW91dGJfcCgweDM0LFBJVF9NT0RFKTsJCS8qIGJpbmFyeSwgbW9kZSAyLCBMU0IvTVNCLCBjaCAwICovCisJdWRlbGF5KDEwKTsKKwlvdXRiX3AoTEFUQ0ggJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLworCXVkZWxheSgxMCk7CisJb3V0YihMQVRDSCA+PiA4ICwgUElUX0NIMCk7CS8qIE1TQiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0aW1lcl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlzZXR1cF9waXRfdGltZXIoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgdGltZXJfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgidGltZXJfcGl0IiksCisJLnJlc3VtZQk9IHRpbWVyX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfdGltZXIgPSB7CisJLmlkCT0gMCwKKwkuY2xzCT0gJnRpbWVyX3N5c2NsYXNzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90aW1lcl9zeXNmcyh2b2lkKQoreworCWludCBlcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmdGltZXJfc3lzY2xhc3MpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfdGltZXIpOworCXJldHVybiBlcnJvcjsKK30KKworZGV2aWNlX2luaXRjYWxsKGluaXRfdGltZXJfc3lzZnMpOworCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9wbS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdmMjIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcG0uYwpAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIChDKSBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+IDIwMDMKKyAqCisgKiBEcml2ZXIgdG8gdXNlIHRoZSBQb3dlciBNYW5hZ2VtZW50IFRpbWVyIChQTVRNUikgYXZhaWxhYmxlIGluIHNvbWUKKyAqIHNvdXRoYnJpZGdlcyBhcyBwcmltYXJ5IHRpbWluZyBzb3VyY2UgZm9yIHRoZSBMaW51eCBrZXJuZWwuCisgKgorICogQmFzZWQgb24gcGFydHMgb2YgbGludXgvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYywgdGltZXJfcGl0LmMsCisgKiB0aW1lcl9ocGV0LmMsIGFuZCBvbiBBcmphbiB2YW4gZGUgVmVuJ3MgaW1wbGVtZW50YXRpb24gZm9yIDIuNC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Mi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisKKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKKworLyogTnVtYmVyIG9mIFBNVE1SIHRpY2tzIGV4cGVjdGVkIGR1cmluZyBjYWxpYnJhdGlvbiBydW4gKi8KKyNkZWZpbmUgUE1UTVJfVElDS1NfUEVSX1NFQyAzNTc5NTQ1CisjZGVmaW5lIFBNVE1SX0VYUEVDVEVEX1JBVEUgXAorICAoKENBTElCUkFURV9MQVRDSCAqIChQTVRNUl9USUNLU19QRVJfU0VDID4+IDEwKSkgLyAoQ0xPQ0tfVElDS19SQVRFPj4xMCkpCisKKworLyogVGhlIEkvTyBwb3J0IHRoZSBQTVRNUiByZXNpZGVzIGF0LgorICogVGhlIGxvY2F0aW9uIGlzIGRldGVjdGVkIGR1cmluZyBzZXR1cF9hcmNoKCksCisgKiBpbiBhcmNoL2kzODYvYWNwaS9ib290LmMgKi8KK3UzMiBwbXRtcl9pb3BvcnQgPSAwOworCisKKy8qIHZhbHVlIG9mIHRoZSBQb3dlciB0aW1lciBhdCBsYXN0IHRpbWVyIGludGVycnVwdCAqLworc3RhdGljIHUzMiBvZmZzZXRfdGljazsKK3N0YXRpYyB1MzIgb2Zmc2V0X2RlbGF5OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19iYXNlOworc3RhdGljIHNlcWxvY2tfdCBtb25vdG9uaWNfbG9jayA9IFNFUUxPQ0tfVU5MT0NLRUQ7CisKKyNkZWZpbmUgQUNQSV9QTV9NQVNLIDB4RkZGRkZGIC8qIGxpbWl0IGl0IHRvIDI0IGJpdHMgKi8KKworLypoZWxwZXIgZnVuY3Rpb24gdG8gc2FmZWx5IHJlYWQgYWNwaSBwbSB0aW1lc291cmNlKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfcG10bXIodm9pZCkKK3sKKwl1MzIgdjE9MCx2Mj0wLHYzPTA7CisJLyogSXQgaGFzIGJlZW4gcmVwb3J0ZWQgdGhhdCBiZWNhdXNlIG9mIHZhcmlvdXMgYnJva2VuCisJICogY2hpcHNldHMgKElDSDQsIFBJSVg0IGFuZCBQSUlYNEUpIHdoZXJlIHRoZSBBQ1BJIFBNIHRpbWUKKwkgKiBzb3VyY2UgaXMgbm90IGxhdGNoZWQsIHNvIHlvdSBtdXN0IHJlYWQgaXQgbXVsdGlwbGUKKwkgKiB0aW1lcyB0byBpbnN1cmUgYSBzYWZlIHZhbHVlIGlzIHJlYWQuCisJICovCisJZG8geworCQl2MSA9IGlubChwbXRtcl9pb3BvcnQpOworCQl2MiA9IGlubChwbXRtcl9pb3BvcnQpOworCQl2MyA9IGlubChwbXRtcl9pb3BvcnQpOworCX0gd2hpbGUgKCh2MSA+IHYyICYmIHYxIDwgdjMpIHx8ICh2MiA+IHYzICYmIHYyIDwgdjEpCisJCQl8fCAodjMgPiB2MSAmJiB2MyA8IHYyKSk7CisKKwkvKiBtYXNrIHRoZSBvdXRwdXQgdG8gMjQgYml0cyAqLworCXJldHVybiB2MiAmIEFDUElfUE1fTUFTSzsKK30KKworCisvKgorICogU29tZSBib2FyZHMgaGF2ZSB0aGUgUE1UTVIgcnVubmluZyB3YXkgdG9vIGZhc3QuIFdlIGNoZWNrCisgKiB0aGUgUE1UTVIgcmF0ZSBhZ2FpbnN0IFBJVCBjaGFubmVsIDIgdG8gY2F0Y2ggdGhlc2UgY2FzZXMuCisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X3BtdG1yX3JhdGUodm9pZCkKK3sKKwl1MzIgdmFsdWUxLCB2YWx1ZTI7CisJdW5zaWduZWQgbG9uZyBjb3VudCwgZGVsdGE7CisKKwltYWNoX3ByZXBhcmVfY291bnRlcigpOworCXZhbHVlMSA9IHJlYWRfcG10bXIoKTsKKwltYWNoX2NvdW50dXAoJmNvdW50KTsKKwl2YWx1ZTIgPSByZWFkX3BtdG1yKCk7CisJZGVsdGEgPSAodmFsdWUyIC0gdmFsdWUxKSAmIEFDUElfUE1fTUFTSzsKKworCS8qIENoZWNrIHRoYXQgdGhlIFBNVE1SIGRlbHRhIGlzIHdpdGhpbiA1JSBvZiB3aGF0IHdlIGV4cGVjdCAqLworCWlmIChkZWx0YSA8IChQTVRNUl9FWFBFQ1RFRF9SQVRFICogMTkpIC8gMjAgfHwKKwkgICAgZGVsdGEgPiAoUE1UTVJfRVhQRUNURURfUkFURSAqIDIxKSAvIDIwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlBNLVRpbWVyIHJ1bm5pbmcgYXQgaW52YWxpZCByYXRlOiAlbHUlJSBvZiBub3JtYWwgLSBhYm9ydGluZy5cbiIsIDEwMFVMICogZGVsdGEgLyBQTVRNUl9FWFBFQ1RFRF9SQVRFKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaW5pdF9wbXRtcihjaGFyKiBvdmVycmlkZSkKK3sKKwl1MzIgdmFsdWUxLCB2YWx1ZTI7CisJdW5zaWduZWQgaW50IGk7CisKKyAJaWYgKG92ZXJyaWRlWzBdICYmIHN0cm5jbXAob3ZlcnJpZGUsInBtdG1yIiw1KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXBtdG1yX2lvcG9ydCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiB3ZSB1c2UgdGhlIFRTQyBmb3IgZGVsYXlfcG10bXIsIHNvIG1ha2Ugc3VyZSBpdCBleGlzdHMgKi8KKwlpZiAoIWNwdV9oYXNfdHNjKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qICJ2ZXJpZnkiIHRoaXMgdGltaW5nIHNvdXJjZSAqLworCXZhbHVlMSA9IHJlYWRfcG10bXIoKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQl2YWx1ZTIgPSByZWFkX3BtdG1yKCk7CisJCWlmICh2YWx1ZTIgPT0gdmFsdWUxKQorCQkJY29udGludWU7CisJCWlmICh2YWx1ZTIgPiB2YWx1ZTEpCisJCQlnb3RvIHBtX2dvb2Q7CisJCWlmICgodmFsdWUyIDwgdmFsdWUxKSAmJiAoKHZhbHVlMikgPCAweEZGRikpCisJCQlnb3RvIHBtX2dvb2Q7CisJCXByaW50ayhLRVJOX0lORk8gIlBNLVRpbWVyIGhhZCBpbmNvbnNpc3RlbnQgcmVzdWx0czogMHglI3gsIDB4JSN4IC0gYWJvcnRpbmcuXG4iLCB2YWx1ZTEsIHZhbHVlMik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJQTS1UaW1lciBoYWQgbm8gcmVhc29uYWJsZSByZXN1bHQ6IDB4JSN4IC0gYWJvcnRpbmcuXG4iLCB2YWx1ZTEpOworCXJldHVybiAtRU5PREVWOworCitwbV9nb29kOgorCWlmICh2ZXJpZnlfcG10bXJfcmF0ZSgpICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJaW5pdF9jcHVfa2h6KCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGN5YzJ1cyh1MzIgY3ljbGVzKQoreworCS8qIFRoZSBQb3dlciBNYW5hZ2VtZW50IFRpbWVyIHRpY2tzIGF0IDMuNTc5NTQ1IHRpY2tzIHBlciBtaWNyb3NlY29uZC4KKwkgKiAxIC8gUE1fVElNRVJfRlJFUVVFTkNZID09IDAuMjc5MzY1MTEgPX4gMjg2LzEwMjQgW2Vycm9yOiAwLjAyNCVdCisJICoKKwkgKiBFdmVuIHdpdGggSFogPSAxMDAsIGRlbHRhIGlzIGF0IG1heGltdW0gMzU3OTYgdGlja3MsIHNvIGl0IGNhbgorCSAqIGVhc2lseSBiZSBtdWx0aXBsaWVkIHdpdGggMjg2ICg9MHgxMUUpIHdpdGhvdXQgaGF2aW5nIHRvIGZlYXIKKwkgKiB1MzIgb3ZlcmZsb3dzLgorCSAqLworCWN5Y2xlcyAqPSAyODY7CisJcmV0dXJuIChjeWNsZXMgPj4gMTApOworfQorCisvKgorICogdGhpcyBnZXRzIGNhbGxlZCBkdXJpbmcgZWFjaCB0aW1lciBpbnRlcnJ1cHQKKyAqICAgLSBDYWxsZWQgd2hpbGUgaG9sZGluZyB0aGUgd3JpdGVyIHh0aW1lX2xvY2sKKyAqLworc3RhdGljIHZvaWQgbWFya19vZmZzZXRfcG10bXIodm9pZCkKK3sKKwl1MzIgbG9zdCwgZGVsdGEsIGxhc3Rfb2Zmc2V0OworCXN0YXRpYyBpbnQgZmlyc3RfcnVuID0gMTsKKwlsYXN0X29mZnNldCA9IG9mZnNldF90aWNrOworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCisJb2Zmc2V0X3RpY2sgPSByZWFkX3BtdG1yKCk7CisKKwkvKiBjYWxjdWxhdGUgdGljayBpbnRlcnZhbCAqLworCWRlbHRhID0gKG9mZnNldF90aWNrIC0gbGFzdF9vZmZzZXQpICYgQUNQSV9QTV9NQVNLOworCisJLyogY29udmVydCB0byB1c2VjcyAqLworCWRlbHRhID0gY3ljMnVzKGRlbHRhKTsKKworCS8qIHVwZGF0ZSB0aGUgbW9ub3RvbmljIGJhc2UgdmFsdWUgKi8KKwltb25vdG9uaWNfYmFzZSArPSBkZWx0YSAqIE5TRUNfUEVSX1VTRUM7CisJd3JpdGVfc2VxdW5sb2NrKCZtb25vdG9uaWNfbG9jayk7CisKKwkvKiBjb252ZXJ0IHRvIHRpY2tzICovCisJZGVsdGEgKz0gb2Zmc2V0X2RlbGF5OworCWxvc3QgPSBkZWx0YSAvIChVU0VDX1BFUl9TRUMgLyBIWik7CisJb2Zmc2V0X2RlbGF5ID0gZGVsdGEgJSAoVVNFQ19QRVJfU0VDIC8gSFopOworCisKKwkvKiBjb21wZW5zYXRlIGZvciBsb3N0IHRpY2tzICovCisJaWYgKGxvc3QgPj0gMikKKwkJamlmZmllc182NCArPSBsb3N0IC0gMTsKKworCS8qIGRvbid0IGNhbGN1bGF0ZSBkZWxheSBmb3IgZmlyc3QgcnVuLAorCSAgIG9yIGlmIHdlJ3ZlIGdvdCBsZXNzIHRoZW4gYSB0aWNrICovCisJaWYgKGZpcnN0X3J1biB8fCAobG9zdCA8IDEpKSB7CisJCWZpcnN0X3J1biA9IDA7CisJCW9mZnNldF9kZWxheSA9IDA7CisJfQorfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Nsb2NrX3BtdG1yKHZvaWQpCit7CisJdTMyIGxhc3Rfb2Zmc2V0LCB0aGlzX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYmFzZSwgcmV0OworCXVuc2lnbmVkIHNlcTsKKworCisJLyogYXRvbWljYWxseSByZWFkIG1vbm90b25pYyBiYXNlICYgbGFzdF9vZmZzZXQgKi8KKwlkbyB7CisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJm1vbm90b25pY19sb2NrKTsKKwkJbGFzdF9vZmZzZXQgPSBvZmZzZXRfdGljazsKKwkJYmFzZSA9IG1vbm90b25pY19iYXNlOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJm1vbm90b25pY19sb2NrLCBzZXEpKTsKKworCS8qIFJlYWQgdGhlIHBtdG1yICovCisJdGhpc19vZmZzZXQgPSAgcmVhZF9wbXRtcigpOworCisJLyogY29udmVydCB0byBuYW5vc2Vjb25kcyAqLworCXJldCA9ICh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KSAmIEFDUElfUE1fTUFTSzsKKwlyZXQgPSBiYXNlICsgKGN5YzJ1cyhyZXQpICogTlNFQ19QRVJfVVNFQyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZGVsYXlfcG10bXIodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwl1bnNpZ25lZCBsb25nIGJjbG9jaywgbm93OworCisJcmR0c2NsKGJjbG9jayk7CisJZG8KKwl7CisJCXJlcF9ub3AoKTsKKwkJcmR0c2NsKG5vdyk7CisJfSB3aGlsZSAoKG5vdy1iY2xvY2spIDwgbG9vcHMpOworfQorCisKKy8qCisgKiBnZXQgdGhlIG9mZnNldCAoaW4gbWljcm9zZWNvbmRzKSBmcm9tIHRoZSBsYXN0IGNhbGwgdG8gbWFya19vZmZzZXQoKQorICoJLSBDYWxsZWQgaG9sZGluZyBhIHJlYWRlciB4dGltZV9sb2NrCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9vZmZzZXRfcG10bXIodm9pZCkKK3sKKwl1MzIgbm93LCBvZmZzZXQsIGRlbHRhID0gMDsKKworCW9mZnNldCA9IG9mZnNldF90aWNrOworCW5vdyA9IHJlYWRfcG10bXIoKTsKKwlkZWx0YSA9IChub3cgLSBvZmZzZXQpJkFDUElfUE1fTUFTSzsKKworCXJldHVybiAodW5zaWduZWQgbG9uZykgb2Zmc2V0X2RlbGF5ICsgY3ljMnVzKGRlbHRhKTsKK30KKworCisvKiBhY3BpIHRpbWVyX29wdHMgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IHRpbWVyX29wdHMgdGltZXJfcG10bXIgPSB7CisJLm5hbWUJCQk9ICJwbXRtciIsCisJLm1hcmtfb2Zmc2V0CQk9IG1hcmtfb2Zmc2V0X3BtdG1yLAorCS5nZXRfb2Zmc2V0CQk9IGdldF9vZmZzZXRfcG10bXIsCisJLm1vbm90b25pY19jbG9jayAJPSBtb25vdG9uaWNfY2xvY2tfcG10bXIsCisJLmRlbGF5IAkJCT0gZGVsYXlfcG10bXIsCit9OworCitzdHJ1Y3QgaW5pdF90aW1lcl9vcHRzIF9faW5pdGRhdGEgdGltZXJfcG10bXJfaW5pdCA9IHsKKwkuaW5pdCA9IGluaXRfcG10bXIsCisJLm9wdHMgPSAmdGltZXJfcG10bXIsCit9OworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBvd2VyIE1hbmFnZW1lbnQgVGltZXIgKFBNVE1SKSBhcyBwcmltYXJ5IHRpbWluZyBzb3VyY2UgZm9yIHg4NiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl90c2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjg1OTk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMKQEAgLTAsMCArMSw1NjAgQEAKKy8qCisgKiBUaGlzIGNvZGUgbGFyZ2VseSBtb3ZlZCBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvdGltZS5jLgorICogU2VlIGNvbW1lbnRzIHRoZXJlIGZvciBwcm9wZXIgY3JlZGl0cy4KKyAqCisgKiAyMDA0LTA2LTI1ICAgIEplc3BlciBKdWhsCisgKiAgICAgIG1vdmVkIG1hcmtfb2Zmc2V0X3RzYyBiZWxvdyBjcHVmcmVxX2RlbGF5ZWRfZ2V0IHRvIGF2b2lkIGdjYyAzLjQKKyAqICAgICAgZmFpbGluZyB0byBpbmxpbmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisvKiBwcm9jZXNzb3IuaCBmb3IgZGlzdGFibGVfdHNjIGZsYWcgKi8KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlICJpb19wb3J0cy5oIgorI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKKworI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF91c2VjX3F1b3RpZW50Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0Oworc3RhdGljIHN0cnVjdCB0aW1lcl9vcHRzIHRpbWVyX3RzYzsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkKTsKKworaW50IHRzY19kaXNhYmxlIF9faW5pdGRhdGEgPSAwOworCitleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOworCitzdGF0aWMgaW50IHVzZV90c2M7CisvKiBOdW1iZXIgb2YgdXNlY3MgdGhhdCB0aGUgbGFzdCBpbnRlcnJ1cHQgd2FzIGRlbGF5ZWQgKi8KK3N0YXRpYyBpbnQgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfdHNjX2xvdzsgLyogbHNiIDMyIGJpdHMgb2YgVGltZSBTdGFtcCBDb3VudGVyICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19oaWdoOyAvKiBtc2IgMzIgYml0cyBvZiBUaW1lIFN0YW1wIENvdW50ZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Jhc2U7CitzdGF0aWMgc2VxbG9ja190IG1vbm90b25pY19sb2NrID0gU0VRTE9DS19VTkxPQ0tFRDsKKworLyogY29udmVydCBmcm9tIGN5Y2xlcyg2NGJpdHMpID0+IG5hbm9zZWNvbmRzICg2NGJpdHMpCisgKiAgYmFzaWMgZXF1YXRpb246CisgKgkJbnMgPSBjeWNsZXMgLyAoZnJlcSAvIG5zX3Blcl9zZWMpCisgKgkJbnMgPSBjeWNsZXMgKiAobnNfcGVyX3NlYyAvIGZyZXEpCisgKgkJbnMgPSBjeWNsZXMgKiAoMTBeOSAvIChjcHVfbWh6ICogMTBeNikpCisgKgkJbnMgPSBjeWNsZXMgKiAoMTBeMyAvIGNwdV9taHopCisgKgorICoJVGhlbiB3ZSB1c2Ugc2NhbGluZyBtYXRoIChzdWdnZXN0ZWQgYnkgZ2VvcmdlQG12aXN0YS5jb20pIHRvIGdldDoKKyAqCQlucyA9IGN5Y2xlcyAqICgxMF4zICogU0MgLyBjcHVfbWh6KSAvIFNDCisgKgkJbnMgPSBjeWNsZXMgKiBjeWMybnNfc2NhbGUgLyBTQworICoKKyAqCUFuZCBzaW5jZSBTQyBpcyBhIGNvbnN0YW50IHBvd2VyIG9mIHR3bywgd2UgY2FuIGNvbnZlcnQgdGhlIGRpdgorICogIGludG8gYSBzaGlmdC4gICAKKyAqCQkJLWpvaG5zdHVsQHVzLmlibS5jb20gIm1hdGggaXMgaGFyZCwgbGV0cyBnbyBzaG9wcGluZyEiCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN5YzJuc19zY2FsZTsgCisjZGVmaW5lIENZQzJOU19TQ0FMRV9GQUNUT1IgMTAgLyogMl4xMCwgY2FyZWZ1bGx5IGNob3NlbiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2N5YzJuc19zY2FsZSh1bnNpZ25lZCBsb25nIGNwdV9taHopCit7CisJY3ljMm5zX3NjYWxlID0gKDEwMDAgPDwgQ1lDMk5TX1NDQUxFX0ZBQ1RPUikvY3B1X21oejsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzXzJfbnModW5zaWduZWQgbG9uZyBsb25nIGN5YykKK3sKKwlyZXR1cm4gKGN5YyAqIGN5YzJuc19zY2FsZSkgPj4gQ1lDMk5TX1NDQUxFX0ZBQ1RPUjsKK30KKworc3RhdGljIGludCBjb3VudDI7IC8qIGNvdW50ZXIgZm9yIG1hcmtfb2Zmc2V0X3RzYygpICovCisKKy8qIENhY2hlZCAqbXVsdGlwbGllciogdG8gY29udmVydCBUU0MgY291bnRzIHRvIG1pY3Jvc2Vjb25kcy4KKyAqIChzZWUgdGhlIGVxdWF0aW9uIGJlbG93KS4KKyAqIEVxdWFsIHRvIDJeMzIgKiAoMSAvIChjbG9ja3MgcGVyIHVzZWMpICkuCisgKiBJbml0aWFsaXplZCBpbiB0aW1lX2luaXQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X29mZnNldF90c2Modm9pZCkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGVheCwgZWR4OworCisJLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCisKKwlyZHRzYyhlYXgsZWR4KTsKKworCS8qIC4uIHJlbGF0aXZlIHRvIHByZXZpb3VzIGppZmZ5ICgzMiBiaXRzIGlzIGVub3VnaCkgKi8KKwllYXggLT0gbGFzdF90c2NfbG93OwkvKiB0c2NfbG93IGRlbHRhICovCisKKwkvKgorICAgICAgICAgKiBUaW1lIG9mZnNldCA9ICh0c2NfbG93IGRlbHRhKSAqIGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudAorICAgICAgICAgKiAgICAgICAgICAgICA9ICh0c2NfbG93IGRlbHRhKSAqICh1c2Vjc19wZXJfY2xvY2spCisgICAgICAgICAqICAgICAgICAgICAgID0gKHRzY19sb3cgZGVsdGEpICogKHVzZWNzX3Blcl9qaWZmeSAvIGNsb2Nrc19wZXJfamlmZnkpCisJICoKKwkgKiBVc2luZyBhIG11bGwgaW5zdGVhZCBvZiBhIGRpdmwgc2F2ZXMgdXAgdG8gMzEgY2xvY2sgY3ljbGVzCisJICogaW4gdGhlIGNyaXRpY2FsIHBhdGguCisgICAgICAgICAqLworCisJX19hc21fXygibXVsbCAlMiIKKwkJOiI9YSIgKGVheCksICI9ZCIgKGVkeCkKKwkJOiJybSIgKGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudCksCisJCSAiMCIgKGVheCkpOworCisJLyogb3VyIGFkanVzdGVkIHRpbWUgb2Zmc2V0IGluIG1pY3Jvc2Vjb25kcyAqLworCXJldHVybiBkZWxheV9hdF9sYXN0X2ludGVycnVwdCArIGVkeDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2tfdHNjKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Rfb2Zmc2V0LCB0aGlzX29mZnNldCwgYmFzZTsKKwl1bnNpZ25lZCBzZXE7CisJCisJLyogYXRvbWljYWxseSByZWFkIG1vbm90b25pYyBiYXNlICYgbGFzdF9vZmZzZXQgKi8KKwlkbyB7CisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJm1vbm90b25pY19sb2NrKTsKKwkJbGFzdF9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X3RzY19oaWdoPDwzMil8bGFzdF90c2NfbG93OworCQliYXNlID0gbW9ub3RvbmljX2Jhc2U7CisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbW9ub3RvbmljX2xvY2ssIHNlcSkpOworCisJLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCisJcmR0c2NsbCh0aGlzX29mZnNldCk7CisKKwkvKiByZXR1cm4gdGhlIHZhbHVlIGluIG5zICovCisJcmV0dXJuIGJhc2UgKyBjeWNsZXNfMl9ucyh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KTsKK30KKworLyoKKyAqIFNjaGVkdWxlciBjbG9jayAtIHJldHVybnMgY3VycmVudCB0aW1lIGluIG5hbm9zZWMgdW5pdHMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aGlzX29mZnNldDsKKworCS8qCisJICogSW4gdGhlIE5VTUEgY2FzZSB3ZSBkb250IHVzZSB0aGUgVFNDIGFzIHRoZXkgYXJlIG5vdAorCSAqIHN5bmNocm9uaXplZCBhY3Jvc3MgYWxsIENQVXMuCisJICovCisjaWZuZGVmIENPTkZJR19OVU1BCisJaWYgKCF1c2VfdHNjKQorI2VuZGlmCisJCS8qIG5vIGxvY2tpbmcgYnV0IGEgcmFyZSB3cm9uZyB2YWx1ZSBpcyBub3QgYSBiaWcgZGVhbCAqLworCQlyZXR1cm4gamlmZmllc182NCAqICgxMDAwMDAwMDAwIC8gSFopOworCisJLyogUmVhZCB0aGUgVGltZSBTdGFtcCBDb3VudGVyICovCisJcmR0c2NsbCh0aGlzX29mZnNldCk7CisKKwkvKiByZXR1cm4gdGhlIHZhbHVlIGluIG5zICovCisJcmV0dXJuIGN5Y2xlc18yX25zKHRoaXNfb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgZGVsYXlfdHNjKHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJdW5zaWduZWQgbG9uZyBiY2xvY2ssIG5vdzsKKwkKKwlyZHRzY2woYmNsb2NrKTsKKwlkbworCXsKKwkJcmVwX25vcCgpOworCQlyZHRzY2wobm93KTsKKwl9IHdoaWxlICgobm93LWJjbG9jaykgPCBsb29wcyk7Cit9CisKKyNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgorc3RhdGljIHZvaWQgbWFya19vZmZzZXRfdHNjX2hwZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGhpc19vZmZzZXQsIGxhc3Rfb2Zmc2V0OworIAl1bnNpZ25lZCBsb25nIG9mZnNldCwgdGVtcCwgaHBldF9jdXJyZW50OworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwkvKgorCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZXNlIHR3byBvcGVyYXRpb25zIGhhcHBlbiBhbG1vc3QgYXQKKwkgKiB0aGUgc2FtZSB0aW1lLiBXZSBkbyB0aGUgUkRUU0Mgc3R1ZmYgZmlyc3QsIHNpbmNlIGl0J3MKKwkgKiBmYXN0ZXIuIFRvIGF2b2lkIGFueSBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgaW50ZXJydXB0cworCSAqIGRpc2FibGVkIGxvY2FsbHkuCisJICovCisJLyoKKwkgKiBJbnRlcnJ1cHRzIGFyZSBqdXN0IGRpc2FibGVkIGxvY2FsbHkgc2luY2UgdGhlIHRpbWVyIGlycQorCSAqIGhhcyB0aGUgU0FfSU5URVJSVVBUIGZsYWcgc2V0LiAtYXJjYQorCSAqLworCS8qIHJlYWQgUGVudGl1bSBjeWNsZSBjb3VudGVyICovCisKKwlocGV0X2N1cnJlbnQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJcmR0c2MobGFzdF90c2NfbG93LCBsYXN0X3RzY19oaWdoKTsKKworCS8qIGxvc3QgdGljayBjb21wZW5zYXRpb24gKi8KKwlvZmZzZXQgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ01QKSAtIGhwZXRfdGljazsKKwlpZiAodW5saWtlbHkoKChvZmZzZXQgLSBocGV0X2xhc3QpID4gaHBldF90aWNrKSAmJiAoaHBldF9sYXN0ICE9IDApKSkgeworCQlpbnQgbG9zdF90aWNrcyA9IChvZmZzZXQgLSBocGV0X2xhc3QpIC8gaHBldF90aWNrOworCQlqaWZmaWVzXzY0ICs9IGxvc3RfdGlja3M7CisJfQorCWhwZXRfbGFzdCA9IGhwZXRfY3VycmVudDsKKworCS8qIHVwZGF0ZSB0aGUgbW9ub3RvbmljIGJhc2UgdmFsdWUgKi8KKwl0aGlzX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfdHNjX2hpZ2g8PDMyKXxsYXN0X3RzY19sb3c7CisJbW9ub3RvbmljX2Jhc2UgKz0gY3ljbGVzXzJfbnModGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7CisJd3JpdGVfc2VxdW5sb2NrKCZtb25vdG9uaWNfbG9jayk7CisKKwkvKiBjYWxjdWxhdGUgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgKi8KKwkvKgorCSAqIFRpbWUgb2Zmc2V0ID0gKGhwZXQgZGVsdGEpICogKCB1c2VjcyBwZXIgSFBFVCBjbG9jayApCisJICogICAgICAgICAgICAgPSAoaHBldCBkZWx0YSkgKiAoIHVzZWNzIHBlciB0aWNrIC8gSFBFVCBjbG9ja3MgcGVyIHRpY2spCisJICogICAgICAgICAgICAgPSAoaHBldCBkZWx0YSkgKiAoIGhwZXRfdXNlY19xdW90aWVudCApIC8gKDJeMzIpCisJICogV2hlcmUsCisJICogaHBldF91c2VjX3F1b3RpZW50ID0gKDJeMzIgKiB1c2VjcyBwZXIgdGljaykvSFBFVCBjbG9ja3MgcGVyIHRpY2sKKwkgKi8KKwlkZWxheV9hdF9sYXN0X2ludGVycnVwdCA9IGhwZXRfY3VycmVudCAtIG9mZnNldDsKKwlBU01fTVVMNjRfUkVHKHRlbXAsIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0LAorCQkJaHBldF91c2VjX3F1b3RpZW50LCBkZWxheV9hdF9sYXN0X2ludGVycnVwdCk7Cit9CisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2luaXQgPSAwOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcms7CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQgKnYpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQljcHVmcmVxX2dldChjcHUpOworCX0KKwljcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDA7Cit9CisKKy8qIGlmIHdlIG5vdGljZSBsb3N0IHRpY2tzLCBzY2hlZHVsZSBhIGNhbGwgdG8gY3B1ZnJlcV9nZXQoKSBhcyBpdCB0cmllcworICogdG8gdmVyaWZ5IHRoZSBDUFUgZnJlcXVlbmN5IHRoZSB0aW1pbmcgY29yZSB0aGlua3MgdGhlIENQVSBpcyBydW5uaW5nCisgKiBhdCBpcyBzdGlsbCBjb3JyZWN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkKSAKK3sKKwlpZiAoY3B1ZnJlcV9pbml0ICYmICFjcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCkgeworCQljcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDE7CisJCXByaW50ayhLRVJOX0RFQlVHICJMb3Npbmcgc29tZSB0aWNrcy4uLiBjaGVja2luZyBpZiBDUFUgZnJlcXVlbmN5IGNoYW5nZWQuXG4iKTsKKwkJc2NoZWR1bGVfd29yaygmY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrKTsKKwl9Cit9CisKKy8qIElmIHRoZSBDUFUgZnJlcXVlbmN5IGlzIHNjYWxlZCwgVFNDLWJhc2VkIGRlbGF5cyB3aWxsIG5lZWQgYSBkaWZmZXJlbnQKKyAqIGxvb3BzX3Blcl9qaWZmeSB2YWx1ZSB0byBmdW5jdGlvbiBwcm9wZXJseS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50ICByZWZfZnJlcSA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnlfcmVmID0gMDsKKworI2lmbmRlZiBDT05GSUdfU01QCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmYXN0X2dldHRpbWVvZmZzZXRfcmVmID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV9raHpfcmVmID0gMDsKKyNlbmRpZgorCitzdGF0aWMgaW50Cit0aW1lX2NwdWZyZXFfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCisJCSAgICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzICpmcmVxID0gZGF0YTsKKworCWlmICh2YWwgIT0gQ1BVRlJFUV9SRVNVTUVDSEFOR0UpCisJCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwlpZiAoIXJlZl9mcmVxKSB7CisJCXJlZl9mcmVxID0gZnJlcS0+b2xkOworCQlsb29wc19wZXJfamlmZnlfcmVmID0gY3B1X2RhdGFbZnJlcS0+Y3B1XS5sb29wc19wZXJfamlmZnk7CisjaWZuZGVmIENPTkZJR19TTVAKKwkJZmFzdF9nZXR0aW1lb2Zmc2V0X3JlZiA9IGZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudDsKKwkJY3B1X2toel9yZWYgPSBjcHVfa2h6OworI2VuZGlmCisJfQorCisJaWYgKCh2YWwgPT0gQ1BVRlJFUV9QUkVDSEFOR0UgICYmIGZyZXEtPm9sZCA8IGZyZXEtPm5ldykgfHwKKwkgICAgKHZhbCA9PSBDUFVGUkVRX1BPU1RDSEFOR0UgJiYgZnJlcS0+b2xkID4gZnJlcS0+bmV3KSB8fAorCSAgICAodmFsID09IENQVUZSRVFfUkVTVU1FQ0hBTkdFKSkgeworCQlpZiAoIShmcmVxLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpKQorCQkJY3B1X2RhdGFbZnJlcS0+Y3B1XS5sb29wc19wZXJfamlmZnkgPSBjcHVmcmVxX3NjYWxlKGxvb3BzX3Blcl9qaWZmeV9yZWYsIHJlZl9mcmVxLCBmcmVxLT5uZXcpOworI2lmbmRlZiBDT05GSUdfU01QCisJCWlmIChjcHVfa2h6KQorCQkJY3B1X2toeiA9IGNwdWZyZXFfc2NhbGUoY3B1X2toel9yZWYsIHJlZl9mcmVxLCBmcmVxLT5uZXcpOworCQlpZiAodXNlX3RzYykgeworCQkJaWYgKCEoZnJlcS0+ZmxhZ3MgJiBDUFVGUkVRX0NPTlNUX0xPT1BTKSkgeworCQkJCWZhc3RfZ2V0dGltZW9mZnNldF9xdW90aWVudCA9IGNwdWZyZXFfc2NhbGUoZmFzdF9nZXR0aW1lb2Zmc2V0X3JlZiwgZnJlcS0+bmV3LCByZWZfZnJlcSk7CisJCQkJc2V0X2N5YzJuc19zY2FsZShjcHVfa2h6LzEwMDApOworCQkJfQorCQl9CisjZW5kaWYKKwl9CisKKwlpZiAodmFsICE9IENQVUZSRVFfUkVTVU1FQ0hBTkdFKQorCQl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHRpbWVfY3B1ZnJlcV9ub3RpZmllcgorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3RzYyh2b2lkKQoreworCWludCByZXQ7CisJSU5JVF9XT1JLKCZjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcmssIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0LCBOVUxMKTsKKwlyZXQgPSBjcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZ0aW1lX2NwdWZyZXFfbm90aWZpZXJfYmxvY2ssCisJCQkJCUNQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7CisJaWYgKCFyZXQpCisJCWNwdWZyZXFfaW5pdCA9IDE7CisJcmV0dXJuIHJldDsKK30KK2NvcmVfaW5pdGNhbGwoY3B1ZnJlcV90c2MpOworCisjZWxzZSAvKiBDT05GSUdfQ1BVX0ZSRVEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQpIHsgcmV0dXJuOyB9CisjZW5kaWYgCisKK3N0YXRpYyB2b2lkIG1hcmtfb2Zmc2V0X3RzYyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9zdCxkZWxheTsKKwl1bnNpZ25lZCBsb25nIGRlbHRhID0gbGFzdF90c2NfbG93OworCWludCBjb3VudDsKKwlpbnQgY291bnRtcDsKKwlzdGF0aWMgaW50IGNvdW50MSA9IDA7CisJdW5zaWduZWQgbG9uZyBsb25nIHRoaXNfb2Zmc2V0LCBsYXN0X29mZnNldDsKKwlzdGF0aWMgaW50IGxvc3RfY291bnQgPSAwOworCisJd3JpdGVfc2VxbG9jaygmbW9ub3RvbmljX2xvY2spOworCWxhc3Rfb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF90c2NfaGlnaDw8MzIpfGxhc3RfdHNjX2xvdzsKKwkvKgorCSAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZXNlIHR3byBvcGVyYXRpb25zIGhhcHBlbiBhbG1vc3QgYXQKKwkgKiB0aGUgc2FtZSB0aW1lLiBXZSBkbyB0aGUgUkRUU0Mgc3R1ZmYgZmlyc3QsIHNpbmNlIGl0J3MKKwkgKiBmYXN0ZXIuIFRvIGF2b2lkIGFueSBpbmNvbnNpc3RlbmNpZXMsIHdlIG5lZWQgaW50ZXJydXB0cworCSAqIGRpc2FibGVkIGxvY2FsbHkuCisJICovCisKKwkvKgorCSAqIEludGVycnVwdHMgYXJlIGp1c3QgZGlzYWJsZWQgbG9jYWxseSBzaW5jZSB0aGUgdGltZXIgaXJxCisJICogaGFzIHRoZSBTQV9JTlRFUlJVUFQgZmxhZyBzZXQuIC1hcmNhCisJICovCisKKwkvKiByZWFkIFBlbnRpdW0gY3ljbGUgY291bnRlciAqLworCisJcmR0c2MobGFzdF90c2NfbG93LCBsYXN0X3RzY19oaWdoKTsKKworCXNwaW5fbG9jaygmaTgyNTNfbG9jayk7CisJb3V0Yl9wKDB4MDAsIFBJVF9NT0RFKTsgICAgIC8qIGxhdGNoIHRoZSBjb3VudCBBU0FQICovCisKKwljb3VudCA9IGluYl9wKFBJVF9DSDApOyAgICAvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCisJY291bnQgfD0gaW5iKFBJVF9DSDApIDw8IDg7CisKKwkvKgorCSAqIFZJQTY4NmEgdGVzdCBjb2RlLi4uIHJlc2V0IHRoZSBsYXRjaCBpZiBjb3VudCA+IG1heCArIDEKKwkgKiBmcm9tIHRpbWVyX3BpdC5jIC0gY2piCisJICovCisJaWYgKGNvdW50ID4gTEFUQ0gpIHsKKwkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKKwkJb3V0Yl9wKExBVENIICYgMHhmZiwgUElUX0NIMCk7CisJCW91dGIoTEFUQ0ggPj4gOCwgUElUX0NIMCk7CisJCWNvdW50ID0gTEFUQ0ggLSAxOworCX0KKworCXNwaW5fdW5sb2NrKCZpODI1M19sb2NrKTsKKworCWlmIChwaXRfbGF0Y2hfYnVnZ3kpIHsKKwkJLyogZ2V0IGNlbnRlciB2YWx1ZSBvZiBsYXN0IDMgdGltZSBsdXRjaCAqLworCQlpZiAoKGNvdW50MiA+PSBjb3VudCAmJiBjb3VudCA+PSBjb3VudDEpCisJCSAgICB8fCAoY291bnQxID49IGNvdW50ICYmIGNvdW50ID49IGNvdW50MikpIHsKKwkJCWNvdW50MiA9IGNvdW50MTsgY291bnQxID0gY291bnQ7CisJCX0gZWxzZSBpZiAoKGNvdW50MSA+PSBjb3VudDIgJiYgY291bnQyID49IGNvdW50KQorCQkJICAgfHwgKGNvdW50ID49IGNvdW50MiAmJiBjb3VudDIgPj0gY291bnQxKSkgeworCQkJY291bnRtcCA9IGNvdW50O2NvdW50ID0gY291bnQyOworCQkJY291bnQyID0gY291bnQxO2NvdW50MSA9IGNvdW50bXA7CisJCX0gZWxzZSB7CisJCQljb3VudDIgPSBjb3VudDE7IGNvdW50MSA9IGNvdW50OyBjb3VudCA9IGNvdW50MTsKKwkJfQorCX0KKworCS8qIGxvc3QgdGljayBjb21wZW5zYXRpb24gKi8KKwlkZWx0YSA9IGxhc3RfdHNjX2xvdyAtIGRlbHRhOworCXsKKwkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBlYXgsIGVkeDsKKwkJZWF4ID0gZGVsdGE7CisJCV9fYXNtX18oIm11bGwgJTIiCisJCToiPWEiIChlYXgpLCAiPWQiIChlZHgpCisJCToicm0iIChmYXN0X2dldHRpbWVvZmZzZXRfcXVvdGllbnQpLAorCQkgIjAiIChlYXgpKTsKKwkJZGVsdGEgPSBlZHg7CisJfQorCWRlbHRhICs9IGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0OworCWxvc3QgPSBkZWx0YS8oMTAwMDAwMC9IWik7CisJZGVsYXkgPSBkZWx0YSUoMTAwMDAwMC9IWik7CisJaWYgKGxvc3QgPj0gMikgeworCQlqaWZmaWVzXzY0ICs9IGxvc3QtMTsKKworCQkvKiBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlIHdlJ3JlIG5vdCBhbHdheXMgbG9zaW5nIHRpY2tzICovCisJCWlmIChsb3N0X2NvdW50KysgPiAxMDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkxvc2luZyB0b28gbWFueSB0aWNrcyFcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVFNDIGNhbm5vdCBiZSB1c2VkIGFzIGEgdGltZXNvdXJjZS4gIFxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQb3NzaWJsZSByZWFzb25zIGZvciB0aGlzIGFyZTpcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBZb3UncmUgcnVubmluZyB3aXRoIFNwZWVkc3RlcCxcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBZb3UgZG9uJ3QgaGF2ZSBETUEgZW5hYmxlZCBmb3IgeW91ciBoYXJkIGRpc2sgKHNlZSBoZHBhcm0pLFxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIEluY29ycmVjdCBUU0Mgc3luY2hyb25pemF0aW9uIG9uIGFuIFNNUCBzeXN0ZW0gKHNlZSBkbWVzZykuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhbGxpbmcgYmFjayB0byBhIHNhbmUgdGltZXNvdXJjZSBub3cuXG4iKTsKKworCQkJY2xvY2tfZmFsbGJhY2soKTsKKwkJfQorCQkvKiAuLi4gYnV0IGdpdmUgdGhlIFRTQyBhIGZhaXIgY2hhbmNlICovCisJCWlmIChsb3N0X2NvdW50ID4gMjUpCisJCQljcHVmcmVxX2RlbGF5ZWRfZ2V0KCk7CisJfSBlbHNlCisJCWxvc3RfY291bnQgPSAwOworCS8qIHVwZGF0ZSB0aGUgbW9ub3RvbmljIGJhc2UgdmFsdWUgKi8KKwl0aGlzX29mZnNldCA9ICgodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfdHNjX2hpZ2g8PDMyKXxsYXN0X3RzY19sb3c7CisJbW9ub3RvbmljX2Jhc2UgKz0gY3ljbGVzXzJfbnModGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7CisJd3JpdGVfc2VxdW5sb2NrKCZtb25vdG9uaWNfbG9jayk7CisKKwkvKiBjYWxjdWxhdGUgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgKi8KKwljb3VudCA9ICgoTEFUQ0gtMSkgLSBjb3VudCkgKiBUSUNLX1NJWkU7CisJZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQgPSAoY291bnQgKyBMQVRDSC8yKSAvIExBVENIOworCisJLyogY2F0Y2ggY29ybmVyIGNhc2Ugd2hlcmUgdGljayByb2xsb3ZlciBvY2N1cmVkCisJICogYmV0d2VlbiB0c2MgYW5kIHBpdCByZWFkcyAoYXMgbm90ZWQgd2hlbgorCSAqIHVzZWMgZGVsdGEgaXMgPiA5MCUgIyBvZiB1c2Vjcy90aWNrKQorCSAqLworCWlmIChsb3N0ICYmIGFicyhkZWxheSAtIGRlbGF5X2F0X2xhc3RfaW50ZXJydXB0KSA+ICg5MDAwMDAvSFopKQorCQlqaWZmaWVzXzY0Kys7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdHNjKGNoYXIqIG92ZXJyaWRlKQoreworCisJLyogY2hlY2sgY2xvY2sgb3ZlcnJpZGUgKi8KKwlpZiAob3ZlcnJpZGVbMF0gJiYgc3RybmNtcChvdmVycmlkZSwidHNjIiwzKSkgeworI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisJCWlmIChpc19ocGV0X2VuYWJsZWQoKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJXYXJuaW5nOiBjbG9jaz0gb3ZlcnJpZGUgZmFpbGVkLiBEZWZhdWx0aW5nIHRvIHRzY1xuIik7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIEFQTSBlbmFibGVkIG9yIHRoZSBDUFUgY2xvY2sgc3BlZWQgaXMgdmFyaWFibGUKKwkgKiAoQ1BVIHN0b3BzIGNsb2NrIG9uIEhMVCBvciBzbG93cyBjbG9jayB0byBzYXZlIHBvd2VyKQorCSAqIHRoZW4gdGhlIFRTQyB0aW1lc3RhbXBzIG1heSBkaXZlcmdlIGJ5IHVwIHRvIDEgamlmZnkgZnJvbQorCSAqICdyZWFsIHRpbWUnIGJ1dCBub3RoaW5nIHdpbGwgYnJlYWsuCisJICogVGhlIG1vc3QgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IHRoZSBDUFUgaXMgIndva2VuIiBmcm9tIGEgaGFsdAorCSAqIHN0YXRlIGJ5IHRoZSB0aW1lciBpbnRlcnJ1cHQgaXRzZWxmLCBzbyB3ZSBnZXQgMCBlcnJvci4gSW4gdGhlCisJICogcmFyZSBjYXNlcyB3aGVyZSBhIGRyaXZlciB3b3VsZCAid2FrZSIgdGhlIENQVSBhbmQgcmVxdWVzdCBhCisJICogdGltZXN0YW1wLCB0aGUgbWF4aW11bSBlcnJvciBpcyA8IDEgamlmZnkuIEJ1dCB0aW1lc3RhbXBzIGFyZQorCSAqIHN0aWxsIHBlcmZlY3RseSBvcmRlcmVkLgorCSAqIE5vdGUgdGhhdCB0aGUgVFNDIGNvdW50ZXIgd2lsbCBiZSByZXNldCBpZiBBUE0gc3VzcGVuZHMKKwkgKiB0byBkaXNrOyB0aGlzIHdvbid0IGJyZWFrIHRoZSBrZXJuZWwsIHRob3VnaCwgJ2N1eiB3ZSdyZQorCSAqIHNtYXJ0LiAgU2VlIGFyY2gvaTM4Ni9rZXJuZWwvYXBtLmMuCisJICovCisgCS8qCisgCSAqCUZpcnN0bHkgd2UgaGF2ZSB0byBkbyBhIENQVSBjaGVjayBmb3IgY2hpcHMgd2l0aAorIAkgKiAJYSBwb3RlbnRpYWxseSBidWdneSBUU0MuIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZW4ndCBydW4KKyAJICoJdGhlIGlkZW50L2J1Z3MgY2hlY2tzIHNvIHdlIG11c3QgcnVuIHRoaXMgaG9vayBhcyBpdAorIAkgKgltYXkgdHVybiBvZmYgdGhlIFRTQyBmbGFnLgorIAkgKgorIAkgKglOT1RFOiB0aGlzIGRvZXNuJ3QgeWV0IGhhbmRsZSBTTVAgNDg2IG1hY2hpbmVzIHdoZXJlIG9ubHkKKyAJICoJc29tZSBDUFUncyBoYXZlIGEgVFNDLiBUaGF0cyBuZXZlciB3b3JrZWQgYW5kIG5vYm9keSBoYXMKKyAJICoJbW9hbmVkIGlmIHlvdSBoYXZlIHRoZSBvbmx5IG9uZSBpbiB0aGUgd29ybGQgLSB5b3UgZml4IGl0IQorIAkgKi8KKworCWNvdW50MiA9IExBVENIOyAvKiBpbml0aWFsaXplIGNvdW50ZXIgZm9yIG1hcmtfb2Zmc2V0X3RzYygpICovCisKKwlpZiAoY3B1X2hhc190c2MpIHsKKwkJdW5zaWduZWQgbG9uZyB0c2NfcXVvdGllbnQ7CisjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKKwkJaWYgKGlzX2hwZXRfZW5hYmxlZCgpKXsKKwkJCXVuc2lnbmVkIGxvbmcgcmVzdWx0LCByZW1haW47CisJCQlwcmludGsoIlVzaW5nIFRTQyBmb3IgZ2V0dGltZW9mZGF5XG4iKTsKKwkJCXRzY19xdW90aWVudCA9IGNhbGlicmF0ZV90c2NfaHBldChOVUxMKTsKKwkJCXRpbWVyX3RzYy5tYXJrX29mZnNldCA9ICZtYXJrX29mZnNldF90c2NfaHBldDsKKwkJCS8qCisJCQkgKiBNYXRoIHRvIGNhbGN1bGF0ZSBocGV0IHRvIHVzZWMgbXVsdGlwbGllcgorCQkJICogTG9vayBmb3IgdGhlIGNvbW1lbnRzIGF0IGdldF9vZmZzZXRfdHNjX2hwZXQoKQorCQkJICovCisJCQlBU01fRElWNjRfUkVHKHJlc3VsdCwgcmVtYWluLCBocGV0X3RpY2ssCisJCQkJCTAsIEtFUk5FTF9USUNLX1VTRUMpOworCQkJaWYgKHJlbWFpbiA+IChocGV0X3RpY2sgPj4gMSkpCisJCQkJcmVzdWx0Kys7IC8qIHJvdW5kaW5nIHRoZSByZXN1bHQgKi8KKworCQkJaHBldF91c2VjX3F1b3RpZW50ID0gcmVzdWx0OworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQl0c2NfcXVvdGllbnQgPSBjYWxpYnJhdGVfdHNjKCk7CisJCX0KKworCQlpZiAodHNjX3F1b3RpZW50KSB7CisJCQlmYXN0X2dldHRpbWVvZmZzZXRfcXVvdGllbnQgPSB0c2NfcXVvdGllbnQ7CisJCQl1c2VfdHNjID0gMTsKKwkJCS8qCisJCQkgKglXZSBjb3VsZCBiZSBtb3JlIHNlbGVjdGl2ZSBoZXJlIEkgc3VzcGVjdAorCQkJICoJYW5kIGp1c3QgZW5hYmxlIHRoaXMgZm9yIHRoZSBuZXh0IGludGVsIGNoaXBzID8KKwkJCSAqLworCQkJLyogcmVwb3J0IENQVSBjbG9jayByYXRlIGluIEh6LgorCQkJICogVGhlIGZvcm11bGEgaXMgKDEwXjYgKiAyXjMyKSAvICgyXjMyICogMSAvIChjbG9ja3MvdXMpKSA9CisJCQkgKiBjbG9jay9zZWNvbmQuIE91ciBwcmVjaXNpb24gaXMgYWJvdXQgMTAwIHBwbS4KKwkJCSAqLworCQkJewl1bnNpZ25lZCBsb25nIGVheD0wLCBlZHg9MTAwMDsKKwkJCQlfX2FzbV9fKCJkaXZsICUyIgorCQkgICAgICAgCQk6Ij1hIiAoY3B1X2toeiksICI9ZCIgKGVkeCkKKyAgICAgICAgCSAgICAgICAJCToiciIgKHRzY19xdW90aWVudCksCisJICAgICAgICAgICAgICAgIAkiMCIgKGVheCksICIxIiAoZWR4KSk7CisJCQkJcHJpbnRrKCJEZXRlY3RlZCAlbHUuJTAzbHUgTUh6IHByb2Nlc3Nvci5cbiIsIGNwdV9raHogLyAxMDAwLCBjcHVfa2h6ICUgMTAwMCk7CisJCQl9CisJCQlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHovMTAwMCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2lmbmRlZiBDT05GSUdfWDg2X1RTQworLyogZGlzYWJsZSBmbGFnIGZvciB0c2MuICBUYWtlcyBlZmZlY3QgYnkgY2xlYXJpbmcgdGhlIFRTQyBjcHUgZmxhZworICogaW4gY3B1L2NvbW1vbi5jICovCitzdGF0aWMgaW50IF9faW5pdCB0c2Nfc2V0dXAoY2hhciAqc3RyKQoreworCXRzY19kaXNhYmxlID0gMTsKKwlyZXR1cm4gMTsKK30KKyNlbHNlCitzdGF0aWMgaW50IF9faW5pdCB0c2Nfc2V0dXAoY2hhciAqc3RyKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIm5vdHNjOiBLZXJuZWwgY29tcGlsZWQgd2l0aCBDT05GSUdfWDg2X1RTQywgIgorCQkJCSJjYW5ub3QgZGlzYWJsZSBUU0MuXG4iKTsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorX19zZXR1cCgibm90c2MiLCB0c2Nfc2V0dXApOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdHNjIHRpbWVyX29wdHMgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IHRpbWVyX29wdHMgdGltZXJfdHNjID0geworCS5uYW1lID0gInRzYyIsCisJLm1hcmtfb2Zmc2V0ID0gbWFya19vZmZzZXRfdHNjLCAKKwkuZ2V0X29mZnNldCA9IGdldF9vZmZzZXRfdHNjLAorCS5tb25vdG9uaWNfY2xvY2sgPSBtb25vdG9uaWNfY2xvY2tfdHNjLAorCS5kZWxheSA9IGRlbGF5X3RzYywKK307CisKK3N0cnVjdCBpbml0X3RpbWVyX29wdHMgX19pbml0ZGF0YSB0aW1lcl90c2NfaW5pdCA9IHsKKwkuaW5pdCA9IGluaXRfdHNjLAorCS5vcHRzID0gJnRpbWVyX3RzYywKK307CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RyYW1wb2xpbmUuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHJhbXBvbGluZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjY2UwZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RyYW1wb2xpbmUuUwpAQCAtMCwwICsxLDgwIEBACisvKgorICoKKyAqCVRyYW1wb2xpbmUuUwlEZXJpdmVkIGZyb20gU2V0dXAuUyBieSBMaW51cyBUb3J2YWxkcworICoKKyAqCTQgSmFuIDE5OTcgTWljaGFlbCBDaGFzdGFpbjogY2hhbmdlZCB0byBnbnUgYXMuCisgKgorICoJVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGJvb3Rpbmcgc2Vjb25kYXJ5IENQVXMgaW4gU01QIG1hY2hpbmUKKyAqCisgKglFbnRyeTogQ1M6SVAgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIG91ciBjb2RlLCB3ZSBhcmUgCisgKglpbiByZWFsIG1vZGUgd2l0aCBubyBzdGFjaywgYnV0IHRoZSByZXN0IG9mIHRoZSAKKyAqCXRyYW1wb2xpbmUgcGFnZSB0byBtYWtlIG91ciBzdGFjayBhbmQgZXZlcnl0aGluZyBlbHNlCisgKglpcyBhIG15c3RlcnkuCisgKgorICoJSW4gZmFjdCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIGEgc3RhY2sgc28gd2UgZG9uJ3QKKyAqCXNldCBvbmUgdXAuCisgKgorICoJV2UganVtcCBpbnRvIHRoZSBib290L2NvbXByZXNzZWQvaGVhZC5TIGNvZGUuIFNvIHlvdSdkCisgKgliZXR0ZXIgYmUgcnVubmluZyBhIGNvbXByZXNzZWQga2VybmVsIGltYWdlIG9yIHlvdQorICoJd29uJ3QgZ2V0IHZlcnkgZmFyLgorICoKKyAqCU9uIGVudHJ5IHRvIHRyYW1wb2xpbmVfZGF0YSwgdGhlIHByb2Nlc3NvciBpcyBpbiByZWFsIG1vZGUKKyAqCXdpdGggMTYtYml0IGFkZHJlc3NpbmcgYW5kIDE2LWJpdCBkYXRhLiAgQ1MgaGFzIHNvbWUgdmFsdWUKKyAqCWFuZCBJUCBpcyB6ZXJvLiAgVGh1cywgZGF0YSBhZGRyZXNzZXMgbmVlZCB0byBiZSBhYnNvbHV0ZQorICoJKG5vIHJlbG9jYXRpb24pIGFuZCBhcmUgdGFrZW4gd2l0aCByZWdhcmQgdG8gcl9iYXNlLgorICoKKyAqCUlmIHlvdSB3b3JrIG9uIHRoaXMgZmlsZSwgY2hlY2sgdGhlIG9iamVjdCBtb2R1bGUgd2l0aAorICoJb2JqZHVtcCAtLXJlbG9jIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcmVsb2NhdGlvbgorICoJZW50cmllcyBleGNlcHQgZm9yOgorICoKKyAqCVRZUEUgICAgICAgICAgICAgIFZBTFVFCisgKglSXzM4Nl8zMiAgICAgICAgICBzdGFydHVwXzMyX3NtcAorICoJUl8zODZfMzIgICAgICAgICAgYm9vdF9nZHRfdGFibGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworLmRhdGEKKworLmNvZGUxNgorCitFTlRSWSh0cmFtcG9saW5lX2RhdGEpCityX2Jhc2UgPSAuCisJd2JpbnZkCQkJIyBOZWVkZWQgZm9yIE5VTUEtUSBzaG91bGQgYmUgaGFybWxlc3MgZm9yIG90aGVycworCW1vdgklY3MsICVheAkjIENvZGUgYW5kIGRhdGEgaW4gdGhlIHNhbWUgcGxhY2UKKwltb3YJJWF4LCAlZHMKKworCWNsaQkJCSMgV2Ugc2hvdWxkIGJlIHNhZmUgYW55d2F5CisKKwltb3ZsCSQweEE1QTVBNUE1LCB0cmFtcG9saW5lX2RhdGEgLSByX2Jhc2UKKwkJCQkjIHdyaXRlIG1hcmtlciBmb3IgbWFzdGVyIGtub3dzIHdlJ3JlIHJ1bm5pbmcKKworCS8qIEdEVCB0YWJsZXMgaW4gbm9uIGRlZmF1bHQgbG9jYXRpb24ga2VybmVsIGNhbiBiZSBiZXlvbmQgMTZNQiBhbmQKKwkgKiBsZ2R0IHdpbGwgbm90IGJlIGFibGUgdG8gbG9hZCB0aGUgYWRkcmVzcyBhcyBpbiByZWFsIG1vZGUgZGVmYXVsdAorCSAqIG9wZXJhbmQgc2l6ZSBpcyAxNmJpdC4gVXNlIGxnZHRsIGluc3RlYWQgdG8gZm9yY2Ugb3BlcmFuZCBzaXplCisJICogdG8gMzIgYml0LgorCSAqLworCisJbGlkdGwJYm9vdF9pZHQgLSByX2Jhc2UJIyBsb2FkIGlkdCB3aXRoIDAsIDAKKwlsZ2R0bAlib290X2dkdCAtIHJfYmFzZQkjIGxvYWQgZ2R0IHdpdGggd2hhdGV2ZXIgaXMgYXBwcm9wcmlhdGUKKworCXhvcgklYXgsICVheAorCWluYwklYXgJCSMgcHJvdGVjdGVkIG1vZGUgKFBFKSBiaXQKKwlsbXN3CSVheAkJIyBpbnRvIHByb3RlY3RlZCBtb2RlCisJIyBmbHVzaCBwcmVmZXRjaCBhbmQganVtcCB0byBzdGFydHVwXzMyX3NtcCBpbiBhcmNoL2kzODYva2VybmVsL2hlYWQuUworCWxqbXBsCSRfX0JPT1RfQ1MsICQoc3RhcnR1cF8zMl9zbXAtX19QQUdFX09GRlNFVCkKKworCSMgVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgc2FtZSA2NEsgc2VnbWVudCBhcyB0aGUgYWJvdmU7CisJIyBoZW5jZSB3ZSBkb24ndCB1c2UgdGhlIGJvb3RfZ2R0X2Rlc2NyIGRlZmluZWQgaW4gaGVhZC5TCitib290X2dkdDoKKwkud29yZAlfX0JPT1RfRFMgKyA3CQkJIyBnZHQgbGltaXQKKwkubG9uZwlib290X2dkdF90YWJsZS1fX1BBR0VfT0ZGU0VUCSMgZ2R0IGJhc2UKKworYm9vdF9pZHQ6CisJLndvcmQJMAkJCQkjIGlkdCBsaW1pdCA9IDAKKwkubG9uZwkwCQkJCSMgaWR0IGJhc2UgPSAwTAorCisuZ2xvYmwgdHJhbXBvbGluZV9lbmQKK3RyYW1wb2xpbmVfZW5kOgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMGUzODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKQEAgLTAsMCArMSwxMDg0IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni90cmFwcy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgUGVudGl1bSBJSUkgRlhTUiwgU1NFIHN1cHBvcnQKKyAqCUdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4sIE1heSAyMDAwCisgKi8KKworLyoKKyAqICdUcmFwcy5jJyBoYW5kbGVzIGhhcmR3YXJlIHRyYXBzIGFuZCBmYXVsdHMgYWZ0ZXIgd2UgaGF2ZSBzYXZlZCBzb21lCisgKiBzdGF0ZSBpbiAnYXNtLnMnLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CisKKyNpZmRlZiBDT05GSUdfRUlTQQorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01DQQorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL2kzODcuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CisKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKyNpbmNsdWRlIDxhc20va2RlYnVnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgIm1hY2hfdHJhcHMuaCIKKworYXNtbGlua2FnZSBpbnQgc3lzdGVtX2NhbGwodm9pZCk7CisKK3N0cnVjdCBkZXNjX3N0cnVjdCBkZWZhdWx0X2xkdFtdID0geyB7IDAsIDAgfSwgeyAwLCAwIH0sIHsgMCwgMCB9LAorCQl7IDAsIDAgfSwgeyAwLCAwIH0gfTsKKworLyogRG8gd2UgaWdub3JlIEZQVSBpbnRlcnJ1cHRzID8gKi8KK2NoYXIgaWdub3JlX2ZwdV9pcnEgPSAwOworCisvKgorICogVGhlIElEVCBoYXMgdG8gYmUgcGFnZS1hbGlnbmVkIHRvIHNpbXBsaWZ5IHRoZSBQZW50aXVtCisgKiBGMCAwRiBidWcgd29ya2Fyb3VuZC4uIFdlIGhhdmUgYSBzcGVjaWFsIGxpbmsgc2VnbWVudAorICogZm9yIHRoaXMuCisgKi8KK3N0cnVjdCBkZXNjX3N0cnVjdCBpZHRfdGFibGVbMjU2XSBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaWR0IikpKSA9IHsgezAsIDB9LCB9OworCithc21saW5rYWdlIHZvaWQgZGl2aWRlX2Vycm9yKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGRlYnVnKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIG5taSh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBpbnQzKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIG92ZXJmbG93KHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGJvdW5kcyh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBpbnZhbGlkX29wKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGRldmljZV9ub3RfYXZhaWxhYmxlKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bih2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBpbnZhbGlkX1RTUyh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBzZWdtZW50X25vdF9wcmVzZW50KHZvaWQpOworYXNtbGlua2FnZSB2b2lkIHN0YWNrX3NlZ21lbnQodm9pZCk7Cithc21saW5rYWdlIHZvaWQgZ2VuZXJhbF9wcm90ZWN0aW9uKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIHBhZ2VfZmF1bHQodm9pZCk7Cithc21saW5rYWdlIHZvaWQgY29wcm9jZXNzb3JfZXJyb3Iodm9pZCk7Cithc21saW5rYWdlIHZvaWQgc2ltZF9jb3Byb2Nlc3Nvcl9lcnJvcih2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBhbGlnbm1lbnRfY2hlY2sodm9pZCk7Cithc21saW5rYWdlIHZvaWQgc3B1cmlvdXNfaW50ZXJydXB0X2J1Zyh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBtYWNoaW5lX2NoZWNrKHZvaWQpOworCitzdGF0aWMgaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDI0Oworc3RydWN0IG5vdGlmaWVyX2Jsb2NrICppMzg2ZGllX2NoYWluOworc3RhdGljIERFRklORV9TUElOTE9DSyhkaWVfbm90aWZpZXJfbG9jayk7CisKK2ludCByZWdpc3Rlcl9kaWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZkaWVfbm90aWZpZXJfbG9jaywgZmxhZ3MpOworCWVyciA9IG5vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZpMzg2ZGllX2NoYWluLCBuYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGllX25vdGlmaWVyX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9zdGFja19wdHIoc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywgdm9pZCAqcCkKK3sKKwlyZXR1cm4JcCA+ICh2b2lkICopdGluZm8gJiYKKwkJcCA8ICh2b2lkICopdGluZm8gKyBUSFJFQURfU0laRSAtIDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwcmludF9jb250ZXh0X3N0YWNrKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGluZm8sCisJCQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgZWJwKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworI2lmZGVmCUNPTkZJR19GUkFNRV9QT0lOVEVSCisJd2hpbGUgKHZhbGlkX3N0YWNrX3B0cih0aW5mbywgKHZvaWQgKillYnApKSB7CisJCWFkZHIgPSAqKHVuc2lnbmVkIGxvbmcgKikoZWJwICsgNCk7CisJCXByaW50aygiIFs8JTA4bHg+XSAiLCBhZGRyKTsKKwkJcHJpbnRfc3ltYm9sKCIlcyIsIGFkZHIpOworCQlwcmludGsoIlxuIik7CisJCWVicCA9ICoodW5zaWduZWQgbG9uZyAqKWVicDsKKwl9CisjZWxzZQorCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sIHN0YWNrKSkgeworCQlhZGRyID0gKnN0YWNrKys7CisJCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKKwkJCXByaW50aygiIFs8JTA4bHg+XSIsIGFkZHIpOworCQkJcHJpbnRfc3ltYm9sKCIgJXMiLCBhZGRyKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiBlYnA7Cit9CisKK3ZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKiBzdGFjaykKK3sKKwl1bnNpZ25lZCBsb25nIGVicDsKKworCWlmICghdGFzaykKKwkJdGFzayA9IGN1cnJlbnQ7CisKKwlpZiAodGFzayA9PSBjdXJyZW50KSB7CisJCS8qIEdyYWIgZWJwIHJpZ2h0IGZyb20gb3VyIHJlZ3MgKi8KKwkJYXNtICgibW92bCAlJWVicCwgJTAiIDogIj1yIiAoZWJwKSA6ICk7CisJfSBlbHNlIHsKKwkJLyogZWJwIGlzIHRoZSBsYXN0IHJlZyBwdXNoZWQgYnkgc3dpdGNoX3RvICovCisJCWVicCA9ICoodW5zaWduZWQgbG9uZyAqKSB0YXNrLT50aHJlYWQuZXNwOworCX0KKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCB0aHJlYWRfaW5mbyAqY29udGV4dDsKKwkJY29udGV4dCA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKKwkJCSgodW5zaWduZWQgbG9uZylzdGFjayAmICh+KFRIUkVBRF9TSVpFIC0gMSkpKTsKKwkJZWJwID0gcHJpbnRfY29udGV4dF9zdGFjayhjb250ZXh0LCBzdGFjaywgZWJwKTsKKwkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyopY29udGV4dC0+cHJldmlvdXNfZXNwOworCQlpZiAoIXN0YWNrKQorCQkJYnJlYWs7CisJCXByaW50aygiID09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwl9Cit9CisKK3ZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmVzcCkKK3sKKwl1bnNpZ25lZCBsb25nICpzdGFjazsKKwlpbnQgaTsKKworCWlmIChlc3AgPT0gTlVMTCkgeworCQlpZiAodGFzaykKKwkJCWVzcCA9ICh1bnNpZ25lZCBsb25nKil0YXNrLT50aHJlYWQuZXNwOworCQllbHNlCisJCQllc3AgPSAodW5zaWduZWQgbG9uZyAqKSZlc3A7CisJfQorCisJc3RhY2sgPSBlc3A7CisJZm9yKGkgPSAwOyBpIDwga3N0YWNrX2RlcHRoX3RvX3ByaW50OyBpKyspIHsKKwkJaWYgKGtzdGFja19lbmQoc3RhY2spKQorCQkJYnJlYWs7CisJCWlmIChpICYmICgoaSAlIDgpID09IDApKQorCQkJcHJpbnRrKCJcbiAgICAgICAiKTsKKwkJcHJpbnRrKCIlMDhseCAiLCAqc3RhY2srKyk7CisJfQorCXByaW50aygiXG5DYWxsIFRyYWNlOlxuIik7CisJc2hvd190cmFjZSh0YXNrLCBlc3ApOworfQorCisvKgorICogVGhlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkdW1wX3N0YWNrIGdlbmVyYXRvcgorICovCit2b2lkIGR1bXBfc3RhY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCisJc2hvd190cmFjZShjdXJyZW50LCAmc3RhY2spOworfQorCitFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOworCit2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpOworCWludCBpbl9rZXJuZWwgPSAxOworCXVuc2lnbmVkIGxvbmcgZXNwOworCXVuc2lnbmVkIHNob3J0IHNzOworCisJZXNwID0gKHVuc2lnbmVkIGxvbmcpICgmcmVncy0+ZXNwKTsKKwlzcyA9IF9fS0VSTkVMX0RTOworCWlmIChyZWdzLT54Y3MgJiAzKSB7CisJCWluX2tlcm5lbCA9IDA7CisJCWVzcCA9IHJlZ3MtPmVzcDsKKwkJc3MgPSByZWdzLT54c3MgJiAweGZmZmY7CisJfQorCXByaW50X21vZHVsZXMoKTsKKwlwcmludGsoIkNQVTogICAgJWRcbkVJUDogICAgJTA0eDpbPCUwOGx4Pl0gICAgJXMgVkxJXG5FRkxBR1M6ICUwOGx4IgorCQkJIiAgICglcykgXG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIDB4ZmZmZiAmIHJlZ3MtPnhjcywgcmVncy0+ZWlwLAorCQlwcmludF90YWludGVkKCksIHJlZ3MtPmVmbGFncywgc3lzdGVtX3V0c25hbWUucmVsZWFzZSk7CisJcHJpbnRfc3ltYm9sKCJFSVAgaXMgYXQgJXNcbiIsIHJlZ3MtPmVpcCk7CisJcHJpbnRrKCJlYXg6ICUwOGx4ICAgZWJ4OiAlMDhseCAgIGVjeDogJTA4bHggICBlZHg6ICUwOGx4XG4iLAorCQlyZWdzLT5lYXgsIHJlZ3MtPmVieCwgcmVncy0+ZWN4LCByZWdzLT5lZHgpOworCXByaW50aygiZXNpOiAlMDhseCAgIGVkaTogJTA4bHggICBlYnA6ICUwOGx4ICAgZXNwOiAlMDhseFxuIiwKKwkJcmVncy0+ZXNpLCByZWdzLT5lZGksIHJlZ3MtPmVicCwgZXNwKTsKKwlwcmludGsoImRzOiAlMDR4ICAgZXM6ICUwNHggICBzczogJTA0eFxuIiwKKwkJcmVncy0+eGRzICYgMHhmZmZmLCByZWdzLT54ZXMgJiAweGZmZmYsIHNzKTsKKwlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHRocmVhZGluZm89JXAgdGFzaz0lcCkiLAorCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGN1cnJlbnRfdGhyZWFkX2luZm8oKSwgY3VycmVudCk7CisJLyoKKwkgKiBXaGVuIGluLWtlcm5lbCwgd2UgYWxzbyBwcmludCBvdXQgdGhlIHN0YWNrIGFuZCBjb2RlIGF0IHRoZQorCSAqIHRpbWUgb2YgdGhlIGZhdWx0Li4KKwkgKi8KKwlpZiAoaW5fa2VybmVsKSB7CisJCXU4ICplaXA7CisKKwkJcHJpbnRrKCJcblN0YWNrOiAiKTsKKwkJc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyopZXNwKTsKKworCQlwcmludGsoIkNvZGU6ICIpOworCisJCWVpcCA9ICh1OCAqKXJlZ3MtPmVpcCAtIDQzOworCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKywgZWlwKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgYzsKKworCQkJaWYgKGVpcCA8ICh1OCAqKVBBR0VfT0ZGU0VUIHx8IF9fZ2V0X3VzZXIoYywgZWlwKSkgeworCQkJCXByaW50aygiIEJhZCBFSVAgdmFsdWUuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZWlwID09ICh1OCAqKXJlZ3MtPmVpcCkKKwkJCQlwcmludGsoIjwlMDJ4PiAiLCBjKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIiUwMnggIiwgYyk7CisJCX0KKwl9CisJcHJpbnRrKCJcbiIpOworfQkKKworc3RhdGljIHZvaWQgaGFuZGxlX0JVRyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBzaG9ydCB1ZDI7CisJdW5zaWduZWQgc2hvcnQgbGluZTsKKwljaGFyICpmaWxlOworCWNoYXIgYzsKKwl1bnNpZ25lZCBsb25nIGVpcDsKKworCWlmIChyZWdzLT54Y3MgJiAzKQorCQlnb3RvIG5vX2J1ZzsJCS8qIE5vdCBpbiBrZXJuZWwgKi8KKworCWVpcCA9IHJlZ3MtPmVpcDsKKworCWlmIChlaXAgPCBQQUdFX09GRlNFVCkKKwkJZ290byBub19idWc7CisJaWYgKF9fZ2V0X3VzZXIodWQyLCAodW5zaWduZWQgc2hvcnQgKillaXApKQorCQlnb3RvIG5vX2J1ZzsKKwlpZiAodWQyICE9IDB4MGIwZikKKwkJZ290byBub19idWc7CisJaWYgKF9fZ2V0X3VzZXIobGluZSwgKHVuc2lnbmVkIHNob3J0ICopKGVpcCArIDIpKSkKKwkJZ290byBidWc7CisJaWYgKF9fZ2V0X3VzZXIoZmlsZSwgKGNoYXIgKiopKGVpcCArIDQpKSB8fAorCQkodW5zaWduZWQgbG9uZylmaWxlIDwgUEFHRV9PRkZTRVQgfHwgX19nZXRfdXNlcihjLCBmaWxlKSkKKwkJZmlsZSA9ICI8YmFkIGZpbGVuYW1lPiI7CisKKwlwcmludGsoIi0tLS0tLS0tLS0tLVsgY3V0IGhlcmUgXS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrKEtFUk5fQUxFUlQgImtlcm5lbCBCVUcgYXQgJXM6JWQhXG4iLCBmaWxlLCBsaW5lKTsKKworbm9fYnVnOgorCXJldHVybjsKKworCS8qIEhlcmUgd2Uga25vdyBpdCB3YXMgYSBCVUcgYnV0IGZpbGUtbi1saW5lIGlzIHVuYXZhaWxhYmxlICovCitidWc6CisJcHJpbnRrKCJLZXJuZWwgQlVHXG4iKTsKK30KKwordm9pZCBkaWUoY29uc3QgY2hhciAqIHN0ciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycikKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJc3BpbmxvY2tfdCBsb2NrOworCQl1MzIgbG9ja19vd25lcjsKKwkJaW50IGxvY2tfb3duZXJfZGVwdGg7CisJfSBkaWUgPSB7CisJCS5sb2NrID0JCQlTUElOX0xPQ0tfVU5MT0NLRUQsCisJCS5sb2NrX293bmVyID0JCS0xLAorCQkubG9ja19vd25lcl9kZXB0aCA9CTAKKwl9OworCXN0YXRpYyBpbnQgZGllX2NvdW50ZXI7CisKKwlpZiAoZGllLmxvY2tfb3duZXIgIT0gX3NtcF9wcm9jZXNzb3JfaWQoKSkgeworCQljb25zb2xlX3ZlcmJvc2UoKTsKKwkJc3Bpbl9sb2NrX2lycSgmZGllLmxvY2spOworCQlkaWUubG9ja19vd25lciA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJZGllLmxvY2tfb3duZXJfZGVwdGggPSAwOworCQlidXN0X3NwaW5sb2NrcygxKTsKKwl9CisKKwlpZiAoKytkaWUubG9ja19vd25lcl9kZXB0aCA8IDMpIHsKKwkJaW50IG5sID0gMDsKKwkJaGFuZGxlX0JVRyhyZWdzKTsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiAlMDRseCBbIyVkXVxuIiwgc3RyLCBlcnIgJiAweGZmZmYsICsrZGllX2NvdW50ZXIpOworI2lmZGVmIENPTkZJR19QUkVFTVBUCisJCXByaW50aygiUFJFRU1QVCAiKTsKKwkJbmwgPSAxOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NNUAorCQlwcmludGsoIlNNUCAiKTsKKwkJbmwgPSAxOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQworCQlwcmludGsoIkRFQlVHX1BBR0VBTExPQyIpOworCQlubCA9IDE7CisjZW5kaWYKKwkJaWYgKG5sKQorCQkJcHJpbnRrKCJcbiIpOworCW5vdGlmeV9kaWUoRElFX09PUFMsIChjaGFyICopc3RyLCByZWdzLCBlcnIsIDI1NSwgU0lHU0VHVik7CisJCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworICAJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAiUmVjdXJzaXZlIGRpZSgpIGZhaWx1cmUsIG91dHB1dCBzdXBwcmVzc2VkXG4iKTsKKworCWJ1c3Rfc3BpbmxvY2tzKDApOworCWRpZS5sb2NrX293bmVyID0gLTE7CisJc3Bpbl91bmxvY2tfaXJxKCZkaWUubG9jayk7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIGluIGludGVycnVwdCIpOworCisJaWYgKHBhbmljX29uX29vcHMpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkZhdGFsIGV4Y2VwdGlvbjogcGFuaWMgaW4gNSBzZWNvbmRzXG4iKTsKKwkJc3NsZWVwKDUpOworCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7CisJfQorCWRvX2V4aXQoU0lHU0VHVik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaWVfaWZfa2VybmVsKGNvbnN0IGNoYXIgKiBzdHIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnIpCit7CisJaWYgKCEocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgJiYgISgzICYgcmVncy0+eGNzKSkKKwkJZGllKHN0ciwgcmVncywgZXJyKTsKK30KKworc3RhdGljIHZvaWQgZG9fdHJhcChpbnQgdHJhcG5yLCBpbnQgc2lnbnIsIGNoYXIgKnN0ciwgaW50IHZtODYsCisJCQkgICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSwgc2lnaW5mb190ICppbmZvKQoreworCWlmIChyZWdzLT5lZmxhZ3MgJiBWTV9NQVNLKSB7CisJCWlmICh2bTg2KQorCQkJZ290byB2bTg2X3RyYXA7CisJCWdvdG8gdHJhcF9zaWduYWw7CisJfQorCisJaWYgKCEocmVncy0+eGNzICYgMykpCisJCWdvdG8ga2VybmVsX3RyYXA7CisKKwl0cmFwX3NpZ25hbDogeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCQl0c2stPnRocmVhZC50cmFwX25vID0gdHJhcG5yOworCQlpZiAoaW5mbykKKwkJCWZvcmNlX3NpZ19pbmZvKHNpZ25yLCBpbmZvLCB0c2spOworCQllbHNlCisJCQlmb3JjZV9zaWcoc2lnbnIsIHRzayk7CisJCXJldHVybjsKKwl9CisKKwlrZXJuZWxfdHJhcDogeworCQlpZiAoIWZpeHVwX2V4Y2VwdGlvbihyZWdzKSkKKwkJCWRpZShzdHIsIHJlZ3MsIGVycm9yX2NvZGUpOworCQlyZXR1cm47CisJfQorCisJdm04Nl90cmFwOiB7CisJCWludCByZXQgPSBoYW5kbGVfdm04Nl90cmFwKChzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqKSByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIpOworCQlpZiAocmV0KSBnb3RvIHRyYXBfc2lnbmFsOworCQlyZXR1cm47CisJfQorfQorCisjZGVmaW5lIERPX0VSUk9SKHRyYXBuciwgc2lnbnIsIHN0ciwgbmFtZSkgXAorZmFzdGNhbGwgdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpIFwKK3sgXAorCWlmIChub3RpZnlfZGllKERJRV9UUkFQLCBzdHIsIHJlZ3MsIGVycm9yX2NvZGUsIHRyYXBuciwgc2lnbnIpIFwKKwkJCQkJCT09IE5PVElGWV9TVE9QKSBcCisJCXJldHVybjsgXAorCWRvX3RyYXAodHJhcG5yLCBzaWduciwgc3RyLCAwLCByZWdzLCBlcnJvcl9jb2RlLCBOVUxMKTsgXAorfQorCisjZGVmaW5lIERPX0VSUk9SX0lORk8odHJhcG5yLCBzaWduciwgc3RyLCBuYW1lLCBzaWNvZGUsIHNpYWRkcikgXAorZmFzdGNhbGwgdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpIFwKK3sgXAorCXNpZ2luZm9fdCBpbmZvOyBcCisJaW5mby5zaV9zaWdubyA9IHNpZ25yOyBcCisJaW5mby5zaV9lcnJubyA9IDA7IFwKKwlpbmZvLnNpX2NvZGUgPSBzaWNvZGU7IFwKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilzaWFkZHI7IFwKKwlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIsIHNpZ25yKSBcCisJCQkJCQk9PSBOT1RJRllfU1RPUCkgXAorCQlyZXR1cm47IFwKKwlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgMCwgcmVncywgZXJyb3JfY29kZSwgJmluZm8pOyBcCit9CisKKyNkZWZpbmUgRE9fVk04Nl9FUlJPUih0cmFwbnIsIHNpZ25yLCBzdHIsIG5hbWUpIFwKK2Zhc3RjYWxsIHZvaWQgZG9fIyNuYW1lKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKSBcCit7IFwKKwlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIsIHNpZ25yKSBcCisJCQkJCQk9PSBOT1RJRllfU1RPUCkgXAorCQlyZXR1cm47IFwKKwlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgMSwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7IFwKK30KKworI2RlZmluZSBET19WTTg2X0VSUk9SX0lORk8odHJhcG5yLCBzaWduciwgc3RyLCBuYW1lLCBzaWNvZGUsIHNpYWRkcikgXAorZmFzdGNhbGwgdm9pZCBkb18jI25hbWUoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpIFwKK3sgXAorCXNpZ2luZm9fdCBpbmZvOyBcCisJaW5mby5zaV9zaWdubyA9IHNpZ25yOyBcCisJaW5mby5zaV9lcnJubyA9IDA7IFwKKwlpbmZvLnNpX2NvZGUgPSBzaWNvZGU7IFwKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilzaWFkZHI7IFwKKwlpZiAobm90aWZ5X2RpZShESUVfVFJBUCwgc3RyLCByZWdzLCBlcnJvcl9jb2RlLCB0cmFwbnIsIHNpZ25yKSBcCisJCQkJCQk9PSBOT1RJRllfU1RPUCkgXAorCQlyZXR1cm47IFwKKwlkb190cmFwKHRyYXBuciwgc2lnbnIsIHN0ciwgMSwgcmVncywgZXJyb3JfY29kZSwgJmluZm8pOyBcCit9CisKK0RPX1ZNODZfRVJST1JfSU5GTyggMCwgU0lHRlBFLCAgImRpdmlkZSBlcnJvciIsIGRpdmlkZV9lcnJvciwgRlBFX0lOVERJViwgcmVncy0+ZWlwKQorI2lmbmRlZiBDT05GSUdfS1BST0JFUworRE9fVk04Nl9FUlJPUiggMywgU0lHVFJBUCwgImludDMiLCBpbnQzKQorI2VuZGlmCitET19WTTg2X0VSUk9SKCA0LCBTSUdTRUdWLCAib3ZlcmZsb3ciLCBvdmVyZmxvdykKK0RPX1ZNODZfRVJST1IoIDUsIFNJR1NFR1YsICJib3VuZHMiLCBib3VuZHMpCitET19FUlJPUl9JTkZPKCA2LCBTSUdJTEwsICAiaW52YWxpZCBvcGVyYW5kIiwgaW52YWxpZF9vcCwgSUxMX0lMTE9QTiwgcmVncy0+ZWlwKQorRE9fRVJST1IoIDksIFNJR0ZQRSwgICJjb3Byb2Nlc3NvciBzZWdtZW50IG92ZXJydW4iLCBjb3Byb2Nlc3Nvcl9zZWdtZW50X292ZXJydW4pCitET19FUlJPUigxMCwgU0lHU0VHViwgImludmFsaWQgVFNTIiwgaW52YWxpZF9UU1MpCitET19FUlJPUigxMSwgU0lHQlVTLCAgInNlZ21lbnQgbm90IHByZXNlbnQiLCBzZWdtZW50X25vdF9wcmVzZW50KQorRE9fRVJST1IoMTIsIFNJR0JVUywgICJzdGFjayBzZWdtZW50Iiwgc3RhY2tfc2VnbWVudCkKK0RPX0VSUk9SX0lORk8oMTcsIFNJR0JVUywgImFsaWdubWVudCBjaGVjayIsIGFsaWdubWVudF9jaGVjaywgQlVTX0FEUkFMTiwgMCkKKworZmFzdGNhbGwgdm9pZCBkb19nZW5lcmFsX3Byb3RlY3Rpb24oc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCit7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCA9ICZjdXJyZW50LT50aHJlYWQ7CisKKwkvKgorCSAqIFBlcmZvcm0gdGhlIGxhenkgVFNTJ3MgSS9PIGJpdG1hcCBjb3B5LiBJZiB0aGUgVFNTIGhhcyBhbgorCSAqIGludmFsaWQgb2Zmc2V0IHNldCAodGhlIExBWlkgb25lKSBhbmQgdGhlIGZhdWx0aW5nIHRocmVhZCBoYXMKKwkgKiBhIHZhbGlkIEkvTyBiaXRtYXAgcG9pbnRlciwgd2UgY29weSB0aGUgSS9PIGJpdG1hcCBpbiB0aGUgVFNTCisJICogYW5kIHdlIHNldCB0aGUgb2Zmc2V0IGZpZWxkIGNvcnJlY3RseS4gVGhlbiB3ZSBsZXQgdGhlIENQVSB0bworCSAqIHJlc3RhcnQgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uLgorCSAqLworCWlmICh0c3MtPmlvX2JpdG1hcF9iYXNlID09IElOVkFMSURfSU9fQklUTUFQX09GRlNFVF9MQVpZICYmCisJICAgIHRocmVhZC0+aW9fYml0bWFwX3B0cikgeworCQltZW1jcHkodHNzLT5pb19iaXRtYXAsIHRocmVhZC0+aW9fYml0bWFwX3B0ciwKKwkJICAgICAgIHRocmVhZC0+aW9fYml0bWFwX21heCk7CisJCS8qCisJCSAqIElmIHRoZSBwcmV2aW91c2x5IHNldCBtYXAgd2FzIGV4dGVuZGluZyB0byBoaWdoZXIgcG9ydHMKKwkJICogdGhhbiB0aGUgY3VycmVudCBvbmUsIHBhZCBleHRyYSBzcGFjZSB3aXRoIDB4ZmYgKG5vIGFjY2VzcykuCisJCSAqLworCQlpZiAodGhyZWFkLT5pb19iaXRtYXBfbWF4IDwgdHNzLT5pb19iaXRtYXBfbWF4KQorCQkJbWVtc2V0KChjaGFyICopIHRzcy0+aW9fYml0bWFwICsKKwkJCQl0aHJlYWQtPmlvX2JpdG1hcF9tYXgsIDB4ZmYsCisJCQkJdHNzLT5pb19iaXRtYXBfbWF4IC0gdGhyZWFkLT5pb19iaXRtYXBfbWF4KTsKKwkJdHNzLT5pb19iaXRtYXBfbWF4ID0gdGhyZWFkLT5pb19iaXRtYXBfbWF4OworCQl0c3MtPmlvX2JpdG1hcF9iYXNlID0gSU9fQklUTUFQX09GRlNFVDsKKwkJcHV0X2NwdSgpOworCQlyZXR1cm47CisJfQorCXB1dF9jcHUoKTsKKworCWlmIChyZWdzLT5lZmxhZ3MgJiBWTV9NQVNLKQorCQlnb3RvIGdwX2luX3ZtODY7CisKKwlpZiAoIShyZWdzLT54Y3MgJiAzKSkKKwkJZ290byBncF9pbl9rZXJuZWw7CisKKwljdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAxMzsKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJcmV0dXJuOworCitncF9pbl92bTg2OgorCWxvY2FsX2lycV9lbmFibGUoKTsKKwloYW5kbGVfdm04Nl9mYXVsdCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikgcmVncywgZXJyb3JfY29kZSk7CisJcmV0dXJuOworCitncF9pbl9rZXJuZWw6CisJaWYgKCFmaXh1cF9leGNlcHRpb24ocmVncykpIHsKKwkJaWYgKG5vdGlmeV9kaWUoRElFX0dQRiwgImdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdCIsIHJlZ3MsCisJCQkJZXJyb3JfY29kZSwgMTMsIFNJR1NFR1YpID09IE5PVElGWV9TVE9QKQorCQkJcmV0dXJuOworCQlkaWUoImdlbmVyYWwgcHJvdGVjdGlvbiBmYXVsdCIsIHJlZ3MsIGVycm9yX2NvZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgbWVtX3Bhcml0eV9lcnJvcih1bnNpZ25lZCBjaGFyIHJlYXNvbiwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXByaW50aygiVWhodWguIE5NSSByZWNlaXZlZC4gRGF6ZWQgYW5kIGNvbmZ1c2VkLCBidXQgdHJ5aW5nIHRvIGNvbnRpbnVlXG4iKTsKKwlwcmludGsoIllvdSBwcm9iYWJseSBoYXZlIGEgaGFyZHdhcmUgcHJvYmxlbSB3aXRoIHlvdXIgUkFNIGNoaXBzXG4iKTsKKworCS8qIENsZWFyIGFuZCBkaXNhYmxlIHRoZSBtZW1vcnkgcGFyaXR5IGVycm9yIGxpbmUuICovCisJY2xlYXJfbWVtX2Vycm9yKHJlYXNvbik7Cit9CisKK3N0YXRpYyB2b2lkIGlvX2NoZWNrX2Vycm9yKHVuc2lnbmVkIGNoYXIgcmVhc29uLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJcHJpbnRrKCJOTUk6IElPQ0sgZXJyb3IgKGRlYnVnIGludGVycnVwdD8pXG4iKTsKKwlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKworCS8qIFJlLWVuYWJsZSB0aGUgSU9DSyBsaW5lLCB3YWl0IGZvciBhIGZldyBzZWNvbmRzICovCisJcmVhc29uID0gKHJlYXNvbiAmIDB4ZikgfCA4OworCW91dGIocmVhc29uLCAweDYxKTsKKwlpID0gMjAwMDsKKwl3aGlsZSAoLS1pKSB1ZGVsYXkoMTAwMCk7CisJcmVhc29uICY9IH44OworCW91dGIocmVhc29uLCAweDYxKTsKK30KKworc3RhdGljIHZvaWQgdW5rbm93bl9ubWlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKyNpZmRlZiBDT05GSUdfTUNBCisJLyogTWlnaHQgYWN0dWFsbHkgYmUgYWJsZSB0byBmaWd1cmUgb3V0IHdoYXQgdGhlIGd1aWx0eSBwYXJ0eQorCSogaXMuICovCisJaWYoIE1DQV9idXMgKSB7CisJCW1jYV9oYW5kbGVfbm1pKCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlwcmludGsoIlVoaHVoLiBOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnggb24gQ1BVICVkLlxuIiwKKwkJcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXByaW50aygiRGF6ZWQgYW5kIGNvbmZ1c2VkLCBidXQgdHJ5aW5nIHRvIGNvbnRpbnVlXG4iKTsKKwlwcmludGsoIkRvIHlvdSBoYXZlIGEgc3RyYW5nZSBwb3dlciBzYXZpbmcgbW9kZSBlbmFibGVkP1xuIik7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobm1pX3ByaW50X2xvY2spOworCit2b2lkIGRpZV9ubWkgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICptc2cpCit7CisJc3Bpbl9sb2NrKCZubWlfcHJpbnRfbG9jayk7CisJLyoKKwkqIFdlIGFyZSBpbiB0cm91YmxlIGFueXdheSwgbGV0cyBhdCBsZWFzdCB0cnkKKwkqIHRvIGdldCBhIG1lc3NhZ2Ugb3V0LgorCSovCisJYnVzdF9zcGlubG9ja3MoMSk7CisJcHJpbnRrKG1zZyk7CisJcHJpbnRrKCIgb24gQ1BVJWQsIGVpcCAlMDhseCwgcmVnaXN0ZXJzOlxuIiwKKwkJc21wX3Byb2Nlc3Nvcl9pZCgpLCByZWdzLT5laXApOworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCXByaW50aygiY29uc29sZSBzaHV0cyB1cCAuLi5cbiIpOworCWNvbnNvbGVfc2lsZW50KCk7CisJc3Bpbl91bmxvY2soJm5taV9wcmludF9sb2NrKTsKKwlidXN0X3NwaW5sb2NrcygwKTsKKwlkb19leGl0KFNJR1NFR1YpOworfQorCitzdGF0aWMgdm9pZCBkZWZhdWx0X2RvX25taShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdW5zaWduZWQgY2hhciByZWFzb24gPSAwOworCisJLyogT25seSB0aGUgQlNQIGdldHMgZXh0ZXJuYWwgTk1JcyBmcm9tIHRoZSBzeXN0ZW0uICAqLworCWlmICghc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQlyZWFzb24gPSBnZXRfbm1pX3JlYXNvbigpOworIAorCWlmICghKHJlYXNvbiAmIDB4YzApKSB7CisJCWlmIChub3RpZnlfZGllKERJRV9OTUlfSVBJLCAibm1pX2lwaSIsIHJlZ3MsIHJlYXNvbiwgMCwgU0lHSU5UKQorCQkJCQkJCT09IE5PVElGWV9TVE9QKQorCQkJcmV0dXJuOworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCQkvKgorCQkgKiBPaywgc28gdGhpcyBpcyBub25lIG9mIHRoZSBkb2N1bWVudGVkIE5NSSBzb3VyY2VzLAorCQkgKiBzbyBpdCBtdXN0IGJlIHRoZSBOTUkgd2F0Y2hkb2cuCisJCSAqLworCQlpZiAobm1pX3dhdGNoZG9nKSB7CisJCQlubWlfd2F0Y2hkb2dfdGljayhyZWdzKTsKKwkJCXJldHVybjsKKwkJfQorI2VuZGlmCisJCXVua25vd25fbm1pX2Vycm9yKHJlYXNvbiwgcmVncyk7CisJCXJldHVybjsKKwl9CisJaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIHJlYXNvbiwgMCwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuOworCWlmIChyZWFzb24gJiAweDgwKQorCQltZW1fcGFyaXR5X2Vycm9yKHJlYXNvbiwgcmVncyk7CisJaWYgKHJlYXNvbiAmIDB4NDApCisJCWlvX2NoZWNrX2Vycm9yKHJlYXNvbiwgcmVncyk7CisJLyoKKwkgKiBSZWFzc2VydCBOTUkgaW4gY2FzZSBpdCBiZWNhbWUgYWN0aXZlIG1lYW53aGlsZQorCSAqIGFzIGl0J3MgZWRnZS10cmlnZ2VyZWQuCisJICovCisJcmVhc3NlcnRfbm1pKCk7Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfbm1pX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgaW50IGNwdSkKK3sKKwlyZXR1cm4gMDsKK30KKyAKK3N0YXRpYyBubWlfY2FsbGJhY2tfdCBubWlfY2FsbGJhY2sgPSBkdW1teV9ubWlfY2FsbGJhY2s7CisgCitmYXN0Y2FsbCB2b2lkIGRvX25taShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlpbnQgY3B1OworCisJbm1pX2VudGVyKCk7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJKytubWlfY291bnQoY3B1KTsKKworCWlmICghbm1pX2NhbGxiYWNrKHJlZ3MsIGNwdSkpCisJCWRlZmF1bHRfZG9fbm1pKHJlZ3MpOworCisJbm1pX2V4aXQoKTsKK30KKwordm9pZCBzZXRfbm1pX2NhbGxiYWNrKG5taV9jYWxsYmFja190IGNhbGxiYWNrKQoreworCW5taV9jYWxsYmFjayA9IGNhbGxiYWNrOworfQorCit2b2lkIHVuc2V0X25taV9jYWxsYmFjayh2b2lkKQoreworCW5taV9jYWxsYmFjayA9IGR1bW15X25taV9jYWxsYmFjazsKK30KKworI2lmZGVmIENPTkZJR19LUFJPQkVTCitmYXN0Y2FsbCBpbnQgZG9faW50MyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCWlmIChub3RpZnlfZGllKERJRV9JTlQzLCAiaW50MyIsIHJlZ3MsIGVycm9yX2NvZGUsIDMsIFNJR1RSQVApCisJCQk9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuIDE7CisJLyogVGhpcyBpcyBhbiBpbnRlcnJ1cHQgZ2F0ZSwgYmVjYXVzZSBrcHJvYmVzIHdhbnRzIGludGVycnVwdHMKKwlkaXNhYmxlZC4gIE5vcm1hbCB0cmFwIGhhbmRsZXJzIGRvbid0LiAqLworCXJlc3RvcmVfaW50ZXJydXB0cyhyZWdzKTsKKwlkb190cmFwKDMsIFNJR1RSQVAsICJpbnQzIiwgMSwgcmVncywgZXJyb3JfY29kZSwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIE91ciBoYW5kbGluZyBvZiB0aGUgcHJvY2Vzc29yIGRlYnVnIHJlZ2lzdGVycyBpcyBub24tdHJpdmlhbC4KKyAqIFdlIGRvIG5vdCBjbGVhciB0aGVtIG9uIGVudHJ5IGFuZCBleGl0IGZyb20gdGhlIGtlcm5lbC4gVGhlcmVmb3JlCisgKiBpdCBpcyBwb3NzaWJsZSB0byBnZXQgYSB3YXRjaHBvaW50IHRyYXAgaGVyZSBmcm9tIGluc2lkZSB0aGUga2VybmVsLgorICogSG93ZXZlciwgdGhlIGNvZGUgaW4gLi9wdHJhY2UuYyBoYXMgZW5zdXJlZCB0aGF0IHRoZSB1c2VyIGNhbgorICogb25seSBzZXQgd2F0Y2hwb2ludHMgb24gdXNlcnNwYWNlIGFkZHJlc3Nlcy4gVGhlcmVmb3JlIHRoZSBpbi1rZXJuZWwKKyAqIHdhdGNocG9pbnQgdHJhcCBjYW4gb25seSBvY2N1ciBpbiBjb2RlIHdoaWNoIGlzIHJlYWRpbmcvd3JpdGluZworICogZnJvbSB1c2VyIHNwYWNlLiBTdWNoIGNvZGUgbXVzdCBub3QgaG9sZCBrZXJuZWwgbG9ja3MgKHNpbmNlIGl0CisgKiBjYW4gZXF1YWxseSB0YWtlIGEgcGFnZSBmYXVsdCksIHRoZXJlZm9yZSBpdCBpcyBzYWZlIHRvIGNhbGwKKyAqIGZvcmNlX3NpZ19pbmZvIGV2ZW4gdGhvdWdoIHRoYXQgY2xhaW1zIGFuZCByZWxlYXNlcyBsb2Nrcy4KKyAqIAorICogQ29kZSBpbiAuL3NpZ25hbC5jIGVuc3VyZXMgdGhhdCB0aGUgZGVidWcgY29udHJvbCByZWdpc3RlcgorICogaXMgcmVzdG9yZWQgYmVmb3JlIHdlIGRlbGl2ZXIgYW55IHNpZ25hbCwgYW5kIHRoZXJlZm9yZSB0aGF0CisgKiB1c2VyIGNvZGUgcnVucyB3aXRoIHRoZSBjb3JyZWN0IGRlYnVnIGNvbnRyb2wgcmVnaXN0ZXIgZXZlbiB0aG91Z2gKKyAqIHdlIGNsZWFyIGl0IGhlcmUuCisgKgorICogQmVpbmcgY2FyZWZ1bCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBiZSBhcyBjYXJlZnVsIGluIGEKKyAqIGxvdCBvZiBtb3JlIGNvbXBsaWNhdGVkIHBsYWNlcyAodGFzayBzd2l0Y2hpbmcgY2FuIGJlIGEgYml0IGxhenkKKyAqIGFib3V0IHJlc3RvcmluZyBhbGwgdGhlIGRlYnVnIHN0YXRlLCBhbmQgcHRyYWNlIGRvZXNuJ3QgaGF2ZSB0bworICogZmluZCBldmVyeSBvY2N1cnJlbmNlIG9mIHRoZSBURiBiaXQgdGhhdCBjb3VsZCBiZSBzYXZlZCBhd2F5IGV2ZW4KKyAqIGJ5IHVzZXIgY29kZSkKKyAqLworZmFzdGNhbGwgdm9pZCBkb19kZWJ1ZyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwl1bnNpZ25lZCBpbnQgY29uZGl0aW9uOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlZGI2LCUwIiA6ICI9ciIgKGNvbmRpdGlvbikpOworCisJaWYgKG5vdGlmeV9kaWUoRElFX0RFQlVHLCAiZGVidWciLCByZWdzLCBjb25kaXRpb24sIGVycm9yX2NvZGUsCisJCQkJCVNJR1RSQVApID09IE5PVElGWV9TVE9QKQorCQlyZXR1cm47CisJLyogSXQncyBzYWZlIHRvIGFsbG93IGlycSdzIGFmdGVyIERSNiBoYXMgYmVlbiBzYXZlZCAqLworCWlmIChyZWdzLT5lZmxhZ3MgJiBYODZfRUZMQUdTX0lGKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkvKiBNYXNrIG91dCBzcHVyaW91cyBkZWJ1ZyB0cmFwcyBkdWUgdG8gbGF6eSBEUjcgc2V0dGluZyAqLworCWlmIChjb25kaXRpb24gJiAoRFJfVFJBUDB8RFJfVFJBUDF8RFJfVFJBUDJ8RFJfVFJBUDMpKSB7CisJCWlmICghdHNrLT50aHJlYWQuZGVidWdyZWdbN10pCisJCQlnb3RvIGNsZWFyX2RyNzsKKwl9CisKKwlpZiAocmVncy0+ZWZsYWdzICYgVk1fTUFTSykKKwkJZ290byBkZWJ1Z192bTg2OworCisJLyogU2F2ZSBkZWJ1ZyBzdGF0dXMgcmVnaXN0ZXIgd2hlcmUgcHRyYWNlIGNhbiBzZWUgaXQgKi8KKwl0c2stPnRocmVhZC5kZWJ1Z3JlZ1s2XSA9IGNvbmRpdGlvbjsKKworCS8qCisJICogU2luZ2xlLXN0ZXBwaW5nIHRocm91Z2ggVEY6IG1ha2Ugc3VyZSB3ZSBpZ25vcmUgYW55IGV2ZW50cyBpbgorCSAqIGtlcm5lbCBzcGFjZSAoYnV0IHJlLWVuYWJsZSBURiB3aGVuIHJldHVybmluZyB0byB1c2VyIG1vZGUpLgorCSAqLworCWlmIChjb25kaXRpb24gJiBEUl9TVEVQKSB7CisJCS8qCisJCSAqIFdlIGFscmVhZHkgY2hlY2tlZCB2ODYgbW9kZSBhYm92ZSwgc28gd2UgY2FuCisJCSAqIGNoZWNrIGZvciBrZXJuZWwgbW9kZSBieSBqdXN0IGNoZWNraW5nIHRoZSBDUEwKKwkJICogb2YgQ1MuCisJCSAqLworCQlpZiAoKHJlZ3MtPnhjcyAmIDMpID09IDApCisJCQlnb3RvIGNsZWFyX1RGX3JlZW5hYmxlOworCX0KKworCS8qIE9rLCBmaW5hbGx5IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlICovCisJc2VuZF9zaWd0cmFwKHRzaywgcmVncywgZXJyb3JfY29kZSk7CisKKwkvKiBEaXNhYmxlIGFkZGl0aW9uYWwgdHJhcHMuIFRoZXknbGwgYmUgcmUtZW5hYmxlZCB3aGVuCisJICogdGhlIHNpZ25hbCBpcyBkZWxpdmVyZWQuCisJICovCitjbGVhcl9kcjc6CisJX19hc21fXygibW92bCAlMCwlJWRiNyIKKwkJOiAvKiBubyBvdXRwdXQgKi8KKwkJOiAiciIgKDApKTsKKwlyZXR1cm47CisKK2RlYnVnX3ZtODY6CisJaGFuZGxlX3ZtODZfdHJhcCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikgcmVncywgZXJyb3JfY29kZSwgMSk7CisJcmV0dXJuOworCitjbGVhcl9URl9yZWVuYWJsZToKKwlzZXRfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1NJTkdMRVNURVApOworCXJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgd2UgcGxheSBhcm91bmQgd2l0aCB0aGUgJ1RTJyBiaXQgaW4gYW4gYXR0ZW1wdCB0byBnZXQKKyAqIHRoZSBjb3JyZWN0IGJlaGF2aW91ciBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiB0aGUgYXN5bmNocm9ub3VzCisgKiBJUlExMyBiZWhhdmlvdXIKKyAqLwordm9pZCBtYXRoX2Vycm9yKHZvaWQgX191c2VyICplaXApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICogdGFzazsKKwlzaWdpbmZvX3QgaW5mbzsKKwl1bnNpZ25lZCBzaG9ydCBjd2QsIHN3ZDsKKworCS8qCisJICogU2F2ZSB0aGUgaW5mbyBmb3IgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGFuZCBjbGVhciB0aGUgZXJyb3IuCisJICovCisJdGFzayA9IGN1cnJlbnQ7CisJc2F2ZV9pbml0X2ZwdSh0YXNrKTsKKwl0YXNrLT50aHJlYWQudHJhcF9ubyA9IDE2OworCXRhc2stPnRocmVhZC5lcnJvcl9jb2RlID0gMDsKKwlpbmZvLnNpX3NpZ25vID0gU0lHRlBFOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSA9IF9fU0lfRkFVTFQ7CisJaW5mby5zaV9hZGRyID0gZWlwOworCS8qCisJICogKH5jd2QgJiBzd2QpIHdpbGwgbWFzayBvdXQgZXhjZXB0aW9ucyB0aGF0IGFyZSBub3Qgc2V0IHRvIHVubWFza2VkCisJICogc3RhdHVzLiAgMHgzZiBpcyB0aGUgZXhjZXB0aW9uIGJpdHMgaW4gdGhlc2UgcmVncywgMHgyMDAgaXMgdGhlCisJICogQzEgcmVnIHlvdSBuZWVkIGluIGNhc2Ugb2YgYSBzdGFjayBmYXVsdCwgMHgwNDAgaXMgdGhlIHN0YWNrCisJICogZmF1bHQgYml0LiAgV2Ugc2hvdWxkIG9ubHkgYmUgdGFraW5nIG9uZSBleGNlcHRpb24gYXQgYSB0aW1lLAorCSAqIHNvIGlmIHRoaXMgY29tYmluYXRpb24gZG9lc24ndCBwcm9kdWNlIGFueSBzaW5nbGUgZXhjZXB0aW9uLAorCSAqIHRoZW4gd2UgaGF2ZSBhIGJhZCBwcm9ncmFtIHRoYXQgaXNuJ3Qgc3luY3Jvbml6aW5nIGl0cyBGUFUgdXNhZ2UKKwkgKiBhbmQgaXQgd2lsbCBzdWZmZXIgdGhlIGNvbnNlcXVlbmNlcyBzaW5jZSB3ZSB3b24ndCBiZSBhYmxlIHRvCisJICogZnVsbHkgcmVwcm9kdWNlIHRoZSBjb250ZXh0IG9mIHRoZSBleGNlcHRpb24KKwkgKi8KKwljd2QgPSBnZXRfZnB1X2N3ZCh0YXNrKTsKKwlzd2QgPSBnZXRfZnB1X3N3ZCh0YXNrKTsKKwlzd2l0Y2ggKCgofmN3ZCkgJiBzd2QgJiAweDNmKSB8IChzd2QgJiAweDI0MCkpIHsKKwkJY2FzZSAweDAwMDoKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQljYXNlIDB4MDAxOiAvKiBJbnZhbGlkIE9wICovCisJCWNhc2UgMHgwNDE6IC8qIFN0YWNrIEZhdWx0ICovCisJCWNhc2UgMHgyNDE6IC8qIFN0YWNrIEZhdWx0IHwgRGlyZWN0aW9uICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUSU5WOworCQkJLyogU2hvdWxkIHdlIGNsZWFyIHRoZSBTRiBvciBsZXQgdXNlciBzcGFjZSBkbyBpdCA/Pz8/ICovCisJCQlicmVhazsKKwkJY2FzZSAweDAwMjogLyogRGVub3JtYWxpemUgKi8KKwkJY2FzZSAweDAxMDogLyogVW5kZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUVU5EOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDQ6IC8qIFplcm8gRGl2aWRlICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxURElWOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDg6IC8qIE92ZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUT1ZGOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMjA6IC8qIFByZWNpc2lvbiAqLworCQkJaW5mby5zaV9jb2RlID0gRlBFX0ZMVFJFUzsKKwkJCWJyZWFrOworCX0KKwlmb3JjZV9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCB0YXNrKTsKK30KKworZmFzdGNhbGwgdm9pZCBkb19jb3Byb2Nlc3Nvcl9lcnJvcihzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlpZ25vcmVfZnB1X2lycSA9IDE7CisJbWF0aF9lcnJvcigodm9pZCBfX3VzZXIgKilyZWdzLT5laXApOworfQorCitzdGF0aWMgdm9pZCBzaW1kX21hdGhfZXJyb3Iodm9pZCBfX3VzZXIgKmVpcCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiB0YXNrOworCXNpZ2luZm9fdCBpbmZvOworCXVuc2lnbmVkIHNob3J0IG14Y3NyOworCisJLyoKKwkgKiBTYXZlIHRoZSBpbmZvIGZvciB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgYW5kIGNsZWFyIHRoZSBlcnJvci4KKwkgKi8KKwl0YXNrID0gY3VycmVudDsKKwlzYXZlX2luaXRfZnB1KHRhc2spOworCXRhc2stPnRocmVhZC50cmFwX25vID0gMTk7CisJdGFzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOworCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gX19TSV9GQVVMVDsKKwlpbmZvLnNpX2FkZHIgPSBlaXA7CisJLyoKKwkgKiBUaGUgU0lNRCBGUFUgZXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhIGxpdHRsZSBkaWZmZXJlbnRseSwgYXMgdGhlcmUKKwkgKiBpcyBvbmx5IGEgc2luZ2xlIHN0YXR1cy9jb250cm9sIHJlZ2lzdGVyLiAgVGh1cywgdG8gZGV0ZXJtaW5lIHdoaWNoCisJICogdW5tYXNrZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgd2UgbXVzdCBtYXNrIHRoZSBleGNlcHRpb24gbWFzayBiaXRzCisJICogYXQgMHgxZjgwLCBhbmQgdGhlbiB1c2UgdGhlc2UgdG8gbWFzayB0aGUgZXhjZXB0aW9uIGJpdHMgYXQgMHgzZi4KKwkgKi8KKwlteGNzciA9IGdldF9mcHVfbXhjc3IodGFzayk7CisJc3dpdGNoICh+KChteGNzciAmIDB4MWY4MCkgPj4gNykgJiAobXhjc3IgJiAweDNmKSkgeworCQljYXNlIDB4MDAwOgorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCWNhc2UgMHgwMDE6IC8qIEludmFsaWQgT3AgKi8KKwkJCWluZm8uc2lfY29kZSA9IEZQRV9GTFRJTlY7CisJCQlicmVhazsKKwkJY2FzZSAweDAwMjogLyogRGVub3JtYWxpemUgKi8KKwkJY2FzZSAweDAxMDogLyogVW5kZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUVU5EOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDQ6IC8qIFplcm8gRGl2aWRlICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxURElWOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMDg6IC8qIE92ZXJmbG93ICovCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUT1ZGOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMjA6IC8qIFByZWNpc2lvbiAqLworCQkJaW5mby5zaV9jb2RlID0gRlBFX0ZMVFJFUzsKKwkJCWJyZWFrOworCX0KKwlmb3JjZV9zaWdfaW5mbyhTSUdGUEUsICZpbmZvLCB0YXNrKTsKK30KKworZmFzdGNhbGwgdm9pZCBkb19zaW1kX2NvcHJvY2Vzc29yX2Vycm9yKHN0cnVjdCBwdF9yZWdzICogcmVncywKKwkJCQkJICBsb25nIGVycm9yX2NvZGUpCit7CisJaWYgKGNwdV9oYXNfeG1tKSB7CisJCS8qIEhhbmRsZSBTSU1EIEZQVSBleGNlcHRpb25zIG9uIFBJSUkrIHByb2Nlc3NvcnMuICovCisJCWlnbm9yZV9mcHVfaXJxID0gMTsKKwkJc2ltZF9tYXRoX2Vycm9yKCh2b2lkIF9fdXNlciAqKXJlZ3MtPmVpcCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSGFuZGxlIHN0cmFuZ2UgY2FjaGUgZmx1c2ggZnJvbSB1c2VyIHNwYWNlIGV4Y2VwdGlvbgorCQkgKiBpbiBhbGwgb3RoZXIgY2FzZXMuICBUaGlzIGlzIHVuZG9jdW1lbnRlZCBiZWhhdmlvdXIuCisJCSAqLworCQlpZiAocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgeworCQkJaGFuZGxlX3ZtODZfZmF1bHQoKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICopcmVncywKKwkJCQkJICBlcnJvcl9jb2RlKTsKKwkJCXJldHVybjsKKwkJfQorCQlkaWVfaWZfa2VybmVsKCJjYWNoZSBmbHVzaCBkZW5pZWQiLCByZWdzLCBlcnJvcl9jb2RlKTsKKwkJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAxOTsKKwkJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJfQorfQorCitmYXN0Y2FsbCB2b2lkIGRvX3NwdXJpb3VzX2ludGVycnVwdF9idWcoc3RydWN0IHB0X3JlZ3MgKiByZWdzLAorCQkJCQkgIGxvbmcgZXJyb3JfY29kZSkKK3sKKyNpZiAwCisJLyogTm8gbmVlZCB0byB3YXJuIGFib3V0IHRoaXMgYW55IGxvbmdlci4gKi8KKwlwcmludGsoIklnbm9yaW5nIFA2IExvY2FsIEFQSUMgU3B1cmlvdXMgSW50ZXJydXB0IEJ1Zy4uLlxuIik7CisjZW5kaWYKK30KKworZmFzdGNhbGwgdm9pZCBzZXR1cF94ODZfYm9ndXNfc3RhY2sodW5zaWduZWQgY2hhciAqIHN0aykKK3sKKwl1bnNpZ25lZCBsb25nICpzd2l0Y2gxNl9wdHIsICpzd2l0Y2gzMl9wdHI7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CisJdW5zaWduZWQgbG9uZyBzdGFja190b3AsIHN0YWNrX2JvdDsKKwl1bnNpZ25lZCBzaG9ydCBpcmV0X2ZyYW1lMTZfb2ZmOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJLyogcmVzZXJ2ZSB0aGUgc3BhY2Ugb24gMzJiaXQgc3RhY2sgZm9yIHRoZSBtYWdpYyBzd2l0Y2gxNiBwb2ludGVyICovCisJbWVtbW92ZShzdGssIHN0ayArIDgsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCXN3aXRjaDE2X3B0ciA9ICh1bnNpZ25lZCBsb25nICopKHN0ayArIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKilzdGs7CisJLyogbm93IHRoZSBzd2l0Y2gzMiBvbiAxNmJpdCBzdGFjayAqLworCXN0YWNrX2JvdCA9ICh1bnNpZ25lZCBsb25nKSZwZXJfY3B1KGNwdV8xNmJpdF9zdGFjaywgY3B1KTsKKwlzdGFja190b3AgPSBzdGFja19ib3QgKwlDUFVfMTZCSVRfU1RBQ0tfU0laRTsKKwlzd2l0Y2gzMl9wdHIgPSAodW5zaWduZWQgbG9uZyAqKShzdGFja190b3AgLSA4KTsKKwlpcmV0X2ZyYW1lMTZfb2ZmID0gQ1BVXzE2QklUX1NUQUNLX1NJWkUgLSA4IC0gMjA7CisJLyogY29weSBpcmV0IGZyYW1lIG9uIDE2Yml0IHN0YWNrICovCisJbWVtY3B5KCh2b2lkICopKHN0YWNrX2JvdCArIGlyZXRfZnJhbWUxNl9vZmYpLCAmcmVncy0+ZWlwLCAyMCk7CisJLyogZmlsbCBpbiB0aGUgc3dpdGNoIHBvaW50ZXJzICovCisJc3dpdGNoMTZfcHRyWzBdID0gKHJlZ3MtPmVzcCAmIDB4ZmZmZjAwMDApIHwgaXJldF9mcmFtZTE2X29mZjsKKwlzd2l0Y2gxNl9wdHJbMV0gPSBfX0VTUEZJWF9TUzsKKwlzd2l0Y2gzMl9wdHJbMF0gPSAodW5zaWduZWQgbG9uZylzdGsgKyBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpICsKKwkJOCAtIENQVV8xNkJJVF9TVEFDS19TSVpFOworCXN3aXRjaDMyX3B0clsxXSA9IF9fS0VSTkVMX0RTOworfQorCitmYXN0Y2FsbCB1bnNpZ25lZCBjaGFyICogZml4dXBfeDg2X2JvZ3VzX3N0YWNrKHVuc2lnbmVkIHNob3J0IHNwKQoreworCXVuc2lnbmVkIGxvbmcgKnN3aXRjaDMyX3B0cjsKKwl1bnNpZ25lZCBjaGFyICpzdGFjazE2LCAqc3RhY2szMjsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgc3RhY2tfYm90OworCWludCBsZW47CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdGFja19ib3QgPSAodW5zaWduZWQgbG9uZykmcGVyX2NwdShjcHVfMTZiaXRfc3RhY2ssIGNwdSk7CisJc3RhY2tfdG9wID0gc3RhY2tfYm90ICsJQ1BVXzE2QklUX1NUQUNLX1NJWkU7CisJc3dpdGNoMzJfcHRyID0gKHVuc2lnbmVkIGxvbmcgKikoc3RhY2tfdG9wIC0gOCk7CisJLyogY29weSB0aGUgZGF0YSBmcm9tIDE2Yml0IHN0YWNrIHRvIDMyYml0IHN0YWNrICovCisJbGVuID0gQ1BVXzE2QklUX1NUQUNLX1NJWkUgLSA4IC0gc3A7CisJc3RhY2sxNiA9ICh1bnNpZ25lZCBjaGFyICopKHN0YWNrX2JvdCArIHNwKTsKKwlzdGFjazMyID0gKHVuc2lnbmVkIGNoYXIgKikKKwkJKHN3aXRjaDMyX3B0clswXSArIENQVV8xNkJJVF9TVEFDS19TSVpFIC0gOCAtIGxlbik7CisJbWVtY3B5KHN0YWNrMzIsIHN0YWNrMTYsIGxlbik7CisJcmV0dXJuIHN0YWNrMzI7Cit9CisKKy8qCisgKiAgJ21hdGhfc3RhdGVfcmVzdG9yZSgpJyBzYXZlcyB0aGUgY3VycmVudCBtYXRoIGluZm9ybWF0aW9uIGluIHRoZQorICogb2xkIG1hdGggc3RhdGUgYXJyYXksIGFuZCBnZXRzIHRoZSBuZXcgb25lcyBmcm9tIHRoZSBjdXJyZW50IHRhc2sKKyAqCisgKiBDYXJlZnVsLi4gVGhlcmUgYXJlIHByb2JsZW1zIHdpdGggSUJNLWRlc2lnbmVkIElSUTEzIGJlaGF2aW91ci4KKyAqIERvbid0IHRvdWNoIHVubGVzcyB5b3UgKnJlYWxseSoga25vdyBob3cgaXQgd29ya3MuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBrZXJuZWwgcHJlZW1wdGlvbiBkaXNhYmxlZCAoaW4gdGhpcyBjYXNlLAorICogbG9jYWwgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYXQgdGhlIGNhbGwtc2l0ZSBpbiBlbnRyeS5TKS4KKyAqLworYXNtbGlua2FnZSB2b2lkIG1hdGhfc3RhdGVfcmVzdG9yZShzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gdGhyZWFkLT50YXNrOworCisJY2x0cygpOwkJLyogQWxsb3cgbWF0aHMgb3BzIChvciB3ZSByZWN1cnNlKSAqLworCWlmICghdHNrX3VzZWRfbWF0aCh0c2spKQorCQlpbml0X2ZwdSh0c2spOworCXJlc3RvcmVfZnB1KHRzayk7CisJdGhyZWFkLT5zdGF0dXMgfD0gVFNfVVNFREZQVTsJLyogU28gd2UgZm5zYXZlIG9uIHN3aXRjaF90bygpICovCit9CisKKyNpZm5kZWYgQ09ORklHX01BVEhfRU1VTEFUSU9OCisKK2FzbWxpbmthZ2Ugdm9pZCBtYXRoX2VtdWxhdGUobG9uZyBhcmcpCit7CisJcHJpbnRrKCJtYXRoLWVtdWxhdGlvbiBub3QgZW5hYmxlZCBhbmQgbm8gY29wcm9jZXNzb3IgZm91bmQuXG4iKTsKKwlwcmludGsoImtpbGxpbmcgJXMuXG4iLGN1cnJlbnQtPmNvbW0pOworCWZvcmNlX3NpZyhTSUdGUEUsY3VycmVudCk7CisJc2NoZWR1bGUoKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19NQVRIX0VNVUxBVElPTiAqLworCisjaWZkZWYgQ09ORklHX1g4Nl9GMDBGX0JVRwordm9pZCBfX2luaXQgdHJhcF9pbml0X2YwMGZfYnVnKHZvaWQpCit7CisJX19zZXRfZml4bWFwKEZJWF9GMDBGX0lEVCwgX19wYSgmaWR0X3RhYmxlKSwgUEFHRV9LRVJORUxfUk8pOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIElEVCBkZXNjcmlwdG9yIGFuZCByZWxvYWQgdGhlIElEVCBzbyB0aGF0CisJICogaXQgdXNlcyB0aGUgcmVhZC1vbmx5IG1hcHBlZCB2aXJ0dWFsIGFkZHJlc3MuCisJICovCisJaWR0X2Rlc2NyLmFkZHJlc3MgPSBmaXhfdG9fdmlydChGSVhfRjAwRl9JRFQpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsaWR0ICUwIiA6IDogIm0iIChpZHRfZGVzY3IpKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIF9zZXRfZ2F0ZShnYXRlX2FkZHIsdHlwZSxkcGwsYWRkcixzZWcpIFwKK2RvIHsgXAorICBpbnQgX19kMCwgX19kMTsgXAorICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdncgJSVkeCwlJWF4XG5cdCIgXAorCSJtb3Z3ICU0LCUlZHhcblx0IiBcCisJIm1vdmwgJSVlYXgsJTBcblx0IiBcCisJIm1vdmwgJSVlZHgsJTEiIFwKKwk6Ij1tIiAoKigobG9uZyAqKSAoZ2F0ZV9hZGRyKSkpLCBcCisJICI9bSIgKCooMSsobG9uZyAqKSAoZ2F0ZV9hZGRyKSkpLCAiPSZhIiAoX19kMCksICI9JmQiIChfX2QxKSBcCisJOiJpIiAoKHNob3J0KSAoMHg4MDAwKyhkcGw8PDEzKSsodHlwZTw8OCkpKSwgXAorCSAiMyIgKChjaGFyICopIChhZGRyKSksIjIiICgoc2VnKSA8PCAxNikpOyBcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBUaGlzIG5lZWRzIHRvIHVzZSAnaWR0X3RhYmxlJyByYXRoZXIgdGhhbiAnaWR0JywgYW5kCisgKiB0aHVzIHVzZSB0aGUgX25vbm1hcHBlZF8gdmVyc2lvbiBvZiB0aGUgSURULCBhcyB0aGUKKyAqIFBlbnRpdW0gRjAgMEYgYnVnZml4IGNhbiBoYXZlIHJlc3VsdGVkIGluIHRoZSBtYXBwZWQKKyAqIElEVCBiZWluZyB3cml0ZS1wcm90ZWN0ZWQuCisgKi8KK3ZvaWQgc2V0X2ludHJfZ2F0ZSh1bnNpZ25lZCBpbnQgbiwgdm9pZCAqYWRkcikKK3sKKwlfc2V0X2dhdGUoaWR0X3RhYmxlK24sMTQsMCxhZGRyLF9fS0VSTkVMX0NTKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBzZXRzIHVwIGFuIGludGVycnVwdCBnYXRlIGF0IGRpcmVjdG9yeSBwcml2aWxlZ2UgbGV2ZWwgMy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9zeXN0ZW1faW50cl9nYXRlKHVuc2lnbmVkIGludCBuLCB2b2lkICphZGRyKQoreworCV9zZXRfZ2F0ZShpZHRfdGFibGUrbiwgMTQsIDMsIGFkZHIsIF9fS0VSTkVMX0NTKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHNldF90cmFwX2dhdGUodW5zaWduZWQgaW50IG4sIHZvaWQgKmFkZHIpCit7CisJX3NldF9nYXRlKGlkdF90YWJsZStuLDE1LDAsYWRkcixfX0tFUk5FTF9DUyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfc3lzdGVtX2dhdGUodW5zaWduZWQgaW50IG4sIHZvaWQgKmFkZHIpCit7CisJX3NldF9nYXRlKGlkdF90YWJsZStuLDE1LDMsYWRkcixfX0tFUk5FTF9DUyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfdGFza19nYXRlKHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgZ2R0X2VudHJ5KQoreworCV9zZXRfZ2F0ZShpZHRfdGFibGUrbiw1LDAsMCwoZ2R0X2VudHJ5PDwzKSk7Cit9CisKKwordm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0VJU0EKKwl2b2lkIF9faW9tZW0gKnAgPSBpb3JlbWFwKDB4MEZGRkQ5LCA0KTsKKwlpZiAocmVhZGwocCkgPT0gJ0UnKygnSSc8PDgpKygnUyc8PDE2KSsoJ0EnPDwyNCkpIHsKKwkJRUlTQV9idXMgPSAxOworCX0KKwlpb3VubWFwKHApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwlpbml0X2FwaWNfbWFwcGluZ3MoKTsKKyNlbmRpZgorCisJc2V0X3RyYXBfZ2F0ZSgwLCZkaXZpZGVfZXJyb3IpOworCXNldF9pbnRyX2dhdGUoMSwmZGVidWcpOworCXNldF9pbnRyX2dhdGUoMiwmbm1pKTsKKwlzZXRfc3lzdGVtX2ludHJfZ2F0ZSgzLCAmaW50Myk7IC8qIGludDMtNSBjYW4gYmUgY2FsbGVkIGZyb20gYWxsICovCisJc2V0X3N5c3RlbV9nYXRlKDQsJm92ZXJmbG93KTsKKwlzZXRfc3lzdGVtX2dhdGUoNSwmYm91bmRzKTsKKwlzZXRfdHJhcF9nYXRlKDYsJmludmFsaWRfb3ApOworCXNldF90cmFwX2dhdGUoNywmZGV2aWNlX25vdF9hdmFpbGFibGUpOworCXNldF90YXNrX2dhdGUoOCxHRFRfRU5UUllfRE9VQkxFRkFVTFRfVFNTKTsKKwlzZXRfdHJhcF9nYXRlKDksJmNvcHJvY2Vzc29yX3NlZ21lbnRfb3ZlcnJ1bik7CisJc2V0X3RyYXBfZ2F0ZSgxMCwmaW52YWxpZF9UU1MpOworCXNldF90cmFwX2dhdGUoMTEsJnNlZ21lbnRfbm90X3ByZXNlbnQpOworCXNldF90cmFwX2dhdGUoMTIsJnN0YWNrX3NlZ21lbnQpOworCXNldF90cmFwX2dhdGUoMTMsJmdlbmVyYWxfcHJvdGVjdGlvbik7CisJc2V0X2ludHJfZ2F0ZSgxNCwmcGFnZV9mYXVsdCk7CisJc2V0X3RyYXBfZ2F0ZSgxNSwmc3B1cmlvdXNfaW50ZXJydXB0X2J1Zyk7CisJc2V0X3RyYXBfZ2F0ZSgxNiwmY29wcm9jZXNzb3JfZXJyb3IpOworCXNldF90cmFwX2dhdGUoMTcsJmFsaWdubWVudF9jaGVjayk7CisjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKKwlzZXRfdHJhcF9nYXRlKDE4LCZtYWNoaW5lX2NoZWNrKTsKKyNlbmRpZgorCXNldF90cmFwX2dhdGUoMTksJnNpbWRfY29wcm9jZXNzb3JfZXJyb3IpOworCisJc2V0X3N5c3RlbV9nYXRlKFNZU0NBTExfVkVDVE9SLCZzeXN0ZW1fY2FsbCk7CisKKwkvKgorCSAqIFNob3VsZCBiZSBhIGJhcnJpZXIgZm9yIGFueSBleHRlcm5hbCBDUFUgc3RhdGUuCisJICovCisJY3B1X2luaXQoKTsKKworCXRyYXBfaW5pdF9ob29rKCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGtzdGFja19zZXR1cChjaGFyICpzKQoreworCWtzdGFja19kZXB0aF90b19wcmludCA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDApOworCXJldHVybiAwOworfQorX19zZXR1cCgia3N0YWNrPSIsIGtzdGFja19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZtODYuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm04Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmM2Q1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3ZtODYuYwpAQCAtMCwwICsxLDgwNCBAQAorLyoKKyAqICBsaW51eC9rZXJuZWwvdm04Ni5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NCAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgMjkgZGVjIDIwMDEgLSBGaXhlZCBvb3BzZXMgY2F1c2VkIGJ5IHVuY2hlY2tlZCBhY2Nlc3MgdG8gdGhlIHZtODYKKyAqICAgICAgICAgICAgICAgIHN0YWNrIC0gTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRzQGNvbG9yZnVsbGlmZS5jb20+CisgKgorICogIDIyIG1hciAyMDAyIC0gTWFuZnJlZCBkZXRlY3RlZCB0aGUgc3RhY2tmYXVsdHMsIGJ1dCBkaWRuJ3QgaGFuZGxlCisgKiAgICAgICAgICAgICAgICB0aGVtIGNvcnJlY3RseS4gTm93IHRoZSBlbXVsYXRpb24gd2lsbCBiZSBpbiBhCisgKiAgICAgICAgICAgICAgICBjb25zaXN0ZW50IHN0YXRlIGFmdGVyIHN0YWNrZmF1bHRzIC0gS2FzcGVyIER1cG9udAorICogICAgICAgICAgICAgICAgPGthc3BlcmRAZGFpbWkuYXUuZGs+CisgKgorICogIDIyIG1hciAyMDAyIC0gQWRkZWQgbWlzc2luZyBjbGVhcl9JRiBpbiBzZXRfdmZsYWdzXyogS2FzcGVyIER1cG9udAorICogICAgICAgICAgICAgICAgPGthc3BlcmRAZGFpbWkuYXUuZGs+CisgKgorICogID8/ID8/PyAyMDAyIC0gRml4ZWQgcHJlbWF0dXJlIHJldHVybnMgZnJvbSBoYW5kbGVfdm04Nl9mYXVsdAorICogICAgICAgICAgICAgICAgY2F1c2VkIGJ5IEthc3BlciBEdXBvbnQncyBjaGFuZ2VzIC0gU3RhcyBTZXJnZWV2CisgKgorICogICA0IGFwciAyMDAyIC0gRml4ZWQgQ0hFQ0tfSUZfSU5fVFJBUCBicm9rZW4gYnkgU3RhcycgY2hhbmdlcy4KKyAqICAgICAgICAgICAgICAgIEthc3BlciBEdXBvbnQgPGthc3BlcmRAZGFpbWkuYXUuZGs+CisgKgorICogICA5IGFwciAyMDAyIC0gQ2hhbmdlZCBzeW50YXggb2YgbWFjcm9zIGluIGhhbmRsZV92bTg2X2ZhdWx0LgorICogICAgICAgICAgICAgICAgS2FzcGVyIER1cG9udCA8a2FzcGVyZEBkYWltaS5hdS5kaz4KKyAqCisgKiAgIDkgYXByIDIwMDIgLSBDaGFuZ2VkIHN0YWNrIGFjY2VzcyBtYWNyb3MgdG8ganVtcCB0byBhIGxhYmVsCisgKiAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHJldHVybmluZyB0byB1c2Vyc3BhY2UuIFRoaXMgc2ltcGxpZmllcworICogICAgICAgICAgICAgICAgZG9faW50LCBhbmQgaXMgbmVlZGVkIGJ5IGhhbmRsZV92bTZfZmF1bHQuIEthc3BlcgorICogICAgICAgICAgICAgICAgRHVwb250IDxrYXNwZXJkQGRhaW1pLmF1LmRrPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyoKKyAqIEtub3duIHByb2JsZW1zOgorICoKKyAqIEludGVycnVwdCBoYW5kbGluZyBpcyBub3QgZ3VhcmFudGVlZDoKKyAqIC0gYSByZWFsIHg4NiB3aWxsIGRpc2FibGUgYWxsIGludGVycnVwdHMgZm9yIG9uZSBpbnN0cnVjdGlvbgorICogICBhZnRlciBhICJtb3Ygc3MseHgiIHRvIG1ha2Ugc3RhY2sgaGFuZGxpbmcgYXRvbWljIGV2ZW4gd2l0aG91dAorICogICB0aGUgJ2xzcycgaW5zdHJ1Y3Rpb24uIFdlIGNhbid0IGd1YXJhbnRlZSB0aGlzIGluIHY4NiBtb2RlLAorICogICBhcyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBtaWdodCByZXN1bHQgaW4gYSBwYWdlIGZhdWx0IG9yIHNpbWlsYXIuCisgKiAtIGEgcmVhbCB4ODYgd2lsbCBoYXZlIGludGVycnVwdHMgZGlzYWJsZWQgZm9yIG9uZSBpbnN0cnVjdGlvbgorICogICBwYXN0IHRoZSAnc3RpJyB0aGF0IGVuYWJsZXMgdGhlbS4gV2UgZG9uJ3QgYm90aGVyIHdpdGggYWxsIHRoZQorICogICBkZXRhaWxzIHlldC4KKyAqCisgKiBMZXQncyBob3BlIHRoZXNlIHByb2JsZW1zIGRvIG5vdCBhY3R1YWxseSBtYXR0ZXIgZm9yIGFueXRoaW5nLgorICovCisKKworI2RlZmluZSBLVk04NgkoKHN0cnVjdCBrZXJuZWxfdm04Nl9zdHJ1Y3QgKilyZWdzKQorI2RlZmluZSBWTVBJIAlLVk04Ni0+dm04NnBsdXMKKworCisvKgorICogOC0gYW5kIDE2LWJpdCByZWdpc3RlciBkZWZpbmVzLi4KKyAqLworI2RlZmluZSBBTChyZWdzKQkoKCh1bnNpZ25lZCBjaGFyICopJigocmVncyktPmVheCkpWzBdKQorI2RlZmluZSBBSChyZWdzKQkoKCh1bnNpZ25lZCBjaGFyICopJigocmVncyktPmVheCkpWzFdKQorI2RlZmluZSBJUChyZWdzKQkoKih1bnNpZ25lZCBzaG9ydCAqKSYoKHJlZ3MpLT5laXApKQorI2RlZmluZSBTUChyZWdzKQkoKih1bnNpZ25lZCBzaG9ydCAqKSYoKHJlZ3MpLT5lc3ApKQorCisvKgorICogdmlydHVhbCBmbGFncyAoMTYgYW5kIDMyLWJpdCB2ZXJzaW9ucykKKyAqLworI2RlZmluZSBWRkxBR1MJKCoodW5zaWduZWQgc2hvcnQgKikmKGN1cnJlbnQtPnRocmVhZC52ODZmbGFncykpCisjZGVmaW5lIFZFRkxBR1MJKGN1cnJlbnQtPnRocmVhZC52ODZmbGFncykKKworI2RlZmluZSBzZXRfZmxhZ3MoWCxuZXcsbWFzaykgXAorKChYKSA9ICgoWCkgJiB+KG1hc2spKSB8ICgobmV3KSAmIChtYXNrKSkpCisKKyNkZWZpbmUgU0FGRV9NQVNLCSgweERENSkKKyNkZWZpbmUgUkVUVVJOX01BU0sJKDB4REZGKQorCisjZGVmaW5lIFZNODZfUkVHU19QQVJUMiBvcmlnX2VheAorI2RlZmluZSBWTTg2X1JFR1NfU0laRTEgXAorICAgICAgICAoICh1bnNpZ25lZCkoICYgKCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikwKS0+Vk04Nl9SRUdTX1BBUlQyKSApICkKKyNkZWZpbmUgVk04Nl9SRUdTX1NJWkUyIChzaXplb2Yoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MpIC0gVk04Nl9SRUdTX1NJWkUxKQorCitzdHJ1Y3QgcHRfcmVncyAqIEZBU1RDQUxMKHNhdmVfdjg2X3N0YXRlKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncykpOworc3RydWN0IHB0X3JlZ3MgKiBmYXN0Y2FsbCBzYXZlX3Y4Nl9zdGF0ZShzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IHRzc19zdHJ1Y3QgKnRzczsKKwlzdHJ1Y3QgcHRfcmVncyAqcmV0OworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJLyoKKwkgKiBUaGlzIGdldHMgY2FsbGVkIGZyb20gZW50cnkuUyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIGJ1dAorCSAqIGZyb20gcHJvY2VzcyBjb250ZXh0LiBFbmFibGUgaW50ZXJydXB0cyBoZXJlLCBiZWZvcmUgdHJ5aW5nCisJICogdG8gYWNjZXNzIHVzZXIgc3BhY2UuCisJICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJaWYgKCFjdXJyZW50LT50aHJlYWQudm04Nl9pbmZvKSB7CisJCXByaW50aygibm8gdm04Nl9pbmZvOiBCQURcbiIpOworCQlkb19leGl0KFNJR1NFR1YpOworCX0KKwlzZXRfZmxhZ3MocmVncy0+ZWZsYWdzLCBWRUZMQUdTLCBWSUZfTUFTSyB8IGN1cnJlbnQtPnRocmVhZC52ODZtYXNrKTsKKwl0bXAgPSBjb3B5X3RvX3VzZXIoJmN1cnJlbnQtPnRocmVhZC52bTg2X2luZm8tPnJlZ3MscmVncywgVk04Nl9SRUdTX1NJWkUxKTsKKwl0bXAgKz0gY29weV90b191c2VyKCZjdXJyZW50LT50aHJlYWQudm04Nl9pbmZvLT5yZWdzLlZNODZfUkVHU19QQVJUMiwKKwkJJnJlZ3MtPlZNODZfUkVHU19QQVJUMiwgVk04Nl9SRUdTX1NJWkUyKTsKKwl0bXAgKz0gcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLnNjcmVlbl9iaXRtYXAsJmN1cnJlbnQtPnRocmVhZC52bTg2X2luZm8tPnNjcmVlbl9iaXRtYXApOworCWlmICh0bXApIHsKKwkJcHJpbnRrKCJ2bTg2OiBjb3VsZCBub3QgYWNjZXNzIHVzZXJzcGFjZSB2bTg2X2luZm9cbiIpOworCQlkb19leGl0KFNJR1NFR1YpOworCX0KKworCXRzcyA9ICZwZXJfY3B1KGluaXRfdHNzLCBnZXRfY3B1KCkpOworCWN1cnJlbnQtPnRocmVhZC5lc3AwID0gY3VycmVudC0+dGhyZWFkLnNhdmVkX2VzcDA7CisJY3VycmVudC0+dGhyZWFkLnN5c2VudGVyX2NzID0gX19LRVJORUxfQ1M7CisJbG9hZF9lc3AwKHRzcywgJmN1cnJlbnQtPnRocmVhZCk7CisJY3VycmVudC0+dGhyZWFkLnNhdmVkX2VzcDAgPSAwOworCXB1dF9jcHUoKTsKKworCWxvYWRzZWdtZW50KGZzLCBjdXJyZW50LT50aHJlYWQuc2F2ZWRfZnMpOworCWxvYWRzZWdtZW50KGdzLCBjdXJyZW50LT50aHJlYWQuc2F2ZWRfZ3MpOworCXJldCA9IEtWTTg2LT5yZWdzMzI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbWFya19zY3JlZW5fcmRvbmx5KHN0cnVjdCB0YXNrX3N0cnVjdCAqIHRzaykKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlLCAqbWFwcGVkOworCWludCBpOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJc3Bpbl9sb2NrKCZ0c2stPm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXBnZCA9IHBnZF9vZmZzZXQodHNrLT5tbSwgMHhBMDAwMCk7CisJaWYgKHBnZF9ub25lX29yX2NsZWFyX2JhZChwZ2QpKQorCQlnb3RvIG91dDsKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgMHhBMDAwMCk7CisJaWYgKHB1ZF9ub25lX29yX2NsZWFyX2JhZChwdWQpKQorCQlnb3RvIG91dDsKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgMHhBMDAwMCk7CisJaWYgKHBtZF9ub25lX29yX2NsZWFyX2JhZChwbWQpKQorCQlnb3RvIG91dDsKKwlwdGUgPSBtYXBwZWQgPSBwdGVfb2Zmc2V0X21hcChwbWQsIDB4QTAwMDApOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmIChwdGVfcHJlc2VudCgqcHRlKSkKKwkJCXNldF9wdGUocHRlLCBwdGVfd3Jwcm90ZWN0KCpwdGUpKTsKKwkJcHRlKys7CisJfQorCXB0ZV91bm1hcChtYXBwZWQpOworb3V0OgorCXNwaW5fdW5sb2NrKCZ0c2stPm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXByZWVtcHRfZW5hYmxlKCk7CisJZmx1c2hfdGxiKCk7Cit9CisKKworCitzdGF0aWMgaW50IGRvX3ZtODZfaXJxX2hhbmRsaW5nKGludCBzdWJmdW5jdGlvbiwgaW50IGlycW51bWJlcik7CitzdGF0aWMgdm9pZCBkb19zeXNfdm04NihzdHJ1Y3Qga2VybmVsX3ZtODZfc3RydWN0ICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CisKK2FzbWxpbmthZ2UgaW50IHN5c192bTg2b2xkKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCit7CisJc3RydWN0IHZtODZfc3RydWN0IF9fdXNlciAqdjg2ID0gKHN0cnVjdCB2bTg2X3N0cnVjdCBfX3VzZXIgKilyZWdzLmVieDsKKwlzdHJ1Y3Qga2VybmVsX3ZtODZfc3RydWN0IGluZm87IC8qIGRlY2xhcmUgdGhpcyBfb24gdG9wXywKKwkJCQkJICogdGhpcyBhdm9pZHMgd2FzdGluZyBvZiBzdGFjayBzcGFjZS4KKwkJCQkJICogVGhpcyByZW1haW5zIG9uIHRoZSBzdGFjayB1bnRpbCB3ZQorCQkJCQkgKiByZXR1cm4gdG8gMzIgYml0IHVzZXIgc3BhY2UuCisJCQkJCSAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCWludCB0bXAsIHJldCA9IC1FUEVSTTsKKworCXRzayA9IGN1cnJlbnQ7CisJaWYgKHRzay0+dGhyZWFkLnNhdmVkX2VzcDApCisJCWdvdG8gb3V0OworCXRtcCAgPSBjb3B5X2Zyb21fdXNlcigmaW5mbywgdjg2LCBWTTg2X1JFR1NfU0laRTEpOworCXRtcCArPSBjb3B5X2Zyb21fdXNlcigmaW5mby5yZWdzLlZNODZfUkVHU19QQVJUMiwgJnY4Ni0+cmVncy5WTTg2X1JFR1NfUEFSVDIsCisJCShsb25nKSZpbmZvLnZtODZwbHVzIC0gKGxvbmcpJmluZm8ucmVncy5WTTg2X1JFR1NfUEFSVDIpOworCXJldCA9IC1FRkFVTFQ7CisJaWYgKHRtcCkKKwkJZ290byBvdXQ7CisJbWVtc2V0KCZpbmZvLnZtODZwbHVzLCAwLCAoaW50KSZpbmZvLnJlZ3MzMiAtIChpbnQpJmluZm8udm04NnBsdXMpOworCWluZm8ucmVnczMyID0gJnJlZ3M7CisJdHNrLT50aHJlYWQudm04Nl9pbmZvID0gdjg2OworCWRvX3N5c192bTg2KCZpbmZvLCB0c2spOworCXJldCA9IDA7CS8qIHdlIG5ldmVyIHJldHVybiBoZXJlICovCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCithc21saW5rYWdlIGludCBzeXNfdm04NihzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXN0cnVjdCBrZXJuZWxfdm04Nl9zdHJ1Y3QgaW5mbzsgLyogZGVjbGFyZSB0aGlzIF9vbiB0b3BfLAorCQkJCQkgKiB0aGlzIGF2b2lkcyB3YXN0aW5nIG9mIHN0YWNrIHNwYWNlLgorCQkJCQkgKiBUaGlzIHJlbWFpbnMgb24gdGhlIHN0YWNrIHVudGlsIHdlCisJCQkJCSAqIHJldHVybiB0byAzMiBiaXQgdXNlciBzcGFjZS4KKwkJCQkJICovCisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJaW50IHRtcCwgcmV0OworCXN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgX191c2VyICp2ODY7CisKKwl0c2sgPSBjdXJyZW50OworCXN3aXRjaCAocmVncy5lYngpIHsKKwkJY2FzZSBWTTg2X1JFUVVFU1RfSVJROgorCQljYXNlIFZNODZfRlJFRV9JUlE6CisJCWNhc2UgVk04Nl9HRVRfSVJRX0JJVFM6CisJCWNhc2UgVk04Nl9HRVRfQU5EX1JFU0VUX0lSUToKKwkJCXJldCA9IGRvX3ZtODZfaXJxX2hhbmRsaW5nKHJlZ3MuZWJ4LCAoaW50KXJlZ3MuZWN4KTsKKwkJCWdvdG8gb3V0OworCQljYXNlIFZNODZfUExVU19JTlNUQUxMX0NIRUNLOgorCQkJLyogTk9URTogb24gb2xkIHZtODYgc3R1ZmYgdGhpcyB3aWxsIHJldHVybiB0aGUgZXJyb3IKKwkJCSAgIGZyb20gdmVyaWZ5X2FyZWEoKSwgYmVjYXVzZSB0aGUgc3ViZnVuY3Rpb24gaXMKKwkJCSAgIGludGVycHJldGVkIGFzIChpbnZhbGlkKSBhZGRyZXNzIHRvIHZtODZfc3RydWN0LgorCQkJICAgU28gdGhlIGluc3RhbGxhdGlvbiBjaGVjayB3b3Jrcy4KKwkJCSAqLworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIHdlIGNvbWUgaGVyZSBvbmx5IGZvciBmdW5jdGlvbnMgVk04Nl9FTlRFUiwgVk04Nl9FTlRFUl9OT19CWVBBU1MgKi8KKwlyZXQgPSAtRVBFUk07CisJaWYgKHRzay0+dGhyZWFkLnNhdmVkX2VzcDApCisJCWdvdG8gb3V0OworCXY4NiA9IChzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0IF9fdXNlciAqKXJlZ3MuZWN4OworCXRtcCAgPSBjb3B5X2Zyb21fdXNlcigmaW5mbywgdjg2LCBWTTg2X1JFR1NfU0laRTEpOworCXRtcCArPSBjb3B5X2Zyb21fdXNlcigmaW5mby5yZWdzLlZNODZfUkVHU19QQVJUMiwgJnY4Ni0+cmVncy5WTTg2X1JFR1NfUEFSVDIsCisJCShsb25nKSZpbmZvLnJlZ3MzMiAtIChsb25nKSZpbmZvLnJlZ3MuVk04Nl9SRUdTX1BBUlQyKTsKKwlyZXQgPSAtRUZBVUxUOworCWlmICh0bXApCisJCWdvdG8gb3V0OworCWluZm8ucmVnczMyID0gJnJlZ3M7CisJaW5mby52bTg2cGx1cy5pc192bTg2cHVzID0gMTsKKwl0c2stPnRocmVhZC52bTg2X2luZm8gPSAoc3RydWN0IHZtODZfc3RydWN0IF9fdXNlciAqKXY4NjsKKwlkb19zeXNfdm04NigmaW5mbywgdHNrKTsKKwlyZXQgPSAwOwkvKiB3ZSBuZXZlciByZXR1cm4gaGVyZSAqLworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQgZG9fc3lzX3ZtODYoc3RydWN0IGtlcm5lbF92bTg2X3N0cnVjdCAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IHRzc19zdHJ1Y3QgKnRzczsKKy8qCisgKiBtYWtlIHN1cmUgdGhlIHZtODYoKSBzeXN0ZW0gY2FsbCBkb2Vzbid0IHRyeSB0byBkbyBhbnl0aGluZyBzaWxseQorICovCisJaW5mby0+cmVncy5fX251bGxfZHMgPSAwOworCWluZm8tPnJlZ3MuX19udWxsX2VzID0gMDsKKworLyogd2UgYXJlIGNsZWFyaW5nIGZzLGdzIGxhdGVyIGp1c3QgYmVmb3JlICJqbXAgcmVzdW1lX3VzZXJzcGFjZSIsCisgKiBiZWNhdXNlIHN0YXJ0aW5nIHdpdGggTGludXggMi4xLnggdGhleSBhcmVuJ3Qgbm8gbG9uZ2VyIHNhdmVkL3Jlc3RvcmVkCisgKi8KKworLyoKKyAqIFRoZSBlZmxhZ3MgcmVnaXN0ZXIgaXMgYWxzbyBzcGVjaWFsOiB3ZSBjYW5ub3QgdHJ1c3QgdGhhdCB0aGUgdXNlcgorICogaGFzIHNldCBpdCB1cCBzYWZlbHksIHNvIHRoaXMgbWFrZXMgc3VyZSBpbnRlcnJ1cHQgZXRjIGZsYWdzIGFyZQorICogaW5oZXJpdGVkIGZyb20gcHJvdGVjdGVkIG1vZGUuCisgKi8KKyAJVkVGTEFHUyA9IGluZm8tPnJlZ3MuZWZsYWdzOworCWluZm8tPnJlZ3MuZWZsYWdzICY9IFNBRkVfTUFTSzsKKwlpbmZvLT5yZWdzLmVmbGFncyB8PSBpbmZvLT5yZWdzMzItPmVmbGFncyAmIH5TQUZFX01BU0s7CisJaW5mby0+cmVncy5lZmxhZ3MgfD0gVk1fTUFTSzsKKworCXN3aXRjaCAoaW5mby0+Y3B1X3R5cGUpIHsKKwkJY2FzZSBDUFVfMjg2OgorCQkJdHNrLT50aHJlYWQudjg2bWFzayA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfMzg2OgorCQkJdHNrLT50aHJlYWQudjg2bWFzayA9IE5UX01BU0sgfCBJT1BMX01BU0s7CisJCQlicmVhazsKKwkJY2FzZSBDUFVfNDg2OgorCQkJdHNrLT50aHJlYWQudjg2bWFzayA9IEFDX01BU0sgfCBOVF9NQVNLIHwgSU9QTF9NQVNLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0c2stPnRocmVhZC52ODZtYXNrID0gSURfTUFTSyB8IEFDX01BU0sgfCBOVF9NQVNLIHwgSU9QTF9NQVNLOworCQkJYnJlYWs7CisJfQorCisvKgorICogU2F2ZSBvbGQgc3RhdGUsIHNldCBkZWZhdWx0IHJldHVybiB2YWx1ZSAoJWVheCkgdG8gMAorICovCisJaW5mby0+cmVnczMyLT5lYXggPSAwOworCXRzay0+dGhyZWFkLnNhdmVkX2VzcDAgPSB0c2stPnRocmVhZC5lc3AwOworCWFzbSB2b2xhdGlsZSgibW92bCAlJWZzLCUwIjoiPW0iICh0c2stPnRocmVhZC5zYXZlZF9mcykpOworCWFzbSB2b2xhdGlsZSgibW92bCAlJWdzLCUwIjoiPW0iICh0c2stPnRocmVhZC5zYXZlZF9ncykpOworCisJdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGdldF9jcHUoKSk7CisJdHNrLT50aHJlYWQuZXNwMCA9ICh1bnNpZ25lZCBsb25nKSAmaW5mby0+Vk04Nl9UU1NfRVNQMDsKKwlpZiAoY3B1X2hhc19zZXApCisJCXRzay0+dGhyZWFkLnN5c2VudGVyX2NzID0gMDsKKwlsb2FkX2VzcDAodHNzLCAmdHNrLT50aHJlYWQpOworCXB1dF9jcHUoKTsKKworCXRzay0+dGhyZWFkLnNjcmVlbl9iaXRtYXAgPSBpbmZvLT5zY3JlZW5fYml0bWFwOworCWlmIChpbmZvLT5mbGFncyAmIFZNODZfU0NSRUVOX0JJVE1BUCkKKwkJbWFya19zY3JlZW5fcmRvbmx5KHRzayk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJ4b3JsICUlZWF4LCUlZWF4OyBtb3ZsICUlZWF4LCUlZnM7IG1vdmwgJSVlYXgsJSVnc1xuXHQiCisJCSJtb3ZsICUwLCUlZXNwXG5cdCIKKwkJIm1vdmwgJTEsJSVlYnBcblx0IgorCQkiam1wIHJlc3VtZV91c2Vyc3BhY2UiCisJCTogLyogbm8gb3V0cHV0cyAqLworCQk6InIiICgmaW5mby0+cmVncyksICJyIiAodHNrLT50aHJlYWRfaW5mbykgOiAiYXgiKTsKKwkvKiB3ZSBuZXZlciByZXR1cm4gaGVyZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmV0dXJuX3RvXzMyYml0KHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVnczE2LCBpbnQgcmV0dmFsKQoreworCXN0cnVjdCBwdF9yZWdzICogcmVnczMyOworCisJcmVnczMyID0gc2F2ZV92ODZfc3RhdGUocmVnczE2KTsKKwlyZWdzMzItPmVheCA9IHJldHZhbDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlMCwlJWVzcFxuXHQiCisJCSJtb3ZsICUxLCUlZWJwXG5cdCIKKwkJImptcCByZXN1bWVfdXNlcnNwYWNlIgorCQk6IDogInIiIChyZWdzMzIpLCAiciIgKGN1cnJlbnRfdGhyZWFkX2luZm8oKSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X0lGKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncykKK3sKKwlWRUZMQUdTIHw9IFZJRl9NQVNLOworCWlmIChWRUZMQUdTICYgVklQX01BU0spCisJCXJldHVybl90b18zMmJpdChyZWdzLCBWTTg2X1NUSSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9JRihzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCit7CisJVkVGTEFHUyAmPSB+VklGX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9URihzdHJ1Y3Qga2VybmVsX3ZtODZfcmVncyAqIHJlZ3MpCit7CisJcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfQUMoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzKQoreworCXJlZ3MtPmVmbGFncyAmPSB+QUNfTUFTSzsKK30KKworLyogSXQgaXMgY29ycmVjdCB0byBjYWxsIHNldF9JRihyZWdzKSBmcm9tIHRoZSBzZXRfdmZsYWdzXyoKKyAqIGZ1bmN0aW9ucy4gSG93ZXZlciBzb21lb25lIGZvcmdvdCB0byBjYWxsIGNsZWFyX0lGKHJlZ3MpCisgKiBpbiB0aGUgb3Bwb3NpdGUgY2FzZS4KKyAqIEFmdGVyIHRoZSBjb21tYW5kIHNlcXVlbmNlIENMSSBQVVNIRiBTVEkgUE9QRiB5b3Ugc2hvdWxkCisgKiBlbmQgdXAgd2l0aCBpbnRlcnJ1cHMgZGlzYWJsZWQsIGJ1dCB5b3UgZW5kZWQgdXAgd2l0aAorICogaW50ZXJydXB0cyBlbmFibGVkLgorICogICggSSB3YXMgdGVzdGluZyBteSBvd24gY2hhbmdlcywgYnV0IHRoZSBvbmx5IGJ1ZyBJCisgKiAgICBjb3VsZCBmaW5kIHdhcyBpbiBhIGZ1bmN0aW9uIEkgaGFkIG5vdCBjaGFuZ2VkLiApCisgKiBbS0RdCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNldF92ZmxhZ3NfbG9uZyh1bnNpZ25lZCBsb25nIGVmbGFncywgc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzKQoreworCXNldF9mbGFncyhWRUZMQUdTLCBlZmxhZ3MsIGN1cnJlbnQtPnRocmVhZC52ODZtYXNrKTsKKwlzZXRfZmxhZ3MocmVncy0+ZWZsYWdzLCBlZmxhZ3MsIFNBRkVfTUFTSyk7CisJaWYgKGVmbGFncyAmIElGX01BU0spCisJCXNldF9JRihyZWdzKTsKKwllbHNlCisJCWNsZWFyX0lGKHJlZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3ZmbGFnc19zaG9ydCh1bnNpZ25lZCBzaG9ydCBmbGFncywgc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzKQoreworCXNldF9mbGFncyhWRkxBR1MsIGZsYWdzLCBjdXJyZW50LT50aHJlYWQudjg2bWFzayk7CisJc2V0X2ZsYWdzKHJlZ3MtPmVmbGFncywgZmxhZ3MsIFNBRkVfTUFTSyk7CisJaWYgKGZsYWdzICYgSUZfTUFTSykKKwkJc2V0X0lGKHJlZ3MpOworCWVsc2UKKwkJY2xlYXJfSUYocmVncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfdmZsYWdzKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gcmVncy0+ZWZsYWdzICYgUkVUVVJOX01BU0s7CisKKwlpZiAoVkVGTEFHUyAmIFZJRl9NQVNLKQorCQlmbGFncyB8PSBJRl9NQVNLOworCWZsYWdzIHw9IElPUExfTUFTSzsKKwlyZXR1cm4gZmxhZ3MgfCAoVkVGTEFHUyAmIGN1cnJlbnQtPnRocmVhZC52ODZtYXNrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfcmV2ZWN0b3JlZChpbnQgbnIsIHN0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCAqIGJpdG1hcCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYnRsICUyLCUxXG5cdHNiYmwgJTAsJTAiCisJCToiPXIiIChucikKKwkJOiJtIiAoKmJpdG1hcCksInIiIChucikpOworCXJldHVybiBucjsKK30KKworI2RlZmluZSB2YWxfYnl0ZSh2YWwsIG4pICgoKF9fdTggKikmdmFsKVtuXSkKKworI2RlZmluZSBwdXNoYihiYXNlLCBwdHIsIHZhbCwgZXJyX2xhYmVsKSBcCisJZG8geyBcCisJCV9fdTggX192YWwgPSB2YWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKF9fdmFsLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIHB1c2h3KGJhc2UsIHB0ciwgdmFsLCBlcnJfbGFiZWwpIFwKKwlkbyB7IFwKKwkJX191MTYgX192YWwgPSB2YWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKHZhbF9ieXRlKF9fdmFsLCAxKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHItLTsgXAorCQlpZiAocHV0X3VzZXIodmFsX2J5dGUoX192YWwsIDApLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIHB1c2hsKGJhc2UsIHB0ciwgdmFsLCBlcnJfbGFiZWwpIFwKKwlkbyB7IFwKKwkJX191MzIgX192YWwgPSB2YWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKHZhbF9ieXRlKF9fdmFsLCAzKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHItLTsgXAorCQlpZiAocHV0X3VzZXIodmFsX2J5dGUoX192YWwsIDIpLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0ci0tOyBcCisJCWlmIChwdXRfdXNlcih2YWxfYnl0ZShfX3ZhbCwgMSksIGJhc2UgKyBwdHIpIDwgMCkgXAorCQkJZ290byBlcnJfbGFiZWw7IFwKKwkJcHRyLS07IFwKKwkJaWYgKHB1dF91c2VyKHZhbF9ieXRlKF9fdmFsLCAwKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBwb3BiKGJhc2UsIHB0ciwgZXJyX2xhYmVsKSBcCisJKHsgXAorCQlfX3U4IF9fcmVzOyBcCisJCWlmIChnZXRfdXNlcihfX3JlcywgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHIrKzsgXAorCQlfX3JlczsgXAorCX0pCisKKyNkZWZpbmUgcG9wdyhiYXNlLCBwdHIsIGVycl9sYWJlbCkgXAorCSh7IFwKKwkJX191MTYgX19yZXM7IFwKKwkJaWYgKGdldF91c2VyKHZhbF9ieXRlKF9fcmVzLCAwKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHIrKzsgXAorCQlpZiAoZ2V0X3VzZXIodmFsX2J5dGUoX19yZXMsIDEpLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0cisrOyBcCisJCV9fcmVzOyBcCisJfSkKKworI2RlZmluZSBwb3BsKGJhc2UsIHB0ciwgZXJyX2xhYmVsKSBcCisJKHsgXAorCQlfX3UzMiBfX3JlczsgXAorCQlpZiAoZ2V0X3VzZXIodmFsX2J5dGUoX19yZXMsIDApLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0cisrOyBcCisJCWlmIChnZXRfdXNlcih2YWxfYnl0ZShfX3JlcywgMSksIGJhc2UgKyBwdHIpIDwgMCkgXAorCQkJZ290byBlcnJfbGFiZWw7IFwKKwkJcHRyKys7IFwKKwkJaWYgKGdldF91c2VyKHZhbF9ieXRlKF9fcmVzLCAyKSwgYmFzZSArIHB0cikgPCAwKSBcCisJCQlnb3RvIGVycl9sYWJlbDsgXAorCQlwdHIrKzsgXAorCQlpZiAoZ2V0X3VzZXIodmFsX2J5dGUoX19yZXMsIDMpLCBiYXNlICsgcHRyKSA8IDApIFwKKwkJCWdvdG8gZXJyX2xhYmVsOyBcCisJCXB0cisrOyBcCisJCV9fcmVzOyBcCisJfSkKKworLyogVGhlcmUgYXJlIHNvIG1hbnkgcG9zc2libGUgcmVhc29ucyBmb3IgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4KKyAqIFZNODZfSU5UeCwgc28gYWRkaW5nIGFub3RoZXIgZG9lc24ndCBib3RoZXIgbWUuIFdlIGNhbiBleHBlY3QKKyAqIHVzZXJzcGFjZSBwcm9ncmFtcyB0byBiZSBhYmxlIHRvIGhhbmRsZSBpdC4gKEdldHRpbmcgYSBwcm9ibGVtCisgKiBpbiB1c2Vyc3BhY2UgaXMgYWx3YXlzIGJldHRlciB0aGFuIGFuIE9vcHMgYW55d2F5LikgW0tEXQorICovCitzdGF0aWMgdm9pZCBkb19pbnQoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKnJlZ3MsIGludCBpLAorICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICogc3NwLCB1bnNpZ25lZCBzaG9ydCBzcCkKK3sKKwl1bnNpZ25lZCBsb25nIF9fdXNlciAqaW50cl9wdHI7CisJdW5zaWduZWQgbG9uZyBzZWdvZmZzOworCisJaWYgKHJlZ3MtPmNzID09IEJJT1NTRUcpCisJCWdvdG8gY2Fubm90X2hhbmRsZTsKKwlpZiAoaXNfcmV2ZWN0b3JlZChpLCAmS1ZNODYtPmludF9yZXZlY3RvcmVkKSkKKwkJZ290byBjYW5ub3RfaGFuZGxlOworCWlmIChpPT0weDIxICYmIGlzX3JldmVjdG9yZWQoQUgocmVncyksJktWTTg2LT5pbnQyMV9yZXZlY3RvcmVkKSkKKwkJZ290byBjYW5ub3RfaGFuZGxlOworCWludHJfcHRyID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopIChpIDw8IDIpOworCWlmIChnZXRfdXNlcihzZWdvZmZzLCBpbnRyX3B0cikpCisJCWdvdG8gY2Fubm90X2hhbmRsZTsKKwlpZiAoKHNlZ29mZnMgPj4gMTYpID09IEJJT1NTRUcpCisJCWdvdG8gY2Fubm90X2hhbmRsZTsKKwlwdXNodyhzc3AsIHNwLCBnZXRfdmZsYWdzKHJlZ3MpLCBjYW5ub3RfaGFuZGxlKTsKKwlwdXNodyhzc3AsIHNwLCByZWdzLT5jcywgY2Fubm90X2hhbmRsZSk7CisJcHVzaHcoc3NwLCBzcCwgSVAocmVncyksIGNhbm5vdF9oYW5kbGUpOworCXJlZ3MtPmNzID0gc2Vnb2ZmcyA+PiAxNjsKKwlTUChyZWdzKSAtPSA2OworCUlQKHJlZ3MpID0gc2Vnb2ZmcyAmIDB4ZmZmZjsKKwljbGVhcl9URihyZWdzKTsKKwljbGVhcl9JRihyZWdzKTsKKwljbGVhcl9BQyhyZWdzKTsKKwlyZXR1cm47CisKK2Nhbm5vdF9oYW5kbGU6CisJcmV0dXJuX3RvXzMyYml0KHJlZ3MsIFZNODZfSU5UeCArIChpIDw8IDgpKTsKK30KKworaW50IGhhbmRsZV92bTg2X3RyYXAoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUsIGludCB0cmFwbm8pCit7CisJaWYgKFZNUEkuaXNfdm04NnB1cykgeworCQlpZiAoICh0cmFwbm89PTMpIHx8ICh0cmFwbm89PTEpICkKKwkJCXJldHVybl90b18zMmJpdChyZWdzLCBWTTg2X1RSQVAgKyAodHJhcG5vIDw8IDgpKTsKKwkJZG9faW50KHJlZ3MsIHRyYXBubywgKHVuc2lnbmVkIGNoYXIgX191c2VyICopIChyZWdzLT5zcyA8PCA0KSwgU1AocmVncykpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHRyYXBubyAhPTEpCisJCXJldHVybiAxOyAvKiB3ZSBsZXQgdGhpcyBoYW5kbGUgYnkgdGhlIGNhbGxpbmcgcm91dGluZSAqLworCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCXNpZ2RlbHNldCgmY3VycmVudC0+YmxvY2tlZCwgU0lHVFJBUCk7CisJCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwl9CisJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMSk7CisJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSB0cmFwbm87CisJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCXJldHVybiAwOworfQorCit2b2lkIGhhbmRsZV92bTg2X2ZhdWx0KHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQoreworCXVuc2lnbmVkIGNoYXIgb3Bjb2RlOworCXVuc2lnbmVkIGNoYXIgX191c2VyICpjc3A7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKnNzcDsKKwl1bnNpZ25lZCBzaG9ydCBpcCwgc3A7CisJaW50IGRhdGEzMiwgcHJlZl9kb25lOworCisjZGVmaW5lIENIRUNLX0lGX0lOX1RSQVAgXAorCWlmIChWTVBJLnZtODZkYmdfYWN0aXZlICYmIFZNUEkudm04NmRiZ19URnBlbmRpZykgXAorCQluZXdmbGFncyB8PSBURl9NQVNLCisjZGVmaW5lIFZNODZfRkFVTFRfUkVUVVJOIGRvIHsgXAorCWlmIChWTVBJLmZvcmNlX3JldHVybl9mb3JfcGljICAmJiAoVkVGTEFHUyAmIChJRl9NQVNLIHwgVklGX01BU0spKSkgXAorCQlyZXR1cm5fdG9fMzJiaXQocmVncywgVk04Nl9QSUNSRVRVUk4pOyBcCisJcmV0dXJuOyB9IHdoaWxlICgwKQorCisJY3NwID0gKHVuc2lnbmVkIGNoYXIgX191c2VyICopIChyZWdzLT5jcyA8PCA0KTsKKwlzc3AgPSAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgKHJlZ3MtPnNzIDw8IDQpOworCXNwID0gU1AocmVncyk7CisJaXAgPSBJUChyZWdzKTsKKworCWRhdGEzMiA9IDA7CisJcHJlZl9kb25lID0gMDsKKwlkbyB7CisJCXN3aXRjaCAob3Bjb2RlID0gcG9wYihjc3AsIGlwLCBzaW11bGF0ZV9zaWdzZWd2KSkgeworCQkJY2FzZSAweDY2OiAgICAgIC8qIDMyLWJpdCBkYXRhICovICAgICBkYXRhMzI9MTsgYnJlYWs7CisJCQljYXNlIDB4Njc6ICAgICAgLyogMzItYml0IGFkZHJlc3MgKi8gIGJyZWFrOworCQkJY2FzZSAweDJlOiAgICAgIC8qIENTICovICAgICAgICAgICAgICBicmVhazsKKwkJCWNhc2UgMHgzZTogICAgICAvKiBEUyAqLyAgICAgICAgICAgICAgYnJlYWs7CisJCQljYXNlIDB4MjY6ICAgICAgLyogRVMgKi8gICAgICAgICAgICAgIGJyZWFrOworCQkJY2FzZSAweDM2OiAgICAgIC8qIFNTICovICAgICAgICAgICAgICBicmVhazsKKwkJCWNhc2UgMHg2NTogICAgICAvKiBHUyAqLyAgICAgICAgICAgICAgYnJlYWs7CisJCQljYXNlIDB4NjQ6ICAgICAgLyogRlMgKi8gICAgICAgICAgICAgIGJyZWFrOworCQkJY2FzZSAweGYyOiAgICAgIC8qIHJlcG56ICovICAgICAgIGJyZWFrOworCQkJY2FzZSAweGYzOiAgICAgIC8qIHJlcCAqLyAgICAgICAgICAgICBicmVhazsKKwkJCWRlZmF1bHQ6IHByZWZfZG9uZSA9IDE7CisJCX0KKwl9IHdoaWxlICghcHJlZl9kb25lKTsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisKKwkvKiBwdXNoZiAqLworCWNhc2UgMHg5YzoKKwkJaWYgKGRhdGEzMikgeworCQkJcHVzaGwoc3NwLCBzcCwgZ2V0X3ZmbGFncyhyZWdzKSwgc2ltdWxhdGVfc2lnc2Vndik7CisJCQlTUChyZWdzKSAtPSA0OworCQl9IGVsc2UgeworCQkJcHVzaHcoc3NwLCBzcCwgZ2V0X3ZmbGFncyhyZWdzKSwgc2ltdWxhdGVfc2lnc2Vndik7CisJCQlTUChyZWdzKSAtPSAyOworCQl9CisJCUlQKHJlZ3MpID0gaXA7CisJCVZNODZfRkFVTFRfUkVUVVJOOworCisJLyogcG9wZiAqLworCWNhc2UgMHg5ZDoKKwkJeworCQl1bnNpZ25lZCBsb25nIG5ld2ZsYWdzOworCQlpZiAoZGF0YTMyKSB7CisJCQluZXdmbGFncz1wb3BsKHNzcCwgc3AsIHNpbXVsYXRlX3NpZ3NlZ3YpOworCQkJU1AocmVncykgKz0gNDsKKwkJfSBlbHNlIHsKKwkJCW5ld2ZsYWdzID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCVNQKHJlZ3MpICs9IDI7CisJCX0KKwkJSVAocmVncykgPSBpcDsKKwkJQ0hFQ0tfSUZfSU5fVFJBUDsKKwkJaWYgKGRhdGEzMikgeworCQkJc2V0X3ZmbGFnc19sb25nKG5ld2ZsYWdzLCByZWdzKTsKKwkJfSBlbHNlIHsKKwkJCXNldF92ZmxhZ3Nfc2hvcnQobmV3ZmxhZ3MsIHJlZ3MpOworCQl9CisJCVZNODZfRkFVTFRfUkVUVVJOOworCQl9CisKKwkvKiBpbnQgeHggKi8KKwljYXNlIDB4Y2Q6IHsKKwkJaW50IGludG5vPXBvcGIoY3NwLCBpcCwgc2ltdWxhdGVfc2lnc2Vndik7CisJCUlQKHJlZ3MpID0gaXA7CisJCWlmIChWTVBJLnZtODZkYmdfYWN0aXZlKSB7CisJCQlpZiAoICgxIDw8IChpbnRubyAmNykpICYgVk1QSS52bTg2ZGJnX2ludHh4dGFiW2ludG5vID4+IDNdICkKKwkJCQlyZXR1cm5fdG9fMzJiaXQocmVncywgVk04Nl9JTlR4ICsgKGludG5vIDw8IDgpKTsKKwkJfQorCQlkb19pbnQocmVncywgaW50bm8sIHNzcCwgc3ApOworCQlyZXR1cm47CisJfQorCisJLyogaXJldCAqLworCWNhc2UgMHhjZjoKKwkJeworCQl1bnNpZ25lZCBsb25nIG5ld2lwOworCQl1bnNpZ25lZCBsb25nIG5ld2NzOworCQl1bnNpZ25lZCBsb25nIG5ld2ZsYWdzOworCQlpZiAoZGF0YTMyKSB7CisJCQluZXdpcD1wb3BsKHNzcCwgc3AsIHNpbXVsYXRlX3NpZ3NlZ3YpOworCQkJbmV3Y3M9cG9wbChzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCW5ld2ZsYWdzPXBvcGwoc3NwLCBzcCwgc2ltdWxhdGVfc2lnc2Vndik7CisJCQlTUChyZWdzKSArPSAxMjsKKwkJfSBlbHNlIHsKKwkJCW5ld2lwID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCW5ld2NzID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCW5ld2ZsYWdzID0gcG9wdyhzc3AsIHNwLCBzaW11bGF0ZV9zaWdzZWd2KTsKKwkJCVNQKHJlZ3MpICs9IDY7CisJCX0KKwkJSVAocmVncykgPSBuZXdpcDsKKwkJcmVncy0+Y3MgPSBuZXdjczsKKwkJQ0hFQ0tfSUZfSU5fVFJBUDsKKwkJaWYgKGRhdGEzMikgeworCQkJc2V0X3ZmbGFnc19sb25nKG5ld2ZsYWdzLCByZWdzKTsKKwkJfSBlbHNlIHsKKwkJCXNldF92ZmxhZ3Nfc2hvcnQobmV3ZmxhZ3MsIHJlZ3MpOworCQl9CisJCVZNODZfRkFVTFRfUkVUVVJOOworCQl9CisKKwkvKiBjbGkgKi8KKwljYXNlIDB4ZmE6CisJCUlQKHJlZ3MpID0gaXA7CisJCWNsZWFyX0lGKHJlZ3MpOworCQlWTTg2X0ZBVUxUX1JFVFVSTjsKKworCS8qIHN0aSAqLworCS8qCisJICogRGFtbi4gVGhpcyBpcyBpbmNvcnJlY3Q6IHRoZSAnc3RpJyBpbnN0cnVjdGlvbiBzaG91bGQgYWN0dWFsbHkKKwkgKiBlbmFibGUgaW50ZXJydXB0cyBhZnRlciB0aGUgL25leHQvIGluc3RydWN0aW9uLiBOb3QgZ29vZC4KKwkgKgorCSAqIFByb2JhYmx5IG5lZWRzIHNvbWUgaG9yc2luZyBhcm91bmQgd2l0aCB0aGUgVEYgZmxhZy4gQWllZS4uCisJICovCisJY2FzZSAweGZiOgorCQlJUChyZWdzKSA9IGlwOworCQlzZXRfSUYocmVncyk7CisJCVZNODZfRkFVTFRfUkVUVVJOOworCisJZGVmYXVsdDoKKwkJcmV0dXJuX3RvXzMyYml0KHJlZ3MsIFZNODZfVU5LTk9XTik7CisJfQorCisJcmV0dXJuOworCitzaW11bGF0ZV9zaWdzZWd2OgorCS8qIEZJWE1FOiBBZnRlciBhIGxvbmcgZGlzY3Vzc2lvbiB3aXRoIFN0YXMgd2UgZmluYWxseQorCSAqICAgICAgICBhZ3JlZWQsIHRoYXQgdGhpcyBpcyB3cm9uZy4gSGVyZSB3ZSBzaG91bGQKKwkgKiAgICAgICAgcmVhbGx5IHNlbmQgYSBTSUdTRUdWIHRvIHRoZSB1c2VyIHByb2dyYW0uCisJICogICAgICAgIEJ1dCBob3cgZG8gd2UgY3JlYXRlIHRoZSBjb3JyZWN0IGNvbnRleHQ/IFdlCisJICogICAgICAgIGFyZSBpbnNpZGUgYSBnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQgaGFuZGxlcgorCSAqICAgICAgICBhbmQgaGFzIGp1c3QgcmV0dXJuZWQgZnJvbSBhIHBhZ2UgZmF1bHQgaGFuZGxlci4KKwkgKiAgICAgICAgVGhlIGNvcnJlY3QgY29udGV4dCBmb3IgdGhlIHNpZ25hbCBoYW5kbGVyCisJICogICAgICAgIHNob3VsZCBiZSBhIG1peHR1cmUgb2YgdGhlIHR3bywgYnV0IGhvdyBkbyB3ZQorCSAqICAgICAgICBnZXQgdGhlIGluZm9ybWF0aW9uPyBbS0RdCisJICovCisJcmV0dXJuX3RvXzMyYml0KHJlZ3MsIFZNODZfVU5LTk9XTik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0gdm04NiBzcGVjaWFsIElSUSBwYXNzaW5nIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVk04Nl9JUlFOQU1FCQkidm04NmlycSIKKworc3RhdGljIHN0cnVjdCB2bTg2X2lycXMgeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCWludCBzaWc7Cit9IHZtODZfaXJxc1sxNl07CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXJxYml0c19sb2NrKTsKK3N0YXRpYyBpbnQgaXJxYml0czsKKworI2RlZmluZSBBTExPV0VEX1NJR1MgKCAxIC8qIDAgPSBkb24ndCBzZW5kIGEgc2lnbmFsICovIFwKKwl8ICgxIDw8IFNJR1VTUjEpIHwgKDEgPDwgU0lHVVNSMikgfCAoMSA8PCBTSUdJTykgIHwgKDEgPDwgU0lHVVJHKSBcCisJfCAoMSA8PCBTSUdVTlVTRUQpICkKKwkKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcnFfaGFuZGxlcihpbnQgaW50bm8sIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBpcnFfYml0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CQorCWlycV9iaXQgPSAxIDw8IGludG5vOworCWlmICgoaXJxYml0cyAmIGlycV9iaXQpIHx8ICEgdm04Nl9pcnFzW2ludG5vXS50c2spCisJCWdvdG8gb3V0OworCWlycWJpdHMgfD0gaXJxX2JpdDsKKwlpZiAodm04Nl9pcnFzW2ludG5vXS5zaWcpCisJCXNlbmRfc2lnKHZtODZfaXJxc1tpbnRub10uc2lnLCB2bTg2X2lycXNbaW50bm9dLnRzaywgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBJUlEgd2lsbCBiZSByZS1lbmFibGVkIHdoZW4gdXNlciBhc2tzIGZvciB0aGUgaXJxICh3aGV0aGVyCisJICogcG9sbGluZyBvciBhcyBhIHJlc3VsdCBvZiB0aGUgc2lnbmFsKQorCSAqLworCWRpc2FibGVfaXJxKGludG5vKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFiaXRzX2xvY2ssIGZsYWdzKTsJCisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV92bTg2X2lycShpbnQgaXJxbnVtYmVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmcmVlX2lycShpcnFudW1iZXIsIE5VTEwpOworCXZtODZfaXJxc1tpcnFudW1iZXJdLnRzayA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CQorCWlycWJpdHMgJj0gfigxIDw8IGlycW51bWJlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxYml0c19sb2NrLCBmbGFncyk7CQorfQorCit2b2lkIHJlbGVhc2Vfdm04Nl9pcnFzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSBGSVJTVF9WTTg2X0lSUSA7IGkgPD0gTEFTVF9WTTg2X0lSUTsgaSsrKQorCSAgICBpZiAodm04Nl9pcnFzW2ldLnRzayA9PSB0YXNrKQorCQlmcmVlX3ZtODZfaXJxKGkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfYW5kX3Jlc2V0X2lycShpbnQgaXJxbnVtYmVyKQoreworCWludCBiaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlpZiAoaW52YWxpZF92bTg2X2lycShpcnFudW1iZXIpKSByZXR1cm4gMDsKKwlpZiAodm04Nl9pcnFzW2lycW51bWJlcl0udHNrICE9IGN1cnJlbnQpIHJldHVybiAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFiaXRzX2xvY2ssIGZsYWdzKTsJCisJYml0ID0gaXJxYml0cyAmICgxIDw8IGlycW51bWJlcik7CisJaXJxYml0cyAmPSB+Yml0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycWJpdHNfbG9jaywgZmxhZ3MpOwkKKwlpZiAoIWJpdCkKKwkJcmV0dXJuIDA7CisJZW5hYmxlX2lycShpcnFudW1iZXIpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZG9fdm04Nl9pcnFfaGFuZGxpbmcoaW50IHN1YmZ1bmN0aW9uLCBpbnQgaXJxbnVtYmVyKQoreworCWludCByZXQ7CisJc3dpdGNoIChzdWJmdW5jdGlvbikgeworCQljYXNlIFZNODZfR0VUX0FORF9SRVNFVF9JUlE6IHsKKwkJCXJldHVybiBnZXRfYW5kX3Jlc2V0X2lycShpcnFudW1iZXIpOworCQl9CisJCWNhc2UgVk04Nl9HRVRfSVJRX0JJVFM6IHsKKwkJCXJldHVybiBpcnFiaXRzOworCQl9CisJCWNhc2UgVk04Nl9SRVFVRVNUX0lSUTogeworCQkJaW50IHNpZyA9IGlycW51bWJlciA+PiA4OworCQkJaW50IGlycSA9IGlycW51bWJlciAmIDI1NTsKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwkJCWlmICghKCgxIDw8IHNpZykgJiBBTExPV0VEX1NJR1MpKSByZXR1cm4gLUVQRVJNOworCQkJaWYgKGludmFsaWRfdm04Nl9pcnEoaXJxKSkgcmV0dXJuIC1FUEVSTTsKKwkJCWlmICh2bTg2X2lycXNbaXJxXS50c2spIHJldHVybiAtRVBFUk07CisJCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsICZpcnFfaGFuZGxlciwgMCwgVk04Nl9JUlFOQU1FLCBOVUxMKTsKKwkJCWlmIChyZXQpIHJldHVybiByZXQ7CisJCQl2bTg2X2lycXNbaXJxXS5zaWcgPSBzaWc7CisJCQl2bTg2X2lycXNbaXJxXS50c2sgPSBjdXJyZW50OworCQkJcmV0dXJuIGlycTsKKwkJfQorCQljYXNlICBWTTg2X0ZSRUVfSVJROiB7CisJCQlpZiAoaW52YWxpZF92bTg2X2lycShpcnFudW1iZXIpKSByZXR1cm4gLUVQRVJNOworCQkJaWYgKCF2bTg2X2lycXNbaXJxbnVtYmVyXS50c2spIHJldHVybiAwOworCQkJaWYgKHZtODZfaXJxc1tpcnFudW1iZXJdLnRzayAhPSBjdXJyZW50KSByZXR1cm4gLUVQRVJNOworCQkJZnJlZV92bTg2X2lycShpcnFudW1iZXIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDUxMmNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0wLDAgKzEsMTM0IEBACisvKiBsZCBzY3JpcHQgdG8gbWFrZSBpMzg2IExpbnV4IGtlcm5lbAorICogV3JpdHRlbiBieSBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej47CisgKi8KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKHN0YXJ0dXBfMzIpCitqaWZmaWVzID0gamlmZmllc182NDsKK1NFQ1RJT05TCit7CisgIC4gPSBfX1BBR0VfT0ZGU0VUICsgMHgxMDAwMDA7CisgIC8qIHJlYWQtb25seSAqLworICBfdGV4dCA9IC47CQkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KKyAgLnRleHQgOiB7CisJKigudGV4dCkKKwlTQ0hFRF9URVhUCisJTE9DS19URVhUCisJKiguZml4dXApCisJKiguZ251Lndhcm5pbmcpCisJfSA9IDB4OTA5MAorCisgIF9ldGV4dCA9IC47CQkJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLworCisgIC4gPSBBTElHTigxNik7CQkvKiBFeGNlcHRpb24gdGFibGUgKi8KKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICBST0RBVEEKKworICAvKiB3cml0ZWFibGUgKi8KKyAgLmRhdGEgOiB7CQkJLyogRGF0YSAqLworCSooLmRhdGEpCisJQ09OU1RSVUNUT1JTCisJfQorCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ub3NhdmVfYmVnaW4gPSAuOworICAuZGF0YV9ub3NhdmUgOiB7ICooLmRhdGEubm9zYXZlKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ub3NhdmVfZW5kID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIC5kYXRhLnBhZ2VfYWxpZ25lZCA6IHsgKiguZGF0YS5pZHQpIH0KKworICAuID0gQUxJR04oMzIpOworICAuZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCA6IHsgKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkgfQorCisgIF9lZGF0YSA9IC47CQkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLworCisgIC4gPSBBTElHTihUSFJFQURfU0laRSk7CS8qIGluaXRfdGFzayAqLworICAuZGF0YS5pbml0X3Rhc2sgOiB7ICooLmRhdGEuaW5pdF90YXNrKSB9CisKKyAgLyogd2lsbCBiZSBmcmVlZCBhZnRlciBpbml0ICovCisgIC4gPSBBTElHTig0MDk2KTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLworICBfX2luaXRfYmVnaW4gPSAuOworICAuaW5pdC50ZXh0IDogeyAKKwlfc2luaXR0ZXh0ID0gLjsKKwkqKC5pbml0LnRleHQpCisJX2Vpbml0dGV4dCA9IC47CisgIH0KKyAgLmluaXQuZGF0YSA6IHsgKiguaW5pdC5kYXRhKSB9CisgIC4gPSBBTElHTigxNik7CisgIF9fc2V0dXBfc3RhcnQgPSAuOworICAuaW5pdC5zZXR1cCA6IHsgKiguaW5pdC5zZXR1cCkgfQorICBfX3NldHVwX2VuZCA9IC47CisgIF9faW5pdGNhbGxfc3RhcnQgPSAuOworICAuaW5pdGNhbGwuaW5pdCA6IHsKKwkqKC5pbml0Y2FsbDEuaW5pdCkgCisJKiguaW5pdGNhbGwyLmluaXQpIAorCSooLmluaXRjYWxsMy5pbml0KSAKKwkqKC5pbml0Y2FsbDQuaW5pdCkgCisJKiguaW5pdGNhbGw1LmluaXQpIAorCSooLmluaXRjYWxsNi5pbml0KSAKKwkqKC5pbml0Y2FsbDcuaW5pdCkKKyAgfQorICBfX2luaXRjYWxsX2VuZCA9IC47CisgIF9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKKyAgLmNvbl9pbml0Y2FsbC5pbml0IDogeyAqKC5jb25faW5pdGNhbGwuaW5pdCkgfQorICBfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOworICBTRUNVUklUWV9JTklUCisgIC4gPSBBTElHTig0KTsKKyAgX19hbHRfaW5zdHJ1Y3Rpb25zID0gLjsKKyAgLmFsdGluc3RydWN0aW9ucyA6IHsgKiguYWx0aW5zdHJ1Y3Rpb25zKSB9IAorICBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsgCisgLmFsdGluc3RyX3JlcGxhY2VtZW50IDogeyAqKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkgfSAKKyAgLyogLmV4aXQudGV4dCBpcyBkaXNjYXJkIGF0IHJ1bnRpbWUsIG5vdCBsaW5rIHRpbWUsIHRvIGRlYWwgd2l0aCByZWZlcmVuY2VzCisgICAgIGZyb20gLmFsdGluc3RydWN0aW9ucyBhbmQgLmVoX2ZyYW1lICovCisgIC5leGl0LnRleHQgOiB7ICooLmV4aXQudGV4dCkgfQorICAuZXhpdC5kYXRhIDogeyAqKC5leGl0LmRhdGEpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRyYW1mc19zdGFydCA9IC47CisgIC5pbml0LnJhbWZzIDogeyAqKC5pbml0LnJhbWZzKSB9CisgIF9faW5pdHJhbWZzX2VuZCA9IC47CisgIC4gPSBBTElHTigzMik7CisgIF9fcGVyX2NwdV9zdGFydCA9IC47CisgIC5kYXRhLnBlcmNwdSAgOiB7ICooLmRhdGEucGVyY3B1KSB9CisgIF9fcGVyX2NwdV9lbmQgPSAuOworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9lbmQgPSAuOworICAvKiBmcmVlZCBhZnRlciBpbml0IGVuZHMgaGVyZSAqLworCQorICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KKyAgLmJzcyA6IHsKKwkqKC5ic3MucGFnZV9hbGlnbmVkKQorCSooLmJzcykKKyAgfQorICAuID0gQUxJR04oNCk7CisgIF9fYnNzX3N0b3AgPSAuOyAKKworICBfZW5kID0gLiA7CisKKyAgLyogVGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGNyZWF0ZXMgdGhlIGVhcmx5IGJvb3QgcGFnZSB0YWJsZXMgKi8KKyAgLiA9IEFMSUdOKDQwOTYpOworICBwZzAgPSAuOworCisgIC8qIFNlY3Rpb25zIHRvIGJlIGRpc2NhcmRlZCAqLworICAvRElTQ0FSRC8gOiB7CisJKiguZXhpdGNhbGwuZXhpdCkKKwl9CisKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLWludDgwLlMgYi9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLWludDgwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwZDA1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtaW50ODAuUwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29kZSBmb3IgdGhlIHZzeXNjYWxsIHBhZ2UuICBUaGlzIHZlcnNpb24gdXNlcyB0aGUgb2xkIGludCAkMHg4MCBtZXRob2QuCisgKgorICogTk9URToKKyAqIDEpIF9fa2VybmVsX3ZzeXNjYWxsIF9tdXN0XyBiZSBmaXJzdCBpbiB0aGlzIHBhZ2UuCisgKiAyKSB0aGVyZSBhcmUgYWxpZ25tZW50IGNvbnN0cmFpbnRzIG9uIHRoaXMgc3R1Yiwgc2VlIHZzeXNjYWxsLXNpZ3JldHVybi5TCisgKiAgICBmb3IgZGV0YWlscy4KKyAqLworCisJLnRleHQKKwkuZ2xvYmwgX19rZXJuZWxfdnN5c2NhbGwKKwkudHlwZSBfX2tlcm5lbF92c3lzY2FsbCxAZnVuY3Rpb24KK19fa2VybmVsX3ZzeXNjYWxsOgorLkxTVEFSVF92c3lzY2FsbDoKKwlpbnQgJDB4ODAKKwlyZXQKKy5MRU5EX3ZzeXNjYWxsOgorCS5zaXplIF9fa2VybmVsX3ZzeXNjYWxsLC4tLkxTVEFSVF92c3lzY2FsbAorCS5wcmV2aW91cworCisJLnNlY3Rpb24gLmVoX2ZyYW1lLCJhIixAcHJvZ2JpdHMKKy5MU1RBUlRGUkFNRURMU0k6CisJLmxvbmcgLkxFTkRDSUVETFNJLS5MU1RBUlRDSUVETFNJCisuTFNUQVJUQ0lFRExTSToKKwkubG9uZyAwCQkJLyogQ0lFIElEICovCisJLmJ5dGUgMQkJCS8qIFZlcnNpb24gbnVtYmVyICovCisJLnN0cmluZyAielIiCQkvKiBOVUwtdGVybWluYXRlZCBhdWdtZW50YXRpb24gc3RyaW5nICovCisJLnVsZWIxMjggMQkJLyogQ29kZSBhbGlnbm1lbnQgZmFjdG9yICovCisJLnNsZWIxMjggLTQJCS8qIERhdGEgYWxpZ25tZW50IGZhY3RvciAqLworCS5ieXRlIDgJCQkvKiBSZXR1cm4gYWRkcmVzcyByZWdpc3RlciBjb2x1bW4gKi8KKwkudWxlYjEyOCAxCQkvKiBBdWdtZW50YXRpb24gdmFsdWUgbGVuZ3RoICovCisJLmJ5dGUgMHgxYgkJLyogRFdfRUhfUEVfcGNyZWx8RFdfRUhfUEVfc2RhdGE0LiAqLworCS5ieXRlIDB4MGMJCS8qIERXX0NGQV9kZWZfY2ZhICovCisJLnVsZWIxMjggNAorCS51bGViMTI4IDQKKwkuYnl0ZSAweDg4CQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg4ICovCisJLnVsZWIxMjggMQorCS5hbGlnbiA0CisuTEVORENJRURMU0k6CisJLmxvbmcgLkxFTkRGREVETFNJLS5MU1RBUlRGREVETFNJIC8qIExlbmd0aCBGREUgKi8KKy5MU1RBUlRGREVETFNJOgorCS5sb25nIC5MU1RBUlRGREVETFNJLS5MU1RBUlRGUkFNRURMU0kgLyogQ0lFIHBvaW50ZXIgKi8KKwkubG9uZyAuTFNUQVJUX3ZzeXNjYWxsLS4JLyogUEMtcmVsYXRpdmUgc3RhcnQgYWRkcmVzcyAqLworCS5sb25nIC5MRU5EX3ZzeXNjYWxsLS5MU1RBUlRfdnN5c2NhbGwKKwkudWxlYjEyOCAwCisJLmFsaWduIDQKKy5MRU5ERkRFRExTSToKKwkucHJldmlvdXMKKworLyoKKyAqIEdldCB0aGUgY29tbW9uIGNvZGUgZm9yIHRoZSBzaWdyZXR1cm4gZW50cnkgcG9pbnRzLgorICovCisjaW5jbHVkZSAidnN5c2NhbGwtc2lncmV0dXJuLlMiCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLXNpZ3JldHVybi5TIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1zaWdyZXR1cm4uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGZjZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1zaWdyZXR1cm4uUwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvbW1vbiBjb2RlIGZvciB0aGUgc2lncmV0dXJuIGVudHJ5IHBvaW50cyBvbiB0aGUgdnN5c2NhbGwgcGFnZS4KKyAqIFNvIGZhciB0aGlzIGNvZGUgaXMgdGhlIHNhbWUgZm9yIGJvdGggaW50ODAgYW5kIHN5c2VudGVyIHZlcnNpb25zLgorICogVGhpcyBmaWxlIGlzICNpbmNsdWRlJ2QgYnkgdnN5c2NhbGwtKi5TIHRvIGRlZmluZSB0aGVtIGFmdGVyIHRoZQorICogdnN5c2NhbGwgZW50cnkgcG9pbnQuICBUaGUga2VybmVsIGFzc3VtZXMgdGhhdCB0aGUgYWRkcmVzc2VzIG9mIHRoZXNlCisgKiByb3V0aW5lcyBhcmUgY29uc3RhbnQgZm9yIGFsbCB2c3lzY2FsbCBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKworCisvKiBYWFgKKyAgIFNob3VsZCB0aGVzZSBiZSBuYW1lZCAiX3NpZ3RyYW1wIiBvciBzb21ldGhpbmc/CisqLworCisJLnRleHQKKwkub3JnCV9fa2VybmVsX3ZzeXNjYWxsKzMyCisJLmdsb2JsIF9fa2VybmVsX3NpZ3JldHVybgorCS50eXBlIF9fa2VybmVsX3NpZ3JldHVybixAZnVuY3Rpb24KK19fa2VybmVsX3NpZ3JldHVybjoKKy5MU1RBUlRfc2lncmV0dXJuOgorCXBvcGwgJWVheAkJLyogWFhYIGRvZXMgdGhpcyBtZWFuIGl0IG5lZWRzIHVud2luZCBpbmZvPyAqLworCW1vdmwgJF9fTlJfc2lncmV0dXJuLCAlZWF4CisJaW50ICQweDgwCisuTEVORF9zaWdyZXR1cm46CisJLnNpemUgX19rZXJuZWxfc2lncmV0dXJuLC4tLkxTVEFSVF9zaWdyZXR1cm4KKworCS5iYWxpZ24gMzIKKwkuZ2xvYmwgX19rZXJuZWxfcnRfc2lncmV0dXJuCisJLnR5cGUgX19rZXJuZWxfcnRfc2lncmV0dXJuLEBmdW5jdGlvbgorX19rZXJuZWxfcnRfc2lncmV0dXJuOgorLkxTVEFSVF9ydF9zaWdyZXR1cm46CisJbW92bCAkX19OUl9ydF9zaWdyZXR1cm4sICVlYXgKKwlpbnQgJDB4ODAKKy5MRU5EX3J0X3NpZ3JldHVybjoKKwkuc2l6ZSBfX2tlcm5lbF9ydF9zaWdyZXR1cm4sLi0uTFNUQVJUX3J0X3NpZ3JldHVybgorCS5wcmV2aW91cworCisJLnNlY3Rpb24gLmVoX2ZyYW1lLCJhIixAcHJvZ2JpdHMKKy5MU1RBUlRGUkFNRURMU0kxOgorCS5sb25nIC5MRU5EQ0lFRExTSTEtLkxTVEFSVENJRURMU0kxCisuTFNUQVJUQ0lFRExTSTE6CisJLmxvbmcgMAkJCS8qIENJRSBJRCAqLworCS5ieXRlIDEJCQkvKiBWZXJzaW9uIG51bWJlciAqLworCS5zdHJpbmcgInpSIgkJLyogTlVMLXRlcm1pbmF0ZWQgYXVnbWVudGF0aW9uIHN0cmluZyAqLworCS51bGViMTI4IDEJCS8qIENvZGUgYWxpZ25tZW50IGZhY3RvciAqLworCS5zbGViMTI4IC00CQkvKiBEYXRhIGFsaWdubWVudCBmYWN0b3IgKi8KKwkuYnl0ZSA4CQkJLyogUmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgY29sdW1uICovCisJLnVsZWIxMjggMQkJLyogQXVnbWVudGF0aW9uIHZhbHVlIGxlbmd0aCAqLworCS5ieXRlIDB4MWIJCS8qIERXX0VIX1BFX3BjcmVsfERXX0VIX1BFX3NkYXRhNC4gKi8KKwkuYnl0ZSAwCQkJLyogRFdfQ0ZBX25vcCAqLworCS5hbGlnbiA0CisuTEVORENJRURMU0kxOgorCS5sb25nIC5MRU5ERkRFRExTSTEtLkxTVEFSVEZERURMU0kxIC8qIExlbmd0aCBGREUgKi8KKy5MU1RBUlRGREVETFNJMToKKwkubG9uZyAuTFNUQVJURkRFRExTSTEtLkxTVEFSVEZSQU1FRExTSTEgLyogQ0lFIHBvaW50ZXIgKi8KKwkvKiBIQUNLOiBUaGUgZHdhcmYyIHVud2luZCByb3V0aW5lcyB3aWxsIHN1YnRyYWN0IDEgZnJvbSB0aGUKKwkgICByZXR1cm4gYWRkcmVzcyB0byBnZXQgYW4gYWRkcmVzcyBpbiB0aGUgbWlkZGxlIG9mIHRoZQorCSAgIHByZXN1bWVkIGNhbGwgaW5zdHJ1Y3Rpb24uICBTaW5jZSB3ZSBkaWRuJ3QgZ2V0IGhlcmUgdmlhCisJICAgYSBjYWxsLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIG5vcCBiZWZvcmUgdGhlIHJlYWwgc3RhcnQKKwkgICB0byBtYWtlIHVwIGZvciBpdC4gICovCisJLmxvbmcgLkxTVEFSVF9zaWdyZXR1cm4tMS0uCS8qIFBDLXJlbGF0aXZlIHN0YXJ0IGFkZHJlc3MgKi8KKwkubG9uZyAuTEVORF9zaWdyZXR1cm4tLkxTVEFSVF9zaWdyZXR1cm4rMQorCS51bGViMTI4IDAJCQkvKiBBdWdtZW50YXRpb24gKi8KKwkvKiBXaGF0IGZvbGxvd3MgYXJlIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSB0YWJsZSBnZW5lcmF0aW9uLgorCSAgIFdlIHJlY29yZCB0aGUgbG9jYXRpb25zIG9mIGVhY2ggcmVnaXN0ZXIgc2F2ZWQuICBUaGlzIGlzCisJICAgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgIkNGQSIgaXMgYWx3YXlzIGFzc3VtZWQgdG8KKwkgICBiZSB0aGUgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIgaW4gdGhlIGNhbGxlci4gIFRoaXMgbWVhbnMKKwkgICB0aGF0IHdlIG11c3QgZGVmaW5lIHRoZSBDRkEgb2YgdGhpcyBib2R5IG9mIGNvZGUgdG8gYmUgdGhlCisJICAgc2F2ZWQgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIgaW4gdGhlIHNpZ2NvbnRleHQuICBXaGljaAorCSAgIGFsc28gbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBmaXhlZCByZWxhdGlvbiB0byB0aGUgb3RoZXIgCisJICAgc2F2ZWQgcmVnaXN0ZXJzLCB3aGljaCBtZWFucyB0aGF0IHdlIG11c3QgdXNlIERXX0NGQV9leHByZXNzaW9uCisJICAgdG8gY29tcHV0ZSB0aGVpciBhZGRyZXNzZXMuICBJdCBhbHNvIG1lYW5zIHRoYXQgd2hlbiB3ZSAKKwkgICBhZGp1c3QgdGhlIHN0YWNrIHdpdGggdGhlIHBvcGwsIHdlIGhhdmUgdG8gZG8gaXQgYWxsIG92ZXIgYWdhaW4uICAqLworCisjZGVmaW5lIGRvX2NmYV9leHByKG9mZnNldCkJCQkJCQlcCisJLmJ5dGUgMHgwZjsJCQkvKiBEV19DRkFfZGVmX2NmYV9leHByZXNzaW9uICovCVwKKwkudWxlYjEyOCAxZi0wZjsJCQkvKiAgIGxlbmd0aCAqLwkJCVwKKzA6CS5ieXRlIDB4NzQ7CQkJLyogICAgIERXX09QX2JyZWc0ICovCQlcCisJLnNsZWIxMjggb2Zmc2V0OwkJLyogICAgICBvZmZzZXQgKi8JCVwKKwkuYnl0ZSAweDA2OwkJCS8qICAgICBEV19PUF9kZXJlZiAqLwkJXAorMToKKworI2RlZmluZSBkb19leHByKHJlZ25vLCBvZmZzZXQpCQkJCQkJXAorCS5ieXRlIDB4MTA7CQkJLyogRFdfQ0ZBX2V4cHJlc3Npb24gKi8JCVwKKwkudWxlYjEyOCByZWdubzsJCQkvKiAgIHJlZ25vICovCQkJXAorCS51bGViMTI4IDFmLTBmOwkJCS8qICAgbGVuZ3RoICovCQkJXAorMDoJLmJ5dGUgMHg3NDsJCQkvKiAgICAgRFdfT1BfYnJlZzQgKi8JCVwKKwkuc2xlYjEyOCBvZmZzZXQ7CQkvKiAgICAgICBvZmZzZXQgKi8JCVwKKzE6CisKKwlkb19jZmFfZXhwcihTSUdDT05URVhUX2VzcCs0KQorCWRvX2V4cHIoMCwgU0lHQ09OVEVYVF9lYXgrNCkKKwlkb19leHByKDEsIFNJR0NPTlRFWFRfZWN4KzQpCisJZG9fZXhwcigyLCBTSUdDT05URVhUX2VkeCs0KQorCWRvX2V4cHIoMywgU0lHQ09OVEVYVF9lYngrNCkKKwlkb19leHByKDUsIFNJR0NPTlRFWFRfZWJwKzQpCisJZG9fZXhwcig2LCBTSUdDT05URVhUX2VzaSs0KQorCWRvX2V4cHIoNywgU0lHQ09OVEVYVF9lZGkrNCkKKwlkb19leHByKDgsIFNJR0NPTlRFWFRfZWlwKzQpCisKKwkuYnl0ZSAweDQyCS8qIERXX0NGQV9hZHZhbmNlX2xvYyAyIC0tIG5vcDsgcG9wbCBlYXguICovCisKKwlkb19jZmFfZXhwcihTSUdDT05URVhUX2VzcCkKKwlkb19leHByKDAsIFNJR0NPTlRFWFRfZWF4KQorCWRvX2V4cHIoMSwgU0lHQ09OVEVYVF9lY3gpCisJZG9fZXhwcigyLCBTSUdDT05URVhUX2VkeCkKKwlkb19leHByKDMsIFNJR0NPTlRFWFRfZWJ4KQorCWRvX2V4cHIoNSwgU0lHQ09OVEVYVF9lYnApCisJZG9fZXhwcig2LCBTSUdDT05URVhUX2VzaSkKKwlkb19leHByKDcsIFNJR0NPTlRFWFRfZWRpKQorCWRvX2V4cHIoOCwgU0lHQ09OVEVYVF9laXApCisKKwkuYWxpZ24gNAorLkxFTkRGREVETFNJMToKKworCS5sb25nIC5MRU5ERkRFRExTSTItLkxTVEFSVEZERURMU0kyIC8qIExlbmd0aCBGREUgKi8KKy5MU1RBUlRGREVETFNJMjoKKwkubG9uZyAuTFNUQVJURkRFRExTSTItLkxTVEFSVEZSQU1FRExTSTEgLyogQ0lFIHBvaW50ZXIgKi8KKwkvKiBIQUNLOiBTZWUgYWJvdmUgd3J0IHVud2luZCBsaWJyYXJ5IGFzc3VtcHRpb25zLiAgKi8KKwkubG9uZyAuTFNUQVJUX3J0X3NpZ3JldHVybi0xLS4JLyogUEMtcmVsYXRpdmUgc3RhcnQgYWRkcmVzcyAqLworCS5sb25nIC5MRU5EX3J0X3NpZ3JldHVybi0uTFNUQVJUX3J0X3NpZ3JldHVybisxCisJLnVsZWIxMjggMAkJCS8qIEF1Z21lbnRhdGlvbiAqLworCS8qIFdoYXQgZm9sbG93cyBhcmUgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHRhYmxlIGdlbmVyYXRpb24uCisJICAgV2UgcmVjb3JkIHRoZSBsb2NhdGlvbnMgb2YgZWFjaCByZWdpc3RlciBzYXZlZC4gIFRoaXMgaXMKKwkgICBzbGlnaHRseSBsZXNzIGNvbXBsaWNhdGVkIHRoYW4gdGhlIGFib3ZlLCBzaW5jZSB3ZSBkb24ndAorCSAgIG1vZGlmeSB0aGUgc3RhY2sgcG9pbnRlciBpbiB0aGUgcHJvY2Vzcy4gICovCisKKwlkb19jZmFfZXhwcihSVF9TSUdGUkFNRV9zaWdjb250ZXh0LTQgKyBTSUdDT05URVhUX2VzcCkKKwlkb19leHByKDAsIFJUX1NJR0ZSQU1FX3NpZ2NvbnRleHQtNCArIFNJR0NPTlRFWFRfZWF4KQorCWRvX2V4cHIoMSwgUlRfU0lHRlJBTUVfc2lnY29udGV4dC00ICsgU0lHQ09OVEVYVF9lY3gpCisJZG9fZXhwcigyLCBSVF9TSUdGUkFNRV9zaWdjb250ZXh0LTQgKyBTSUdDT05URVhUX2VkeCkKKwlkb19leHByKDMsIFJUX1NJR0ZSQU1FX3NpZ2NvbnRleHQtNCArIFNJR0NPTlRFWFRfZWJ4KQorCWRvX2V4cHIoNSwgUlRfU0lHRlJBTUVfc2lnY29udGV4dC00ICsgU0lHQ09OVEVYVF9lYnApCisJZG9fZXhwcig2LCBSVF9TSUdGUkFNRV9zaWdjb250ZXh0LTQgKyBTSUdDT05URVhUX2VzaSkKKwlkb19leHByKDcsIFJUX1NJR0ZSQU1FX3NpZ2NvbnRleHQtNCArIFNJR0NPTlRFWFRfZWRpKQorCWRvX2V4cHIoOCwgUlRfU0lHRlJBTUVfc2lnY29udGV4dC00ICsgU0lHQ09OVEVYVF9laXApCisKKwkuYWxpZ24gNAorLkxFTkRGREVETFNJMjoKKwkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc3lzZW50ZXIuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc3lzZW50ZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGFlZmIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1zeXNlbnRlci5TCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29kZSBmb3IgdGhlIHZzeXNjYWxsIHBhZ2UuICBUaGlzIHZlcnNpb24gdXNlcyB0aGUgc3lzZW50ZXIgaW5zdHJ1Y3Rpb24uCisgKgorICogTk9URToKKyAqIDEpIF9fa2VybmVsX3ZzeXNjYWxsIF9tdXN0XyBiZSBmaXJzdCBpbiB0aGlzIHBhZ2UuCisgKiAyKSB0aGVyZSBhcmUgYWxpZ25tZW50IGNvbnN0cmFpbnRzIG9uIHRoaXMgc3R1Yiwgc2VlIHZzeXNjYWxsLXNpZ3JldHVybi5TCisgKiAgICBmb3IgZGV0YWlscy4KKyAqLworCisJLnRleHQKKwkuZ2xvYmwgX19rZXJuZWxfdnN5c2NhbGwKKwkudHlwZSBfX2tlcm5lbF92c3lzY2FsbCxAZnVuY3Rpb24KK19fa2VybmVsX3ZzeXNjYWxsOgorLkxTVEFSVF92c3lzY2FsbDoKKwlwdXNoICVlY3gKKy5McHVzaF9lY3g6CisJcHVzaCAlZWR4CisuTHB1c2hfZWR4OgorCXB1c2ggJWVicAorLkxlbnRlcl9rZXJuZWw6CisJbW92bCAlZXNwLCVlYnAKKwlzeXNlbnRlcgorCisJLyogNzogYWxpZ24gcmV0dXJuIHBvaW50IHdpdGggbm9wJ3MgdG8gbWFrZSBkaXNhc3NlbWJseSBlYXNpZXIgKi8KKwkuc3BhY2UgNywweDkwCisKKwkvKiAxNDogU3lzdGVtIGNhbGwgcmVzdGFydCBwb2ludCBpcyBoZXJlISAoU1lTRU5URVJfUkVUVVJOIC0gMikgKi8KKwlqbXAgLkxlbnRlcl9rZXJuZWwKKwkvKiAxNjogU3lzdGVtIGNhbGwgbm9ybWFsIHJldHVybiBwb2ludCBpcyBoZXJlISAqLworCS5nbG9ibCBTWVNFTlRFUl9SRVRVUk4JLyogU3ltYm9sIHVzZWQgYnkgZW50cnkuUy4gICovCitTWVNFTlRFUl9SRVRVUk46CisJcG9wICVlYnAKKy5McG9wX2VicDoKKwlwb3AgJWVkeAorLkxwb3BfZWR4OgorCXBvcCAlZWN4CisuTHBvcF9lY3g6CisJcmV0CisuTEVORF92c3lzY2FsbDoKKwkuc2l6ZSBfX2tlcm5lbF92c3lzY2FsbCwuLS5MU1RBUlRfdnN5c2NhbGwKKwkucHJldmlvdXMKKworCS5zZWN0aW9uIC5laF9mcmFtZSwiYSIsQHByb2diaXRzCisuTFNUQVJURlJBTUVETFNJOgorCS5sb25nIC5MRU5EQ0lFRExTSS0uTFNUQVJUQ0lFRExTSQorLkxTVEFSVENJRURMU0k6CisJLmxvbmcgMAkJCS8qIENJRSBJRCAqLworCS5ieXRlIDEJCQkvKiBWZXJzaW9uIG51bWJlciAqLworCS5zdHJpbmcgInpSIgkJLyogTlVMLXRlcm1pbmF0ZWQgYXVnbWVudGF0aW9uIHN0cmluZyAqLworCS51bGViMTI4IDEJCS8qIENvZGUgYWxpZ25tZW50IGZhY3RvciAqLworCS5zbGViMTI4IC00CQkvKiBEYXRhIGFsaWdubWVudCBmYWN0b3IgKi8KKwkuYnl0ZSA4CQkJLyogUmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgY29sdW1uICovCisJLnVsZWIxMjggMQkJLyogQXVnbWVudGF0aW9uIHZhbHVlIGxlbmd0aCAqLworCS5ieXRlIDB4MWIJCS8qIERXX0VIX1BFX3BjcmVsfERXX0VIX1BFX3NkYXRhNC4gKi8KKwkuYnl0ZSAweDBjCQkvKiBEV19DRkFfZGVmX2NmYSAqLworCS51bGViMTI4IDQKKwkudWxlYjEyOCA0CisJLmJ5dGUgMHg4OAkJLyogRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4OCAqLworCS51bGViMTI4IDEKKwkuYWxpZ24gNAorLkxFTkRDSUVETFNJOgorCS5sb25nIC5MRU5ERkRFRExTSS0uTFNUQVJURkRFRExTSSAvKiBMZW5ndGggRkRFICovCisuTFNUQVJURkRFRExTSToKKwkubG9uZyAuTFNUQVJURkRFRExTSS0uTFNUQVJURlJBTUVETFNJIC8qIENJRSBwb2ludGVyICovCisJLmxvbmcgLkxTVEFSVF92c3lzY2FsbC0uCS8qIFBDLXJlbGF0aXZlIHN0YXJ0IGFkZHJlc3MgKi8KKwkubG9uZyAuTEVORF92c3lzY2FsbC0uTFNUQVJUX3ZzeXNjYWxsCisJLnVsZWIxMjggMAorCS8qIFdoYXQgZm9sbG93cyBhcmUgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHRhYmxlIGdlbmVyYXRpb24uCisJICAgV2UgaGF2ZSB0byByZWNvcmQgYWxsIGNoYW5nZXMgb2YgdGhlIHN0YWNrIHBvaW50ZXIuICAqLworCS5ieXRlIDB4MDQJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZyAuTHB1c2hfZWN4LS5MU1RBUlRfdnN5c2NhbGwKKwkuYnl0ZSAweDBlCQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZSAweDA4CQkvKiBSQSBhdCBvZmZzZXQgOCBub3cgKi8KKwkuYnl0ZSAweDA0CQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcgLkxwdXNoX2VkeC0uTHB1c2hfZWN4CisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgwYwkJLyogUkEgYXQgb2Zmc2V0IDEyIG5vdyAqLworCS5ieXRlIDB4MDQJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZyAuTGVudGVyX2tlcm5lbC0uTHB1c2hfZWR4CisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgxMAkJLyogUkEgYXQgb2Zmc2V0IDE2IG5vdyAqLworCS5ieXRlIDB4ODUsIDB4MDQJLyogRFdfQ0ZBX29mZnNldCAlZWJwIC0xNiAqLworCS8qIEZpbmFsbHkgdGhlIGVwaWxvZ3VlLiAgKi8KKwkuYnl0ZSAweDA0CQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcgLkxwb3BfZWJwLS5MZW50ZXJfa2VybmVsCisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgwYwkJLyogUkEgYXQgb2Zmc2V0IDEyIG5vdyAqLworCS5ieXRlIDB4YzUJCS8qIERXX0NGQV9yZXN0b3JlICVlYnAgKi8KKwkuYnl0ZSAweDA0CQkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcgLkxwb3BfZWR4LS5McG9wX2VicAorCS5ieXRlIDB4MGUJCS8qIERXX0NGQV9kZWZfY2ZhX29mZnNldCAqLworCS5ieXRlIDB4MDgJCS8qIFJBIGF0IG9mZnNldCA4IG5vdyAqLworCS5ieXRlIDB4MDQJCS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZyAuTHBvcF9lY3gtLkxwb3BfZWR4CisJLmJ5dGUgMHgwZQkJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUgMHgwNAkJLyogUkEgYXQgb2Zmc2V0IDQgbm93ICovCisJLmFsaWduIDQKKy5MRU5ERkRFRExTSToKKwkucHJldmlvdXMKKworLyoKKyAqIEdldCB0aGUgY29tbW9uIGNvZGUgZm9yIHRoZSBzaWdyZXR1cm4gZW50cnkgcG9pbnRzLgorICovCisjaW5jbHVkZSAidnN5c2NhbGwtc2lncmV0dXJuLlMiCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLlMgYi9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwMzg5MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwuUwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCitfX0lOSVREQVRBCisKKwkuZ2xvYmwgdnN5c2NhbGxfaW50ODBfc3RhcnQsIHZzeXNjYWxsX2ludDgwX2VuZAordnN5c2NhbGxfaW50ODBfc3RhcnQ6CisJLmluY2JpbiAiYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1pbnQ4MC5zbyIKK3ZzeXNjYWxsX2ludDgwX2VuZDoKKworCS5nbG9ibCB2c3lzY2FsbF9zeXNlbnRlcl9zdGFydCwgdnN5c2NhbGxfc3lzZW50ZXJfZW5kCit2c3lzY2FsbF9zeXNlbnRlcl9zdGFydDoKKwkuaW5jYmluICJhcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLXN5c2VudGVyLnNvIgordnN5c2NhbGxfc3lzZW50ZXJfZW5kOgorCitfX0ZJTklUCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLmxkcy5TIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTgzMjlkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC5sZHMuUwpAQCAtMCwwICsxLDY1IEBACisvKgorICogTGlua2VyIHNjcmlwdCBmb3IgdnN5c2NhbGwgRFNPLiAgVGhlIHZzeXNjYWxsIHBhZ2UgaXMgYW4gRUxGIHNoYXJlZAorICogb2JqZWN0IHByZWxpbmtlZCB0byBpdHMgdmlydHVhbCBhZGRyZXNzLCBhbmQgd2l0aCBvbmx5IG9uZSByZWFkLW9ubHkKKyAqIHNlZ21lbnQgKHRoYXQgZml0cyBpbiBvbmUgcGFnZSkuICBUaGlzIHNjcmlwdCBjb250cm9scyBpdHMgbGF5b3V0LgorICovCisjaW5jbHVkZSA8YXNtL2FzbV9vZmZzZXRzLmg+CisKK1NFQ1RJT05TCit7CisgIC4gPSBWU1lTQ0FMTF9CQVNFICsgU0laRU9GX0hFQURFUlM7CisKKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CQk6dGV4dAorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKworICAvKiBUaGlzIGxpbmtlciBzY3JpcHQgaXMgdXNlZCBib3RoIHdpdGggLXIgYW5kIHdpdGggLXNoYXJlZC4KKyAgICAgRm9yIHRoZSBsYXlvdXRzIHRvIG1hdGNoLCB3ZSBuZWVkIHRvIHNraXAgbW9yZSB0aGFuIGVub3VnaAorICAgICBzcGFjZSBmb3IgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGV0IGFsLiAgSWYgdGhpcyBhbW91bnQKKyAgICAgaXMgaW5zdWZmaWNpZW50LCBsZCAtc2hhcmVkIHdpbGwgYmFyZi4gIEp1c3QgaW5jcmVhc2UgaXQgaGVyZS4gICovCisgIC4gPSBWU1lTQ0FMTF9CQVNFICsgMHg0MDA7CisKKyAgLnRleHQgICAgICAgICAgIDogeyAqKC50ZXh0KSB9CQk6dGV4dCA9MHg5MDkwOTA5MAorCisgIC5laF9mcmFtZV9oZHIgICA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CTp0ZXh0IDplaF9mcmFtZV9oZHIKKyAgLmVoX2ZyYW1lICAgICAgIDogeyBLRUVQICgqKC5laF9mcmFtZSkpIH0JOnRleHQKKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CQk6dGV4dCA6ZHluYW1pYworICAudXNlbGVzcyAgICAgICAgOiB7CisgIAkqKC5nb3QucGx0KSAqKC5nb3QpCisJKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorCSooLmR5bmJzcykKKwkqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICB9CQkJCQkJOnRleHQKK30KKworLyoKKyAqIFdlIG11c3Qgc3VwcGx5IHRoZSBFTEYgcHJvZ3JhbSBoZWFkZXJzIGV4cGxpY2l0bHkgdG8gZ2V0IGp1c3Qgb25lCisgKiBQVF9MT0FEIHNlZ21lbnQsIGFuZCBzZXQgdGhlIGZsYWdzIGV4cGxpY2l0bHkgdG8gbWFrZSBzZWdtZW50cyByZWFkLW9ubHkuCisgKi8KK1BIRFJTCit7CisgIHRleHQgUFRfTE9BRCBGSUxFSERSIFBIRFJTIEZMQUdTKDUpOyAvKiBQRl9SfFBGX1ggKi8KKyAgZHluYW1pYyBQVF9EWU5BTUlDIEZMQUdTKDQpOyAvKiBQRl9SICovCisgIGVoX2ZyYW1lX2hkciAweDY0NzRlNTUwOyAvKiBQVF9HTlVfRUhfRlJBTUUsIGJ1dCBsZCBkb2Vzbid0IG1hdGNoIHRoZSBuYW1lICovCit9CisKKy8qCisgKiBUaGlzIGNvbnRyb2xzIHdoYXQgc3ltYm9scyB3ZSBleHBvcnQgZnJvbSB0aGUgRFNPLgorICovCitWRVJTSU9OCit7CisgIExJTlVYXzIuNSB7CisgICAgZ2xvYmFsOgorICAgIAlfX2tlcm5lbF92c3lzY2FsbDsKKyAgICAJX19rZXJuZWxfc2lncmV0dXJuOworICAgIAlfX2tlcm5lbF9ydF9zaWdyZXR1cm47CisKKyAgICBsb2NhbDogKjsKKyAgfTsKK30KKworLyogVGhlIEVMRiBlbnRyeSBwb2ludCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIEFUX1NZU0lORk8gdmFsdWUuICAqLworRU5UUlkoX19rZXJuZWxfdnN5c2NhbGwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2xpYi9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9saWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxOTMyZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9saWIvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIworIyBNYWtlZmlsZSBmb3IgaTM4Ni1zcGVjaWZpYyBsaWJyYXJ5IGZpbGVzLi4KKyMKKworCitsaWIteSA9IGNoZWNrc3VtLm8gZGVsYXkubyB1c2VyY29weS5vIGdldHVzZXIubyBwdXR1c2VyLm8gbWVtY3B5Lm8gc3Ryc3RyLm8gXAorCWJpdG9wcy5vCisKK2xpYi0kKENPTkZJR19YODZfVVNFXzNETk9XKSArPSBtbXgubworbGliLSQoQ09ORklHX0hBVkVfREVDX0xPQ0spICs9IGRlY19hbmRfbG9jay5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL2JpdG9wcy5jIGIvYXJjaC9pMzg2L2xpYi9iaXRvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2RiMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2xpYi9iaXRvcHMuYwpAQCAtMCwwICsxLDcwIEBACisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKy8qKgorICogZmluZF9uZXh0X2JpdCAtIGZpbmQgdGhlIGZpcnN0IHNldCBiaXQgaW4gYSBtZW1vcnkgcmVnaW9uCisgKiBAYWRkcjogVGhlIGFkZHJlc3MgdG8gYmFzZSB0aGUgc2VhcmNoIG9uCisgKiBAb2Zmc2V0OiBUaGUgYml0bnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBhdAorICogQHNpemU6IFRoZSBtYXhpbXVtIHNpemUgdG8gc2VhcmNoCisgKi8KK2ludCBmaW5kX25leHRfYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBzaXplLCBpbnQgb2Zmc2V0KQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnAgPSBhZGRyICsgKG9mZnNldCA+PiA1KTsKKwlpbnQgc2V0ID0gMCwgYml0ID0gb2Zmc2V0ICYgMzEsIHJlczsKKworCWlmIChiaXQpIHsKKwkJLyoKKwkJICogTG9vayBmb3Igbm9uemVybyBpbiB0aGUgZmlyc3QgMzIgYml0czoKKwkJICovCisJCV9fYXNtX18oImJzZmwgJTEsJTBcblx0IgorCQkJImpuZSAxZlxuXHQiCisJCQkibW92bCAkMzIsICUwXG4iCisJCQkiMToiCisJCQk6ICI9ciIgKHNldCkKKwkJCTogInIiICgqcCA+PiBiaXQpKTsKKwkJaWYgKHNldCA8ICgzMiAtIGJpdCkpCisJCQlyZXR1cm4gc2V0ICsgb2Zmc2V0OworCQlzZXQgPSAzMiAtIGJpdDsKKwkJcCsrOworCX0KKwkvKgorCSAqIE5vIHNldCBiaXQgeWV0LCBzZWFyY2ggcmVtYWluaW5nIGZ1bGwgd29yZHMgZm9yIGEgYml0CisJICovCisJcmVzID0gZmluZF9maXJzdF9iaXQgKHAsIHNpemUgLSAzMiAqIChwIC0gYWRkcikpOworCXJldHVybiAob2Zmc2V0ICsgc2V0ICsgcmVzKTsKK30KK0VYUE9SVF9TWU1CT0woZmluZF9uZXh0X2JpdCk7CisKKy8qKgorICogZmluZF9uZXh0X3plcm9fYml0IC0gZmluZCB0aGUgZmlyc3QgemVybyBiaXQgaW4gYSBtZW1vcnkgcmVnaW9uCisgKiBAYWRkcjogVGhlIGFkZHJlc3MgdG8gYmFzZSB0aGUgc2VhcmNoIG9uCisgKiBAb2Zmc2V0OiBUaGUgYml0bnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBhdAorICogQHNpemU6IFRoZSBtYXhpbXVtIHNpemUgdG8gc2VhcmNoCisgKi8KK2ludCBmaW5kX25leHRfemVyb19iaXQoY29uc3QgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IHNpemUsIGludCBvZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyAqIHAgPSAoKHVuc2lnbmVkIGxvbmcgKikgYWRkcikgKyAob2Zmc2V0ID4+IDUpOworCWludCBzZXQgPSAwLCBiaXQgPSBvZmZzZXQgJiAzMSwgcmVzOworCisJaWYgKGJpdCkgeworCQkvKgorCQkgKiBMb29rIGZvciB6ZXJvIGluIHRoZSBmaXJzdCAzMiBiaXRzLgorCQkgKi8KKwkJX19hc21fXygiYnNmbCAlMSwlMFxuXHQiCisJCQkiam5lIDFmXG5cdCIKKwkJCSJtb3ZsICQzMiwgJTBcbiIKKwkJCSIxOiIKKwkJCTogIj1yIiAoc2V0KQorCQkJOiAiciIgKH4oKnAgPj4gYml0KSkpOworCQlpZiAoc2V0IDwgKDMyIC0gYml0KSkKKwkJCXJldHVybiBzZXQgKyBvZmZzZXQ7CisJCXNldCA9IDMyIC0gYml0OworCQlwKys7CisJfQorCS8qCisJICogTm8gemVybyB5ZXQsIHNlYXJjaCByZW1haW5pbmcgZnVsbCBieXRlcyBmb3IgYSB6ZXJvCisJICovCisJcmVzID0gZmluZF9maXJzdF96ZXJvX2JpdCAocCwgc2l6ZSAtIDMyICogKHAgLSAodW5zaWduZWQgbG9uZyAqKSBhZGRyKSk7CisJcmV0dXJuIChvZmZzZXQgKyBzZXQgKyByZXMpOworfQorRVhQT1JUX1NZTUJPTChmaW5kX25leHRfemVyb19iaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2xpYi9jaGVja3N1bS5TIGIvYXJjaC9pMzg2L2xpYi9jaGVja3N1bS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Yzc4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbGliL2NoZWNrc3VtLlMKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJSVAvVENQL1VEUCBjaGVja3N1bW1pbmcgcm91dGluZXMKKyAqCisgKiBBdXRob3JzOglKb3JnZSBDd2lrLCA8am9yZ2VAbGFzZXIuc2F0bGluay5uZXQ+CisgKgkJQXJudCBHdWxicmFuZHNlbiwgPGFndWxicmFAbnZnLnVuaXQubm8+CisgKgkJVG9tIE1heSwgPGZ0b21AbmV0Y29tLmNvbT4KKyAqICAgICAgICAgICAgICBQZW50aXVtIFByby9JSSByb3V0aW5lczoKKyAqICAgICAgICAgICAgICBBbGV4YW5kZXIgS2plbGRhYXMgPGFzdG9yQGd1YXJkaWFuLm5vPgorICogICAgICAgICAgICAgIEZpbm4gQXJuZSBHYW5nc3RhZCA8ZmlubmFnQGd1YXJkaWFuLm5vPgorICoJCUxvdHMgb2YgY29kZSBtb3ZlZCBmcm9tIHRjcC5jIGFuZCBpcC5jOyBzZWUgdGhvc2UgZmlsZXMKKyAqCQlmb3IgbW9yZSBuYW1lcy4KKyAqCisgKiBDaGFuZ2VzOiAgICAgSW5nbyBNb2xuYXIsIGNvbnZlcnRlZCBjc3VtX3BhcnRpYWxfY29weSgpIHRvIDIuMSBleGNlcHRpb24KKyAqCQkJICAgICBoYW5kbGluZy4KKyAqCQlBbmRpIEtsZWVuLCAgYWRkIHplcm9pbmcgb24gZXJyb3IKKyAqICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCB0byBwdXJlIGFzc2VtYmxlcgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKwkJCQkKKy8qCisgKiBjb21wdXRlcyBhIHBhcnRpYWwgY2hlY2tzdW0sIGUuZy4gZm9yIFRDUC9VRFAgZnJhZ21lbnRzCisgKi8KKworLyoJCit1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQorICovCisJCQorLnRleHQKKy5hbGlnbiA0CisuZ2xvYmwgY3N1bV9wYXJ0aWFsCQkJCQkJCQkKKwkJCisjaWZuZGVmIENPTkZJR19YODZfVVNFX1BQUk9fQ0hFQ0tTVU0KKworCSAgLyoJCQorCSAgICogRXhwZXJpbWVudHMgd2l0aCBFdGhlcm5ldCBhbmQgU0xJUCBjb25uZWN0aW9ucyBzaG93IHRoYXQgYnVmZgorCSAgICogaXMgYWxpZ25lZCBvbiBlaXRoZXIgYSAyLWJ5dGUgb3IgNC1ieXRlIGJvdW5kYXJ5LiAgV2UgZ2V0IGF0CisJICAgKiBsZWFzdCBhIHR3b2ZvbGQgc3BlZWR1cCBvbiA0ODYgYW5kIFBlbnRpdW0gaWYgaXQgaXMgNC1ieXRlIGFsaWduZWQuCisJICAgKiBGb3J0dW5hdGVseSwgaXQgaXMgZWFzeSB0byBjb252ZXJ0IDItYnl0ZSBhbGlnbm1lbnQgdG8gNC1ieXRlCisJICAgKiBhbGlnbm1lbnQgZm9yIHRoZSB1bnJvbGxlZCBsb29wLgorCSAgICovCQkKK2NzdW1fcGFydGlhbDoJCisJcHVzaGwgJWVzaQorCXB1c2hsICVlYngKKwltb3ZsIDIwKCVlc3ApLCVlYXgJIyBGdW5jdGlvbiBhcmc6IHVuc2lnbmVkIGludCBzdW0KKwltb3ZsIDE2KCVlc3ApLCVlY3gJIyBGdW5jdGlvbiBhcmc6IGludCBsZW4KKwltb3ZsIDEyKCVlc3ApLCVlc2kJIyBGdW5jdGlvbiBhcmc6IHVuc2lnbmVkIGNoYXIgKmJ1ZmYKKwl0ZXN0bCAkMywgJWVzaQkJIyBDaGVjayBhbGlnbm1lbnQuCisJanogMmYJCQkjIEp1bXAgaWYgYWxpZ25tZW50IGlzIG9rLgorCXRlc3RsICQxLCAlZXNpCQkjIENoZWNrIGFsaWdubWVudC4KKwlqeiAxMGYJCQkjIEp1bXAgaWYgYWxpZ25tZW50IGlzIGJvdW5kYXJ5IG9mIDJieXRlcy4KKworCSMgYnVmIGlzIG9kZAorCWRlYyAlZWN4CisJamwgOGYKKwltb3Z6YmwgKCVlc2kpLCAlZWJ4CisJYWRjbCAlZWJ4LCAlZWF4CisJcm9sbCAkOCwgJWVheAorCWluYyAlZXNpCisJdGVzdGwgJDIsICVlc2kKKwlqeiAyZgorMTA6CisJc3VibCAkMiwgJWVjeAkJIyBBbGlnbm1lbnQgdXNlcyB1cCB0d28gYnl0ZXMuCisJamFlIDFmCQkJIyBKdW1wIGlmIHdlIGhhZCBhdCBsZWFzdCB0d28gYnl0ZXMuCisJYWRkbCAkMiwgJWVjeAkJIyBlY3ggd2FzIDwgMi4gIERlYWwgd2l0aCBpdC4KKwlqbXAgNGYKKzE6CW1vdncgKCVlc2kpLCAlYngKKwlhZGRsICQyLCAlZXNpCisJYWRkdyAlYngsICVheAorCWFkY2wgJDAsICVlYXgKKzI6CisJbW92bCAlZWN4LCAlZWR4CisJc2hybCAkNSwgJWVjeAorCWp6IDJmCisJdGVzdGwgJWVzaSwgJWVzaQorMToJbW92bCAoJWVzaSksICVlYngKKwlhZGNsICVlYngsICVlYXgKKwltb3ZsIDQoJWVzaSksICVlYngKKwlhZGNsICVlYngsICVlYXgKKwltb3ZsIDgoJWVzaSksICVlYngKKwlhZGNsICVlYngsICVlYXgKKwltb3ZsIDEyKCVlc2kpLCAlZWJ4CisJYWRjbCAlZWJ4LCAlZWF4CisJbW92bCAxNiglZXNpKSwgJWVieAorCWFkY2wgJWVieCwgJWVheAorCW1vdmwgMjAoJWVzaSksICVlYngKKwlhZGNsICVlYngsICVlYXgKKwltb3ZsIDI0KCVlc2kpLCAlZWJ4CisJYWRjbCAlZWJ4LCAlZWF4CisJbW92bCAyOCglZXNpKSwgJWVieAorCWFkY2wgJWVieCwgJWVheAorCWxlYSAzMiglZXNpKSwgJWVzaQorCWRlYyAlZWN4CisJam5lIDFiCisJYWRjbCAkMCwgJWVheAorMjoJbW92bCAlZWR4LCAlZWN4CisJYW5kbCAkMHgxYywgJWVkeAorCWplIDRmCisJc2hybCAkMiwgJWVkeAkJIyBUaGlzIGNsZWFycyBDRgorMzoJYWRjbCAoJWVzaSksICVlYXgKKwlsZWEgNCglZXNpKSwgJWVzaQorCWRlYyAlZWR4CisJam5lIDNiCisJYWRjbCAkMCwgJWVheAorNDoJYW5kbCAkMywgJWVjeAorCWp6IDdmCisJY21wbCAkMiwgJWVjeAorCWpiIDVmCisJbW92dyAoJWVzaSksJWN4CisJbGVhbCAyKCVlc2kpLCVlc2kKKwlqZSA2ZgorCXNobGwgJDE2LCVlY3gKKzU6CW1vdmIgKCVlc2kpLCVjbAorNjoJYWRkbCAlZWN4LCVlYXgKKwlhZGNsICQwLCAlZWF4IAorNzoJCisJdGVzdGwgJDEsIDEyKCVlc3ApCisJanogOGYKKwlyb2xsICQ4LCAlZWF4Cis4OgorCXBvcGwgJWVieAorCXBvcGwgJWVzaQorCXJldAorCisjZWxzZQorCisvKiBWZXJzaW9uIGZvciBQZW50aXVtSUkvUFBybyAqLworCitjc3VtX3BhcnRpYWw6CisJcHVzaGwgJWVzaQorCXB1c2hsICVlYngKKwltb3ZsIDIwKCVlc3ApLCVlYXgJIyBGdW5jdGlvbiBhcmc6IHVuc2lnbmVkIGludCBzdW0KKwltb3ZsIDE2KCVlc3ApLCVlY3gJIyBGdW5jdGlvbiBhcmc6IGludCBsZW4KKwltb3ZsIDEyKCVlc3ApLCVlc2kJIyBGdW5jdGlvbiBhcmc6CWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZgorCisJdGVzdGwgJDMsICVlc2kgICAgICAgICAKKwlqbnogMjVmICAgICAgICAgICAgICAgICAKKzEwOgorCW1vdmwgJWVjeCwgJWVkeAorCW1vdmwgJWVjeCwgJWVieAorCWFuZGwgJDB4N2MsICVlYngKKwlzaHJsICQ3LCAlZWN4CisJYWRkbCAlZWJ4LCVlc2kKKwlzaHJsICQyLCAlZWJ4ICAKKwluZWdsICVlYngKKwlsZWEgNDVmKCVlYngsJWVieCwyKSwgJWVieAorCXRlc3RsICVlc2ksICVlc2kKKwlqbXAgKiVlYngKKworCSMgSGFuZGxlIDItYnl0ZS1hbGlnbmVkIHJlZ2lvbnMKKzIwOglhZGR3ICglZXNpKSwgJWF4CisJbGVhIDIoJWVzaSksICVlc2kKKwlhZGNsICQwLCAlZWF4CisJam1wIDEwYgorMjU6CisJdGVzdGwgJDEsICVlc2kgICAgICAgICAKKwlqeiAzMGYgICAgICAgICAgICAgICAgIAorCSMgYnVmIGlzIG9kZAorCWRlYyAlZWN4CisJamwgOTBmCisJbW92emJsICglZXNpKSwgJWVieAorCWFkZGwgJWVieCwgJWVheAorCWFkY2wgJDAsICVlYXgKKwlyb2xsICQ4LCAlZWF4CisJaW5jICVlc2kKKwl0ZXN0bCAkMiwgJWVzaQorCWp6IDEwYgorCiszMDoJc3VibCAkMiwgJWVjeCAgICAgICAgICAKKwlqYSAyMGIgICAgICAgICAgICAgICAgIAorCWplIDMyZgorCWFkZGwgJDIsICVlY3gKKwlqeiA4MGYKKwltb3Z6YmwgKCVlc2kpLCVlYngJIyBjc3VtbWluZyAxIGJ5dGUsIDItYWxpZ25lZAorCWFkZGwgJWVieCwgJWVheAorCWFkY2wgJDAsICVlYXgKKwlqbXAgODBmCiszMjoKKwlhZGR3ICglZXNpKSwgJWF4CSMgY3N1bW1pbmcgMiBieXRlcywgMi1hbGlnbmVkCisJYWRjbCAkMCwgJWVheAorCWptcCA4MGYKKworNDA6IAorCWFkZGwgLTEyOCglZXNpKSwgJWVheAorCWFkY2wgLTEyNCglZXNpKSwgJWVheAorCWFkY2wgLTEyMCglZXNpKSwgJWVheAorCWFkY2wgLTExNiglZXNpKSwgJWVheCAgIAorCWFkY2wgLTExMiglZXNpKSwgJWVheCAgIAorCWFkY2wgLTEwOCglZXNpKSwgJWVheAorCWFkY2wgLTEwNCglZXNpKSwgJWVheAorCWFkY2wgLTEwMCglZXNpKSwgJWVheAorCWFkY2wgLTk2KCVlc2kpLCAlZWF4CisJYWRjbCAtOTIoJWVzaSksICVlYXgKKwlhZGNsIC04OCglZXNpKSwgJWVheAorCWFkY2wgLTg0KCVlc2kpLCAlZWF4CisJYWRjbCAtODAoJWVzaSksICVlYXgKKwlhZGNsIC03NiglZXNpKSwgJWVheAorCWFkY2wgLTcyKCVlc2kpLCAlZWF4CisJYWRjbCAtNjgoJWVzaSksICVlYXgKKwlhZGNsIC02NCglZXNpKSwgJWVheCAgICAgCisJYWRjbCAtNjAoJWVzaSksICVlYXggICAgIAorCWFkY2wgLTU2KCVlc2kpLCAlZWF4ICAgICAKKwlhZGNsIC01MiglZXNpKSwgJWVheCAgIAorCWFkY2wgLTQ4KCVlc2kpLCAlZWF4ICAgCisJYWRjbCAtNDQoJWVzaSksICVlYXgKKwlhZGNsIC00MCglZXNpKSwgJWVheAorCWFkY2wgLTM2KCVlc2kpLCAlZWF4CisJYWRjbCAtMzIoJWVzaSksICVlYXgKKwlhZGNsIC0yOCglZXNpKSwgJWVheAorCWFkY2wgLTI0KCVlc2kpLCAlZWF4CisJYWRjbCAtMjAoJWVzaSksICVlYXgKKwlhZGNsIC0xNiglZXNpKSwgJWVheAorCWFkY2wgLTEyKCVlc2kpLCAlZWF4CisJYWRjbCAtOCglZXNpKSwgJWVheAorCWFkY2wgLTQoJWVzaSksICVlYXgKKzQ1OgorCWxlYSAxMjgoJWVzaSksICVlc2kKKwlhZGNsICQwLCAlZWF4CisJZGVjICVlY3gKKwlqZ2UgNDBiCisJbW92bCAlZWR4LCAlZWN4Cis1MDoJYW5kbCAkMywgJWVjeAorCWp6IDgwZgorCisJIyBIYW5kbGUgdGhlIGxhc3QgMS0zIGJ5dGVzIHdpdGhvdXQganVtcGluZworCW5vdGwgJWVjeAkJIyAxLT4yLCAyLT4xLCAzLT4wLCBoaWdoZXIgYml0cyBhcmUgbWFza2VkCisJbW92bCAkMHhmZmZmZmYsJWVieAkjIGJ5IHRoZSBzaGxsIGFuZCBzaHJsIGluc3RydWN0aW9ucworCXNobGwgJDMsJWVjeAorCXNocmwgJWNsLCVlYngKKwlhbmRsIC0xMjgoJWVzaSksJWVieAkjIGVzaSBpcyA0LWFsaWduZWQgc28gc2hvdWxkIGJlIG9rCisJYWRkbCAlZWJ4LCVlYXgKKwlhZGNsICQwLCVlYXgKKzgwOiAKKwl0ZXN0bCAkMSwgMTIoJWVzcCkKKwlqeiA5MGYKKwlyb2xsICQ4LCAlZWF4Cis5MDogCisJcG9wbCAlZWJ4CisJcG9wbCAlZXNpCisJcmV0CisJCQkJCisjZW5kaWYKKworLyoKK3Vuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljIChjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKKwkJCQkgIGludCBsZW4sIGludCBzdW0sIGludCAqc3JjX2Vycl9wdHIsIGludCAqZHN0X2Vycl9wdHIpCisgKi8gCisKKy8qCisgKiBDb3B5IGZyb20gZHMgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKKyAqCisgKiBUaGUgbWFjcm9zIFNSQyBhbmQgRFNUIHNwZWNpZnkgdGhlIHR5cGUgb2YgYWNjZXNzIGZvciB0aGUgaW5zdHJ1Y3Rpb24uCisgKiB0aHVzIHdlIGNhbiBjYWxsIGEgY3VzdG9tIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBhbGwgYWNjZXNzIHR5cGVzLgorICoKKyAqIEZJWE1FOiBjb3VsZCBzb21lb25lIGRvdWJsZS1jaGVjayB3aGV0aGVyIEkgaGF2ZW4ndCBtaXhlZCB1cCBzb21lIFNSQyBhbmQKKyAqCSAgRFNUIGRlZmluaXRpb25zPyBJdCdzIGRhbW4gaGFyZCB0byB0cmlnZ2VyIGFsbCBjYXNlcy4gIEkgaG9wZSBJIGdvdAorICoJICB0aGVtIGFsbCBidXQgdGhlcmUncyBubyBndWFyYW50ZWUuCisgKi8KKworI2RlZmluZSBTUkMoeS4uLikJCQlcCisJOTk5OTogeTsJCQlcCisJLnNlY3Rpb24gX19leF90YWJsZSwgImEiOwlcCisJLmxvbmcgOTk5OWIsIDYwMDFmCTsJXAorCS5wcmV2aW91cworCisjZGVmaW5lIERTVCh5Li4uKQkJCVwKKwk5OTk5OiB5OwkJCVwKKwkuc2VjdGlvbiBfX2V4X3RhYmxlLCAiYSI7CVwKKwkubG9uZyA5OTk5YiwgNjAwMmYJOwlcCisJLnByZXZpb3VzCisKKy5hbGlnbiA0CisuZ2xvYmwgY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYworCQkJCQorI2lmbmRlZiBDT05GSUdfWDg2X1VTRV9QUFJPX0NIRUNLU1VNCisKKyNkZWZpbmUgQVJHQkFTRSAxNgkJCisjZGVmaW5lIEZQCQkxMgorCQkKK2NzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWM6CisJc3VibCAgJDQsJWVzcAkKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVzaQorCXB1c2hsICVlYngKKwltb3ZsIEFSR0JBU0UrMTYoJWVzcCksJWVheAkjIHN1bQorCW1vdmwgQVJHQkFTRSsxMiglZXNwKSwlZWN4CSMgbGVuCisJbW92bCBBUkdCQVNFKzQoJWVzcCksJWVzaQkjIHNyYworCW1vdmwgQVJHQkFTRSs4KCVlc3ApLCVlZGkJIyBkc3QKKworCXRlc3RsICQyLCAlZWRpCQkJIyBDaGVjayBhbGlnbm1lbnQuIAorCWp6IDJmCQkJCSMgSnVtcCBpZiBhbGlnbm1lbnQgaXMgb2suCisJc3VibCAkMiwgJWVjeAkJCSMgQWxpZ25tZW50IHVzZXMgdXAgdHdvIGJ5dGVzLgorCWphZSAxZgkJCQkjIEp1bXAgaWYgd2UgaGFkIGF0IGxlYXN0IHR3byBieXRlcy4KKwlhZGRsICQyLCAlZWN4CQkJIyBlY3ggd2FzIDwgMi4gIERlYWwgd2l0aCBpdC4KKwlqbXAgNGYKK1NSQygxOgltb3Z3ICglZXNpKSwgJWJ4CSkKKwlhZGRsICQyLCAlZXNpCitEU1QoCW1vdncgJWJ4LCAoJWVkaSkJKQorCWFkZGwgJDIsICVlZGkKKwlhZGR3ICVieCwgJWF4CQorCWFkY2wgJDAsICVlYXgKKzI6CisJbW92bCAlZWN4LCBGUCglZXNwKQorCXNocmwgJDUsICVlY3gKKwlqeiAyZgorCXRlc3RsICVlc2ksICVlc2kKK1NSQygxOgltb3ZsICglZXNpKSwgJWVieAkpCitTUkMoCW1vdmwgNCglZXNpKSwgJWVkeAkpCisJYWRjbCAlZWJ4LCAlZWF4CitEU1QoCW1vdmwgJWVieCwgKCVlZGkpCSkKKwlhZGNsICVlZHgsICVlYXgKK0RTVCgJbW92bCAlZWR4LCA0KCVlZGkpCSkKKworU1JDKAltb3ZsIDgoJWVzaSksICVlYngJKQorU1JDKAltb3ZsIDEyKCVlc2kpLCAlZWR4CSkKKwlhZGNsICVlYngsICVlYXgKK0RTVCgJbW92bCAlZWJ4LCA4KCVlZGkpCSkKKwlhZGNsICVlZHgsICVlYXgKK0RTVCgJbW92bCAlZWR4LCAxMiglZWRpKQkpCisKK1NSQygJbW92bCAxNiglZXNpKSwgJWVieCAJKQorU1JDKAltb3ZsIDIwKCVlc2kpLCAlZWR4CSkKKwlhZGNsICVlYngsICVlYXgKK0RTVCgJbW92bCAlZWJ4LCAxNiglZWRpKQkpCisJYWRjbCAlZWR4LCAlZWF4CitEU1QoCW1vdmwgJWVkeCwgMjAoJWVkaSkJKQorCitTUkMoCW1vdmwgMjQoJWVzaSksICVlYngJKQorU1JDKAltb3ZsIDI4KCVlc2kpLCAlZWR4CSkKKwlhZGNsICVlYngsICVlYXgKK0RTVCgJbW92bCAlZWJ4LCAyNCglZWRpKQkpCisJYWRjbCAlZWR4LCAlZWF4CitEU1QoCW1vdmwgJWVkeCwgMjgoJWVkaSkJKQorCisJbGVhIDMyKCVlc2kpLCAlZXNpCisJbGVhIDMyKCVlZGkpLCAlZWRpCisJZGVjICVlY3gKKwlqbmUgMWIKKwlhZGNsICQwLCAlZWF4CisyOgltb3ZsIEZQKCVlc3ApLCAlZWR4CisJbW92bCAlZWR4LCAlZWN4CisJYW5kbCAkMHgxYywgJWVkeAorCWplIDRmCisJc2hybCAkMiwgJWVkeAkJCSMgVGhpcyBjbGVhcnMgQ0YKK1NSQygzOgltb3ZsICglZXNpKSwgJWVieAkpCisJYWRjbCAlZWJ4LCAlZWF4CitEU1QoCW1vdmwgJWVieCwgKCVlZGkpCSkKKwlsZWEgNCglZXNpKSwgJWVzaQorCWxlYSA0KCVlZGkpLCAlZWRpCisJZGVjICVlZHgKKwlqbmUgM2IKKwlhZGNsICQwLCAlZWF4Cis0OglhbmRsICQzLCAlZWN4CisJanogN2YKKwljbXBsICQyLCAlZWN4CisJamIgNWYKK1NSQygJbW92dyAoJWVzaSksICVjeAkpCisJbGVhbCAyKCVlc2kpLCAlZXNpCitEU1QoCW1vdncgJWN4LCAoJWVkaSkJKQorCWxlYWwgMiglZWRpKSwgJWVkaQorCWplIDZmCisJc2hsbCAkMTYsJWVjeAorU1JDKDU6CW1vdmIgKCVlc2kpLCAlY2wJKQorRFNUKAltb3ZiICVjbCwgKCVlZGkpCSkKKzY6CWFkZGwgJWVjeCwgJWVheAorCWFkY2wgJDAsICVlYXgKKzc6Cis1MDAwOgorCisjIEV4Y2VwdGlvbiBoYW5kbGVyOgorLnNlY3Rpb24gLmZpeHVwLCAiYXgiCQkJCQkJCQorCis2MDAxOgorCW1vdmwgQVJHQkFTRSsyMCglZXNwKSwgJWVieAkjIHNyY19lcnJfcHRyCisJbW92bCAkLUVGQVVMVCwgKCVlYngpCisKKwkjIHplcm8gdGhlIGNvbXBsZXRlIGRlc3RpbmF0aW9uIC0gY29tcHV0aW5nIHRoZSByZXN0CisJIyBpcyB0b28gbXVjaCB3b3JrIAorCW1vdmwgQVJHQkFTRSs4KCVlc3ApLCAlZWRpCSMgZHN0CisJbW92bCBBUkdCQVNFKzEyKCVlc3ApLCAlZWN4CSMgbGVuCisJeG9ybCAlZWF4LCVlYXgKKwlyZXAgOyBzdG9zYgorCisJam1wIDUwMDBiCisKKzYwMDI6CisJbW92bCBBUkdCQVNFKzI0KCVlc3ApLCAlZWJ4CSMgZHN0X2Vycl9wdHIKKwltb3ZsICQtRUZBVUxULCglZWJ4KQorCWptcCA1MDAwYgorCisucHJldmlvdXMKKworCXBvcGwgJWVieAorCXBvcGwgJWVzaQorCXBvcGwgJWVkaQorCXBvcGwgJWVjeAkJCSMgZXF1aXZhbGVudCB0byBhZGRsICQ0LCVlc3AKKwlyZXQJCisKKyNlbHNlCisKKy8qIFZlcnNpb24gZm9yIFBlbnRpdW1JSS9QUHJvICovCisKKyNkZWZpbmUgUk9VTkQxKHgpIFwKKwlTUkMobW92bCB4KCVlc2kpLCAlZWJ4CSkJOwlcCisJYWRkbCAlZWJ4LCAlZWF4CQkJOwlcCisJRFNUKG1vdmwgJWVieCwgeCglZWRpKQkpCTsgCisKKyNkZWZpbmUgUk9VTkQoeCkgXAorCVNSQyhtb3ZsIHgoJWVzaSksICVlYngJKQk7CVwKKwlhZGNsICVlYngsICVlYXgJCQk7CVwKKwlEU1QobW92bCAlZWJ4LCB4KCVlZGkpCSkJOworCisjZGVmaW5lIEFSR0JBU0UgMTIKKwkJCitjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljOgorCXB1c2hsICVlYngKKwlwdXNobCAlZWRpCisJcHVzaGwgJWVzaQorCW1vdmwgQVJHQkFTRSs0KCVlc3ApLCVlc2kJI3NyYworCW1vdmwgQVJHQkFTRSs4KCVlc3ApLCVlZGkJI2RzdAkKKwltb3ZsIEFSR0JBU0UrMTIoJWVzcCksJWVjeAkjbGVuCisJbW92bCBBUkdCQVNFKzE2KCVlc3ApLCVlYXgJI3N1bQorIwltb3ZsICVlY3gsICVlZHggIAorCW1vdmwgJWVjeCwgJWVieCAgCisJbW92bCAlZXNpLCAlZWR4CisJc2hybCAkNiwgJWVjeCAgICAgCisJYW5kbCAkMHgzYywgJWVieCAgCisJbmVnbCAlZWJ4CisJc3VibCAlZWJ4LCAlZXNpICAKKwlzdWJsICVlYngsICVlZGkgIAorCWxlYSAgLTEoJWVzaSksJWVkeAorCWFuZGwgJC0zMiwlZWR4CisJbGVhIDNmKCVlYngsJWVieCksICVlYngKKwl0ZXN0bCAlZXNpLCAlZXNpIAorCWptcCAqJWVieAorMToJYWRkbCAkNjQsJWVzaQorCWFkZGwgJDY0LCVlZGkgCisJU1JDKG1vdmIgLTMyKCVlZHgpLCVibCkJOyBTUkMobW92YiAoJWVkeCksJWJsKQorCVJPVU5EMSgtNjQpIFJPVU5EKC02MCkgUk9VTkQoLTU2KSBST1VORCgtNTIpCQorCVJPVU5EICgtNDgpIFJPVU5EKC00NCkgUk9VTkQoLTQwKSBST1VORCgtMzYpCQorCVJPVU5EICgtMzIpIFJPVU5EKC0yOCkgUk9VTkQoLTI0KSBST1VORCgtMjApCQorCVJPVU5EICgtMTYpIFJPVU5EKC0xMikgUk9VTkQoLTgpICBST1VORCgtNCkJCiszOglhZGNsICQwLCVlYXgKKwlhZGRsICQ2NCwgJWVkeAorCWRlYyAlZWN4CisJamdlIDFiCis0Ogltb3ZsIEFSR0JBU0UrMTIoJWVzcCksJWVkeAkjbGVuCisJYW5kbCAkMywgJWVkeAorCWp6IDdmCisJY21wbCAkMiwgJWVkeAorCWpiIDVmCitTUkMoCW1vdncgKCVlc2kpLCAlZHggICAgICAgICApCisJbGVhbCAyKCVlc2kpLCAlZXNpCitEU1QoCW1vdncgJWR4LCAoJWVkaSkgICAgICAgICApCisJbGVhbCAyKCVlZGkpLCAlZWRpCisJamUgNmYKKwlzaGxsICQxNiwlZWR4Cis1OgorU1JDKAltb3ZiICglZXNpKSwgJWRsICAgICAgICAgKQorRFNUKAltb3ZiICVkbCwgKCVlZGkpICAgICAgICAgKQorNjoJYWRkbCAlZWR4LCAlZWF4CisJYWRjbCAkMCwgJWVheAorNzoKKy5zZWN0aW9uIC5maXh1cCwgImF4IgorNjAwMToJbW92bAlBUkdCQVNFKzIwKCVlc3ApLCAlZWJ4CSMgc3JjX2Vycl9wdHIJCisJbW92bCAkLUVGQVVMVCwgKCVlYngpCisJIyB6ZXJvIHRoZSBjb21wbGV0ZSBkZXN0aW5hdGlvbiAoY29tcHV0aW5nIHRoZSByZXN0IGlzIHRvbyBtdWNoIHdvcmspCisJbW92bCBBUkdCQVNFKzgoJWVzcCksJWVkaQkjIGRzdAorCW1vdmwgQVJHQkFTRSsxMiglZXNwKSwlZWN4CSMgbGVuCisJeG9ybCAlZWF4LCVlYXgKKwlyZXA7IHN0b3NiCisJam1wIDdiCis2MDAyOgltb3ZsIEFSR0JBU0UrMjQoJWVzcCksICVlYngJIyBkc3RfZXJyX3B0cgorCW1vdmwgJC1FRkFVTFQsICglZWJ4KQorCWptcCAgN2IJCQkKKy5wcmV2aW91cwkJCQkKKworCXBvcGwgJWVzaQorCXBvcGwgJWVkaQorCXBvcGwgJWVieAorCXJldAorCQkJCQorI3VuZGVmIFJPVU5ECisjdW5kZWYgUk9VTkQxCQkKKwkJCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9saWIvZGVjX2FuZF9sb2NrLmMgYi9hcmNoL2kzODYvbGliL2RlY19hbmRfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDMzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbGliL2RlY19hbmRfbG9jay5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiB4ODYgdmVyc2lvbiBvZiAiYXRvbWljX2RlY19hbmRfbG9jaygpIiB1c2luZworICogdGhlIGF0b21pYyAiY21weGNoZyIgaW5zdHJ1Y3Rpb24uCisgKgorICogKEZvciBDUFUncyBsYWNraW5nIGNtcHhjaGcsIHdlIHVzZSB0aGUgc2xvdworICogZ2VuZXJpYyB2ZXJzaW9uLCBhbmQgdGhpcyBvbmUgbmV2ZXIgZXZlbiBnZXRzCisgKiBjb21waWxlZCkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCitpbnQgX2F0b21pY19kZWNfYW5kX2xvY2soYXRvbWljX3QgKmF0b21pYywgc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlpbnQgY291bnRlcjsKKwlpbnQgbmV3Y291bnQ7CisKK3JlcGVhdDoKKwljb3VudGVyID0gYXRvbWljX3JlYWQoYXRvbWljKTsKKwluZXdjb3VudCA9IGNvdW50ZXItMTsKKworCWlmICghbmV3Y291bnQpCisJCWdvdG8gc2xvd19wYXRoOworCisJYXNtIHZvbGF0aWxlKCJsb2NrOyBjbXB4Y2hnbCAlMSwlMiIKKwkJOiI9YSIgKG5ld2NvdW50KQorCQk6InIiIChuZXdjb3VudCksICJtIiAoYXRvbWljLT5jb3VudGVyKSwgIjAiIChjb3VudGVyKSk7CisKKwkvKiBJZiB0aGUgYWJvdmUgZmFpbGVkLCAiZWF4IiB3aWxsIGhhdmUgY2hhbmdlZCAqLworCWlmIChuZXdjb3VudCAhPSBjb3VudGVyKQorCQlnb3RvIHJlcGVhdDsKKwlyZXR1cm4gMDsKKworc2xvd19wYXRoOgorCXNwaW5fbG9jayhsb2NrKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdChhdG9taWMpKQorCQlyZXR1cm4gMTsKKwlzcGluX3VubG9jayhsb2NrKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9saWIvZGVsYXkuYyBiL2FyY2gvaTM4Ni9saWIvZGVsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODA2MzlmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2xpYi9kZWxheS5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKglQcmVjaXNlIERlbGF5IExvb3BzIGZvciBpMzg2CisgKgorICoJQ29weXJpZ2h0IChDKSAxOTkzIExpbnVzIFRvcnZhbGRzCisgKglDb3B5cmlnaHQgKEMpIDE5OTcgTWFydGluIE1hcmVzIDxtakBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3o+CisgKgorICoJVGhlIF9fZGVsYXkgZnVuY3Rpb24gbXVzdCBfTk9UXyBiZSBpbmxpbmVkIGFzIGl0cyBleGVjdXRpb24gdGltZQorICoJZGVwZW5kcyB3aWxkbHkgb24gYWxpZ25tZW50IG9uIG1hbnkgeDg2IHByb2Nlc3NvcnMuIFRoZSBhZGRpdGlvbmFsCisgKglqdW1wIG1hZ2ljIGlzIG5lZWRlZCB0byBnZXQgdGhlIHRpbWluZyBzdGFibGUgb24gYWxsIHRoZSBDUFUncworICoJd2UgaGF2ZSB0byB3b3JyeSBhYm91dC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KKworI2lmZGVmIENPTkZJR19TTVAKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCB0aW1lcl9vcHRzKiB0aW1lcjsKKwordm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJY3VyX3RpbWVyLT5kZWxheShsb29wcyk7Cit9CisKK2lubGluZSB2b2lkIF9fY29uc3RfdWRlbGF5KHVuc2lnbmVkIGxvbmcgeGxvb3BzKQoreworCWludCBkMDsKKwl4bG9vcHMgKj0gNDsKKwlfX2FzbV9fKCJtdWxsICUwIgorCQk6Ij1kIiAoeGxvb3BzKSwgIj0mYSIgKGQwKQorCQk6IjEiICh4bG9vcHMpLCIwIiAoY3B1X2RhdGFbX3NtcF9wcm9jZXNzb3JfaWQoKV0ubG9vcHNfcGVyX2ppZmZ5ICogKEhaLzQpKSk7CisgICAgICAgIF9fZGVsYXkoKyt4bG9vcHMpOworfQorCit2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCit7CisJX19jb25zdF91ZGVsYXkodXNlY3MgKiAweDAwMDAxMGM3KTsgIC8qIDIqKjMyIC8gMTAwMDAwMCAocm91bmRlZCB1cCkgKi8KK30KKwordm9pZCBfX25kZWxheSh1bnNpZ25lZCBsb25nIG5zZWNzKQoreworCV9fY29uc3RfdWRlbGF5KG5zZWNzICogMHgwMDAwNSk7ICAvKiAyKiozMiAvIDEwMDAwMDAwMDAgKHJvdW5kZWQgdXApICovCit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL2dldHVzZXIuUyBiL2FyY2gvaTM4Ni9saWIvZ2V0dXNlci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDdmMTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbGliL2dldHVzZXIuUwpAQCAtMCwwICsxLDcwIEBACisvKgorICogX19nZXRfdXNlciBmdW5jdGlvbnMuCisgKgorICogKEMpIENvcHlyaWdodCAxOTk4IExpbnVzIFRvcnZhbGRzCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGhhdmUgYSBub24tc3RhbmRhcmQgY2FsbCBpbnRlcmZhY2UKKyAqIHRvIG1ha2UgdGhlbSBtb3JlIGVmZmljaWVudCwgZXNwZWNpYWxseSBhcyB0aGV5CisgKiByZXR1cm4gYW4gZXJyb3IgdmFsdWUgaW4gYWRkaXRpb24gdG8gdGhlICJyZWFsIgorICogcmV0dXJuIHZhbHVlLgorICovCisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisKKworLyoKKyAqIF9fZ2V0X3VzZXJfWAorICoKKyAqIElucHV0czoJJWVheCBjb250YWlucyB0aGUgYWRkcmVzcworICoKKyAqIE91dHB1dHM6CSVlYXggaXMgZXJyb3IgY29kZSAoMCBvciAtRUZBVUxUKQorICoJCSVlZHggY29udGFpbnMgemVyby1leHRlbmRlZCB2YWx1ZQorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgbm90IG1vZGlmeSBhbnkgb3RoZXIgcmVnaXN0ZXJzLAorICogYXMgdGhleSBnZXQgY2FsbGVkIGZyb20gd2l0aGluIGlubGluZSBhc3NlbWJseS4KKyAqLworCisudGV4dAorLmFsaWduIDQKKy5nbG9ibCBfX2dldF91c2VyXzEKK19fZ2V0X3VzZXJfMToKKwlHRVRfVEhSRUFEX0lORk8oJWVkeCkKKwljbXBsIFRJX2FkZHJfbGltaXQoJWVkeCksJWVheAorCWphZSBiYWRfZ2V0X3VzZXIKKzE6CW1vdnpibCAoJWVheCksJWVkeAorCXhvcmwgJWVheCwlZWF4CisJcmV0CisKKy5hbGlnbiA0CisuZ2xvYmwgX19nZXRfdXNlcl8yCitfX2dldF91c2VyXzI6CisJYWRkbCAkMSwlZWF4CisJamMgYmFkX2dldF91c2VyCisJR0VUX1RIUkVBRF9JTkZPKCVlZHgpCisJY21wbCBUSV9hZGRyX2xpbWl0KCVlZHgpLCVlYXgKKwlqYWUgYmFkX2dldF91c2VyCisyOgltb3Z6d2wgLTEoJWVheCksJWVkeAorCXhvcmwgJWVheCwlZWF4CisJcmV0CisKKy5hbGlnbiA0CisuZ2xvYmwgX19nZXRfdXNlcl80CitfX2dldF91c2VyXzQ6CisJYWRkbCAkMywlZWF4CisJamMgYmFkX2dldF91c2VyCisJR0VUX1RIUkVBRF9JTkZPKCVlZHgpCisJY21wbCBUSV9hZGRyX2xpbWl0KCVlZHgpLCVlYXgKKwlqYWUgYmFkX2dldF91c2VyCiszOgltb3ZsIC0zKCVlYXgpLCVlZHgKKwl4b3JsICVlYXgsJWVheAorCXJldAorCitiYWRfZ2V0X3VzZXI6CisJeG9ybCAlZWR4LCVlZHgKKwltb3ZsICQtMTQsJWVheAorCXJldAorCisuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5sb25nIDFiLGJhZF9nZXRfdXNlcgorCS5sb25nIDJiLGJhZF9nZXRfdXNlcgorCS5sb25nIDNiLGJhZF9nZXRfdXNlcgorLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL21lbWNweS5jIGIvYXJjaC9pMzg2L2xpYi9tZW1jcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTFiMjM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2xpYi9tZW1jcHkuYwpAQCAtMCwwICsxLDQ0IEBACisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyN1bmRlZiBtZW1jcHkKKyN1bmRlZiBtZW1zZXQKKwordm9pZCAqbWVtY3B5KHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgbikKK3sKKyNpZmRlZiBDT05GSUdfWDg2X1VTRV8zRE5PVworCXJldHVybiBfX21lbWNweTNkKHRvLCBmcm9tLCBuKTsKKyNlbHNlCisJcmV0dXJuIF9fbWVtY3B5KHRvLCBmcm9tLCBuKTsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChtZW1jcHkpOworCit2b2lkICptZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gX19tZW1zZXQocywgYywgY291bnQpOworfQorRVhQT1JUX1NZTUJPTChtZW1zZXQpOworCit2b2lkICptZW1tb3ZlKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCit7CisJaW50IGQwLCBkMSwgZDI7CisKKwlpZiAoZGVzdCA8IHNyYykgeworCQltZW1jcHkoZGVzdCxzcmMsbik7CisJfSBlbHNlIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCQkic3RkXG5cdCIKKwkJCSJyZXBcblx0IgorCQkJIm1vdnNiXG5cdCIKKwkJCSJjbGQiCisJCQk6ICI9JmMiIChkMCksICI9JlMiIChkMSksICI9JkQiIChkMikKKwkJCToiMCIgKG4pLAorCQkJICIxIiAobi0xKyhjb25zdCBjaGFyICopc3JjKSwKKwkJCSAiMiIgKG4tMSsoY2hhciAqKWRlc3QpCisJCQk6Im1lbW9yeSIpOworCX0KKwlyZXR1cm4gZGVzdDsKK30KK0VYUE9SVF9TWU1CT0wobWVtbW92ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL21teC5jIGIvYXJjaC9pMzg2L2xpYi9tbXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWY4YjFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2xpYi9tbXguYwpAQCAtMCwwICsxLDM5OSBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisKKyNpbmNsdWRlIDxhc20vaTM4Ny5oPgorCisKKy8qCisgKglNTVggM0ROb3chIGxpYnJhcnkgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqCVRvIGRvOgorICoJV2UgY2FuIHVzZSBNTVgganVzdCBmb3IgcHJlZmV0Y2ggaW4gSVJRJ3MuIFRoaXMgbWF5IGJlIGEgd2luLiAKKyAqCQkocmVwb3J0ZWQgc28gb24gSzYtSUlJKQorICoJV2Ugc2hvdWxkIHVzZSBhIGJldHRlciBjb2RlIG5ldXRyYWwgZmlsbGVyIGZvciB0aGUgc2hvcnQganVtcAorICoJCWxlYWwgZWJ4LiBbZWJ4XSBpcyBhcHBhcmVudGx5IGJlc3QgZm9yIEs2LTIsIGJ1dCBDeXJpeCA/PworICoJV2UgYWxzbyB3YW50IHRvIGNsb2JiZXIgdGhlIGZpbGxlciByZWdpc3RlciBzbyB3ZSBkb24ndCBnZXQgYW55CisgKgkJcmVnaXN0ZXIgZm9yd2FyZGluZyBzdGFsbHMgb24gdGhlIGZpbGxlci4gCisgKgorICoJQWRkICp1c2VyIGhhbmRsaW5nLiBDaGVja3N1bXMgYXJlIG5vdCBhIHdpbiB3aXRoIE1NWCBvbiBhbnkgQ1BVCisgKgl0ZXN0ZWQgc28gZmFyIGZvciBhbnkgTU1YIHNvbHV0aW9uIGZpZ3VyZWQuCisgKgorICoJMjIvMDkvMjAwMCAtIEFyamFuIHZhbiBkZSBWZW4gCisgKgkJSW1wcm92ZWQgZm9yIG5vbi1lZ2luZWVyaW5nLXNhbXBsZSBBdGhsb25zIAorICoKKyAqLworIAordm9pZCAqX21teF9tZW1jcHkodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBsZW4pCit7CisJdm9pZCAqcDsKKwlpbnQgaTsKKworCWlmICh1bmxpa2VseShpbl9pbnRlcnJ1cHQoKSkpCisJCXJldHVybiBfX21lbWNweSh0bywgZnJvbSwgbGVuKTsKKworCXAgPSB0bzsKKwlpID0gbGVuID4+IDY7IC8qIGxlbi82NCAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiMTogcHJlZmV0Y2ggKCUwKVxuIgkJLyogVGhpcyBzZXQgaXMgMjggYnl0ZXMgKi8KKwkJIiAgIHByZWZldGNoIDY0KCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMTI4KCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMTkyKCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMjU2KCUwKVxuIgorCQkiMjogIFxuIgorCQkiLnNlY3Rpb24gLmZpeHVwLCBcImF4XCJcbiIKKwkJIjM6IG1vdncgJDB4MUFFQiwgMWJcbiIJLyogam1wIG9uIDI2IGJ5dGVzICovCisJCSIgICBqbXAgMmJcbiIKKwkJIi5wcmV2aW91c1xuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA0XG4iCisJCSIJLmxvbmcgMWIsIDNiXG4iCisJCSIucHJldmlvdXMiCisJCTogOiAiciIgKGZyb20pICk7CisJCQorCQorCWZvcig7IGk+NTsgaS0tKQorCXsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiMTogIHByZWZldGNoIDMyMCglMClcbiIKKwkJIjI6ICBtb3ZxICglMCksICUlbW0wXG4iCisJCSIgIG1vdnEgOCglMCksICUlbW0xXG4iCisJCSIgIG1vdnEgMTYoJTApLCAlJW1tMlxuIgorCQkiICBtb3ZxIDI0KCUwKSwgJSVtbTNcbiIKKwkJIiAgbW92cSAlJW1tMCwgKCUxKVxuIgorCQkiICBtb3ZxICUlbW0xLCA4KCUxKVxuIgorCQkiICBtb3ZxICUlbW0yLCAxNiglMSlcbiIKKwkJIiAgbW92cSAlJW1tMywgMjQoJTEpXG4iCisJCSIgIG1vdnEgMzIoJTApLCAlJW1tMFxuIgorCQkiICBtb3ZxIDQwKCUwKSwgJSVtbTFcbiIKKwkJIiAgbW92cSA0OCglMCksICUlbW0yXG4iCisJCSIgIG1vdnEgNTYoJTApLCAlJW1tM1xuIgorCQkiICBtb3ZxICUlbW0wLCAzMiglMSlcbiIKKwkJIiAgbW92cSAlJW1tMSwgNDAoJTEpXG4iCisJCSIgIG1vdnEgJSVtbTIsIDQ4KCUxKVxuIgorCQkiICBtb3ZxICUlbW0zLCA1NiglMSlcbiIKKwkJIi5zZWN0aW9uIC5maXh1cCwgXCJheFwiXG4iCisJCSIzOiBtb3Z3ICQweDA1RUIsIDFiXG4iCS8qIGptcCBvbiA1IGJ5dGVzICovCisJCSIgICBqbXAgMmJcbiIKKwkJIi5wcmV2aW91c1xuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA0XG4iCisJCSIJLmxvbmcgMWIsIDNiXG4iCisJCSIucHJldmlvdXMiCisJCTogOiAiciIgKGZyb20pLCAiciIgKHRvKSA6ICJtZW1vcnkiKTsKKwkJZnJvbSs9NjQ7CisJCXRvKz02NDsKKwl9CisKKwlmb3IoOyBpPjA7IGktLSkKKwl7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiAgbW92cSAoJTApLCAlJW1tMFxuIgorCQkiICBtb3ZxIDgoJTApLCAlJW1tMVxuIgorCQkiICBtb3ZxIDE2KCUwKSwgJSVtbTJcbiIKKwkJIiAgbW92cSAyNCglMCksICUlbW0zXG4iCisJCSIgIG1vdnEgJSVtbTAsICglMSlcbiIKKwkJIiAgbW92cSAlJW1tMSwgOCglMSlcbiIKKwkJIiAgbW92cSAlJW1tMiwgMTYoJTEpXG4iCisJCSIgIG1vdnEgJSVtbTMsIDI0KCUxKVxuIgorCQkiICBtb3ZxIDMyKCUwKSwgJSVtbTBcbiIKKwkJIiAgbW92cSA0MCglMCksICUlbW0xXG4iCisJCSIgIG1vdnEgNDgoJTApLCAlJW1tMlxuIgorCQkiICBtb3ZxIDU2KCUwKSwgJSVtbTNcbiIKKwkJIiAgbW92cSAlJW1tMCwgMzIoJTEpXG4iCisJCSIgIG1vdnEgJSVtbTEsIDQwKCUxKVxuIgorCQkiICBtb3ZxICUlbW0yLCA0OCglMSlcbiIKKwkJIiAgbW92cSAlJW1tMywgNTYoJTEpXG4iCisJCTogOiAiciIgKGZyb20pLCAiciIgKHRvKSA6ICJtZW1vcnkiKTsKKwkJZnJvbSs9NjQ7CisJCXRvKz02NDsKKwl9CisJLyoKKwkgKglOb3cgZG8gdGhlIHRhaWwgb2YgdGhlIGJsb2NrCisJICovCisJX19tZW1jcHkodG8sIGZyb20sIGxlbiY2Myk7CisJa2VybmVsX2ZwdV9lbmQoKTsKKwlyZXR1cm4gcDsKK30KKworI2lmZGVmIENPTkZJR19NSzcKKworLyoKKyAqCVRoZSBLNyBoYXMgc3RyZWFtaW5nIGNhY2hlIGJ5cGFzcyBsb2FkL3N0b3JlLiBUaGUgQ3lyaXggSUlJLCBLNiBhbmQKKyAqCW90aGVyIE1NWCB1c2luZyBwcm9jZXNzb3JzIGRvIG5vdC4KKyAqLworCitzdGF0aWMgdm9pZCBmYXN0X2NsZWFyX3BhZ2Uodm9pZCAqcGFnZSkKK3sKKwlpbnQgaTsKKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKwkKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIgIHB4b3IgJSVtbTAsICUlbW0wXG4iIDogOgorCSk7CisKKwlmb3IoaT0wO2k8NDA5Ni82NDtpKyspCisJeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIgIG1vdm50cSAlJW1tMCwgKCUwKVxuIgorCQkiICBtb3ZudHEgJSVtbTAsIDgoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgMTYoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgMjQoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgMzIoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgNDAoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgNDgoJTApXG4iCisJCSIgIG1vdm50cSAlJW1tMCwgNTYoJTApXG4iCisJCTogOiAiciIgKHBhZ2UpIDogIm1lbW9yeSIpOworCQlwYWdlKz02NDsKKwl9CisJLyogc2luY2UgbW92bnRxIGlzIHdlYWtseS1vcmRlcmVkLCBhICJzZmVuY2UiIGlzIG5lZWRlZCB0byBiZWNvbWUKKwkgKiBvcmRlcmVkIGFnYWluLgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiAgc2ZlbmNlIFxuIiA6IDoKKwkpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZhc3RfY29weV9wYWdlKHZvaWQgKnRvLCB2b2lkICpmcm9tKQoreworCWludCBpOworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJLyogbWF5YmUgdGhlIHByZWZldGNoIHN0dWZmIGNhbiBnbyBiZWZvcmUgdGhlIGV4cGVuc2l2ZSBmbnNhdmUuLi4KKwkgKiBidXQgdGhhdCBpcyBmb3IgbGF0ZXIuIC1BVgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIjE6IHByZWZldGNoICglMClcbiIKKwkJIiAgIHByZWZldGNoIDY0KCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMTI4KCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMTkyKCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggMjU2KCUwKVxuIgorCQkiMjogIFxuIgorCQkiLnNlY3Rpb24gLmZpeHVwLCBcImF4XCJcbiIKKwkJIjM6IG1vdncgJDB4MUFFQiwgMWJcbiIJLyogam1wIG9uIDI2IGJ5dGVzICovCisJCSIgICBqbXAgMmJcbiIKKwkJIi5wcmV2aW91c1xuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA0XG4iCisJCSIJLmxvbmcgMWIsIDNiXG4iCisJCSIucHJldmlvdXMiCisJCTogOiAiciIgKGZyb20pICk7CisKKwlmb3IoaT0wOyBpPCg0MDk2LTMyMCkvNjQ7IGkrKykKKwl7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIjE6IHByZWZldGNoIDMyMCglMClcbiIKKwkJIjI6IG1vdnEgKCUwKSwgJSVtbTBcbiIKKwkJIiAgIG1vdm50cSAlJW1tMCwgKCUxKVxuIgorCQkiICAgbW92cSA4KCUwKSwgJSVtbTFcbiIKKwkJIiAgIG1vdm50cSAlJW1tMSwgOCglMSlcbiIKKwkJIiAgIG1vdnEgMTYoJTApLCAlJW1tMlxuIgorCQkiICAgbW92bnRxICUlbW0yLCAxNiglMSlcbiIKKwkJIiAgIG1vdnEgMjQoJTApLCAlJW1tM1xuIgorCQkiICAgbW92bnRxICUlbW0zLCAyNCglMSlcbiIKKwkJIiAgIG1vdnEgMzIoJTApLCAlJW1tNFxuIgorCQkiICAgbW92bnRxICUlbW00LCAzMiglMSlcbiIKKwkJIiAgIG1vdnEgNDAoJTApLCAlJW1tNVxuIgorCQkiICAgbW92bnRxICUlbW01LCA0MCglMSlcbiIKKwkJIiAgIG1vdnEgNDgoJTApLCAlJW1tNlxuIgorCQkiICAgbW92bnRxICUlbW02LCA0OCglMSlcbiIKKwkJIiAgIG1vdnEgNTYoJTApLCAlJW1tN1xuIgorCQkiICAgbW92bnRxICUlbW03LCA1NiglMSlcbiIKKwkJIi5zZWN0aW9uIC5maXh1cCwgXCJheFwiXG4iCisJCSIzOiBtb3Z3ICQweDA1RUIsIDFiXG4iCS8qIGptcCBvbiA1IGJ5dGVzICovCisJCSIgICBqbXAgMmJcbiIKKwkJIi5wcmV2aW91c1xuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA0XG4iCisJCSIJLmxvbmcgMWIsIDNiXG4iCisJCSIucHJldmlvdXMiCisJCTogOiAiciIgKGZyb20pLCAiciIgKHRvKSA6ICJtZW1vcnkiKTsKKwkJZnJvbSs9NjQ7CisJCXRvKz02NDsKKwl9CisJZm9yKGk9KDQwOTYtMzIwKS82NDsgaTw0MDk2LzY0OyBpKyspCisJeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIyOiBtb3ZxICglMCksICUlbW0wXG4iCisJCSIgICBtb3ZudHEgJSVtbTAsICglMSlcbiIKKwkJIiAgIG1vdnEgOCglMCksICUlbW0xXG4iCisJCSIgICBtb3ZudHEgJSVtbTEsIDgoJTEpXG4iCisJCSIgICBtb3ZxIDE2KCUwKSwgJSVtbTJcbiIKKwkJIiAgIG1vdm50cSAlJW1tMiwgMTYoJTEpXG4iCisJCSIgICBtb3ZxIDI0KCUwKSwgJSVtbTNcbiIKKwkJIiAgIG1vdm50cSAlJW1tMywgMjQoJTEpXG4iCisJCSIgICBtb3ZxIDMyKCUwKSwgJSVtbTRcbiIKKwkJIiAgIG1vdm50cSAlJW1tNCwgMzIoJTEpXG4iCisJCSIgICBtb3ZxIDQwKCUwKSwgJSVtbTVcbiIKKwkJIiAgIG1vdm50cSAlJW1tNSwgNDAoJTEpXG4iCisJCSIgICBtb3ZxIDQ4KCUwKSwgJSVtbTZcbiIKKwkJIiAgIG1vdm50cSAlJW1tNiwgNDgoJTEpXG4iCisJCSIgICBtb3ZxIDU2KCUwKSwgJSVtbTdcbiIKKwkJIiAgIG1vdm50cSAlJW1tNywgNTYoJTEpXG4iCisJCTogOiAiciIgKGZyb20pLCAiciIgKHRvKSA6ICJtZW1vcnkiKTsKKwkJZnJvbSs9NjQ7CisJCXRvKz02NDsKKwl9CisJLyogc2luY2UgbW92bnRxIGlzIHdlYWtseS1vcmRlcmVkLCBhICJzZmVuY2UiIGlzIG5lZWRlZCB0byBiZWNvbWUKKwkgKiBvcmRlcmVkIGFnYWluLgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiAgc2ZlbmNlIFxuIiA6IDoKKwkpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKKyNlbHNlCisKKy8qCisgKglHZW5lcmljIE1NWCBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IEs3IHNwZWNpZmljIHN0cmVhbWluZworICovCisgCitzdGF0aWMgdm9pZCBmYXN0X2NsZWFyX3BhZ2Uodm9pZCAqcGFnZSkKK3sKKwlpbnQgaTsKKwkKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisJCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiICBweG9yICUlbW0wLCAlJW1tMFxuIiA6IDoKKwkpOworCisJZm9yKGk9MDtpPDQwOTYvMTI4O2krKykKKwl7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiAgbW92cSAlJW1tMCwgKCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCA4KCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCAxNiglMClcbiIKKwkJIiAgbW92cSAlJW1tMCwgMjQoJTApXG4iCisJCSIgIG1vdnEgJSVtbTAsIDMyKCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCA0MCglMClcbiIKKwkJIiAgbW92cSAlJW1tMCwgNDgoJTApXG4iCisJCSIgIG1vdnEgJSVtbTAsIDU2KCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCA2NCglMClcbiIKKwkJIiAgbW92cSAlJW1tMCwgNzIoJTApXG4iCisJCSIgIG1vdnEgJSVtbTAsIDgwKCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCA4OCglMClcbiIKKwkJIiAgbW92cSAlJW1tMCwgOTYoJTApXG4iCisJCSIgIG1vdnEgJSVtbTAsIDEwNCglMClcbiIKKwkJIiAgbW92cSAlJW1tMCwgMTEyKCUwKVxuIgorCQkiICBtb3ZxICUlbW0wLCAxMjAoJTApXG4iCisJCTogOiAiciIgKHBhZ2UpIDogIm1lbW9yeSIpOworCQlwYWdlKz0xMjg7CisJfQorCisJa2VybmVsX2ZwdV9lbmQoKTsKK30KKworc3RhdGljIHZvaWQgZmFzdF9jb3B5X3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20pCit7CisJaW50IGk7CisJCisJCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiMTogcHJlZmV0Y2ggKCUwKVxuIgorCQkiICAgcHJlZmV0Y2ggNjQoJTApXG4iCisJCSIgICBwcmVmZXRjaCAxMjgoJTApXG4iCisJCSIgICBwcmVmZXRjaCAxOTIoJTApXG4iCisJCSIgICBwcmVmZXRjaCAyNTYoJTApXG4iCisJCSIyOiAgXG4iCisJCSIuc2VjdGlvbiAuZml4dXAsIFwiYXhcIlxuIgorCQkiMzogbW92dyAkMHgxQUVCLCAxYlxuIgkvKiBqbXAgb24gMjYgYnl0ZXMgKi8KKwkJIiAgIGptcCAyYlxuIgorCQkiLnByZXZpb3VzXG4iCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCisJCSIJLmFsaWduIDRcbiIKKwkJIgkubG9uZyAxYiwgM2JcbiIKKwkJIi5wcmV2aW91cyIKKwkJOiA6ICJyIiAoZnJvbSkgKTsKKworCWZvcihpPTA7IGk8NDA5Ni82NDsgaSsrKQorCXsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiMTogcHJlZmV0Y2ggMzIwKCUwKVxuIgorCQkiMjogbW92cSAoJTApLCAlJW1tMFxuIgorCQkiICAgbW92cSA4KCUwKSwgJSVtbTFcbiIKKwkJIiAgIG1vdnEgMTYoJTApLCAlJW1tMlxuIgorCQkiICAgbW92cSAyNCglMCksICUlbW0zXG4iCisJCSIgICBtb3ZxICUlbW0wLCAoJTEpXG4iCisJCSIgICBtb3ZxICUlbW0xLCA4KCUxKVxuIgorCQkiICAgbW92cSAlJW1tMiwgMTYoJTEpXG4iCisJCSIgICBtb3ZxICUlbW0zLCAyNCglMSlcbiIKKwkJIiAgIG1vdnEgMzIoJTApLCAlJW1tMFxuIgorCQkiICAgbW92cSA0MCglMCksICUlbW0xXG4iCisJCSIgICBtb3ZxIDQ4KCUwKSwgJSVtbTJcbiIKKwkJIiAgIG1vdnEgNTYoJTApLCAlJW1tM1xuIgorCQkiICAgbW92cSAlJW1tMCwgMzIoJTEpXG4iCisJCSIgICBtb3ZxICUlbW0xLCA0MCglMSlcbiIKKwkJIiAgIG1vdnEgJSVtbTIsIDQ4KCUxKVxuIgorCQkiICAgbW92cSAlJW1tMywgNTYoJTEpXG4iCisJCSIuc2VjdGlvbiAuZml4dXAsIFwiYXhcIlxuIgorCQkiMzogbW92dyAkMHgwNUVCLCAxYlxuIgkvKiBqbXAgb24gNSBieXRlcyAqLworCQkiICAgam1wIDJiXG4iCisJCSIucHJldmlvdXNcbiIKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJIgkuYWxpZ24gNFxuIgorCQkiCS5sb25nIDFiLCAzYlxuIgorCQkiLnByZXZpb3VzIgorCQk6IDogInIiIChmcm9tKSwgInIiICh0bykgOiAibWVtb3J5Iik7CisJCWZyb20rPTY0OworCQl0bys9NjQ7CisJfQorCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKKworI2VuZGlmCisKKy8qCisgKglGYXZvdXIgTU1YIGZvciBwYWdlIGNsZWFyIGFuZCBjb3B5LiAKKyAqLworCitzdGF0aWMgdm9pZCBzbG93X3plcm9fcGFnZSh2b2lkICogcGFnZSkKK3sKKwlpbnQgZDAsIGQxOworCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJjbGRcblx0IiBcCisJCSJyZXAgOyBzdG9zbCIgXAorCQk6ICI9JmMiIChkMCksICI9JkQiIChkMSkKKwkJOiJhIiAoMCksIjEiIChwYWdlKSwiMCIgKDEwMjQpCisJCToibWVtb3J5Iik7Cit9CisgCit2b2lkIG1teF9jbGVhcl9wYWdlKHZvaWQgKiBwYWdlKQoreworCWlmKHVubGlrZWx5KGluX2ludGVycnVwdCgpKSkKKwkJc2xvd196ZXJvX3BhZ2UocGFnZSk7CisJZWxzZQorCQlmYXN0X2NsZWFyX3BhZ2UocGFnZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNsb3dfY29weV9wYWdlKHZvaWQgKnRvLCB2b2lkICpmcm9tKQoreworCWludCBkMCwgZDEsIGQyOworCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJjbGRcblx0IiBcCisJCSJyZXAgOyBtb3ZzbCIgXAorCQk6ICI9JmMiIChkMCksICI9JkQiIChkMSksICI9JlMiIChkMikgXAorCQk6ICIwIiAoMTAyNCksIjEiICgobG9uZykgdG8pLCIyIiAoKGxvbmcpIGZyb20pIFwKKwkJOiAibWVtb3J5Iik7Cit9CisgIAorCit2b2lkIG1teF9jb3B5X3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20pCit7CisJaWYodW5saWtlbHkoaW5faW50ZXJydXB0KCkpKQorCQlzbG93X2NvcHlfcGFnZSh0bywgZnJvbSk7CisJZWxzZQorCQlmYXN0X2NvcHlfcGFnZSh0bywgZnJvbSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL3B1dHVzZXIuUyBiL2FyY2gvaTM4Ni9saWIvcHV0dXNlci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMmQ5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbGliL3B1dHVzZXIuUwpAQCAtMCwwICsxLDg3IEBACisvKgorICogX19wdXRfdXNlciBmdW5jdGlvbnMuCisgKgorICogKEMpIENvcHlyaWdodCAyMDA1IExpbnVzIFRvcnZhbGRzCisgKgorICogVGhlc2UgZnVuY3Rpb25zIGhhdmUgYSBub24tc3RhbmRhcmQgY2FsbCBpbnRlcmZhY2UKKyAqIHRvIG1ha2UgdGhlbSBtb3JlIGVmZmljaWVudCwgZXNwZWNpYWxseSBhcyB0aGV5CisgKiByZXR1cm4gYW4gZXJyb3IgdmFsdWUgaW4gYWRkaXRpb24gdG8gdGhlICJyZWFsIgorICogcmV0dXJuIHZhbHVlLgorICovCisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisKKworLyoKKyAqIF9fcHV0X3VzZXJfWAorICoKKyAqIElucHV0czoJJWVheFs6JWVkeF0gY29udGFpbnMgdGhlIGRhdGEKKyAqCQklZWN4IGNvbnRhaW5zIHRoZSBhZGRyZXNzCisgKgorICogT3V0cHV0czoJJWVheCBpcyBlcnJvciBjb2RlICgwIG9yIC1FRkFVTFQpCisgKgorICogVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBub3QgbW9kaWZ5IGFueSBvdGhlciByZWdpc3RlcnMsCisgKiBhcyB0aGV5IGdldCBjYWxsZWQgZnJvbSB3aXRoaW4gaW5saW5lIGFzc2VtYmx5LgorICovCisKKyNkZWZpbmUgRU5URVIJcHVzaGwgJWVieCA7IEdFVF9USFJFQURfSU5GTyglZWJ4KQorI2RlZmluZSBFWElUCXBvcGwgJWVieCA7IHJldAorCisudGV4dAorLmFsaWduIDQKKy5nbG9ibCBfX3B1dF91c2VyXzEKK19fcHV0X3VzZXJfMToKKwlFTlRFUgorCWNtcGwgVElfYWRkcl9saW1pdCglZWJ4KSwlZWN4CisJamFlIGJhZF9wdXRfdXNlcgorMToJbW92YiAlYWwsKCVlY3gpCisJeG9ybCAlZWF4LCVlYXgKKwlFWElUCisKKy5hbGlnbiA0CisuZ2xvYmwgX19wdXRfdXNlcl8yCitfX3B1dF91c2VyXzI6CisJRU5URVIKKwltb3ZsIFRJX2FkZHJfbGltaXQoJWVieCksJWVieAorCXN1YmwgJDEsJWVieAorCWNtcGwgJWVieCwlZWN4CisJamFlIGJhZF9wdXRfdXNlcgorMjoJbW92dyAlYXgsKCVlY3gpCisJeG9ybCAlZWF4LCVlYXgKKwlFWElUCisKKy5hbGlnbiA0CisuZ2xvYmwgX19wdXRfdXNlcl80CitfX3B1dF91c2VyXzQ6CisJRU5URVIKKwltb3ZsIFRJX2FkZHJfbGltaXQoJWVieCksJWVieAorCXN1YmwgJDMsJWVieAorCWNtcGwgJWVieCwlZWN4CisJamFlIGJhZF9wdXRfdXNlcgorMzoJbW92bCAlZWF4LCglZWN4KQorCXhvcmwgJWVheCwlZWF4CisJRVhJVAorCisuYWxpZ24gNAorLmdsb2JsIF9fcHV0X3VzZXJfOAorX19wdXRfdXNlcl84OgorCUVOVEVSCisJbW92bCBUSV9hZGRyX2xpbWl0KCVlYngpLCVlYngKKwlzdWJsICQ3LCVlYngKKwljbXBsICVlYngsJWVjeAorCWphZSBiYWRfcHV0X3VzZXIKKzQ6CW1vdmwgJWVheCwoJWVjeCkKKzU6CW1vdmwgJWVkeCw0KCVlY3gpCisJeG9ybCAlZWF4LCVlYXgKKwlFWElUCisKK2JhZF9wdXRfdXNlcjoKKwltb3ZsICQtMTQsJWVheAorCUVYSVQKKworLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkubG9uZyAxYixiYWRfcHV0X3VzZXIKKwkubG9uZyAyYixiYWRfcHV0X3VzZXIKKwkubG9uZyAzYixiYWRfcHV0X3VzZXIKKwkubG9uZyA0YixiYWRfcHV0X3VzZXIKKwkubG9uZyA1YixiYWRfcHV0X3VzZXIKKy5wcmV2aW91cwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2xpYi9zdHJzdHIuYyBiL2FyY2gvaTM4Ni9saWIvc3Ryc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkYWZiZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9saWIvc3Ryc3RyLmMKQEAgLTAsMCArMSwzMSBAQAorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCitjaGFyICogc3Ryc3RyKGNvbnN0IGNoYXIgKiBjcyxjb25zdCBjaGFyICogY3QpCit7CitpbnQJZDAsIGQxOworcmVnaXN0ZXIgY2hhciAqIF9fcmVzOworX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIm1vdmwgJTYsJSVlZGlcblx0IgorCSJyZXBuZVxuXHQiCisJInNjYXNiXG5cdCIKKwkibm90bCAlJWVjeFxuXHQiCisJImRlY2wgJSVlY3hcblx0IgkvKiBOT1RFISBUaGlzIGFsc28gc2V0cyBaIGlmIHNlYXJjaHN0cmluZz0nJyAqLworCSJtb3ZsICUlZWN4LCUlZWR4XG4iCisJIjE6XHRtb3ZsICU2LCUlZWRpXG5cdCIKKwkibW92bCAlJWVzaSwlJWVheFxuXHQiCisJIm1vdmwgJSVlZHgsJSVlY3hcblx0IgorCSJyZXBlXG5cdCIKKwkiY21wc2Jcblx0IgorCSJqZSAyZlxuXHQiCQkvKiBhbHNvIHdvcmtzIGZvciBlbXB0eSBzdHJpbmcsIHNlZSBhYm92ZSAqLworCSJ4Y2hnbCAlJWVheCwlJWVzaVxuXHQiCisJImluY2wgJSVlc2lcblx0IgorCSJjbXBiICQwLC0xKCUlZWF4KVxuXHQiCisJImpuZSAxYlxuXHQiCisJInhvcmwgJSVlYXgsJSVlYXhcblx0IgorCSIyOiIKKwk6Ij1hIiAoX19yZXMpLCAiPSZjIiAoZDApLCAiPSZTIiAoZDEpCisJOiIwIiAoMCksICIxIiAoMHhmZmZmZmZmZiksICIyIiAoY3MpLCAiZyIgKGN0KQorCToiZHgiLCAiZGkiKTsKK3JldHVybiBfX3JlczsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2xpYi91c2VyY29weS5jIGIvYXJjaC9pMzg2L2xpYi91c2VyY29weS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYWEyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbGliL3VzZXJjb3B5LmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qIAorICogVXNlciBhZGRyZXNzIHNwYWNlIGFjY2VzcyBmdW5jdGlvbnMuCisgKiBUaGUgbm9uIGlubGluZWQgcGFydHMgb2YgYXNtLWkzODYvdWFjY2Vzcy5oIGFyZSBoZXJlLgorICoKKyAqIENvcHlyaWdodCAxOTk3IEFuZGkgS2xlZW4gPGFrQG11Yy5kZT4KKyAqIENvcHlyaWdodCAxOTk3IExpbnVzIFRvcnZhbGRzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9tbXguaD4KKworc3RhdGljIGlubGluZSBpbnQgX19tb3ZzbF9pc19vayh1bnNpZ25lZCBsb25nIGExLCB1bnNpZ25lZCBsb25nIGEyLCB1bnNpZ25lZCBsb25nIG4pCit7CisjaWZkZWYgQ09ORklHX1g4Nl9JTlRFTF9VU0VSQ09QWQorCWlmIChuID49IDY0ICYmICgoYTEgXiBhMikgJiBtb3ZzbF9tYXNrLm1hc2spKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCXJldHVybiAxOworfQorI2RlZmluZSBtb3ZzbF9pc19vayhhMSxhMixuKSBcCisJX19tb3ZzbF9pc19vaygodW5zaWduZWQgbG9uZykoYTEpLCh1bnNpZ25lZCBsb25nKShhMiksKG4pKQorCisvKgorICogQ29weSBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgZnJvbSB1c2Vyc3BhY2UuCisgKi8KKworI2RlZmluZSBfX2RvX3N0cm5jcHlfZnJvbV91c2VyKGRzdCxzcmMsY291bnQscmVzKQkJCSAgIFwKK2RvIHsJCQkJCQkJCQkgICBcCisJaW50IF9fZDAsIF9fZDEsIF9fZDI7CQkJCQkJICAgXAorCW1pZ2h0X3NsZWVwKCk7CQkJCQkJCSAgIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQkgICBcCisJCSIJdGVzdGwgJTEsJTFcbiIJCQkJCSAgIFwKKwkJIglqeiAyZlxuIgkJCQkJICAgXAorCQkiMDoJbG9kc2JcbiIJCQkJCSAgIFwKKwkJIglzdG9zYlxuIgkJCQkJICAgXAorCQkiCXRlc3RiICUlYWwsJSVhbFxuIgkJCQkgICBcCisJCSIJanogMWZcbiIJCQkJCSAgIFwKKwkJIglkZWNsICUxXG4iCQkJCQkgICBcCisJCSIJam56IDBiXG4iCQkJCQkgICBcCisJCSIxOglzdWJsICUxLCUwXG4iCQkJCQkgICBcCisJCSIyOlxuIgkJCQkJCQkgICBcCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJCSAgIFwKKwkJIjM6CW1vdmwgJTUsJTBcbiIJCQkJCSAgIFwKKwkJIglqbXAgMmJcbiIJCQkJCSAgIFwKKwkJIi5wcmV2aW91c1xuIgkJCQkJCSAgIFwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQkJICAgXAorCQkiCS5hbGlnbiA0XG4iCQkJCQkgICBcCisJCSIJLmxvbmcgMGIsM2JcbiIJCQkJCSAgIFwKKwkJIi5wcmV2aW91cyIJCQkJCQkgICBcCisJCTogIj1kIihyZXMpLCAiPWMiKGNvdW50KSwgIj0mYSIgKF9fZDApLCAiPSZTIiAoX19kMSksCSAgIFwKKwkJICAiPSZEIiAoX19kMikJCQkJCQkgICBcCisJCTogImkiKC1FRkFVTFQpLCAiMCIoY291bnQpLCAiMSIoY291bnQpLCAiMyIoc3JjKSwgIjQiKGRzdCkgXAorCQk6ICJtZW1vcnkiKTsJCQkJCQkgICBcCit9IHdoaWxlICgwKQorCisvKioKKyAqIF9fc3RybmNweV9mcm9tX3VzZXI6IC0gQ29weSBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgorICogQGRzdDogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuICBUaGlzIGJ1ZmZlciBtdXN0IGJlIGF0CisgKiAgICAgICAgIGxlYXN0IEBjb3VudCBieXRlcyBsb25nLgorICogQHNyYzogICBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBjb3VudDogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuCisgKiAKKyAqIENvcGllcyBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZSB0byBrZXJuZWwgc3BhY2UuCisgKiBDYWxsZXIgbXVzdCBjaGVjayB0aGUgc3BlY2lmaWVkIGJsb2NrIHdpdGggYWNjZXNzX29rKCkgYmVmb3JlIGNhbGxpbmcKKyAqIHRoaXMgZnVuY3Rpb24uCisgKgorICogT24gc3VjY2VzcywgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nCisgKiBOVUwpLgorICoKKyAqIElmIGFjY2VzcyB0byB1c2Vyc3BhY2UgZmFpbHMsIHJldHVybnMgLUVGQVVMVCAoc29tZSBkYXRhIG1heSBoYXZlIGJlZW4KKyAqIGNvcGllZCkuCisgKgorICogSWYgQGNvdW50IGlzIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGNvcGllcyBAY291bnQgYnl0ZXMKKyAqIGFuZCByZXR1cm5zIEBjb3VudC4KKyAqLworbG9uZworX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpCit7CisJbG9uZyByZXM7CisJX19kb19zdHJuY3B5X2Zyb21fdXNlcihkc3QsIHNyYywgY291bnQsIHJlcyk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBzdHJuY3B5X2Zyb21fdXNlcjogLSBDb3B5IGEgTlVMIHRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlLgorICogQGRzdDogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuICBUaGlzIGJ1ZmZlciBtdXN0IGJlIGF0CisgKiAgICAgICAgIGxlYXN0IEBjb3VudCBieXRlcyBsb25nLgorICogQHNyYzogICBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBjb3VudDogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuCisgKiAKKyAqIENvcGllcyBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZSB0byBrZXJuZWwgc3BhY2UuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nCisgKiBOVUwpLgorICoKKyAqIElmIGFjY2VzcyB0byB1c2Vyc3BhY2UgZmFpbHMsIHJldHVybnMgLUVGQVVMVCAoc29tZSBkYXRhIG1heSBoYXZlIGJlZW4KKyAqIGNvcGllZCkuCisgKgorICogSWYgQGNvdW50IGlzIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGNvcGllcyBAY291bnQgYnl0ZXMKKyAqIGFuZCByZXR1cm5zIEBjb3VudC4KKyAqLworbG9uZworc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KQoreworCWxvbmcgcmVzID0gLUVGQVVMVDsKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIDEpKQorCQlfX2RvX3N0cm5jcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBjb3VudCwgcmVzKTsKKwlyZXR1cm4gcmVzOworfQorCisKKy8qCisgKiBaZXJvIFVzZXJzcGFjZQorICovCisKKyNkZWZpbmUgX19kb19jbGVhcl91c2VyKGFkZHIsc2l6ZSkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaW50IF9fZDA7CQkJCQkJCVwKKwltaWdodF9zbGVlcCgpOwkJCQkJCQlcCisgIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJCSIwOglyZXA7IHN0b3NsXG4iCQkJCQlcCisJCSIJbW92bCAlMiwlMFxuIgkJCQkJXAorCQkiMToJcmVwOyBzdG9zYlxuIgkJCQkJXAorCQkiMjpcbiIJCQkJCQkJXAorCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCQlcCisJCSIzOglsZWEgMCglMiwlMCw0KSwlMFxuIgkJCQlcCisJCSIJam1wIDJiXG4iCQkJCQlcCisJCSIucHJldmlvdXNcbiIJCQkJCQlcCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQkJCVwKKwkJIgkuYWxpZ24gNFxuIgkJCQkJXAorCQkiCS5sb25nIDBiLDNiXG4iCQkJCQlcCisJCSIJLmxvbmcgMWIsMmJcbiIJCQkJCVwKKwkJIi5wcmV2aW91cyIJCQkJCQlcCisJCTogIj0mYyIoc2l6ZSksICI9JkQiIChfX2QwKQkJCQlcCisJCTogInIiKHNpemUgJiAzKSwgIjAiKHNpemUgLyA0KSwgIjEiKGFkZHIpLCAiYSIoMCkpOwlcCit9IHdoaWxlICgwKQorCisvKioKKyAqIGNsZWFyX3VzZXI6IC0gWmVybyBhIGJsb2NrIG9mIG1lbW9yeSBpbiB1c2VyIHNwYWNlLgorICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHplcm8uCisgKgorICogWmVybyBhIGJsb2NrIG9mIG1lbW9yeSBpbiB1c2VyIHNwYWNlLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNsZWFyZWQuCisgKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KKyAqLwordW5zaWduZWQgbG9uZworY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwltaWdodF9zbGVlcCgpOworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpCisJCV9fZG9fY2xlYXJfdXNlcih0bywgbik7CisJcmV0dXJuIG47Cit9CisKKy8qKgorICogX19jbGVhcl91c2VyOiAtIFplcm8gYSBibG9jayBvZiBtZW1vcnkgaW4gdXNlciBzcGFjZSwgd2l0aCBsZXNzIGNoZWNraW5nLgorICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHplcm8uCisgKgorICogWmVybyBhIGJsb2NrIG9mIG1lbW9yeSBpbiB1c2VyIHNwYWNlLiAgQ2FsbGVyIG11c3QgY2hlY2sKKyAqIHRoZSBzcGVjaWZpZWQgYmxvY2sgd2l0aCBhY2Nlc3Nfb2soKSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNsZWFyZWQuCisgKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KKyAqLwordW5zaWduZWQgbG9uZworX19jbGVhcl91c2VyKHZvaWQgX191c2VyICp0bywgdW5zaWduZWQgbG9uZyBuKQoreworCV9fZG9fY2xlYXJfdXNlcih0bywgbik7CisJcmV0dXJuIG47Cit9CisKKy8qKgorICogc3RybGVuX3VzZXI6IC0gR2V0IHRoZSBzaXplIG9mIGEgc3RyaW5nIGluIHVzZXIgc3BhY2UuCisgKiBAczogVGhlIHN0cmluZyB0byBtZWFzdXJlLgorICogQG46IFRoZSBtYXhpbXVtIHZhbGlkIGxlbmd0aAorICoKKyAqIEdldCB0aGUgc2l6ZSBvZiBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbiB1c2VyIHNwYWNlLgorICoKKyAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBJTkNMVURJTkcgdGhlIHRlcm1pbmF0aW5nIE5VTC4KKyAqIE9uIGV4Y2VwdGlvbiwgcmV0dXJucyAwLgorICogSWYgdGhlIHN0cmluZyBpcyB0b28gbG9uZywgcmV0dXJucyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBAbi4KKyAqLworbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnMsIGxvbmcgbikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSAtX19hZGRyX29rKHMpOworCXVuc2lnbmVkIGxvbmcgcmVzLCB0bXA7CisKKwltaWdodF9zbGVlcCgpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJdGVzdGwgJTAsICUwXG4iCisJCSIJanogM2ZcbiIKKwkJIglhbmRsICUwLCUlZWN4XG4iCisJCSIwOglyZXBuZTsgc2Nhc2JcbiIKKwkJIglzZXRuZSAlJWFsXG4iCisJCSIJc3VibCAlJWVjeCwlMFxuIgorCQkiCWFkZGwgJTAsJSVlYXhcbiIKKwkJIjE6XG4iCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJCSIyOgl4b3JsICUlZWF4LCUlZWF4XG4iCisJCSIJam1wIDFiXG4iCisJCSIzOgltb3ZiICQxLCUlYWxcbiIKKwkJIglqbXAgMWJcbiIKKwkJIi5wcmV2aW91c1xuIgorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbiA0XG4iCisJCSIJLmxvbmcgMGIsMmJcbiIKKwkJIi5wcmV2aW91cyIKKwkJOiI9ciIgKG4pLCAiPUQiIChzKSwgIj1hIiAocmVzKSwgIj1jIiAodG1wKQorCQk6IjAiIChuKSwgIjEiIChzKSwgIjIiICgwKSwgIjMiIChtYXNrKQorCQk6ImNjIik7CisJcmV0dXJuIHJlcyAmIG1hc2s7Cit9CisKKyNpZmRlZiBDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZCitzdGF0aWMgdW5zaWduZWQgbG9uZworX19jb3B5X3VzZXJfaW50ZWwodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IGQwLCBkMTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJICAgICAgICIgICAgICAgLmFsaWduIDIsMHg5MFxuIgorCQkgICAgICAgIjE6ICAgICBtb3ZsIDMyKCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICIgICAgICAgY21wbCAkNjcsICUwXG4iCisJCSAgICAgICAiICAgICAgIGpiZSAzZlxuIgorCQkgICAgICAgIjI6ICAgICBtb3ZsIDY0KCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICIgICAgICAgLmFsaWduIDIsMHg5MFxuIgorCQkgICAgICAgIjM6ICAgICBtb3ZsIDAoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjQ6ICAgICBtb3ZsIDQoJTQpLCAlJWVkeFxuIgorCQkgICAgICAgIjU6ICAgICBtb3ZsICUlZWF4LCAwKCUzKVxuIgorCQkgICAgICAgIjY6ICAgICBtb3ZsICUlZWR4LCA0KCUzKVxuIgorCQkgICAgICAgIjc6ICAgICBtb3ZsIDgoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjg6ICAgICBtb3ZsIDEyKCU0KSwlJWVkeFxuIgorCQkgICAgICAgIjk6ICAgICBtb3ZsICUlZWF4LCA4KCUzKVxuIgorCQkgICAgICAgIjEwOiAgICBtb3ZsICUlZWR4LCAxMiglMylcbiIKKwkJICAgICAgICIxMTogICAgbW92bCAxNiglNCksICUlZWF4XG4iCisJCSAgICAgICAiMTI6ICAgIG1vdmwgMjAoJTQpLCAlJWVkeFxuIgorCQkgICAgICAgIjEzOiAgICBtb3ZsICUlZWF4LCAxNiglMylcbiIKKwkJICAgICAgICIxNDogICAgbW92bCAlJWVkeCwgMjAoJTMpXG4iCisJCSAgICAgICAiMTU6ICAgIG1vdmwgMjQoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjE2OiAgICBtb3ZsIDI4KCU0KSwgJSVlZHhcbiIKKwkJICAgICAgICIxNzogICAgbW92bCAlJWVheCwgMjQoJTMpXG4iCisJCSAgICAgICAiMTg6ICAgIG1vdmwgJSVlZHgsIDI4KCUzKVxuIgorCQkgICAgICAgIjE5OiAgICBtb3ZsIDMyKCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICIyMDogICAgbW92bCAzNiglNCksICUlZWR4XG4iCisJCSAgICAgICAiMjE6ICAgIG1vdmwgJSVlYXgsIDMyKCUzKVxuIgorCQkgICAgICAgIjIyOiAgICBtb3ZsICUlZWR4LCAzNiglMylcbiIKKwkJICAgICAgICIyMzogICAgbW92bCA0MCglNCksICUlZWF4XG4iCisJCSAgICAgICAiMjQ6ICAgIG1vdmwgNDQoJTQpLCAlJWVkeFxuIgorCQkgICAgICAgIjI1OiAgICBtb3ZsICUlZWF4LCA0MCglMylcbiIKKwkJICAgICAgICIyNjogICAgbW92bCAlJWVkeCwgNDQoJTMpXG4iCisJCSAgICAgICAiMjc6ICAgIG1vdmwgNDgoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjI4OiAgICBtb3ZsIDUyKCU0KSwgJSVlZHhcbiIKKwkJICAgICAgICIyOTogICAgbW92bCAlJWVheCwgNDgoJTMpXG4iCisJCSAgICAgICAiMzA6ICAgIG1vdmwgJSVlZHgsIDUyKCUzKVxuIgorCQkgICAgICAgIjMxOiAgICBtb3ZsIDU2KCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICIzMjogICAgbW92bCA2MCglNCksICUlZWR4XG4iCisJCSAgICAgICAiMzM6ICAgIG1vdmwgJSVlYXgsIDU2KCUzKVxuIgorCQkgICAgICAgIjM0OiAgICBtb3ZsICUlZWR4LCA2MCglMylcbiIKKwkJICAgICAgICIgICAgICAgYWRkbCAkLTY0LCAlMFxuIgorCQkgICAgICAgIiAgICAgICBhZGRsICQ2NCwgJTRcbiIKKwkJICAgICAgICIgICAgICAgYWRkbCAkNjQsICUzXG4iCisJCSAgICAgICAiICAgICAgIGNtcGwgJDYzLCAlMFxuIgorCQkgICAgICAgIiAgICAgICBqYSAgMWJcbiIKKwkJICAgICAgICIzNTogICAgbW92bCAgJTAsICUlZWF4XG4iCisJCSAgICAgICAiICAgICAgIHNocmwgICQyLCAlMFxuIgorCQkgICAgICAgIiAgICAgICBhbmRsICAkMywgJSVlYXhcbiIKKwkJICAgICAgICIgICAgICAgY2xkXG4iCisJCSAgICAgICAiOTk6ICAgIHJlcDsgbW92c2xcbiIKKwkJICAgICAgICIzNjogICAgbW92bCAlJWVheCwgJTBcbiIKKwkJICAgICAgICIzNzogICAgcmVwOyBtb3ZzYlxuIgorCQkgICAgICAgIjEwMDpcbiIKKwkJICAgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJCSAgICAgICAiMTAxOiAgIGxlYSAwKCUlZWF4LCUwLDQpLCUwXG4iCisJCSAgICAgICAiICAgICAgIGptcCAxMDBiXG4iCisJCSAgICAgICAiLnByZXZpb3VzXG4iCisJCSAgICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkgICAgICAgIiAgICAgICAuYWxpZ24gNFxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxYiwxMDBiXG4iCisJCSAgICAgICAiICAgICAgIC5sb25nIDJiLDEwMGJcbiIKKwkJICAgICAgICIgICAgICAgLmxvbmcgM2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyA0YiwxMDBiXG4iCisJCSAgICAgICAiICAgICAgIC5sb25nIDViLDEwMGJcbiIKKwkJICAgICAgICIgICAgICAgLmxvbmcgNmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyA3YiwxMDBiXG4iCisJCSAgICAgICAiICAgICAgIC5sb25nIDhiLDEwMGJcbiIKKwkJICAgICAgICIgICAgICAgLmxvbmcgOWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxMGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxMWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxMmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxM2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxNGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxNWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxNmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxN2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxOGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAxOWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyMGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyMWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyMmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyM2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyNGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyNWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyNmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyN2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyOGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAyOWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzMGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzMWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzMmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzM2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzNGIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzNWIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzNmIsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyAzN2IsMTAwYlxuIgorCQkgICAgICAgIiAgICAgICAubG9uZyA5OWIsMTAxYlxuIgorCQkgICAgICAgIi5wcmV2aW91cyIKKwkJICAgICAgIDogIj0mYyIoc2l6ZSksICI9JkQiIChkMCksICI9JlMiIChkMSkKKwkJICAgICAgIDogICIxIih0byksICIyIihmcm9tKSwgIjAiKHNpemUpCisJCSAgICAgICA6ICJlYXgiLCAiZWR4IiwgIm1lbW9yeSIpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworX19jb3B5X3VzZXJfemVyb2luZ19pbnRlbCh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgZDAsIGQxOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkgICAgICAgIiAgICAgICAgLmFsaWduIDIsMHg5MFxuIgorCQkgICAgICAgIjA6ICAgICAgbW92bCAzMiglNCksICUlZWF4XG4iCisJCSAgICAgICAiICAgICAgICBjbXBsICQ2NywgJTBcbiIgICAgICAKKwkJICAgICAgICIgICAgICAgIGpiZSAyZlxuIiAgICAgICAgICAgIAorCQkgICAgICAgIjE6ICAgICAgbW92bCA2NCglNCksICUlZWF4XG4iCisJCSAgICAgICAiICAgICAgICAuYWxpZ24gMiwweDkwXG4iICAgICAKKwkJICAgICAgICIyOiAgICAgIG1vdmwgMCglNCksICUlZWF4XG4iIAorCQkgICAgICAgIjIxOiAgICAgbW92bCA0KCU0KSwgJSVlZHhcbiIgCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWF4LCAwKCUzKVxuIiAKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlZHgsIDQoJTMpXG4iIAorCQkgICAgICAgIjM6ICAgICAgbW92bCA4KCU0KSwgJSVlYXhcbiIgCisJCSAgICAgICAiMzE6ICAgICBtb3ZsIDEyKCU0KSwlJWVkeFxuIiAKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlYXgsIDgoJTMpXG4iIAorCQkgICAgICAgIiAgICAgICAgbW92bCAlJWVkeCwgMTIoJTMpXG4iCisJCSAgICAgICAiNDogICAgICBtb3ZsIDE2KCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICI0MTogICAgIG1vdmwgMjAoJTQpLCAlJWVkeFxuIgorCQkgICAgICAgIiAgICAgICAgbW92bCAlJWVheCwgMTYoJTMpXG4iCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWR4LCAyMCglMylcbiIKKwkJICAgICAgICIxMDogICAgIG1vdmwgMjQoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjUxOiAgICAgbW92bCAyOCglNCksICUlZWR4XG4iCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWF4LCAyNCglMylcbiIKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlZHgsIDI4KCUzKVxuIgorCQkgICAgICAgIjExOiAgICAgbW92bCAzMiglNCksICUlZWF4XG4iCisJCSAgICAgICAiNjE6ICAgICBtb3ZsIDM2KCU0KSwgJSVlZHhcbiIKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlYXgsIDMyKCUzKVxuIgorCQkgICAgICAgIiAgICAgICAgbW92bCAlJWVkeCwgMzYoJTMpXG4iCisJCSAgICAgICAiMTI6ICAgICBtb3ZsIDQwKCU0KSwgJSVlYXhcbiIKKwkJICAgICAgICI3MTogICAgIG1vdmwgNDQoJTQpLCAlJWVkeFxuIgorCQkgICAgICAgIiAgICAgICAgbW92bCAlJWVheCwgNDAoJTMpXG4iCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWR4LCA0NCglMylcbiIKKwkJICAgICAgICIxMzogICAgIG1vdmwgNDgoJTQpLCAlJWVheFxuIgorCQkgICAgICAgIjgxOiAgICAgbW92bCA1MiglNCksICUlZWR4XG4iCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWF4LCA0OCglMylcbiIKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlZHgsIDUyKCUzKVxuIgorCQkgICAgICAgIjE0OiAgICAgbW92bCA1NiglNCksICUlZWF4XG4iCisJCSAgICAgICAiOTE6ICAgICBtb3ZsIDYwKCU0KSwgJSVlZHhcbiIKKwkJICAgICAgICIgICAgICAgIG1vdmwgJSVlYXgsIDU2KCUzKVxuIgorCQkgICAgICAgIiAgICAgICAgbW92bCAlJWVkeCwgNjAoJTMpXG4iCisJCSAgICAgICAiICAgICAgICBhZGRsICQtNjQsICUwXG4iICAgICAKKwkJICAgICAgICIgICAgICAgIGFkZGwgJDY0LCAlNFxuIiAgICAgIAorCQkgICAgICAgIiAgICAgICAgYWRkbCAkNjQsICUzXG4iICAgICAgCisJCSAgICAgICAiICAgICAgICBjbXBsICQ2MywgJTBcbiIgICAgICAKKwkJICAgICAgICIgICAgICAgIGphICAwYlxuIiAgICAgICAgICAgIAorCQkgICAgICAgIjU6ICAgICAgbW92bCAgJTAsICUlZWF4XG4iICAgCisJCSAgICAgICAiICAgICAgICBzaHJsICAkMiwgJTBcbiIgICAgICAKKwkJICAgICAgICIgICAgICAgIGFuZGwgJDMsICUlZWF4XG4iICAgIAorCQkgICAgICAgIiAgICAgICAgY2xkXG4iICAgICAgICAgICAgICAgCisJCSAgICAgICAiNjogICAgICByZXA7IG1vdnNsXG4iICAgCisJCSAgICAgICAiICAgICAgICBtb3ZsICUlZWF4LCUwXG4iCisJCSAgICAgICAiNzogICAgICByZXA7IG1vdnNiXG4iCQorCQkgICAgICAgIjg6XG4iCQkJCisJCSAgICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgorCQkgICAgICAgIjk6ICAgICAgbGVhIDAoJSVlYXgsJTAsNCksJTBcbiIJCisJCSAgICAgICAiMTY6ICAgICBwdXNobCAlMFxuIgkKKwkJICAgICAgICIgICAgICAgIHB1c2hsICUlZWF4XG4iCQorCQkgICAgICAgIiAgICAgICAgeG9ybCAlJWVheCwlJWVheFxuIgorCQkgICAgICAgIiAgICAgICAgcmVwOyBzdG9zYlxuIgkKKwkJICAgICAgICIgICAgICAgIHBvcGwgJSVlYXhcbiIJCisJCSAgICAgICAiICAgICAgICBwb3BsICUwXG4iCQorCQkgICAgICAgIiAgICAgICAgam1wIDhiXG4iCQorCQkgICAgICAgIi5wcmV2aW91c1xuIgkJCisJCSAgICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkgICAgICAgIgkuYWxpZ24gNFxuIgkgICAKKwkJICAgICAgICIJLmxvbmcgMGIsMTZiXG4iCSAKKwkJICAgICAgICIJLmxvbmcgMWIsMTZiXG4iCisJCSAgICAgICAiCS5sb25nIDJiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyAyMWIsMTZiXG4iCisJCSAgICAgICAiCS5sb25nIDNiLDE2YlxuIgkKKwkJICAgICAgICIJLmxvbmcgMzFiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyA0YiwxNmJcbiIJCisJCSAgICAgICAiCS5sb25nIDQxYiwxNmJcbiIKKwkJICAgICAgICIJLmxvbmcgMTBiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyA1MWIsMTZiXG4iCisJCSAgICAgICAiCS5sb25nIDExYiwxNmJcbiIKKwkJICAgICAgICIJLmxvbmcgNjFiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyAxMmIsMTZiXG4iCisJCSAgICAgICAiCS5sb25nIDcxYiwxNmJcbiIKKwkJICAgICAgICIJLmxvbmcgMTNiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyA4MWIsMTZiXG4iCisJCSAgICAgICAiCS5sb25nIDE0YiwxNmJcbiIKKwkJICAgICAgICIJLmxvbmcgOTFiLDE2YlxuIgorCQkgICAgICAgIgkubG9uZyA2Yiw5YlxuIgkKKwkJICAgICAgICIgICAgICAgIC5sb25nIDdiLDE2YlxuIiAKKwkJICAgICAgICIucHJldmlvdXMiCQkKKwkJICAgICAgIDogIj0mYyIoc2l6ZSksICI9JkQiIChkMCksICI9JlMiIChkMSkKKwkJICAgICAgIDogICIxIih0byksICIyIihmcm9tKSwgIjAiKHNpemUpCisJCSAgICAgICA6ICJlYXgiLCAiZWR4IiwgIm1lbW9yeSIpOworCXJldHVybiBzaXplOworfQorI2Vsc2UKKy8qCisgKiBMZWF2ZSB0aGVzZSBkZWNsYXJlZCBidXQgdW5kZWZpbmVkLiAgVGhleSBzaG91bGQgbm90IGJlIGFueSByZWZlcmVuY2VzIHRvCisgKiB0aGVtCisgKi8KK3Vuc2lnbmVkIGxvbmcKK19fY29weV91c2VyX3plcm9pbmdfaW50ZWwodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIHNpemUpOwordW5zaWduZWQgbG9uZworX19jb3B5X3VzZXJfaW50ZWwodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIHNpemUpOworI2VuZGlmIC8qIENPTkZJR19YODZfSU5URUxfVVNFUkNPUFkgKi8KKworLyogR2VuZXJpYyBhcmJpdHJhcnkgc2l6ZWQgY29weS4gICovCisjZGVmaW5lIF9fY29weV91c2VyKHRvLGZyb20sc2l6ZSkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaW50IF9fZDAsIF9fZDEsIF9fZDI7CQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkJIgljbXAgICQ3LCUwXG4iCQkJCQlcCisJCSIJamJlICAxZlxuIgkJCQkJXAorCQkiCW1vdmwgJTEsJTBcbiIJCQkJCVwKKwkJIgluZWdsICUwXG4iCQkJCQlcCisJCSIJYW5kbCAkNywlMFxuIgkJCQkJXAorCQkiCXN1YmwgJTAsJTNcbiIJCQkJCVwKKwkJIjQ6CXJlcDsgbW92c2JcbiIJCQkJCVwKKwkJIgltb3ZsICUzLCUwXG4iCQkJCQlcCisJCSIJc2hybCAkMiwlMFxuIgkJCQkJXAorCQkiCWFuZGwgJDMsJTNcbiIJCQkJCVwKKwkJIgkuYWxpZ24gMiwweDkwXG4iCQkJCVwKKwkJIjA6CXJlcDsgbW92c2xcbiIJCQkJCVwKKwkJIgltb3ZsICUzLCUwXG4iCQkJCQlcCisJCSIxOglyZXA7IG1vdnNiXG4iCQkJCQlcCisJCSIyOlxuIgkJCQkJCQlcCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJCVwKKwkJIjU6CWFkZGwgJTMsJTBcbiIJCQkJCVwKKwkJIglqbXAgMmJcbiIJCQkJCVwKKwkJIjM6CWxlYSAwKCUzLCUwLDQpLCUwXG4iCQkJCVwKKwkJIglqbXAgMmJcbiIJCQkJCVwKKwkJIi5wcmV2aW91c1xuIgkJCQkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQkJXAorCQkiCS5hbGlnbiA0XG4iCQkJCQlcCisJCSIJLmxvbmcgNGIsNWJcbiIJCQkJCVwKKwkJIgkubG9uZyAwYiwzYlxuIgkJCQkJXAorCQkiCS5sb25nIDFiLDJiXG4iCQkJCQlcCisJCSIucHJldmlvdXMiCQkJCQkJXAorCQk6ICI9JmMiKHNpemUpLCAiPSZEIiAoX19kMCksICI9JlMiIChfX2QxKSwgIj1yIihfX2QyKQlcCisJCTogIjMiKHNpemUpLCAiMCIoc2l6ZSksICIxIih0byksICIyIihmcm9tKQkJXAorCQk6ICJtZW1vcnkiKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fY29weV91c2VyX3plcm9pbmcodG8sZnJvbSxzaXplKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWludCBfX2QwLCBfX2QxLCBfX2QyOwkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJCSIJY21wICAkNywlMFxuIgkJCQkJXAorCQkiCWpiZSAgMWZcbiIJCQkJCVwKKwkJIgltb3ZsICUxLCUwXG4iCQkJCQlcCisJCSIJbmVnbCAlMFxuIgkJCQkJXAorCQkiCWFuZGwgJDcsJTBcbiIJCQkJCVwKKwkJIglzdWJsICUwLCUzXG4iCQkJCQlcCisJCSI0OglyZXA7IG1vdnNiXG4iCQkJCQlcCisJCSIJbW92bCAlMywlMFxuIgkJCQkJXAorCQkiCXNocmwgJDIsJTBcbiIJCQkJCVwKKwkJIglhbmRsICQzLCUzXG4iCQkJCQlcCisJCSIJLmFsaWduIDIsMHg5MFxuIgkJCQlcCisJCSIwOglyZXA7IG1vdnNsXG4iCQkJCQlcCisJCSIJbW92bCAlMywlMFxuIgkJCQkJXAorCQkiMToJcmVwOyBtb3ZzYlxuIgkJCQkJXAorCQkiMjpcbiIJCQkJCQkJXAorCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCQlcCisJCSI1OglhZGRsICUzLCUwXG4iCQkJCQlcCisJCSIJam1wIDZmXG4iCQkJCQlcCisJCSIzOglsZWEgMCglMywlMCw0KSwlMFxuIgkJCQlcCisJCSI2OglwdXNobCAlMFxuIgkJCQkJXAorCQkiCXB1c2hsICUlZWF4XG4iCQkJCQlcCisJCSIJeG9ybCAlJWVheCwlJWVheFxuIgkJCQlcCisJCSIJcmVwOyBzdG9zYlxuIgkJCQkJXAorCQkiCXBvcGwgJSVlYXhcbiIJCQkJCVwKKwkJIglwb3BsICUwXG4iCQkJCQlcCisJCSIJam1wIDJiXG4iCQkJCQlcCisJCSIucHJldmlvdXNcbiIJCQkJCQlcCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQkJCVwKKwkJIgkuYWxpZ24gNFxuIgkJCQkJXAorCQkiCS5sb25nIDRiLDViXG4iCQkJCQlcCisJCSIJLmxvbmcgMGIsM2JcbiIJCQkJCVwKKwkJIgkubG9uZyAxYiw2YlxuIgkJCQkJXAorCQkiLnByZXZpb3VzIgkJCQkJCVwKKwkJOiAiPSZjIihzaXplKSwgIj0mRCIgKF9fZDApLCAiPSZTIiAoX19kMSksICI9ciIoX19kMikJXAorCQk6ICIzIihzaXplKSwgIjAiKHNpemUpLCAiMSIodG8pLCAiMiIoZnJvbSkJCVwKKwkJOiAibWVtb3J5Iik7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworCit1bnNpZ25lZCBsb25nIF9fY29weV90b191c2VyX2xsKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCUJVR19PTigobG9uZykgbiA8IDApOworI2lmbmRlZiBDT05GSUdfWDg2X1dQX1dPUktTX09LCisJaWYgKHVubGlrZWx5KGJvb3RfY3B1X2RhdGEud3Bfd29ya3Nfb2sgPT0gMCkgJiYKKwkJCSgodW5zaWduZWQgbG9uZyApdG8pIDwgVEFTS19TSVpFKSB7CisJCS8qIAorCQkgKiBDUFUgZG9lcyBub3QgaG9ub3IgdGhlIFdQIGJpdCB3aGVuIHdyaXRpbmcKKwkJICogZnJvbSBzdXBlcnZpc29yeSBtb2RlLCBhbmQgZHVlIHRvIHByZWVtcHRpb24gb3IgU01QLAorCQkgKiB0aGUgcGFnZSB0YWJsZXMgY2FuIGNoYW5nZSBhdCBhbnkgdGltZS4KKwkJICogRG8gaXQgbWFudWFsbHkuCU1hbmZyZWQgPG1hbmZyZWRAY29sb3JmdWxsaWZlLmNvbT4KKwkJICovCisJCXdoaWxlIChuKSB7CisJCSAgICAgIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICgodW5zaWduZWQgbG9uZyl0byklUEFHRV9TSVpFOworCQkJdW5zaWduZWQgbG9uZyBsZW4gPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CisJCQlpbnQgcmV0dmFsOworCQkJc3RydWN0IHBhZ2UgKnBnOworCQkJdm9pZCAqbWFkZHI7CisJCQkKKwkJCWlmIChsZW4gPiBuKQorCQkJCWxlbiA9IG47CisKK3N1cnZpdmU6CisJCQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCQlyZXR2YWwgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgKXRvLCAxLCAxLCAwLCAmcGcsIE5VTEwpOworCisJCQlpZiAocmV0dmFsID09IC1FTk9NRU0gJiYgY3VycmVudC0+cGlkID09IDEpIHsKKwkJCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQkJCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKKwkJCQlnb3RvIHN1cnZpdmU7CisJCQl9CisKKwkJCWlmIChyZXR2YWwgIT0gMSkgeworCQkJCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCSAgICAgICAJCWJyZWFrOworCQkgICAgICAgCX0KKworCQkJbWFkZHIgPSBrbWFwX2F0b21pYyhwZywgS01fVVNFUjApOworCQkJbWVtY3B5KG1hZGRyICsgb2Zmc2V0LCBmcm9tLCBsZW4pOworCQkJa3VubWFwX2F0b21pYyhtYWRkciwgS01fVVNFUjApOworCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhwZyk7CisJCQlwdXRfcGFnZShwZyk7CisJCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJCQlmcm9tICs9IGxlbjsKKwkJCXRvICs9IGxlbjsKKwkJCW4gLT0gbGVuOworCQl9CisJCXJldHVybiBuOworCX0KKyNlbmRpZgorCWlmIChtb3ZzbF9pc19vayh0bywgZnJvbSwgbikpCisJCV9fY29weV91c2VyKHRvLCBmcm9tLCBuKTsKKwllbHNlCisJCW4gPSBfX2NvcHlfdXNlcl9pbnRlbCh0bywgZnJvbSwgbik7CisJcmV0dXJuIG47Cit9CisKK3Vuc2lnbmVkIGxvbmcKK19fY29weV9mcm9tX3VzZXJfbGwodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJQlVHX09OKChsb25nKW4gPCAwKTsKKwlpZiAobW92c2xfaXNfb2sodG8sIGZyb20sIG4pKQorCQlfX2NvcHlfdXNlcl96ZXJvaW5nKHRvLCBmcm9tLCBuKTsKKwllbHNlCisJCW4gPSBfX2NvcHlfdXNlcl96ZXJvaW5nX2ludGVsKHRvLCBmcm9tLCBuKTsKKwlyZXR1cm4gbjsKK30KKworLyoqCisgKiBjb3B5X3RvX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgaW50byB1c2VyIHNwYWNlLgorICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKiBAZnJvbTogU291cmNlIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4KKyAqIEBuOiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4KKyAqCisgKiBDb250ZXh0OiBVc2VyIGNvbnRleHQgb25seS4gIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgorICoKKyAqIENvcHkgZGF0YSBmcm9tIGtlcm5lbCBzcGFjZSB0byB1c2VyIHNwYWNlLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgbm90IGJlIGNvcGllZC4KKyAqIE9uIHN1Y2Nlc3MsIHRoaXMgd2lsbCBiZSB6ZXJvLgorICovCit1bnNpZ25lZCBsb25nCitjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJbWlnaHRfc2xlZXAoKTsKKwlCVUdfT04oKGxvbmcpIG4gPCAwKTsKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKQorCQluID0gX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pOworCXJldHVybiBuOworfQorRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXIpOworCisvKioKKyAqIGNvcHlfZnJvbV91c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGZyb20gdXNlciBzcGFjZS4KKyAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCisgKiBAZnJvbTogU291cmNlIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCisgKiBAbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuICBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4KKyAqCisgKiBDb3B5IGRhdGEgZnJvbSB1c2VyIHNwYWNlIHRvIGtlcm5lbCBzcGFjZS4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB0aGF0IGNvdWxkIG5vdCBiZSBjb3BpZWQuCisgKiBPbiBzdWNjZXNzLCB0aGlzIHdpbGwgYmUgemVyby4KKyAqCisgKiBJZiBzb21lIGRhdGEgY291bGQgbm90IGJlIGNvcGllZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHBhZCB0aGUgY29waWVkCisgKiBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgc2l6ZSB1c2luZyB6ZXJvIGJ5dGVzLgorICovCit1bnNpZ25lZCBsb25nCitjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwltaWdodF9zbGVlcCgpOworCUJVR19PTigobG9uZykgbiA8IDApOworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQorCQluID0gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CisJZWxzZQorCQltZW1zZXQodG8sIDAsIG4pOworCXJldHVybiBuOworfQorRVhQT1JUX1NZTUJPTChjb3B5X2Zyb21fdXNlcik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L01ha2VmaWxlIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTViYjAyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK29iai15CQkJCTo9IHNldHVwLm8gdG9wb2xvZ3kubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9zZXR1cC5jIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYTA4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3NldHVwLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKglNYWNoaW5lIHNwZWNpZmljIHNldHVwIGZvciBnZW5lcmljCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisKKy8qKgorICogcHJlX2ludHJfaW5pdF9ob29rIC0gaW5pdGlhbGlzYXRpb24gcHJpb3IgdG8gc2V0dGluZyB1cCBpbnRlcnJ1cHQgdmVjdG9ycworICoKKyAqIERlc2NyaXB0aW9uOgorICoJUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IGludGVycnVwdCBpbml0aWFsaXNhdGlvbiBwcmlvciB0byBzZXR0aW5nIHVwCisgKgl0aGUgIm9yZGluYXJ5IiBpbnRlcnJ1cHQgY2FsbCBnYXRlcy4gIEZvciBsZWdhY3kgcmVhc29ucywgdGhlIElTQQorICoJaW50ZXJydXB0cyBzaG91bGQgYmUgaW5pdGlhbGlzZWQgaGVyZSBpZiB0aGUgbWFjaGluZSBlbXVsYXRlcyBhIFBDCisgKglpbiBhbnkgd2F5LgorICoqLwordm9pZCBfX2luaXQgcHJlX2ludHJfaW5pdF9ob29rKHZvaWQpCit7CisJaW5pdF9JU0FfaXJxcygpOworfQorCisvKgorICogSVJRMiBpcyBjYXNjYWRlIGludGVycnVwdCB0byBzZWNvbmQgaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAqLworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMiA9IHsgbm9fYWN0aW9uLCAwLCBDUFVfTUFTS19OT05FLCAiY2FzY2FkZSIsIE5VTEwsIE5VTEx9OworCisvKioKKyAqIGludHJfaW5pdF9ob29rIC0gcG9zdCBnYXRlIHNldHVwIGludGVycnVwdCBpbml0aWFsaXNhdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJRmlsbCBpbiBhbnkgaW50ZXJydXB0cyB0aGF0IG1heSBoYXZlIGJlZW4gbGVmdCBvdXQgYnkgdGhlIGdlbmVyYWwKKyAqCWluaXRfSVJRKCkgcm91dGluZS4gIGludGVycnVwdHMgaGF2aW5nIHRvIGRvIHdpdGggdGhlIG1hY2hpbmUgcmF0aGVyCisgKgl0aGFuIHRoZSBkZXZpY2VzIG9uIHRoZSBJL08gYnVzIChsaWtlIEFQSUMgaW50ZXJydXB0cyBpbiBpbnRlbCBNUAorICoJc3lzdGVtcykgYXJlIHN0YXJ0ZWQgaGVyZS4KKyAqKi8KK3ZvaWQgX19pbml0IGludHJfaW5pdF9ob29rKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJYXBpY19pbnRyX2luaXQoKTsKKyNlbmRpZgorCisJaWYgKCFhY3BpX2lvYXBpYykKKwkJc2V0dXBfaXJxKDIsICZpcnEyKTsKK30KKworLyoqCisgKiBwcmVfc2V0dXBfYXJjaF9ob29rIC0gaG9vayBjYWxsZWQgcHJpb3IgdG8gYW55IHNldHVwX2FyY2goKSBleGVjdXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCWdlbmVyYWxseSB1c2VkIHRvIGFjdGl2YXRlIGFueSBtYWNoaW5lIHNwZWNpZmljIGlkZW50aWZpY2F0aW9uCisgKglyb3V0aW5lcyB0aGF0IG1heSBiZSBuZWVkZWQgYmVmb3JlIHNldHVwX2FyY2goKSBydW5zLiAgT24gVklTV1MKKyAqCXRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIGJvYXJkIHJldmlzaW9uIGFuZCB0eXBlLgorICoqLwordm9pZCBfX2luaXQgcHJlX3NldHVwX2FyY2hfaG9vayh2b2lkKQoreworfQorCisvKioKKyAqIHRyYXBfaW5pdF9ob29rIC0gaW5pdGlhbGlzZSBzeXN0ZW0gc3BlY2lmaWMgdHJhcHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNhbGxlZCBhcyB0aGUgZmluYWwgYWN0IG9mIHRyYXBfaW5pdCgpLiAgVXNlZCBpbiBWSVNXUyB0byBpbml0aWFsaXNlCisgKgl0aGUgdmFyaW91cyBib2FyZCBzcGVjaWZpYyBBUElDIHRyYXBzLgorICoqLwordm9pZCBfX2luaXQgdHJhcF9pbml0X2hvb2sodm9pZCkKK3sKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMCAgPSB7IHRpbWVyX2ludGVycnVwdCwgU0FfSU5URVJSVVBULCBDUFVfTUFTS19OT05FLCAidGltZXIiLCBOVUxMLCBOVUxMfTsKKworLyoqCisgKiB0aW1lX2luaXRfaG9vayAtIGRvIGFueSBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbnMgZm9yIHRoZSBzeXN0ZW0gdGltZXIuCisgKgorICogRGVzY3JpcHRpb246CisgKglNdXN0IHBsdWcgdGhlIHN5c3RlbSB0aW1lciBpbnRlcnJ1cHQgc291cmNlIGF0IEhaIGludG8gdGhlIElSUSBsaXN0ZWQKKyAqCWluIGlycV92ZWN0b3JzLmg6VElNRVJfSVJRCisgKiovCit2b2lkIF9faW5pdCB0aW1lX2luaXRfaG9vayh2b2lkKQoreworCXNldHVwX2lycSgwLCAmaXJxMCk7Cit9CisKKyNpZmRlZiBDT05GSUdfTUNBCisvKioKKyAqIG1jYV9ubWlfaG9vayAtIGhvb2sgaW50byBNQ0Egc3BlY2lmaWMgTk1JIGNoYWluCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgTUNBIChNaWNyb2NoYW5uZWwgQXJjaXRlY3R1cmUpIGhhcyBhbiBOTUkgY2hhaW4gZm9yIE5NSSBzb3VyY2VzCisgKglhbG9uZyB0aGUgTUNBIGJ1cy4gIFVzZSB0aGlzIHRvIGhvb2sgaW50byB0aGF0IGNoYWluIGlmIHlvdSB3aWxsIG5lZWQKKyAqCWl0LgorICoqLwordm9pZCBfX2luaXQgbWNhX25taV9ob29rKHZvaWQpCit7CisJLyogSWYgSSByZWNhbGwgY29ycmVjdGx5LCB0aGVyZSdzIGEgd2hvbGUgYnVuY2ggb2Ygb3RoZXIgdGhpbmdzIHRoYXQKKwkgKiB3ZSBjYW4gZG8gdG8gY2hlY2sgZm9yIE5NSSBwcm9ibGVtcywgYnV0IHRoYXQncyBhbGwgSSBrbm93IGFib3V0CisJICogYXQgdGhlIG1vbWVudC4KKwkgKi8KKworCXByaW50aygiTk1JIGdlbmVyYXRlZCBmcm9tIHVua25vd24gc291cmNlIVxuIik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvdG9wb2xvZ3kuYyBiL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvdG9wb2xvZ3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjNlODgxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC90b3BvbG9neS5jCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBhcmNoL2kzODYvbWFjaC1nZW5lcmljL3RvcG9sb2d5LmMgLSBQb3B1bGF0ZSBkcml2ZXJmcyB3aXRoIHRvcG9sb2d5IGluZm9ybWF0aW9uCisgKgorICogV3JpdHRlbiBieTogTWF0dGhldyBEb2Jzb24sIElCTSBDb3Jwb3JhdGlvbgorICogT3JpZ2luYWwgQ29kZTogUGF1bCBEb3J3aW4sIElCTSBDb3Jwb3JhdGlvbiwgUGF0cmljayBNb2NoZWwsIE9TREwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIElCTSBDb3JwLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgIAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFNlbmQgZmVlZGJhY2sgdG8gPGNvbHBhdGNoQHVzLmlibS5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDxhc20vY3B1Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgaTM4Nl9jcHUgY3B1X2RldmljZXNbTlJfQ1BVU107CisKK2ludCBhcmNoX3JlZ2lzdGVyX2NwdShpbnQgbnVtKXsKKwlzdHJ1Y3Qgbm9kZSAqcGFyZW50ID0gTlVMTDsKKwkKKyNpZmRlZiBDT05GSUdfTlVNQQorCWludCBub2RlID0gY3B1X3RvX25vZGUobnVtKTsKKwlpZiAobm9kZV9vbmxpbmUobm9kZSkpCisJCXBhcmVudCA9ICZub2RlX2RldmljZXNbbm9kZV0ubm9kZTsKKyNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLworCisJcmV0dXJuIHJlZ2lzdGVyX2NwdSgmY3B1X2RldmljZXNbbnVtXS5jcHUsIG51bSwgcGFyZW50KTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCit2b2lkIGFyY2hfdW5yZWdpc3Rlcl9jcHUoaW50IG51bSkgeworCXN0cnVjdCBub2RlICpwYXJlbnQgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX05VTUEKKwlpbnQgbm9kZSA9IGNwdV90b19ub2RlKG51bSk7CisJaWYgKG5vZGVfb25saW5lKG5vZGUpKQorCQlwYXJlbnQgPSAmbm9kZV9kZXZpY2VzW25vZGVdLm5vZGU7CisjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KKworCXJldHVybiB1bnJlZ2lzdGVyX2NwdSgmY3B1X2RldmljZXNbbnVtXS5jcHUsIHBhcmVudCk7Cit9CitFWFBPUlRfU1lNQk9MKGFyY2hfcmVnaXN0ZXJfY3B1KTsKK0VYUE9SVF9TWU1CT0woYXJjaF91bnJlZ2lzdGVyX2NwdSk7CisjZW5kaWYgLypDT05GSUdfSE9UUExVR19DUFUqLworCisKKworI2lmZGVmIENPTkZJR19OVU1BCisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8YXNtL25vZGUuaD4KKworc3RydWN0IGkzODZfbm9kZSBub2RlX2RldmljZXNbTUFYX05VTU5PREVTXTsKKworc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7CisJCWlmIChub2RlX29ubGluZShpKSkKKwkJCWFyY2hfcmVnaXN0ZXJfbm9kZShpKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKKwkJaWYgKGNwdV9wb3NzaWJsZShpKSkgYXJjaF9yZWdpc3Rlcl9jcHUoaSk7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfTlVNQSAqLworCitzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQorCQlpZiAoY3B1X3Bvc3NpYmxlKGkpKSBhcmNoX3JlZ2lzdGVyX2NwdShpKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19OVU1BICovCisKK3N1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWRkNGRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZXM3MDAwL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworb2JqLSQoQ09ORklHX1g4Nl9FUzcwMDApCTo9IGVzNzAwMHBsYXQubworb2JqLSQoQ09ORklHX1g4Nl9HRU5FUklDQVJDSCkJOj0gZXM3MDAwcGxhdC5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwLmggYi9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2OTFmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9lczcwMDAuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIFdyaXR0ZW4gYnk6IEdhcnJ5IEZvcnNncmVuLCBVbmlzeXMgQ29ycG9yYXRpb24KKyAqICAgICAgICAgICAgIE5hdGFsaWUgUHJvdGFzZXZpY2gsIFVuaXN5cyBDb3Jwb3JhdGlvbgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIGNvbmZpZ3VyZSBhbmQgaW50ZXJmYWNlIAorICogd2l0aCBVbmlzeXMgRVM3MDAwIHNlcmllcyBoYXJkd2FyZSBzeXN0ZW0gbWFuYWdlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVW5pc3lzIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogVW5pc3lzIENvcnBvcmF0aW9uLCBUb3duc2hpcCBMaW5lICYgVW5pb24gTWVldGluZyAKKyAqIFJvYWRzLUEsIFVuaXN5cyBXYXksIEJsdWUgQmVsbCwgUGVubnN5bHZhbmlhLCAxOTQyNCwgb3I6CisgKgorICogaHR0cDovL3d3dy51bmlzeXMuY29tCisgKi8KKworI2RlZmluZQlNSVBfUkVHCQkJMQorI2RlZmluZQlNSVBfUFNBSV9SRUcJCTQKKworI2RlZmluZQlNSVBfQlVTWQkJMQorI2RlZmluZQlNSVBfU1BJTgkJMHhmMDAwMAorI2RlZmluZQlNSVBfVkFMSUQJCTB4MDEwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZQlNSVBfUE9SVChWQUxVRSkJKChWQUxVRSA+PiAzMikgJiAweGZmZmYpCisKKyNkZWZpbmUJTUlQX1JEX0xPKFZBTFVFKQkoVkFMVUUgJiAweGZmZmZmZmZmKSAgIAorCitzdHJ1Y3QgbWlwX3JlZ19pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWlwX2luZm87CisJdW5zaWduZWQgbG9uZyBsb25nIGRlbGl2ZXJ5X2luZm87CisJdW5zaWduZWQgbG9uZyBsb25nIGhvc3RfcmVnOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtaXBfcmVnOworfTsKKworc3RydWN0IHBhcnRfaW5mbyB7CisJdW5zaWduZWQgY2hhciB0eXBlOyAgIAorCXVuc2lnbmVkIGNoYXIgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgcGFydF9pZDsKKwl1bnNpZ25lZCBjaGFyIGFwaWNfbW9kZTsKKwl1bnNpZ25lZCBsb25nIHNudW07ICAgIAorCWNoYXIgcHR5cGVbMTZdOworCWNoYXIgc25hbWVbNjRdOworCWNoYXIgcG5hbWVbNjRdOworfTsKKworc3RydWN0IHBzYWkgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBlbnRyeV90eXBlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgbG9uZyBiZXBfYWRkcjsKK307CisKK3N0cnVjdCBlczcwMDBfbWVtX2luZm8geworCXVuc2lnbmVkIGNoYXIgdHlwZTsgICAKKwl1bnNpZ25lZCBjaGFyIGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIHJlc3ZbNl07CisJdW5zaWduZWQgbG9uZyBsb25nICBzdGFydDsgCisJdW5zaWduZWQgbG9uZyBsb25nICBzaXplOyAKK307CisKK3N0cnVjdCBlczcwMDBfb2VtX3RhYmxlIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaGRyOworCXN0cnVjdCBtaXBfcmVnX2luZm8gbWlwOworCXN0cnVjdCBwYXJ0X2luZm8gcGlmOworCXN0cnVjdCBlczcwMDBfbWVtX2luZm8gc2htOworCXN0cnVjdCBwc2FpIHBzYWk7Cit9OworCitzdHJ1Y3QgYWNwaV90YWJsZV9zZHQgeworCXVuc2lnbmVkIGxvbmcgcGE7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHBhOworCQllbnVtIGFjcGlfdGFibGVfaWQgaWQ7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl9CWVudHJ5WzUwXTsKK307CisKK3N0cnVjdCBvZW1fdGFibGUgeworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBIZWFkZXI7CisJdTMyIE9FTVRhYmxlQWRkcjsKKwl1MzIgT0VNVGFibGVTaXplOworfTsKKworc3RydWN0IG1pcF9yZWcgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2ZmXzg7CisJdW5zaWduZWQgbG9uZyBsb25nIG9mZl8xMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2ZmXzE4OworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfMjA7CisJdW5zaWduZWQgbG9uZyBsb25nIG9mZl8yODsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2ZmXzMwOworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZfMzg7Cit9OworCisjZGVmaW5lCU1JUF9TV19BUElDCQkweDEwMjBiCisjZGVmaW5lCU1JUF9GVU5DKFZBTFVFKSAJKFZBTFVFICYgMHhmZikKKworZXh0ZXJuIGludCBwYXJzZV91bmlzeXNfb2VtIChjaGFyICpvZW1wdHIsIGludCBvZW1fZW50cmllcyk7CitleHRlcm4gaW50IGZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyLCBpbnQgKmxlbmd0aCk7CitleHRlcm4gaW50IGVzNzAwMF9zdGFydF9jcHUoaW50IGNwdSwgdW5zaWduZWQgbG9uZyBlaXApOworZXh0ZXJuIHZvaWQgZXM3MDAwX3N3X2FwaWModm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwcGxhdC5jIGIvYXJjaC9pMzg2L21hY2gtZXM3MDAwL2VzNzAwMHBsYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTkzNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZXM3MDAwL2VzNzAwMHBsYXQuYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIFdyaXR0ZW4gYnk6IEdhcnJ5IEZvcnNncmVuLCBVbmlzeXMgQ29ycG9yYXRpb24KKyAqICAgICAgICAgICAgIE5hdGFsaWUgUHJvdGFzZXZpY2gsIFVuaXN5cyBDb3Jwb3JhdGlvbgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIGNvbmZpZ3VyZSBhbmQgaW50ZXJmYWNlCisgKiB3aXRoIFVuaXN5cyBFUzcwMDAgc2VyaWVzIGhhcmR3YXJlIHN5c3RlbSBtYW5hZ2VyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBVbmlzeXMgQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBVbmlzeXMgQ29ycG9yYXRpb24sIFRvd25zaGlwIExpbmUgJiBVbmlvbiBNZWV0aW5nCisgKiBSb2Fkcy1BLCBVbmlzeXMgV2F5LCBCbHVlIEJlbGwsIFBlbm5zeWx2YW5pYSwgMTk0MjQsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cudW5pc3lzLmNvbQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL25taS5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgorI2luY2x1ZGUgImVzNzAwMC5oIgorCisvKgorICogRVM3MDAwIEdsb2JhbHMKKyAqLworCit2b2xhdGlsZSB1bnNpZ25lZCBsb25nCSpwc2FpID0gTlVMTDsKK3N0cnVjdCBtaXBfcmVnCQkqbWlwX3JlZzsKK3N0cnVjdCBtaXBfcmVnCQkqaG9zdF9yZWc7CitpbnQgCQkJbWlwX3BvcnQ7Cit1bnNpZ25lZCBsb25nCQltaXBfYWRkciwgaG9zdF9hZGRyOworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpICYmIChkZWZpbmVkKENPTkZJR19BQ1BJX0lOVEVSUFJFVEVSKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX0JPT1QpKQorCisvKgorICogR1NJIG92ZXJyaWRlIGZvciBFUzcwMDAgcGxhdGZvcm1zLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmFzZTsKKworc3RhdGljIGludAorZXM3MDAwX3JlbmFtZV9nc2koaW50IGlvYXBpYywgaW50IGdzaSkKK3sKKwlpZiAoIWJhc2UpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspCisJCQliYXNlICs9IG5yX2lvYXBpY19yZWdpc3RlcnNbaV07CisJfQorCisJaWYgKCFpb2FwaWMgJiYgKGdzaSA8IDE2KSkgCisJCWdzaSArPSBiYXNlOworCXJldHVybiBnc2k7Cit9CisKKyNlbmRpZiAvLyAoQ09ORklHX1g4Nl9JT19BUElDKSAmJiAoQ09ORklHX0FDUElfSU5URVJQUkVURVIgfHwgQ09ORklHX0FDUElfQk9PVCkKKworLyoKKyAqIFBhcnNlIHRoZSBPRU0gVGFibGUKKyAqLworCitpbnQgX19pbml0CitwYXJzZV91bmlzeXNfb2VtIChjaGFyICpvZW1wdHIsIGludCBvZW1fZW50cmllcykKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICBpOworCWludCAJCQlzdWNjZXNzID0gMDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICB0eXBlLCBzaXplOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHZhbDsKKwljaGFyICAgICAgICAgICAgICAgICAgICAqdHAgPSBOVUxMOworCXN0cnVjdCBwc2FpICAgICAgICAgICAgICpwc2FpcCA9IE5VTEw7CisJc3RydWN0IG1pcF9yZWdfaW5mbyAJKm1pOworCXN0cnVjdCBtaXBfcmVnCQkqaG9zdCwgKm1pcDsKKworCXRwID0gb2VtcHRyOworCisJdHAgKz0gODsKKworCWZvciAoaT0wOyBpIDw9IG9lbV9lbnRyaWVzOyBpKyspIHsKKwkJdHlwZSA9ICp0cCsrOworCQlzaXplID0gKnRwKys7CisJCXRwIC09IDI7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIE1JUF9SRUc6CisJCQltaSA9IChzdHJ1Y3QgbWlwX3JlZ19pbmZvICopdHA7CisJCQl2YWwgPSBNSVBfUkRfTE8obWktPmhvc3RfcmVnKTsKKwkJCWhvc3RfYWRkciA9IHZhbDsKKwkJCWhvc3QgPSAoc3RydWN0IG1pcF9yZWcgKil2YWw7CisJCQlob3N0X3JlZyA9IF9fdmEoaG9zdCk7CisJCQl2YWwgPSBNSVBfUkRfTE8obWktPm1pcF9yZWcpOworCQkJbWlwX3BvcnQgPSBNSVBfUE9SVChtaS0+bWlwX2luZm8pOworCQkJbWlwX2FkZHIgPSB2YWw7CisJCQltaXAgPSAoc3RydWN0IG1pcF9yZWcgKil2YWw7CisJCQltaXBfcmVnID0gX192YShtaXApOworCQkJRHByaW50aygiZXM3MDAwX21pcGNmZzogaG9zdF9yZWcgPSAweCVseCBcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpaG9zdF9yZWcpOworCQkJRHByaW50aygiZXM3MDAwX21pcGNmZzogbWlwX3JlZyA9IDB4JWx4IFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyltaXBfcmVnKTsKKwkJCXN1Y2Nlc3MrKzsKKwkJCWJyZWFrOworCQljYXNlIE1JUF9QU0FJX1JFRzoKKwkJCXBzYWlwID0gKHN0cnVjdCBwc2FpICopdHA7CisJCQlpZiAodHAgIT0gTlVMTCkgeworCQkJCWlmIChwc2FpcC0+YWRkcikKKwkJCQkJcHNhaSA9IF9fdmEocHNhaXAtPmFkZHIpOworCQkJCWVsc2UKKwkJCQkJcHNhaSA9IE5VTEw7CisJCQkJc3VjY2VzcysrOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSA2KSBicmVhazsKKwkJdHAgKz0gc2l6ZTsKKwl9CisKKwlpZiAoc3VjY2VzcyA8IDIpIHsKKwkJZXM3MDAwX3BsYXQgPSAwOworCX0gZWxzZSB7CisJCXByaW50aygiXG5FbmFibGluZyBFUzcwMDAgc3BlY2lmaWMgZmVhdHVyZXMuLi5cbiIpOworCQkvKgorCQkgKiBEZXRlcm1pbmUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEVTNzAwMCBjdXJyZW50bHkgcnVubmluZy4KKwkJICoKKwkJICogZXM3MDAwX3BsYXQgPSAwIGlmIHRoZSBtYWNoaW5lIGlzIE5PVCBhIFVuaXN5cyBFUzcwMDAgYm94CisJCSAqIGVzNzAwMF9wbGF0ID0gMSBpZiB0aGUgbWFjaGluZSBpcyBhIDV4eCBFUzcwMDAgYm94CisJCSAqIGVzNzAwMF9wbGF0ID0gMiBpZiB0aGUgbWFjaGluZSBpcyBhIHg4Nl82NCBFUzcwMDAgYm94CisJCSAqCisJCSAqLworCQlpZiAoIShib290X2NwdV9kYXRhLng4NiA8PSAxNSAmJiBib290X2NwdV9kYXRhLng4Nl9tb2RlbCA8PSAyKSkKKwkJCWVzNzAwMF9wbGF0ID0gMjsKKwkJZWxzZQorCQkJZXM3MDAwX3BsYXQgPSAxOworCisJCWlvYXBpY19yZW51bWJlcl9pcnEgPSBlczcwMDBfcmVuYW1lX2dzaTsKKwl9CisJcmV0dXJuIGVzNzAwMF9wbGF0OworfQorCitpbnQgX19pbml0CitmaW5kX3VuaXN5c19hY3BpX29lbV90YWJsZSh1bnNpZ25lZCBsb25nICpvZW1fYWRkciwgaW50ICpsZW5ndGgpCit7CisJc3RydWN0IGFjcGlfdGFibGVfcnNkcAkJKnJzZHAgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcJCQlyc2RwX3BoeXMgPSAwOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAJKmhlYWRlciA9IE5VTEw7CisJaW50CQkJCWk7CisJc3RydWN0IGFjcGlfdGFibGVfc2R0CQlzZHQ7CisKKwlyc2RwX3BoeXMgPSBhY3BpX2ZpbmRfcnNkcCgpOworCXJzZHAgPSBfX3ZhKHJzZHBfcGh5cyk7CisJaWYgKHJzZHAtPnJzZHRfYWRkcmVzcykgeworCQlzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0CSptYXBwZWRfcnNkdCA9IE5VTEw7CisJCXNkdC5wYSA9IHJzZHAtPnJzZHRfYWRkcmVzczsKKworCQloZWFkZXIgPSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICopCisJCQlfX2FjcGlfbWFwX3RhYmxlKHNkdC5wYSwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQlpZiAoIWhlYWRlcikKKwkJCXJldHVybiAtRU5PREVWOworCisJCXNkdC5jb3VudCA9IChoZWFkZXItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSA+PiAzOworCQltYXBwZWRfcnNkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0ICopCisJCQlfX2FjcGlfbWFwX3RhYmxlKHNkdC5wYSwgaGVhZGVyLT5sZW5ndGgpOworCQlpZiAoIW1hcHBlZF9yc2R0KQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJaGVhZGVyID0gJm1hcHBlZF9yc2R0LT5oZWFkZXI7CisKKwkJZm9yIChpID0gMDsgaSA8IHNkdC5jb3VudDsgaSsrKQorCQkJc2R0LmVudHJ5W2ldLnBhID0gKHVuc2lnbmVkIGxvbmcpIG1hcHBlZF9yc2R0LT5lbnRyeVtpXTsKKwl9OworCWZvciAoaSA9IDA7IGkgPCBzZHQuY291bnQ7IGkrKykgeworCisJCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKKwkJCV9fYWNwaV9tYXBfdGFibGUoc2R0LmVudHJ5W2ldLnBhLAorCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJaWYgKCFoZWFkZXIpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJuY21wKChjaGFyICopICZoZWFkZXItPnNpZ25hdHVyZSwgIk9FTTEiLCA0KSkgeworCQkJaWYgKCFzdHJuY21wKChjaGFyICopICZoZWFkZXItPm9lbV9pZCwgIlVOSVNZUyIsIDYpKSB7CisJCQkJdm9pZCAqYWRkcjsKKwkJCQlzdHJ1Y3Qgb2VtX3RhYmxlICp0OworCQkJCWFjcGlfdGFibGVfcHJpbnQoaGVhZGVyLCBzZHQuZW50cnlbaV0ucGEpOworCQkJCXQgPSAoc3RydWN0IG9lbV90YWJsZSAqKSBfX2FjcGlfbWFwX3RhYmxlKHNkdC5lbnRyeVtpXS5wYSwgaGVhZGVyLT5sZW5ndGgpOworCQkJCWFkZHIgPSAodm9pZCAqKSBfX2FjcGlfbWFwX3RhYmxlKHQtPk9FTVRhYmxlQWRkciwgdC0+T0VNVGFibGVTaXplKTsKKwkJCQkqbGVuZ3RoID0gaGVhZGVyLT5sZW5ndGg7CisJCQkJKm9lbV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJRHByaW50aygiRVM3MDAwOiBkaWQgbm90IGZpbmQgVW5pc3lzIEFDUEkgT0VNIHRhYmxlIVxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZAorZXM3MDAwX3NwaW4oaW50IG4pCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkrKyA8IG4pCisJCXJlcF9ub3AoKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK2VzNzAwMF9taXBfd3JpdGUoc3RydWN0IG1pcF9yZWcgKm1pcF9yZWcpCit7CisJaW50CQkJc3RhdHVzID0gMDsKKwlpbnQJCQlzcGluOworCisJc3BpbiA9IE1JUF9TUElOOworCXdoaWxlICgoKHVuc2lnbmVkIGxvbmcgbG9uZylob3N0X3JlZy0+b2ZmXzM4ICYKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylNSVBfVkFMSUQpICE9IDApIHsKKwkJCWlmICgtLXNwaW4gPD0gMCkgeworCQkJCXByaW50aygiZXM3MDAwX21pcF93cml0ZTogVGltZW91dCB3YWl0aW5nIGZvciBIb3N0IFZhbGlkIEZsYWciKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCWVzNzAwMF9zcGluKE1JUF9TUElOKTsKKwl9CisKKwltZW1jcHkoaG9zdF9yZWcsIG1pcF9yZWcsIHNpemVvZihzdHJ1Y3QgbWlwX3JlZykpOworCW91dGIoMSwgbWlwX3BvcnQpOworCisJc3BpbiA9IE1JUF9TUElOOworCisJd2hpbGUgKCgodW5zaWduZWQgbG9uZyBsb25nKW1pcF9yZWctPm9mZl8zOCAmCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpTUlQX1ZBTElEKSA9PSAwKSB7CisJCWlmICgtLXNwaW4gPD0gMCkgeworCQkJcHJpbnRrKCJlczcwMDBfbWlwX3dyaXRlOiBUaW1lb3V0IHdhaXRpbmcgZm9yIE1JUCBWYWxpZCBGbGFnIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZXM3MDAwX3NwaW4oTUlQX1NQSU4pOworCX0KKworCXN0YXR1cyA9ICgodW5zaWduZWQgbG9uZyBsb25nKW1pcF9yZWctPm9mZl8wICYKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykweGZmZmYwMDAwMDAwMDAwVUxMKSA+PiA0ODsKKwltaXBfcmVnLT5vZmZfMzggPSAoKHVuc2lnbmVkIGxvbmcgbG9uZyltaXBfcmVnLT5vZmZfMzggJgorCQkodW5zaWduZWQgbG9uZyBsb25nKX5NSVBfVkFMSUQpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludAorZXM3MDAwX3N0YXJ0X2NwdShpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGVpcCkKK3sKKwl1bnNpZ25lZCBsb25nIHZlY3QgPSAwLCBwc2FpdmFsID0gMDsKKworCWlmIChwc2FpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXZlY3QgPSAoKHVuc2lnbmVkIGxvbmcpX19wYShlaXApLzB4MTAwMCkgPDwgMTY7CisJcHNhaXZhbCA9ICgweDEwMDAwMDAgfCB2ZWN0IHwgY3B1KTsKKworCXdoaWxlICgqcHNhaSAmIDB4MTAwMDAwMCkKKyAgICAgICAgICAgICAgICA7CisKKwkqcHNhaSA9IHBzYWl2YWw7CisKKwlyZXR1cm4gMDsKKworfQorCitpbnQKK2VzNzAwMF9zdG9wX2NwdShpbnQgY3B1KQoreworCWludCBzdGFydHVwOworCisJaWYgKHBzYWkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJc3RhcnR1cD0gKDB4MTAwMDAwMCB8IGNwdSk7CisKKwl3aGlsZSAoKCpwc2FpICYgMHhmZjAwZmZmZikgIT0gc3RhcnR1cCkKKwkJOworCisJc3RhcnR1cCA9ICgqcHNhaSAmIDB4ZmYwMDAwKSA+PiAxNjsKKwkqcHNhaSAmPSAweGZmZmZmZjsKKworCXJldHVybiAwOworCit9CisKK3ZvaWQgX19pbml0CitlczcwMDBfc3dfYXBpYygpCit7CisJaWYgKGVzNzAwMF9wbGF0KSB7CisJCWludCBtaXBfc3RhdHVzOworCQlzdHJ1Y3QgbWlwX3JlZyBlczcwMDBfbWlwX3JlZzsKKworCQlwcmludGsoIkVTNzAwMDogRW5hYmxpbmcgQVBJQyBtb2RlLlxuIik7CisgICAgICAgIAltZW1zZXQoJmVzNzAwMF9taXBfcmVnLCAwLCBzaXplb2Yoc3RydWN0IG1pcF9yZWcpKTsKKyAgICAgICAgCWVzNzAwMF9taXBfcmVnLm9mZl8wID0gTUlQX1NXX0FQSUM7CisgICAgICAgIAllczcwMDBfbWlwX3JlZy5vZmZfMzggPSAoTUlQX1ZBTElEKTsKKyAgICAgICAgCXdoaWxlICgobWlwX3N0YXR1cyA9IGVzNzAwMF9taXBfd3JpdGUoJmVzNzAwMF9taXBfcmVnKSkgIT0gMCkKKyAgICAgICAgICAgICAgCQlwcmludGsoImVzNzAwMF9zd19hcGljOiBjb21tYW5kIGZhaWxlZCwgc3RhdHVzID0gJXhcbiIsCisJCQkJbWlwX3N0YXR1cyk7CisJCXJldHVybjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1nZW5lcmljL01ha2VmaWxlIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2ZiYzlmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBnZW5lcmljIGFyY2hpdGVjdHVyZQorIworCitFWFRSQV9DRkxBR1MJKz0gLUkuLi9rZXJuZWwKKworb2JqLXkJCQkJOj0gcHJvYmUubyBzdW1taXQubyBiaWdzbXAubyBlczcwMDAubyBkZWZhdWx0Lm8gLi4vbWFjaC1lczcwMDAvCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1nZW5lcmljL2JpZ3NtcC5jIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9iaWdzbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTg4M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9iaWdzbXAuYwpAQCAtMCwwICsxLDU0IEBACisvKiAKKyAqIEFQSUMgZHJpdmVyIGZvciAiYmlnc21wIiBYQVBJQyBtYWNoaW5lcyB3aXRoIG1vcmUgdGhhbiA4IHZpcnR1YWwgQ1BVcy4KKyAqIERyaXZlcyB0aGUgbG9jYWwgQVBJQyBpbiAiY2x1c3RlcmVkIG1vZGUiLgorICovCisjZGVmaW5lIEFQSUNfREVGSU5JVElPTiAxCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYmlnc21wL21hY2hfYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWJpZ3NtcC9tYWNoX2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1iaWdzbXAvbWFjaF9pcGkuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1kZWZhdWx0L21hY2hfbXBwYXJzZS5oPgorCitzdGF0aWMgaW50IGRtaV9iaWdzbXA7IC8qIGNhbiBiZSBzZXQgYnkgZG1pIHNjYW5uZXJzICovCisKK3N0YXRpYyBfX2luaXQgaW50IGhwX2h0X2JpZ3NtcChzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2X0dFTkVSSUNBUkNICisJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBkZXRlY3RlZDogZm9yY2UgdXNlIG9mIGFwaWM9Ymlnc21wXG4iLCBkLT5pZGVudCk7CisJZG1pX2JpZ3NtcCA9IDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBiaWdzbXBfZG1pX3RhYmxlW10gPSB7CisJeyBocF9odF9iaWdzbXAsICJIUCBQcm9MaWFudCBETDc2MCBHMiIsIHsKKwkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIkhQIiksCisJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUDQ0LSIpLAorCX19LAorCisJeyBocF9odF9iaWdzbXAsICJIUCBQcm9MaWFudCBETDc0MCIsIHsKKwkJRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIkhQIiksCisJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiUDQ3LSIpLAorCSB9fSwKKwkgeyB9Cit9OworCisKK3N0YXRpYyBfX2luaXQgaW50IHByb2JlX2JpZ3NtcCh2b2lkKQoreyAKKwlkbWlfY2hlY2tfc3lzdGVtKGJpZ3NtcF9kbWlfdGFibGUpOworCXJldHVybiBkbWlfYmlnc21wOyAKK30gCisKK3N0cnVjdCBnZW5hcGljIGFwaWNfYmlnc21wID0gQVBJQ19JTklUKCJiaWdzbXAiLCBwcm9iZV9iaWdzbXApOyAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvZGVmYXVsdC5jIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9kZWZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMTRlOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvZGVmYXVsdC5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIAorICogRGVmYXVsdCBnZW5lcmljIEFQSUMgZHJpdmVyLiBUaGlzIGhhbmRsZXMgdXB0byA4IENQVXMuCisgKi8KKyNkZWZpbmUgQVBJQ19ERUZJTklUSU9OIDEKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1kZWZhdWx0L21hY2hfYXBpY2RlZi5oPgorI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWRlZmF1bHQvbWFjaF9hcGljLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtZGVmYXVsdC9tYWNoX2lwaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWRlZmF1bHQvbWFjaF9tcHBhcnNlLmg+CisKKy8qIHNob3VsZCBiZSBjYWxsZWQgbGFzdC4gKi8KK3N0YXRpYyBfX2luaXQgaW50IHByb2JlX2RlZmF1bHQodm9pZCkKK3sgCisJcmV0dXJuIDE7Cit9IAorCitzdHJ1Y3QgZ2VuYXBpYyBhcGljX2RlZmF1bHQgPSBBUElDX0lOSVQoImRlZmF1bHQiLCBwcm9iZV9kZWZhdWx0KTsgCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1nZW5lcmljL2VzNzAwMC5jIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9lczcwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQzZWMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9lczcwMDAuYwpAQCAtMCwwICsxLDI4IEBACisvKgorICogQVBJQyBkcml2ZXIgZm9yIHRoZSBVbmlzeXMgRVM3MDAwIGNoaXBzZXQuCisgKi8KKyNkZWZpbmUgQVBJQ19ERUZJTklUSU9OIDEKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KKyNpbmNsdWRlIDxhc20vZ2VuYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1lczcwMDAvbWFjaF9hcGljZGVmLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtZXM3MDAwL21hY2hfYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWVzNzAwMC9tYWNoX2lwaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWVzNzAwMC9tYWNoX21wcGFyc2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1lczcwMDAvbWFjaF93YWtlY3B1Lmg+CisKK3N0YXRpYyBfX2luaXQgaW50IHByb2JlX2VzNzAwMCh2b2lkKQoreworCS8qIHByb2JlZCBsYXRlciBpbiBtcHRhYmxlL0FDUEkgaG9va3MgKi8KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGdlbmFwaWMgYXBpY19lczcwMDAgPSBBUElDX0lOSVQoImVzNzAwMCIsIHByb2JlX2VzNzAwMCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1nZW5lcmljL3Byb2JlLmMgYi9hcmNoL2kzODYvbWFjaC1nZW5lcmljL3Byb2JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5N2M2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvcHJvYmUuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogQ29weXJpZ2h0IDIwMDMgQW5kaSBLbGVlbiwgU3VTRSBMYWJzLiAKKyAqIFN1YmplY3QgdG8gdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgdi4yIAorICogCisgKiBHZW5lcmljIHg4NiBBUElDIGRyaXZlciBwcm9iZSBsYXllci4KKyAqLyAgCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgorI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+CisjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KKworZXh0ZXJuIHN0cnVjdCBnZW5hcGljIGFwaWNfc3VtbWl0OworZXh0ZXJuIHN0cnVjdCBnZW5hcGljIGFwaWNfYmlnc21wOworZXh0ZXJuIHN0cnVjdCBnZW5hcGljIGFwaWNfZXM3MDAwOworZXh0ZXJuIHN0cnVjdCBnZW5hcGljIGFwaWNfZGVmYXVsdDsKKworc3RydWN0IGdlbmFwaWMgKmdlbmFwaWMgPSAmYXBpY19kZWZhdWx0OworCitzdHJ1Y3QgZ2VuYXBpYyAqYXBpY19wcm9iZVtdIF9faW5pdGRhdGEgPSB7IAorCSZhcGljX3N1bW1pdCwKKwkmYXBpY19iaWdzbXAsIAorCSZhcGljX2VzNzAwMCwKKwkmYXBpY19kZWZhdWx0LAkvKiBtdXN0IGJlIGxhc3QgKi8KKwlOVUxMLAorfTsKKwordm9pZCBfX2luaXQgZ2VuZXJpY19hcGljX3Byb2JlKGNoYXIgKmNvbW1hbmRfbGluZSkgCit7IAorCWNoYXIgKnM7CisJaW50IGk7CisJaW50IGNoYW5nZWQgPSAwOworCisJcyA9IHN0cnN0cihjb21tYW5kX2xpbmUsICJhcGljPSIpOworCWlmIChzICYmIChzID09IGNvbW1hbmRfbGluZSB8fCBpc3NwYWNlKHNbLTFdKSkpIHsgCisJCWNoYXIgKnAgPSBzdHJjaHIocywgJyAnKSwgb2xkOyAKKwkJaWYgKCFwKQorCQkJcCA9IHN0cmNocihzLCAnXDAnKTsgCisJCW9sZCA9ICpwOyAKKwkJKnAgPSAwOyAKKwkJZm9yIChpID0gMDsgIWNoYW5nZWQgJiYgYXBpY19wcm9iZVtpXTsgaSsrKSB7CisJCQlpZiAoIXN0cmNtcChhcGljX3Byb2JlW2ldLT5uYW1lLCBzKzUpKSB7IAorCQkJCWNoYW5nZWQgPSAxOworCQkJCWdlbmFwaWMgPSBhcGljX3Byb2JlW2ldOworCQkJfQorCQl9CisJCWlmICghY2hhbmdlZCkKKwkJCXByaW50ayhLRVJOX0VSUiAiVW5rbm93biBnZW5hcGljIGAlcycgc3BlY2lmaWVkLlxuIiwgcyk7CisJCSpwID0gb2xkOworCX0gCisJZm9yIChpID0gMDsgIWNoYW5nZWQgJiYgYXBpY19wcm9iZVtpXTsgaSsrKSB7IAorCQlpZiAoYXBpY19wcm9iZVtpXS0+cHJvYmUoKSkgeworCQkJY2hhbmdlZCA9IDE7CisJCQlnZW5hcGljID0gYXBpY19wcm9iZVtpXTsgCisJCX0gCisJfQorCS8qIE5vdCB2aXNpYmxlIHdpdGhvdXQgZWFybHkgY29uc29sZSAqLyAKKwlpZiAoIWNoYW5nZWQpIAorCQlwYW5pYygiRGlkbid0IGZpbmQgYW4gQVBJQyBkcml2ZXIiKTsgCisKKwlwcmludGsoS0VSTl9JTkZPICJVc2luZyBBUElDIGRyaXZlciAlc1xuIiwgZ2VuYXBpYy0+bmFtZSk7Cit9IAorCisvKiBUaGVzZSBmdW5jdGlvbnMgY2FuIHN3aXRjaCB0aGUgQVBJQyBldmVuIGFmdGVyIHRoZSBpbml0aWFsIC0+cHJvYmUoKSAqLworCitpbnQgX19pbml0IG1wc19vZW1fY2hlY2soc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCBjaGFyICpvZW0sIGNoYXIgKnByb2R1Y3RpZCkKK3sgCisJaW50IGk7CisJZm9yIChpID0gMDsgYXBpY19wcm9iZVtpXTsgKytpKSB7IAorCQlpZiAoYXBpY19wcm9iZVtpXS0+bXBzX29lbV9jaGVjayhtcGMsb2VtLHByb2R1Y3RpZCkpIHsgCisJCQlnZW5hcGljID0gYXBpY19wcm9iZVtpXTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlN3aXRjaGVkIHRvIEFQSUMgZHJpdmVyIGAlcycuXG4iLCAKKwkJCSAgICAgICBnZW5hcGljLT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9IAorCX0gCisJcmV0dXJuIDA7Cit9IAorCitpbnQgX19pbml0IGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgYXBpY19wcm9iZVtpXTsgKytpKSB7IAorCQlpZiAoYXBpY19wcm9iZVtpXS0+YWNwaV9tYWR0X29lbV9jaGVjayhvZW1faWQsIG9lbV90YWJsZV9pZCkpIHsgCisJCQlnZW5hcGljID0gYXBpY19wcm9iZVtpXTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlN3aXRjaGVkIHRvIEFQSUMgZHJpdmVyIGAlcycuXG4iLCAKKwkJCSAgICAgICBnZW5hcGljLT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9IAorCX0gCisJcmV0dXJuIDA7CQorfQorCitpbnQgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpCit7CisJcmV0dXJuIGdlbmFwaWMtPmdldF9hcGljX2lkKCoodW5zaWduZWQgbG9uZyAqKShBUElDX0JBU0UrQVBJQ19JRCkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9zdW1taXQuYyBiL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvc3VtbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkZGY3NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvc3VtbWl0LmMKQEAgLTAsMCArMSwyNyBAQAorLyogCisgKiBBUElDIGRyaXZlciBmb3IgdGhlIElCTSAiU3VtbWl0IiBjaGlwc2V0LgorICovCisjZGVmaW5lIEFQSUNfREVGSU5JVElPTiAxCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtc3VtbWl0L21hY2hfYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXN1bW1pdC9tYWNoX2FwaWNkZWYuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1zdW1taXQvbWFjaF9pcGkuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1zdW1taXQvbWFjaF9tcHBhcnNlLmg+CisKK3N0YXRpYyBfX2luaXQgaW50IHByb2JlX3N1bW1pdCh2b2lkKQoreyAKKwkvKiBwcm9iZWQgbGF0ZXIgaW4gbXB0YWJsZS9BQ1BJIGhvb2tzICovCisJcmV0dXJuIDA7Cit9IAorCitzdHJ1Y3QgZ2VuYXBpYyBhcGljX3N1bW1pdCA9IEFQSUNfSU5JVCgic3VtbWl0IiwgcHJvYmVfc3VtbWl0KTsgCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12aXN3cy9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNWZkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWFjaC12aXN3cy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK29iai15CQkJCTo9IHNldHVwLm8gdHJhcHMubyByZWJvb3QubworCitvYmotJChDT05GSUdfWDg2X1ZJU1dTX0FQSUMpCSs9IHZpc3dzX2FwaWMubworb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQkrPSBtcHBhcnNlLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL21wcGFyc2UuYyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL21wcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTIyMDgyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtdmlzd3MvbXBwYXJzZS5jCkBAIC0wLDAgKzEsMTA1IEBACisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJjb2JhbHQuaCIKKyNpbmNsdWRlICJtYWNoX2FwaWMuaCIKKworLyogSGF2ZSB3ZSBmb3VuZCBhbiBNUCB0YWJsZSAqLworaW50IHNtcF9mb3VuZF9jb25maWc7CisKKy8qCisgKiBWYXJpb3VzIExpbnV4LWludGVybmFsIGRhdGEgc3RydWN0dXJlcyBjcmVhdGVkIGZyb20gdGhlCisgKiBNUC10YWJsZS4KKyAqLworaW50IGFwaWNfdmVyc2lvbiBbTUFYX0FQSUNTXTsKKworaW50IHBpY19tb2RlOwordW5zaWduZWQgbG9uZyBtcF9sYXBpY19hZGRyOworCisvKiBQcm9jZXNzb3IgdGhhdCBpcyBkb2luZyB0aGUgYm9vdCB1cCAqLwordW5zaWduZWQgaW50IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IC0xVTsKK3Vuc2lnbmVkIGludCBib290X2NwdV9sb2dpY2FsX2FwaWNpZCA9IC0xVTsKKworLyogQml0bWFzayBvZiBwaHlzaWNhbGx5IGV4aXN0aW5nIENQVXMgKi8KK3BoeXNpZF9tYXNrX3QgcGh5c19jcHVfcHJlc2VudF9tYXA7CisKK3Vuc2lnbmVkIGludCBfX2luaXRkYXRhIG1heGNwdXMgPSBOUl9DUFVTOworCisvKgorICogVGhlIFZpc3VhbCBXb3Jrc3RhdGlvbiBpcyBJbnRlbCBNUCBjb21wbGlhbnQgaW4gdGhlIGhhcmR3YXJlCisgKiBzZW5zZSwgYnV0IGl0IGRvZXNuJ3QgaGF2ZSBhIEJJT1MoLWNvbmZpZ3VyYXRpb24gdGFibGUpLgorICogTm8gcHJvYmxlbSBmb3IgTGludXguCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IE1QX3Byb2Nlc3Nvcl9pbmZvIChzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKm0pCit7CisgCWludCB2ZXIsIGxvZ2ljYWxfYXBpY2lkOworCXBoeXNpZF9tYXNrX3QgYXBpY19jcHVzOworIAkKKwlpZiAoIShtLT5tcGNfY3B1ZmxhZyAmIENQVV9FTkFCTEVEKSkKKwkJcmV0dXJuOworCisJbG9naWNhbF9hcGljaWQgPSBtLT5tcGNfYXBpY2lkOworCXByaW50ayhLRVJOX0lORk8gIiVzQ1BVICMlZCAlbGQ6JWxkIEFQSUMgdmVyc2lvbiAlZFxuIiwKKwkJbS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUiA/ICJCb290dXAgIiA6ICIiLAorCQltLT5tcGNfYXBpY2lkLAorCQkobS0+bXBjX2NwdWZlYXR1cmUgJiBDUFVfRkFNSUxZX01BU0spID4+IDgsCisJCShtLT5tcGNfY3B1ZmVhdHVyZSAmIENQVV9NT0RFTF9NQVNLKSA+PiA0LAorCQltLT5tcGNfYXBpY3Zlcik7CisKKwlpZiAobS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUikgeworCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBtLT5tcGNfYXBpY2lkOworCQlib290X2NwdV9sb2dpY2FsX2FwaWNpZCA9IGxvZ2ljYWxfYXBpY2lkOworCX0KKworCXZlciA9IG0tPm1wY19hcGljdmVyOworCWlmICgodmVyID49IDB4MTQgJiYgbS0+bXBjX2FwaWNpZCA+PSAweGZmKSB8fCBtLT5tcGNfYXBpY2lkID49IDB4ZikgeworCQlwcmludGsoS0VSTl9FUlIgIlByb2Nlc3NvciAjJWQgSU5WQUxJRC4gKE1heCBJRDogJWQpLlxuIiwKKwkJCW0tPm1wY19hcGljaWQsIE1BWF9BUElDUyk7CisJCXJldHVybjsKKwl9CisKKwlhcGljX2NwdXMgPSBhcGljaWRfdG9fY3B1X3ByZXNlbnQobS0+bXBjX2FwaWNpZCk7CisJcGh5c2lkc19vcihwaHlzX2NwdV9wcmVzZW50X21hcCwgcGh5c19jcHVfcHJlc2VudF9tYXAsIGFwaWNfY3B1cyk7CisJLyoKKwkgKiBWYWxpZGF0ZSB2ZXJzaW9uCisJICovCisJaWYgKHZlciA9PSAweDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1ZywgQVBJQyB2ZXJzaW9uIGlzIDAgZm9yIENQVSMlZCEgIgorCQkJImZpeGluZyB1cCB0byAweDEwLiAodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIsCisJCQltLT5tcGNfYXBpY2lkKTsKKwkJdmVyID0gMHgxMDsKKwl9CisJYXBpY192ZXJzaW9uW20tPm1wY19hcGljaWRdID0gdmVyOworfQorCit2b2lkIF9faW5pdCBmaW5kX3NtcF9jb25maWcodm9pZCkKK3sKKwlzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKm1wID0gcGh5c190b192aXJ0KENPX0NQVV9UQUJfUEhZUyk7CisJdW5zaWduZWQgc2hvcnQgbmNwdXMgPSByZWFkdyhwaHlzX3RvX3ZpcnQoQ09fQ1BVX05VTV9QSFlTKSk7CisKKwlpZiAobmNwdXMgPiBDT19DUFVfTUFYKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImZpbmRfdmlzd3Nfc21wOiBnb3QgY3B1IGNvdW50IG9mICVkIGF0ICVwXG4iLAorCQkJbmNwdXMsIG1wKTsKKworCQluY3B1cyA9IENPX0NQVV9NQVg7CisJfQorCisJaWYgKG5jcHVzID4gbWF4Y3B1cykKKwkJbmNwdXMgPSBtYXhjcHVzOworCisJc21wX2ZvdW5kX2NvbmZpZyA9IDE7CisJd2hpbGUgKG5jcHVzLS0pCisJCU1QX3Byb2Nlc3Nvcl9pbmZvKG1wKyspOworCisJbXBfbGFwaWNfYWRkciA9IEFQSUNfREVGQVVMVF9QSFlTX0JBU0U7Cit9CisKK3ZvaWQgX19pbml0IGdldF9zbXBfY29uZmlnICh2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdmlzd3MvcmVib290LmMgYi9hcmNoL2kzODYvbWFjaC12aXN3cy9yZWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTgxZTkwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtdmlzd3MvcmVib290LmMKQEAgLTAsMCArMSw1MSBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgInBpaXg0LmgiCisKK3ZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOworCit2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICogX191bnVzZWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF9zZW5kX3N0b3AoKTsKKyNlbmRpZgorCisJLyoKKwkgKiBWaXN1YWwgV29ya3N0YXRpb25zIHJlc3RhcnQgYWZ0ZXIgdGhpcworCSAqIHJlZ2lzdGVyIGlzIHBva2VkIG9uIHRoZSBQSUlYNAorCSAqLworCW91dGIoUElJWDRfUkVTRVRfVkFMLCBQSUlYNF9SRVNFVF9QT1JUKTsKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX3Jlc3RhcnQpOworCit2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgcG1fc3RhdHVzOworCWV4dGVybiB1bnNpZ25lZCBpbnQgcGNpX2J1czA7CisKKwl3aGlsZSAoKHBtX3N0YXR1cyA9IGludyhQTVNUU19QT1JUKSkgJiAweDEwMCkKKwkJb3V0dyhwbV9zdGF0dXMsIFBNU1RTX1BPUlQpOworCisJb3V0dyhQTV9TVVNQRU5EX0VOQUJMRSwgUE1DTlRSTF9QT1JUKTsKKworCW1kZWxheSgxMCk7CisKKyNkZWZpbmUgUENJX0NPTkYxX0FERFJFU1MoYnVzLCBkZXZmbiwgcmVnKSBcCisJKDB4ODAwMDAwMDAgfCAoYnVzIDw8IDE2KSB8IChkZXZmbiA8PCA4KSB8IChyZWcgJiB+MykpCisKKwlvdXRsKFBDSV9DT05GMV9BRERSRVNTKHBjaV9idXMwLCBTUEVDSUFMX0RFViwgU1BFQ0lBTF9SRUcpLCAweENGOCk7CisJb3V0bChQSUlYX1NQRUNJQUxfU1RPUCwgMHhDRkMpOworfQorCitFWFBPUlRfU1lNQk9MKG1hY2hpbmVfcG93ZXJfb2ZmKTsKKwordm9pZCBtYWNoaW5lX2hhbHQodm9pZCkKK3sKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX2hhbHQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdmlzd3Mvc2V0dXAuYyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2ZDJkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3NldHVwLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiAgVW5tYWludGFpbmVkIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gc3VwcG9ydC4KKyAqICBTcGxpdCBvdXQgZnJvbSBzZXR1cC5jIGJ5IGRhdmVqQHN1c2UuZGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAiY29iYWx0LmgiCisjaW5jbHVkZSAicGlpeDQuaCIKKworY2hhciB2aXN3c19ib2FyZF90eXBlID0gLTE7CitjaGFyIHZpc3dzX2JvYXJkX3JldiA9IC0xOworCit2b2lkIF9faW5pdCB2aXN3c19nZXRfYm9hcmRfdHlwZV9hbmRfcmV2KHZvaWQpCit7CisJaW50IHJhdzsKKworCXZpc3dzX2JvYXJkX3R5cGUgPSAoY2hhcikoaW5iX3AoUElJWF9HUElfQkRfUkVHKSAmIFBJSVhfR1BJX0JEX1JFRykKKwkJCQkJCQkgPj4gUElJWF9HUElfQkRfU0hJRlQ7CisJLyoKKwkgKiBHZXQgQm9hcmQgcmV2LgorCSAqIEZpcnN0LCB3ZSBoYXZlIHRvIGluaXRpYWxpemUgdGhlIDMwNyBwYXJ0IHRvIGFsbG93IHVzIGFjY2VzcworCSAqIHRvIHRoZSBHUElPIHJlZ2lzdGVycy4gIExldCdzIG1hcCB0aGVtIGF0IDB4MGZjMCB3aGljaCBpcyByaWdodAorCSAqIGFmdGVyIHRoZSBQSUlYNCBQTSBzZWN0aW9uLgorCSAqLworCW91dGJfcChTSU9fREVWX1NFTCwgU0lPX0lOREVYKTsKKwlvdXRiX3AoU0lPX0dQX0RFViwgU0lPX0RBVEEpOwkvKiBUYWxrIHRvIEdQSU8gcmVncy4gKi8KKworCW91dGJfcChTSU9fREVWX01TQiwgU0lPX0lOREVYKTsKKwlvdXRiX3AoU0lPX0dQX01TQiwgU0lPX0RBVEEpOwkvKiBNU0Igb2YgR1BJTyBiYXNlIGFkZHJlc3MgKi8KKworCW91dGJfcChTSU9fREVWX0xTQiwgU0lPX0lOREVYKTsKKwlvdXRiX3AoU0lPX0dQX0xTQiwgU0lPX0RBVEEpOwkvKiBMU0Igb2YgR1BJTyBiYXNlIGFkZHJlc3MgKi8KKworCW91dGJfcChTSU9fREVWX0VOQiwgU0lPX0lOREVYKTsKKwlvdXRiX3AoMSwgU0lPX0RBVEEpOwkJLyogRW5hYmxlIEdQSU8gcmVnaXN0ZXJzLiAqLworCisJLyoKKwkgKiBOb3csIHdlIGhhdmUgdG8gbWFwIHRoZSBwb3dlciBtYW5hZ2VtZW50IHNlY3Rpb24gdG8gd3JpdGUKKwkgKiBhIGJpdCB3aGljaCBlbmFibGVzIGFjY2VzcyB0byB0aGUgR1BJTyByZWdpc3RlcnMuCisJICogV2hhdCBsdW5hdGljIGNhbWUgdXAgd2l0aCB0aGlzIHNoaXQ/CisJICovCisJb3V0Yl9wKFNJT19ERVZfU0VMLCBTSU9fSU5ERVgpOworCW91dGJfcChTSU9fUE1fREVWLCBTSU9fREFUQSk7CS8qIFRhbGsgdG8gR1BJTyByZWdzLiAqLworCisJb3V0Yl9wKFNJT19ERVZfTVNCLCBTSU9fSU5ERVgpOworCW91dGJfcChTSU9fUE1fTVNCLCBTSU9fREFUQSk7CS8qIE1TQiBvZiBQTSBiYXNlIGFkZHJlc3MgKi8KKworCW91dGJfcChTSU9fREVWX0xTQiwgU0lPX0lOREVYKTsKKwlvdXRiX3AoU0lPX1BNX0xTQiwgU0lPX0RBVEEpOwkvKiBMU0Igb2YgUE0gYmFzZSBhZGRyZXNzICovCisKKwlvdXRiX3AoU0lPX0RFVl9FTkIsIFNJT19JTkRFWCk7CisJb3V0Yl9wKDEsIFNJT19EQVRBKTsJCS8qIEVuYWJsZSBQTSByZWdpc3RlcnMuICovCisKKwkvKgorCSAqIE5vdywgd3JpdGUgdGhlIFBNIHJlZ2lzdGVyIHdoaWNoIGVuYWJsZXMgdGhlIEdQSU8gcmVnaXN0ZXJzLgorCSAqLworCW91dGJfcChTSU9fUE1fRkVSMiwgU0lPX1BNX0lOREVYKTsKKwlvdXRiX3AoU0lPX1BNX0dQX0VOLCBTSU9fUE1fREFUQSk7CisKKwkvKgorCSAqIE5vdywgaW5pdGlhbGl6ZSB0aGUgR1BJTyByZWdpc3RlcnMuCisJICogV2Ugd2FudCB0aGVtIGFsbCB0byBiZSBpbnB1dHMgd2hpY2ggaXMgdGhlCisJICogcG93ZXIgb24gZGVmYXVsdCwgc28gbGV0J3MgbGVhdmUgdGhlbSBhbG9uZS4KKwkgKiBTbywgbGV0J3MganVzdCByZWFkIHRoZSBib2FyZCByZXYhCisJICovCisJcmF3ID0gaW5iX3AoU0lPX0dQX0RBVEExKTsKKwlyYXcgJj0gMHg3ZjsJLyogNyBiaXRzIG9mIHZhbGlkIGJvYXJkIHJldmlzaW9uIElELiAqLworCisJaWYgKHZpc3dzX2JvYXJkX3R5cGUgPT0gVklTV1NfMzIwKSB7CisJCWlmIChyYXcgPCAweDYpIHsKKwkJCXZpc3dzX2JvYXJkX3JldiA9IDQ7CisJCX0gZWxzZSBpZiAocmF3IDwgMHhjKSB7CisJCQl2aXN3c19ib2FyZF9yZXYgPSA1OworCQl9IGVsc2UgeworCQkJdmlzd3NfYm9hcmRfcmV2ID0gNjsKKwkJfQorCX0gZWxzZSBpZiAodmlzd3NfYm9hcmRfdHlwZSA9PSBWSVNXU181NDApIHsKKwkJCXZpc3dzX2JvYXJkX3JldiA9IDI7CisJCX0gZWxzZSB7CisJCQl2aXN3c19ib2FyZF9yZXYgPSByYXc7CisJCX0KKworCXByaW50ayhLRVJOX0lORk8gIlNpbGljb24gR3JhcGhpY3MgVmlzdWFsIFdvcmtzdGF0aW9uICVzIChyZXYgJWQpIGRldGVjdGVkXG4iLAorCSAgICAgICAodmlzd3NfYm9hcmRfdHlwZSA9PSBWSVNXU18zMjAgPyAiMzIwIiA6CisJICAgICAgICh2aXN3c19ib2FyZF90eXBlID09IFZJU1dTXzU0MCA/ICI1NDAiIDoKKwkJInVua25vd24iKSksIHZpc3dzX2JvYXJkX3Jldik7Cit9CisKK3ZvaWQgX19pbml0IHByZV9pbnRyX2luaXRfaG9vayh2b2lkKQoreworCWluaXRfVklTV1NfQVBJQ19pcnFzKCk7Cit9CisKK3ZvaWQgX19pbml0IGludHJfaW5pdF9ob29rKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJYXBpY19pbnRyX2luaXQoKTsKKyNlbmRpZgorfQorCit2b2lkIF9faW5pdCBwcmVfc2V0dXBfYXJjaF9ob29rKCkKK3sKKwl2aXN3c19nZXRfYm9hcmRfdHlwZV9hbmRfcmV2KCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTAgPSB7CisJLmhhbmRsZXIgPQl0aW1lcl9pbnRlcnJ1cHQsCisJLmZsYWdzID0JU0FfSU5URVJSVVBULAorCS5uYW1lID0JCSJ0aW1lciIsCit9OworCit2b2lkIF9faW5pdCB0aW1lX2luaXRfaG9vayh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlN0YXJ0aW5nIENvYmFsdCBUaW1lciBzeXN0ZW0gY2xvY2tcbiIpOworCisJLyogU2V0IHRoZSBjb3VudGRvd24gdmFsdWUgKi8KKwljb19jcHVfd3JpdGUoQ09fQ1BVX1RJTUVWQUwsIENPX1RJTUVfSFovSFopOworCisJLyogU3RhcnQgdGhlIHRpbWVyICovCisJY29fY3B1X3dyaXRlKENPX0NQVV9DVFJMLCBjb19jcHVfcmVhZChDT19DUFVfQ1RSTCkgfCBDT19DVFJMX1RJTUVSVU4pOworCisJLyogRW5hYmxlICh1bm1hc2spIHRoZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwljb19jcHVfd3JpdGUoQ09fQ1BVX0NUUkwsIGNvX2NwdV9yZWFkKENPX0NQVV9DVFJMKSAmIH5DT19DVFJMX1RJTUVNQVNLKTsKKworCS8qIFdpcmUgY3B1IElEVCBlbnRyeSB0byBzL3cgaGFuZGxlciAoYW5kIENvYmFsdCBBUElDIHRvIElEVCkgKi8KKwlzZXR1cF9pcnEoMCwgJmlycTApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdmlzd3MvdHJhcHMuYyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3RyYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0MzUzOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3RyYXBzLmMKQEAgLTAsMCArMSw2OSBAQAorLyogVklTV1MgdHJhcHMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlICJjb2JhbHQuaCIKKyNpbmNsdWRlICJsaXRoaXVtLmgiCisKKworI2RlZmluZSBBMDEyMzQgKExJX0lOVEFfMCB8IExJX0lOVEFfMSB8IExJX0lOVEFfMiB8IExJX0lOVEFfMyB8IExJX0lOVEFfNCkKKyNkZWZpbmUgQkNEIChMSV9JTlRCIHwgTElfSU5UQyB8IExJX0lOVEQpCisjZGVmaW5lIEFMTERFVlMgKEEwMTIzNCB8IEJDRCkKKworc3RhdGljIF9faW5pdCB2b2lkIGxpdGhpdW1faW5pdCh2b2lkKQoreworCXNldF9maXhtYXAoRklYX0xJX1BDSUEsIExJX1BDSV9BX1BIWVMpOworCXNldF9maXhtYXAoRklYX0xJX1BDSUIsIExJX1BDSV9CX1BIWVMpOworCisJaWYgKChsaV9wY2lhX3JlYWQxNihQQ0lfVkVORE9SX0lEKSAhPSBQQ0lfVkVORE9SX0lEX1NHSSkgfHwKKwkgICAgKGxpX3BjaWFfcmVhZDE2KFBDSV9ERVZJQ0VfSUQpICE9IFBDSV9WRU5ET1JfSURfU0dJX0xJVEhJVU0pKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJMaXRoaXVtIGhvc3RicmlkZ2UgJWMgbm90IGZvdW5kXG4iLCAnQScpOworCQlwYW5pYygiVGhpcyBtYWNoaW5lIGlzIG5vdCBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIDMyMC81NDAiKTsKKwl9CisKKwlpZiAoKGxpX3BjaWJfcmVhZDE2KFBDSV9WRU5ET1JfSUQpICE9IFBDSV9WRU5ET1JfSURfU0dJKSB8fAorCSAgICAobGlfcGNpYl9yZWFkMTYoUENJX0RFVklDRV9JRCkgIT0gUENJX1ZFTkRPUl9JRF9TR0lfTElUSElVTSkpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkxpdGhpdW0gaG9zdGJyaWRnZSAlYyBub3QgZm91bmRcbiIsICdCJyk7CisJCXBhbmljKCJUaGlzIG1hY2hpbmUgaXMgbm90IFNHSSBWaXN1YWwgV29ya3N0YXRpb24gMzIwLzU0MCIpOworCX0KKworCWxpX3BjaWFfd3JpdGUxNihMSV9QQ0lfSU5URU4sIEFMTERFVlMpOworCWxpX3BjaWJfd3JpdGUxNihMSV9QQ0lfSU5URU4sIEFMTERFVlMpOworfQorCitzdGF0aWMgX19pbml0IHZvaWQgY29iYWx0X2luaXQodm9pZCkKK3sKKwkvKgorCSAqIE9uIG5vcm1hbCBTTVAgUEMgdGhpcyBpcyB1c2VkIG9ubHkgd2l0aCBTTVAsIGJ1dCB3ZSBoYXZlIHRvCisJICogdXNlIGl0IGFuZCBzZXQgaXQgdXAgaGVyZSB0byBzdGFydCB0aGUgQ29iYWx0IGNsb2NrCisJICovCisJc2V0X2ZpeG1hcChGSVhfQVBJQ19CQVNFLCBBUElDX0RFRkFVTFRfUEhZU19CQVNFKTsKKwlzZXR1cF9sb2NhbF9BUElDKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTG9jYWwgQVBJQyBWZXJzaW9uICUjbHgsIElEICUjbHhcbiIsCisJCWFwaWNfcmVhZChBUElDX0xWUiksIGFwaWNfcmVhZChBUElDX0lEKSk7CisKKwlzZXRfZml4bWFwKEZJWF9DT19DUFUsIENPX0NQVV9QSFlTKTsKKwlzZXRfZml4bWFwKEZJWF9DT19BUElDLCBDT19BUElDX1BIWVMpOworCXByaW50ayhLRVJOX0lORk8gIkNvYmFsdCBSZXZpc2lvbiAlI2x4LCBBUElDIElEICUjbHhcbiIsCisJCWNvX2NwdV9yZWFkKENPX0NQVV9SRVYpLCBjb19hcGljX3JlYWQoQ09fQVBJQ19JRCkpOworCisJLyogRW5hYmxlIENvYmFsdCBBUElDIGJlaW5nIGNhcmVmdWwgdG8gTk9UIGNoYW5nZSB0aGUgSUQhICovCisJY29fYXBpY193cml0ZShDT19BUElDX0lELCBjb19hcGljX3JlYWQoQ09fQVBJQ19JRCkgfCBDT19BUElDX0VOQUJMRSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJDb2JhbHQgQVBJQyBlbmFibGVkOiBJRCByZWcgJSNseFxuIiwKKwkJY29fYXBpY19yZWFkKENPX0FQSUNfSUQpKTsKK30KKwordm9pZCBfX2luaXQgdHJhcF9pbml0X2hvb2sodm9pZCkKK3sKKwlsaXRoaXVtX2luaXQoKTsKKwljb2JhbHRfaW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdmlzd3Mvdmlzd3NfYXBpYy5jIGIvYXJjaC9pMzg2L21hY2gtdmlzd3Mvdmlzd3NfYXBpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTY1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWFjaC12aXN3cy92aXN3c19hcGljLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKglsaW51eC9hcmNoL2kzODYvbWFjaF92aXN3cy92aXN3c19hcGljLmMKKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTkgQmVudCBIYWdlbWFyaywgSW5nbyBNb2xuYXIKKyAqCisgKiAgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbiBpbnRlcnJ1cHQgY29udHJvbGxlcgorICoKKyAqICBUaGUgQ29iYWx0IHN5c3RlbSBBU0lDIGluIHRoZSBWaXN1YWwgV29ya3N0YXRpb24gY29udGFpbnMgYSAiQ29iYWx0IiBBUElDCisgKiAgd2hpY2ggc2VydmVzIGFzIHRoZSBtYWluIGludGVycnVwdCBjb250cm9sbGVyIGluIHRoZSBzeXN0ZW0uICBOb24tbGVnYWN5CisgKiAgaGFyZHdhcmUgaW4gdGhlIHN5c3RlbSB1c2VzIHRoaXMgY29udHJvbGxlciBkaXJlY3RseS4gIExlZ2FjeSBkZXZpY2VzCisgKiAgYXJlIGNvbm5lY3RlZCB0byB0aGUgUElJWDQgd2hpY2ggaW4gdHVybiBoYXMgaXRzIDgyNTkocykgY29ubmVjdGVkIHRvCisgKiAgYSBvZiB0aGUgQ29iYWx0IEFQSUMgZW50cnkuCisgKgorICogIDA5LzAyLzIwMDAgLSBVcGRhdGVkIGZvciAyLjQgYnkgamJhcm5lc0BzZ2kuY29tCisgKgorICogIDI1LzExLzIwMDIgLSBVcGRhdGVkIGZvciAyLjUgYnkgQW5kcmV5IFBhbmluIDxwYXprZUBvcmJpdGExLnJ1PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaTgyNTkuaD4KKworI2luY2x1ZGUgImNvYmFsdC5oIgorI2luY2x1ZGUgImlycV92ZWN0b3JzLmgiCisKKworc3RhdGljIERFRklORV9TUElOTE9DSyhjb2JhbHRfbG9jayk7CisKKy8qCisgKiBTZXQgdGhlIGdpdmVuIENvYmFsdCBBUElDIFJlZGlyZWN0aW9uIFRhYmxlIGVudHJ5IHRvIHBvaW50CisgKiB0byB0aGUgZ2l2ZW4gSURUIHZlY3Rvci9pbmRleC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNvX2FwaWNfc2V0KGludCBlbnRyeSwgaW50IGlycSkKK3sKKwljb19hcGljX3dyaXRlKENPX0FQSUNfTE8oZW50cnkpLCBDT19BUElDX0xFVkVMIHwgKGlycSArIEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUikpOworCWNvX2FwaWNfd3JpdGUoQ09fQVBJQ19ISShlbnRyeSksIDApOworfQorCisvKgorICogQ29iYWx0IChJTyktQVBJQyBmdW5jdGlvbnMgdG8gaGFuZGxlIFBDSSBkZXZpY2VzLgorICovCitzdGF0aWMgaW5saW5lIGludCBjb19hcGljX2lkZTBfaGFjayh2b2lkKQoreworCWV4dGVybiBjaGFyIHZpc3dzX2JvYXJkX3R5cGU7CisJZXh0ZXJuIGNoYXIgdmlzd3NfYm9hcmRfcmV2OworCisJaWYgKHZpc3dzX2JvYXJkX3R5cGUgPT0gVklTV1NfMzIwICYmIHZpc3dzX2JvYXJkX3JldiA9PSA1KQorCQlyZXR1cm4gNTsKKwlyZXR1cm4gQ09fQVBJQ19JREUwOworfQorCitzdGF0aWMgaW50IGlzX2NvX2FwaWModW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoSVNfQ09fQVBJQyhpcnEpKQorCQlyZXR1cm4gQ09fQVBJQyhpcnEpOworCisJc3dpdGNoIChpcnEpIHsKKwkJY2FzZSAwOiByZXR1cm4gQ09fQVBJQ19DUFU7CisJCWNhc2UgQ09fSVJRX0lERTA6IHJldHVybiBjb19hcGljX2lkZTBfaGFjaygpOworCQljYXNlIENPX0lSUV9JREUxOiByZXR1cm4gQ09fQVBJQ19JREUxOworCQlkZWZhdWx0OiByZXR1cm4gLTE7CisJfQorfQorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBTR0kgQ29iYWx0IChJTy0pQVBJQzoKKyAqLworCitzdGF0aWMgdm9pZCBlbmFibGVfY29iYWx0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWNvX2FwaWNfc2V0KGlzX2NvX2FwaWMoaXJxKSwgaXJxKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9jb2JhbHRfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IGVudHJ5ID0gaXNfY29fYXBpYyhpcnEpOworCisJY29fYXBpY193cml0ZShDT19BUElDX0xPKGVudHJ5KSwgQ09fQVBJQ19NQVNLKTsKKwljb19hcGljX3JlYWQoQ09fQVBJQ19MTyhlbnRyeSkpOworfQorCisvKgorICogImlycSIgcmVhbGx5IGp1c3Qgc2VydmVzIHRvIGlkZW50aWZ5IHRoZSBkZXZpY2UuICBIZXJlIGlzIHdoZXJlIHdlCisgKiBtYXAgdGhpcyB0byB0aGUgQ29iYWx0IEFQSUMgZW50cnkgd2hlcmUgaXQncyBwaHlzaWNhbGx5IHdpcmVkLgorICogVGhpcyBpcyBjYWxsZWQgdmlhIHJlcXVlc3RfaXJxIC0+IHNldHVwX2lycSAtPiBpcnFfZGVzYy0+c3RhcnR1cCgpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9jb2JhbHRfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb2JhbHRfbG9jaywgZmxhZ3MpOworCWlmICgoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MgfCBJUlFfV0FJVElORykpKQorCQlpcnFfZGVzY1tpcnFdLnN0YXR1cyAmPSB+KElSUV9ESVNBQkxFRCB8IElSUV9JTlBST0dSRVNTIHwgSVJRX1dBSVRJTkcpOworCWVuYWJsZV9jb2JhbHRfaXJxKGlycSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29iYWx0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWNrX2NvYmFsdF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvYmFsdF9sb2NrLCBmbGFncyk7CisJZGlzYWJsZV9jb2JhbHRfaXJxKGlycSk7CisJYXBpY193cml0ZShBUElDX0VPSSwgQVBJQ19FSU9fQUNLKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb2JhbHRfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBlbmRfY29iYWx0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29iYWx0X2xvY2ssIGZsYWdzKTsKKwlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKQorCQllbmFibGVfY29iYWx0X2lycShpcnEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvYmFsdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgY29iYWx0X2lycV90eXBlID0geworCS50eXBlbmFtZSA9CSJDb2JhbHQtQVBJQyIsCisJLnN0YXJ0dXAgPQlzdGFydHVwX2NvYmFsdF9pcnEsCisJLnNodXRkb3duID0JZGlzYWJsZV9jb2JhbHRfaXJxLAorCS5lbmFibGUgPQllbmFibGVfY29iYWx0X2lycSwKKwkuZGlzYWJsZSA9CWRpc2FibGVfY29iYWx0X2lycSwKKwkuYWNrID0JCWFja19jb2JhbHRfaXJxLAorCS5lbmQgPQkJZW5kX2NvYmFsdF9pcnEsCit9OworCisKKy8qCisgKiBUaGlzIGlzIHRoZSBQSUlYNC1iYXNlZCA4MjU5IHRoYXQgaXMgd2lyZWQgdXAgaW5kaXJlY3RseSB0byBDb2JhbHQKKyAqIC0tIG5vdCB0aGUgbWFubmVyIGV4cGVjdGVkIGJ5IHRoZSBjb2RlIGluIGk4MjU5LmMuCisgKgorICogdGhlcmUgaXMgYSAnbWFzdGVyJyBwaHlzaWNhbCBpbnRlcnJ1cHQgc291cmNlIHRoYXQgZ2V0cyBzZW50IHRvCisgKiB0aGUgQ1BVLiBCdXQgaW4gdGhlIGNoaXBzZXQgdGhlcmUgYXJlIHZhcmlvdXMgJ3ZpcnR1YWwnIGludGVycnVwdHMKKyAqIHdhaXRpbmcgdG8gYmUgaGFuZGxlZC4gV2UgcmVwcmVzZW50IHRoaXMgdG8gTGludXggdGhyb3VnaCBhICdtYXN0ZXInCisgKiBpbnRlcnJ1cHQgY29udHJvbGxlciB0eXBlLCBhbmQgdGhyb3VnaCBhIHNwZWNpYWwgdmlydHVhbCBpbnRlcnJ1cHQtCisgKiBjb250cm9sbGVyLiBEZXZpY2UgZHJpdmVycyBvbmx5IHNlZSB0aGUgdmlydHVhbCBpbnRlcnJ1cHQgc291cmNlcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3BpaXg0X21hc3Rlcl9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbml0XzgyNTlBKDApOworCisJcmV0dXJuIHN0YXJ0dXBfY29iYWx0X2lycShpcnEpOworfQorCitzdGF0aWMgdm9pZCBlbmRfcGlpeDRfbWFzdGVyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29iYWx0X2xvY2ssIGZsYWdzKTsKKwllbmFibGVfY29iYWx0X2lycShpcnEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvYmFsdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgcGlpeDRfbWFzdGVyX2lycV90eXBlID0geworCS50eXBlbmFtZSA9CSJQSUlYNC1tYXN0ZXIiLAorCS5zdGFydHVwID0Jc3RhcnR1cF9waWl4NF9tYXN0ZXJfaXJxLAorCS5hY2sgPQkJYWNrX2NvYmFsdF9pcnEsCisJLmVuZCA9CQllbmRfcGlpeDRfbWFzdGVyX2lycSwKK307CisKKworc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBwaWl4NF92aXJ0dWFsX2lycV90eXBlID0geworCS50eXBlbmFtZSA9CSJQSUlYNC12aXJ0dWFsIiwKKwkuc3RhcnR1cCA9CXN0YXJ0dXBfODI1OUFfaXJxLAorCS5zaHV0ZG93biA9CWRpc2FibGVfODI1OUFfaXJxLAorCS5lbmFibGUgPQllbmFibGVfODI1OUFfaXJxLAorCS5kaXNhYmxlID0JZGlzYWJsZV84MjU5QV9pcnEsCit9OworCisKKy8qCisgKiBQSUlYNC04MjU5IG1hc3Rlci92aXJ0dWFsIGZ1bmN0aW9ucyB0byBoYW5kbGUgaW50ZXJydXB0IHJlcXVlc3RzCisgKiBmcm9tIGxlZ2FjeSBkZXZpY2VzOiBmbG9wcHksIHBhcmFsbGVsLCBzZXJpYWwsIHJ0Yy4KKyAqCisgKiBOb25lIG9mIHRoZXNlIGdldCBDb2JhbHQgQVBJQyBlbnRyaWVzLCBuZWl0aGVyIGRvIHRoZXkgaGF2ZSBJRFQKKyAqIGVudHJpZXMuIFRoZXNlIGludGVycnVwdHMgYXJlIHB1cmVseSB2aXJ0dWFsIGFuZCBkaXN0cmlidXRlZCBmcm9tCisgKiB0aGUgJ21hc3RlcicgaW50ZXJydXB0IHNvdXJjZTogQ09fSVJRXzgyNTkuCisgKgorICogV2hlbiB0aGUgODI1OSBpbnRlcnJ1cHRzIGl0cyBoYW5kbGVyIGZpZ3VyZXMgb3V0IHdoaWNoIG9mIHRoZXNlCisgKiBkZXZpY2VzIGlzIGludGVycnVwdGluZyBhbmQgZGlzcGF0Y2hlcyB0byBpdHMgaGFuZGxlci4KKyAqCisgKiBDQVJFRlVMOiBkZXZpY2VzIHNlZSB0aGUgJ3ZpcnR1YWwnIGludGVycnVwdCBvbmx5LiBUaHVzIGRpc2FibGUvCisgKiBlbmFibGVfaXJxIGdldHMgdGhlIHJpZ2h0IGlycS4gVGhpcyAnbWFzdGVyJyBpcnEgaXMgbmV2ZXIgZGlyZWN0bHkKKyAqIG1hbmlwdWxhdGVkIGJ5IGFueSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBwaWl4NF9tYXN0ZXJfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlpbnQgcmVhbGlycTsKKwlpcnFfZGVzY190ICpkZXNjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKworCS8qIEZpbmQgb3V0IHdoYXQncyBpbnRlcnJ1cHRpbmcgaW4gdGhlIFBJSVg0IG1hc3RlciA4MjU5ICovCisJb3V0YigweDBjLCAweDIwKTsJCS8qIE9DVzMgUG9sbCBjb21tYW5kICovCisJcmVhbGlycSA9IGluYigweDIwKTsKKworCS8qCisJICogQml0IDcgPT0gMCBtZWFucyBpbnZhbGlkL3NwdXJpb3VzCisJICovCisJaWYgKHVubGlrZWx5KCEocmVhbGlycSAmIDB4ODApKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJcmVhbGlycSAmPSA3OworCisJaWYgKHVubGlrZWx5KHJlYWxpcnEgPT0gMikpIHsKKwkJb3V0YigweDBjLCAweGEwKTsKKwkJcmVhbGlycSA9IGluYigweGEwKTsKKworCQlpZiAodW5saWtlbHkoIShyZWFsaXJxICYgMHg4MCkpKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCXJlYWxpcnEgPSAocmVhbGlycSAmIDcpICsgODsKKwl9CisKKwkvKiBtYXNrIGFuZCBhY2sgaW50ZXJydXB0ICovCisJY2FjaGVkX2lycV9tYXNrIHw9IDEgPDwgcmVhbGlycTsKKwlpZiAodW5saWtlbHkocmVhbGlycSA+IDcpKSB7CisJCWluYigweGExKTsKKwkJb3V0YihjYWNoZWRfc2xhdmVfbWFzaywgMHhhMSk7CisJCW91dGIoMHg2MCArIChyZWFsaXJxICYgNyksIDB4YTApOworCQlvdXRiKDB4NjAgKyAyLCAweDIwKTsKKwl9IGVsc2UgeworCQlpbmIoMHgyMSk7CisJCW91dGIoY2FjaGVkX21hc3Rlcl9tYXNrLCAweDIxKTsKKwkJb3V0YigweDYwICsgcmVhbGlycSwgMHgyMCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKKworCWRlc2MgPSBpcnFfZGVzYyArIHJlYWxpcnE7CisKKwkvKgorCSAqIGhhbmRsZSB0aGlzICd2aXJ0dWFsIGludGVycnVwdCcgYXMgYSBDb2JhbHQgb25lIG5vdy4KKwkgKi8KKwlrc3RhdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKS5pcnFzW3JlYWxpcnFdKys7CisKKwlpZiAobGlrZWx5KGRlc2MtPmFjdGlvbiAhPSBOVUxMKSkKKwkJaGFuZGxlX0lSUV9ldmVudChyZWFsaXJxLCByZWdzLCBkZXNjLT5hY3Rpb24pOworCisJaWYgKCEoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSkKKwkJZW5hYmxlXzgyNTlBX2lycShyZWFsaXJxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1OUFfbG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbWFzdGVyX2FjdGlvbiA9IHsKKwkuaGFuZGxlciA9CXBpaXg0X21hc3Rlcl9pbnRyLAorCS5uYW1lID0JCSJQSUlYNC04MjU5IiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGNhc2NhZGVfYWN0aW9uID0geworCS5oYW5kbGVyID0gCW5vX2FjdGlvbiwKKwkubmFtZSA9CQkiY2FzY2FkZSIsCit9OworCisKK3ZvaWQgaW5pdF9WSVNXU19BUElDX2lycXModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDT19JUlFfQVBJQzAgKyBDT19BUElDX0xBU1QgKyAxOyBpKyspIHsKKwkJaXJxX2Rlc2NbaV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOworCQlpcnFfZGVzY1tpXS5hY3Rpb24gPSAwOworCQlpcnFfZGVzY1tpXS5kZXB0aCA9IDE7CisKKwkJaWYgKGkgPT0gMCkgeworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZjb2JhbHRfaXJxX3R5cGU7CisJCX0KKwkJZWxzZSBpZiAoaSA9PSBDT19JUlFfSURFMCkgeworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZjb2JhbHRfaXJxX3R5cGU7CisJCX0KKwkJZWxzZSBpZiAoaSA9PSBDT19JUlFfSURFMSkgeworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZjb2JhbHRfaXJxX3R5cGU7CisJCX0KKwkJZWxzZSBpZiAoaSA9PSBDT19JUlFfODI1OSkgeworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZwaWl4NF9tYXN0ZXJfaXJxX3R5cGU7CisJCX0KKwkJZWxzZSBpZiAoaSA8IENPX0lSUV9BUElDMCkgeworCQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZwaWl4NF92aXJ0dWFsX2lycV90eXBlOworCQl9CisJCWVsc2UgaWYgKElTX0NPX0FQSUMoaSkpIHsKKwkJCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmY29iYWx0X2lycV90eXBlOworCQl9CisJfQorCisJc2V0dXBfaXJxKENPX0lSUV84MjU5LCAmbWFzdGVyX2FjdGlvbik7CisJc2V0dXBfaXJxKDIsICZjYXNjYWRlX2FjdGlvbik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL01ha2VmaWxlIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRkMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK0VYVFJBX0NGTEFHUwkrPSAtSS4uL2tlcm5lbAorb2JqLXkJCQk6PSBzZXR1cC5vIHZveWFnZXJfYmFzaWMubyB2b3lhZ2VyX3RocmVhZC5vCisKK29iai0kKENPTkZJR19TTVApCSs9IHZveWFnZXJfc21wLm8gdm95YWdlcl9jYXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci9zZXR1cC5jIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMTIzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3NldHVwLmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqCU1hY2hpbmUgc3BlY2lmaWMgc2V0dXAgZm9yIGdlbmVyaWMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKwordm9pZCBfX2luaXQgcHJlX2ludHJfaW5pdF9ob29rKHZvaWQpCit7CisJaW5pdF9JU0FfaXJxcygpOworfQorCisvKgorICogSVJRMiBpcyBjYXNjYWRlIGludGVycnVwdCB0byBzZWNvbmQgaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAqLworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMiA9IHsgbm9fYWN0aW9uLCAwLCBDUFVfTUFTS19OT05FLCAiY2FzY2FkZSIsIE5VTEwsIE5VTEx9OworCit2b2lkIF9faW5pdCBpbnRyX2luaXRfaG9vayh2b2lkKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlzbXBfaW50cl9pbml0KCk7CisjZW5kaWYKKworCWlmICghYWNwaV9pb2FwaWMpCisJCXNldHVwX2lycSgyLCAmaXJxMik7Cit9CisKK3ZvaWQgX19pbml0IHByZV9zZXR1cF9hcmNoX2hvb2sodm9pZCkKK3sKKwkvKiBWb3lhZ2VycyBydW4gdGhlaXIgQ1BVcyBmcm9tIGluZGVwZW5kZW50IGNsb2Nrcywgc28gZGlzYWJsZQorCSAqIHRoZSBUU0MgY29kZSBiZWNhdXNlIHdlIGNhbid0IHN5bmMgdGhlbSAqLworCXRzY19kaXNhYmxlID0gMTsKK30KKwordm9pZCBfX2luaXQgdHJhcF9pbml0X2hvb2sodm9pZCkKK3sKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxMCAgPSB7IHRpbWVyX2ludGVycnVwdCwgU0FfSU5URVJSVVBULCBDUFVfTUFTS19OT05FLCAidGltZXIiLCBOVUxMLCBOVUxMfTsKKwordm9pZCBfX2luaXQgdGltZV9pbml0X2hvb2sodm9pZCkKK3sKKwlzZXR1cF9pcnEoMCwgJmlycTApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfYmFzaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDJhZWEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OSwyMDAxIAorICoKKyAqIEF1dGhvcjogSi5FLkouQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbQorICoKKyAqIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvdm95YWdlci5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgdm95YWdlciBzcGVjaWZpYyByb3V0aW5lcyBmb3IgZ2V0dGluZworICogaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFyY2hpdGVjdHVyZSB0byBmdW5jdGlvbi4gIEZvciBhZGRpdGlvbmFsCisgKiBmZWF0dXJlcyBzZWU6CisgKgorICoJdm95YWdlcl9jYXQuYyAtIFZveWFnZXIgQ0FUIGJ1cyBpbnRlcmZhY2UKKyAqCXZveWFnZXJfc21wLmMgLSBWb3lhZ2VyIFNNUCBoYWwgKGVtdWxhdGVzIGxpbnV4IHNtcC5jKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdm95YWdlci5oPgorI2luY2x1ZGUgPGFzbS92aWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisKKy8qCisgKiBQb3dlciBvZmYgZnVuY3Rpb24sIGlmIGFueQorICovCit2b2lkICgqcG1fcG93ZXJfb2ZmKSh2b2lkKTsKKworaW50IHZveWFnZXJfbGV2ZWwgPSAwOworCitzdHJ1Y3Qgdm95YWdlcl9TVVMgKnZveWFnZXJfU1VTID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyB2b2lkCit2b3lhZ2VyX2R1bXAoaW50IGR1bW15MSwgc3RydWN0IHB0X3JlZ3MgKmR1bW15Miwgc3RydWN0IHR0eV9zdHJ1Y3QgKmR1bW15MykKK3sKKwkvKiBnZXQgaGVyZSB2aWEgYSBzeXNycSAqLworCXZveWFnZXJfc21wX2R1bXAoKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfdm95YWdlcl9kdW1wX29wID0geworCS5oYW5kbGVyCT0gdm95YWdlcl9kdW1wLAorCS5oZWxwX21zZwk9ICJWb3lhZ2VyIiwKKwkuYWN0aW9uX21zZwk9ICJEdW1wIFZveWFnZXIgU3RhdHVzIiwKK307CisjZW5kaWYKKwordm9pZAordm95YWdlcl9kZXRlY3Qoc3RydWN0IHZveWFnZXJfYmlvc19pbmZvICpiaW9zKQoreworCWlmKGJpb3MtPmxlbiAhPSAweGZmKSB7CisJCWludCBjbGFzcyA9IChiaW9zLT5jbGFzc18xIDw8IDgpIAorCQkJfCAoYmlvcy0+Y2xhc3NfMiAmIDB4ZmYpOworCisJCXByaW50aygiVm95YWdlciBTeXN0ZW0gZGV0ZWN0ZWQuXG4iCisJCSAgICAgICAiICAgICAgICBDbGFzcyAleCwgUmV2aXNpb24gJWQuJWRcbiIsCisJCSAgICAgICBjbGFzcywgYmlvcy0+bWFqb3IsIGJpb3MtPm1pbm9yKTsKKwkJaWYoY2xhc3MgPT0gVk9ZQUdFUl9MRVZFTDQpIAorCQkJdm95YWdlcl9sZXZlbCA9IDQ7CisJCWVsc2UgaWYoY2xhc3MgPCBWT1lBR0VSX0xFVkVMNV9BTkRfQUJPVkUpCisJCQl2b3lhZ2VyX2xldmVsID0gMzsKKwkJZWxzZQorCQkJdm95YWdlcl9sZXZlbCA9IDU7CisJCXByaW50aygiICAgICAgICBBcmNoaXRlY3R1cmUgTGV2ZWwgJWRcbiIsIHZveWFnZXJfbGV2ZWwpOworCQlpZih2b3lhZ2VyX2xldmVsIDwgNCkKKwkJCXByaW50aygiXG4qKldBUk5JTkcqKjogVm95YWdlciBIQUwgb25seSBzdXBwb3J0cyBMZXZlbHMgNCBhbmQgNSBBcmNoaXRlY3R1cmVzIGF0IHRoZSBtb21lbnRcblxuIik7CisJCS8qIGluc3RhbGwgdGhlIHBvd2VyIG9mZiBoYW5kbGVyICovCisJCXBtX3Bvd2VyX29mZiA9IHZveWFnZXJfcG93ZXJfb2ZmOworI2lmZGVmIENPTkZJR19TTVAKKwkJcmVnaXN0ZXJfc3lzcnFfa2V5KCd2JywgJnN5c3JxX3ZveWFnZXJfZHVtcF9vcCk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlwcmludGsoIlxuXG4qKldBUk5JTkcqKjogTm8gVm95YWdlciBTdWJzeXN0ZW0gRm91bmRcbiIpOworCX0KK30KKwordm9pZAordm95YWdlcl9zeXN0ZW1faW50ZXJydXB0KGludCBjcGwsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHJpbnRrKCJWb3lhZ2VyOiBkZXRlY3RlZCBzeXN0ZW0gaW50ZXJydXB0XG4iKTsKK30KKworLyogUm91dGluZSB0byByZWFkIGluZm9ybWF0aW9uIGZyb20gdGhlIGV4dGVuZGVkIENNT1MgYXJlYSAqLworX191OAordm95YWdlcl9leHRlbmRlZF9jbW9zX3JlYWQoX191MTYgYWRkcikKK3sKKwlvdXRiKGFkZHIgJiAweGZmLCAweDc0KTsKKwlvdXRiKChhZGRyID4+IDgpICYgMHhmZiwgMHg3NSk7CisJcmV0dXJuIGluYigweDc2KTsKK30KKworLyogaW50ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBTVVMgQ2xpY2sgTWFwIG9mIG1lbW9yeSAqLworCisjZGVmaW5lIENMSUNLX0VOVFJJRVMJMTYKKyNkZWZpbmUgQ0xJQ0tfU0laRQk0MDk2CS8qIGNsaWNrIHRvIGJ5dGUgY29udmVyc2lvbiBmb3IgTGVuZ3RoICovCisKK3R5cGVkZWYgc3RydWN0IENsaWNrTWFwIHsKKwlzdHJ1Y3QgRW50cnkgeworCQlfX3UzMglBZGRyZXNzOworCQlfX3UzMglMZW5ndGg7CisJfSBFbnRyeVtDTElDS19FTlRSSUVTXTsKK30gQ2xpY2tNYXBfdDsKKworCisvKiBUaGlzIHJvdXRpbmUgaXMgcHJldHR5IG11Y2ggYW4gYXdmdWwgaGFjayB0byByZWFkIHRoZSBiaW9zIGNsaWNrbWFwIGJ5CisgKiBtYXBwaW5nIGl0IGludG8gcGFnZSAwLiAgVGhlcmUgYXJlIHVzdWFsbHkgdGhyZWUgcmVnaW9ucyBpbiB0aGUgbWFwOgorICogCUJhc2UgTWVtb3J5CisgKiAJRXh0ZW5kZWQgTWVtb3J5CisgKgl6ZXJvIGxlbmd0aCBtYXJrZXIgZm9yIGVuZCBvZiBtYXAKKyAqCisgKiBSZXR1cm5zIGFyZSAwIGZvciBmYWlsdXJlIGFuZCAxIGZvciBzdWNjZXNzIG9uIGV4dHJhY3RpbmcgcmVnaW9uLgorICovCitpbnQgX19pbml0Cit2b3lhZ2VyX21lbW9yeV9kZXRlY3QoaW50IHJlZ2lvbiwgX191MzIgKnN0YXJ0LCBfX3UzMiAqbGVuZ3RoKQoreworCWludCBpOworCWludCByZXR2YWwgPSAwOworCV9fdTggY21vc1s0XTsKKwlDbGlja01hcF90ICptYXA7CisJdW5zaWduZWQgbG9uZyBtYXBfYWRkcjsKKwl1bnNpZ25lZCBsb25nIG9sZDsKKworCWlmKHJlZ2lvbiA+PSBDTElDS19FTlRSSUVTKSB7CisJCXByaW50aygiVm95YWdlcjogSWxsZWdhbCBDbGlja01hcCByZWdpb24gJWRcbiIsIHJlZ2lvbik7CisJCXJldHVybiAwOworCX0KKworCWZvcihpID0gMDsgaSA8IHNpemVvZihjbW9zKTsgaSsrKQorCQljbW9zW2ldID0gdm95YWdlcl9leHRlbmRlZF9jbW9zX3JlYWQoVk9ZQUdFUl9NRU1PUllfQ0xJQ0tNQVAgKyBpKTsKKworCW1hcF9hZGRyID0gKih1bnNpZ25lZCBsb25nICopY21vczsKKworCS8qIHN0ZWFsIHBhZ2UgMCBmb3IgdGhpcyAqLworCW9sZCA9IHBnMFswXTsKKwlwZzBbMF0gPSAoKG1hcF9hZGRyICYgUEFHRV9NQVNLKSB8IF9QQUdFX1JXIHwgX1BBR0VfUFJFU0VOVCk7CisJbG9jYWxfZmx1c2hfdGxiKCk7CisJLyogbm93IGNsZWFyIGV2ZXJ5dGhpbmcgb3V0IGJ1dCBwYWdlIDAgKi8KKwltYXAgPSAoQ2xpY2tNYXBfdCAqKShtYXBfYWRkciAmICh+UEFHRV9NQVNLKSk7CisKKwkvKiB6ZXJvIGxlbmd0aCBpcyB0aGUgZW5kIG9mIHRoZSBjbGlja21hcCAqLworCWlmKG1hcC0+RW50cnlbcmVnaW9uXS5MZW5ndGggIT0gMCkgeworCQkqbGVuZ3RoID0gbWFwLT5FbnRyeVtyZWdpb25dLkxlbmd0aCAqIENMSUNLX1NJWkU7CisJCSpzdGFydCA9IG1hcC0+RW50cnlbcmVnaW9uXS5BZGRyZXNzOworCQlyZXR2YWwgPSAxOworCX0KKworCS8qIHJlcGxhY2UgdGhlIG1hcHBpbmcgKi8KKwlwZzBbMF0gPSBvbGQ7CisJbG9jYWxfZmx1c2hfdGxiKCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogdm95YWdlciBzcGVjaWZpYyBoYW5kbGluZyBjb2RlIGZvciB0aW1lciBpbnRlcnJ1cHRzLiAgVXNlZCB0byBoYW5kCisgKiBvZmYgdGhlIHRpbWVyIHRpY2sgdG8gdGhlIFNNUCBjb2RlLCBzaW5jZSB0aGUgVklDIGRvZXNuJ3QgaGF2ZSBhbgorICogaW50ZXJuYWwgdGltZXIgKFRoZSBRSUMgZG9lcywgYnV0IHRoYXQncyBhbm90aGVyIHN0b3J5KS4gKi8KK3ZvaWQKK3ZveWFnZXJfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmKChqaWZmaWVzICYgMHgzZmYpID09IDApIHsKKworCQkvKiBUaGVyZSBzZWVtcyB0byBiZSBzb21ldGhpbmcgZmxha3kgaW4gZWl0aGVyCisJCSAqIGhhcmR3YXJlIG9yIHNvZnR3YXJlIHRoYXQgaXMgcmVzZXR0aW5nIHRoZSB0aW1lciAwCisJCSAqIGNvdW50IHRvIHNvbWV0aGluZyBtdWNoIGhpZ2hlciB0aGFuIGl0IHNob3VsZCBiZQorCQkgKiBUaGlzIHNlZW1zIHRvIG9jY3VyIGluIHRoZSBib290IHNlcXVlbmNlLCBqdXN0CisJCSAqIGJlZm9yZSByb290IGlzIG1vdW50ZWQuICBUaGVyZWZvcmUsIGV2ZXJ5IDEwCisJCSAqIHNlY29uZHMgb3Igc28sIHdlIHNhbml0eSBjaGVjayB0aGUgdGltZXIgemVybyBjb3VudAorCQkgKiBhbmQga2ljayBpdCBiYWNrIHRvIHdoZXJlIGl0IHNob3VsZCBiZS4KKwkJICoKKwkJICogRklYTUU6IFRoaXMgaXMgdGhlIG1vc3QgYXdmdWwgaGFjayB5ZXQgc2Vlbi4gIEkKKwkJICogc2hvdWxkIHdvcmsgb3V0IGV4YWN0bHkgd2hhdCBpcyBpbnRlcmZlcmluZyB3aXRoCisJCSAqIHRoZSB0aW1lciBjb3VudCBzZXR0aW5ncyBlYXJseSBpbiB0aGUgYm9vdCBzZXF1ZW5jZQorCQkgKiBhbmQgc3dpZnRseSBpbnRyb2R1Y2UgaXQgdG8gc29tZXRoaW5nIHNoYXJwIGFuZAorCQkgKiBwb2ludHkuICAqLworCQlfX3UxNiB2YWw7CisJCWV4dGVybiBzcGlubG9ja190IGk4MjUzX2xvY2s7CisKKwkJc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKKwkJCisJCW91dGJfcCgweDAwLCAweDQzKTsKKwkJdmFsID0gaW5iX3AoMHg0MCk7CisJCXZhbCB8PSBpbmIoMHg0MCkgPDwgODsKKwkJc3Bpbl91bmxvY2soJmk4MjUzX2xvY2spOworCisJCWlmKHZhbCA+IExBVENIKSB7CisJCQlwcmludGsoIlxuVk9ZQUdFUjogY291bnRkb3duIHRpbWVyIHZhbHVlIHRvbyBoaWdoICglZCksIHJlc2V0dGluZ1xuXG4iLCB2YWwpOworCQkJc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKKwkJCW91dGIoMHgzNCwweDQzKTsKKwkJCW91dGJfcChMQVRDSCAmIDB4ZmYgLCAweDQwKTsJLyogTFNCICovCisJCQlvdXRiKExBVENIID4+IDggLCAweDQwKTsJLyogTVNCICovCisJCQlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7CisJCX0KKwl9CisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF92aWNfdGltZXJfaW50ZXJydXB0KHJlZ3MpOworI2VuZGlmCit9CisKK3ZvaWQKK3ZveWFnZXJfcG93ZXJfb2ZmKHZvaWQpCit7CisJcHJpbnRrKCJWT1lBR0VSIFBvd2VyIE9mZlxuIik7CisKKwlpZih2b3lhZ2VyX2xldmVsID09IDUpIHsKKwkJdm95YWdlcl9jYXRfcG93ZXJfb2ZmKCk7CisJfSBlbHNlIGlmKHZveWFnZXJfbGV2ZWwgPT0gNCkgeworCQkvKiBUaGlzIGRvZXNuJ3QgYXBwYXJlbnRseSB3b3JrIG9uIG1vc3QgTDQgbWFjaGluZXMsCisJCSAqIGJ1dCB0aGUgc3BlY3Mgc2F5IHRvIGRvIHRoaXMgdG8gZ2V0IGF1dG9tYXRpYyBwb3dlcgorCQkgKiBvZmYuICBVbmZvcnR1bmF0ZWx5LCBpZiBpdCBkb2Vzbid0IHBvd2VyIG9mZiB0aGUKKwkJICogbWFjaGluZSwgaXQgZW5kcyB1cCBkb2luZyBhIGNvbGQgcmVzdGFydCwgd2hpY2gKKwkJICogaXNuJ3QgcmVhbGx5IGludGVuZGVkLCBzbyBjb21tZW50IG91dCB0aGUgY29kZSAqLworI2lmIDAKKwkJaW50IHBvcnQ7CisKKwkgIAorCQkvKiBlbmFibGUgdGhlIHZveWFnZXIgQ29uZmlndXJhdGlvbiBTcGFjZSAqLworCQlvdXRiKChpbmIoVk9ZQUdFUl9NQ19TRVRVUCkgJiAweGYwKSB8IDB4OCwgCisJCSAgICAgVk9ZQUdFUl9NQ19TRVRVUCk7CisJCS8qIHRoZSBwb3J0IGZvciB0aGUgcG93ZXIgb2ZmIGZsYWcgaXMgYW4gb2Zmc2V0IGZyb20gdGhlCisJCSAgIGZsb2F0aW5nIGJhc2UgKi8KKwkJcG9ydCA9IChpbmIoVk9ZQUdFUl9TU1BCX1JFTE9DQVRJT05fUE9SVCkgPDwgOCkgKyAweDIxOworCQkvKiBzZXQgdGhlIHBvd2VyIG9mZiBmbGFnICovCisJCW91dGIoaW5iKHBvcnQpIHwgMHgxLCBwb3J0KTsKKyNlbmRpZgorCX0KKwkvKiBhbmQgd2FpdCBmb3IgaXQgdG8gaGFwcGVuICovCisJZm9yKDs7KSB7CisJCV9fYXNtKCJjbGkiKTsKKwkJX19hc20oImhsdCIpOworCX0KK30KKworLyogY29waWVkIGZyb20gcHJvY2Vzcy5jICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2tiX3dhaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPDB4MTAwMDA7IGkrKykKKwkJaWYgKChpbmJfcCgweDY0KSAmIDB4MDIpID09IDApCisJCQlicmVhazsKK30KKwordm9pZAorbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNtZCkKK3sKKwlwcmludGsoIlZveWFnZXIgV2FybSBSZXN0YXJ0XG4iKTsKKwlrYl93YWl0KCk7CisKKwlpZih2b3lhZ2VyX2xldmVsID09IDUpIHsKKwkJLyogd3JpdGUgbWFnaWMgdmFsdWVzIHRvIHRoZSBSVEMgdG8gaW5mb3JtIHN5c3RlbSB0aGF0CisJCSAqIHNodXRkb3duIGlzIGJlZ2lubmluZyAqLworCQlvdXRiKDB4OGYsIDB4NzApOworCQlvdXRiKDB4NSAsIDB4NzEpOworCQkKKwkJdWRlbGF5KDUwKTsKKwkJb3V0YigweGZlLDB4NjQpOyAgICAgICAgIC8qIHB1bGwgcmVzZXQgbG93ICovCisJfSBlbHNlIGlmKHZveWFnZXJfbGV2ZWwgPT0gNCkgeworCQlfX3UxNiBjYXRiYXNlID0gaW5iKFZPWUFHRVJfU1NQQl9SRUxPQ0FUSU9OX1BPUlQpPDw4OworCQlfX3U4IGJhc2ViZCA9IGluYihWT1lBR0VSX01DX1NFVFVQKTsKKwkJCisJCW91dGIoYmFzZWJkIHwgMHgwOCwgVk9ZQUdFUl9NQ19TRVRVUCk7CisJCW91dGIoMHgwMiwgY2F0YmFzZSArIDB4MjEpOworCX0KKwlmb3IoOzspIHsKKwkJYXNtKCJjbGkiKTsKKwkJYXNtKCJobHQiKTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0wobWFjaGluZV9yZXN0YXJ0KTsKKwordm9pZAorbWNhX25taV9ob29rKHZvaWQpCit7CisJX191OCBkdW1wdmFsIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gaW5iKDB4ZjgyMyk7CisJX191OCBzd25taSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IGluYigweGY4MTMpOworCisJLyogRklYTUU6IGFzc3VtZSBkdW1wIHN3aXRjaCBwcmVzc2VkICovCisJLyogY2hlY2sgdG8gc2VlIGlmIHRoZSBkdW1wIHN3aXRjaCB3YXMgcHJlc3NlZCAqLworCVZERUJVRygoIlZPWUFHRVI6IGR1bXB2YWwgPSAweCV4LCBzd25taSA9IDB4JXhcbiIsIGR1bXB2YWwsIHN3bm1pKSk7CisJLyogY2xlYXIgc3dubWkgKi8KKwlvdXRiKDB4ZmYsIDB4ZjgxMyk7CisJLyogdGVsbCBTVVMgdG8gaWdub3JlIGR1bXAgKi8KKwlpZih2b3lhZ2VyX2xldmVsID09IDUgJiYgdm95YWdlcl9TVVMgIT0gTlVMTCkgeworCQlpZih2b3lhZ2VyX1NVUy0+U1VTX21ib3ggPT0gVk9ZQUdFUl9EVU1QX0JVVFRPTl9OTUkpIHsKKwkJCXZveWFnZXJfU1VTLT5rZXJuZWxfbWJveCA9IFZPWUFHRVJfTk9fQ09NTUFORDsKKwkJCXZveWFnZXJfU1VTLT5rZXJuZWxfZmxhZ3MgfD0gVk9ZQUdFUl9PU19JTl9QUk9HUkVTUzsKKwkJCXVkZWxheSgxMDAwKTsKKwkJCXZveWFnZXJfU1VTLT5rZXJuZWxfbWJveCA9IFZPWUFHRVJfSUdOT1JFX0RVTVA7CisJCQl2b3lhZ2VyX1NVUy0+a2VybmVsX2ZsYWdzICY9IH5WT1lBR0VSX09TX0lOX1BST0dSRVNTOworCQl9CisJfQorCXByaW50ayhLRVJOX0VSUiAiVk9ZQUdFUjogRHVtcCBzd2l0Y2ggcHJlc3NlZCwgcHJpbnRpbmcgQ1BVJWQgdHJhY2ViYWNrc1xuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlzaG93X3N0YWNrKE5VTEwsIE5VTEwpOworCXNob3dfc3RhdGUoKTsKK30KKworCisKK3ZvaWQKK21hY2hpbmVfaGFsdCh2b2lkKQoreworCS8qIHRyZWF0IGEgaGFsdCBsaWtlIGEgcG93ZXIgb2ZmICovCisJbWFjaGluZV9wb3dlcl9vZmYoKTsKK30KKworRVhQT1JUX1NZTUJPTChtYWNoaW5lX2hhbHQpOworCit2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCit7CisJaWYgKHBtX3Bvd2VyX29mZikKKwkJcG1fcG93ZXJfb2ZmKCk7Cit9CisKK0VYUE9SVF9TWU1CT0wobWFjaGluZV9wb3dlcl9vZmYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2NhdC5jIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2NhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOTY3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfY2F0LmMKQEAgLTAsMCArMSwxMTc4IEBACisvKiAtKi0gbW9kZTogYzsgYy1iYXNpYy1vZmZzZXQ6IDggLSotICovCisKKy8qIENvcHlyaWdodCAoQykgMTk5OSwyMDAxCisgKgorICogQXV0aG9yOiBKLkUuSi5Cb3R0b21sZXlASGFuc2VuUGFydG5lcnNoaXAuY29tCisgKgorICogbGludXgvYXJjaC9pMzg2L2tlcm5lbC92b3lhZ2VyX2NhdC5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgbG9naWMgZm9yIG1hbmlwdWxhdGluZyB0aGUgQ0FUIGJ1cworICogaW4gYSBsZXZlbCA1IG1hY2hpbmUuCisgKgorICogVGhlIENBVCBidXMgaXMgYSBzZXJpYWwgY29uZmlndXJhdGlvbiBhbmQgdGVzdCBidXMuICBJdHMgcHJpbWFyeQorICogdXNlcyBhcmUgdG8gcHJvYmUgdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgc3lzdGVtIGFuZCB0bworICogZGlhZ25vc2UgZXJyb3IgY29uZGl0aW9ucyB3aGVuIGEgc3lzdGVtIGludGVycnVwdCBvY2N1cnMuICBUaGUgbG93CisgKiBsZXZlbCBpbnRlcmZhY2UgaXMgZmFpcmx5IHByaW1pdGl2ZSwgc28gbW9zdCBvZiB0aGlzIGZpbGUgY29uc2lzdHMKKyAqIG9mIGJpdCBzaGlmdCBtYW5pcHVsYXRpb25zIHRvIHNlbmQgYW5kIHJlY2VpdmUgcGFja2V0cyBvbiB0aGUKKyAqIHNlcmlhbCBidXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL3ZveWFnZXIuaD4KKyNpbmNsdWRlIDxhc20vdmljLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaWZkZWYgVk9ZQUdFUl9DQVRfREVCVUcKKyNkZWZpbmUgQ0RFQlVHKHgpCXByaW50ayB4CisjZWxzZQorI2RlZmluZSBDREVCVUcoeCkKKyNlbmRpZgorCisvKiB0aGUgQ0FUIGNvbW1hbmQgcG9ydCAqLworI2RlZmluZSBDQVRfQ01ECQkoc3NwYiArIDB4ZSkKKy8qIHRoZSBDQVQgZGF0YSBwb3J0ICovCisjZGVmaW5lIENBVF9EQVRBCShzc3BiICsgMHhkKQorCisvKiB0aGUgaW50ZXJuYWwgY2F0IGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgY2F0X3BhY2soX191OCAqbXNnLCBfX3UxNiBzdGFydF9iaXQsIF9fdTggKmRhdGEsIAorCQkgICAgIF9fdTE2IG51bV9iaXRzKTsKK3N0YXRpYyB2b2lkIGNhdF91bnBhY2soX191OCAqbXNnLCBfX3UxNiBzdGFydF9iaXQsIF9fdTggKmRhdGEsCisJCSAgICAgICBfX3UxNiBudW1fYml0cyk7CitzdGF0aWMgdm9pZCBjYXRfYnVpbGRfaGVhZGVyKF9fdTggKmhlYWRlciwgY29uc3QgX191MTYgbGVuLCAKKwkJCSAgICAgY29uc3QgX191MTYgc21hbGxlc3RfcmVnX2JpdHMsCisJCQkgICAgIGNvbnN0IF9fdTE2IGxvbmdlc3RfcmVnX2JpdHMpOworc3RhdGljIGludCBjYXRfc2VuZGluc3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwLAorCQkJX191OCByZWcsIF9fdTggb3ApOworc3RhdGljIGludCBjYXRfZ2V0ZGF0YSh2b3lhZ2VyX21vZHVsZV90ICptb2RwLCB2b3lhZ2VyX2FzaWNfdCAqYXNpY3AsCisJCSAgICAgICBfX3U4IHJlZywgX191OCAqdmFsdWUpOworc3RhdGljIGludCBjYXRfc2hpZnRvdXQoX191OCAqZGF0YSwgX191MTYgZGF0YV9ieXRlcywgX191MTYgaGVhZGVyX2J5dGVzLAorCQkJX191OCBwYWRfYml0cyk7CitzdGF0aWMgaW50IGNhdF93cml0ZSh2b3lhZ2VyX21vZHVsZV90ICptb2RwLCB2b3lhZ2VyX2FzaWNfdCAqYXNpY3AsIF9fdTggcmVnLAorCQkgICAgIF9fdTggdmFsdWUpOworc3RhdGljIGludCBjYXRfcmVhZCh2b3lhZ2VyX21vZHVsZV90ICptb2RwLCB2b3lhZ2VyX2FzaWNfdCAqYXNpY3AsIF9fdTggcmVnLAorCQkgICAgX191OCAqdmFsdWUpOworc3RhdGljIGludCBjYXRfc3VicmVhZCh2b3lhZ2VyX21vZHVsZV90ICptb2RwLCB2b3lhZ2VyX2FzaWNfdCAqYXNpY3AsCisJCSAgICAgICBfX3UxNiBvZmZzZXQsIF9fdTE2IGxlbiwgdm9pZCAqYnVmKTsKK3N0YXRpYyBpbnQgY2F0X3NlbmRkYXRhKHZveWFnZXJfbW9kdWxlX3QgKm1vZHAsIHZveWFnZXJfYXNpY190ICphc2ljcCwKKwkJCV9fdTggcmVnLCBfX3U4IHZhbHVlKTsKK3N0YXRpYyBpbnQgY2F0X2Rpc2Nvbm5lY3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwKTsKK3N0YXRpYyBpbnQgY2F0X2Nvbm5lY3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwKTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK2NhdF9tb2R1bGVfbmFtZShpbnQgbW9kdWxlX2lkKQoreworCXN3aXRjaChtb2R1bGVfaWQpIHsKKwljYXNlIDB4MTA6CisJCXJldHVybiAiUHJvY2Vzc29yIFNsb3QgMCI7CisJY2FzZSAweDExOgorCQlyZXR1cm4gIlByb2Nlc3NvciBTbG90IDEiOworCWNhc2UgMHgxMjoKKwkJcmV0dXJuICJQcm9jZXNzb3IgU2xvdCAyIjsKKwljYXNlIDB4MTM6CisJCXJldHVybiAiUHJvY2Vzc29yIFNsb3QgNCI7CisJY2FzZSAweDE0OgorCQlyZXR1cm4gIk1lbW9yeSBTbG90IDAiOworCWNhc2UgMHgxNToKKwkJcmV0dXJuICJNZW1vcnkgU2xvdCAxIjsKKwljYXNlIDB4MTg6CisJCXJldHVybiAiUHJpbWFyeSBNaWNyb2NoYW5uZWwiOworCWNhc2UgMHgxOToKKwkJcmV0dXJuICJTZWNvbmRhcnkgTWljcm9jaGFubmVsIjsKKwljYXNlIDB4MWE6CisJCXJldHVybiAiUG93ZXIgU3VwcGx5IEludGVyZmFjZSI7CisJY2FzZSAweDFjOgorCQlyZXR1cm4gIlByb2Nlc3NvciBTbG90IDUiOworCWNhc2UgMHgxZDoKKwkJcmV0dXJuICJQcm9jZXNzb3IgU2xvdCA2IjsKKwljYXNlIDB4MWU6CisJCXJldHVybiAiUHJvY2Vzc29yIFNsb3QgNyI7CisJY2FzZSAweDFmOgorCQlyZXR1cm4gIlByb2Nlc3NvciBTbG90IDgiOworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5rbm93biBNb2R1bGUiOworCX0KK30KKworc3RhdGljIGludCBzc3BiID0gMDsJCS8qIHN0b3JlcyB0aGUgc3VwZXIgcG9ydCBsb2NhdGlvbiAqLworaW50IHZveWFnZXJfOHNsb3QgPSAwOwkJLyogc2V0IHRvIHRydWUgaWYgYSA1MXh4IG1vbnN0ZXIgKi8KKwordm95YWdlcl9tb2R1bGVfdCAqdm95YWdlcl9jYXRfbGlzdDsKKworLyogdGhlIEkvTyBwb3J0IGFzc2lnbm1lbnRzIGZvciB0aGUgVklDIGFuZCBRSUMgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdmljX3JlcyA9IHsKKwkiVm95YWdlciBJbnRlcnJ1cHQgQ29udHJvbGxlciIsIDB4RkMwMCwgMHhGQzZGIH07CitzdGF0aWMgc3RydWN0IHJlc291cmNlIHFpY19yZXMgPSB7CisJIlF1YWQgSW50ZXJydXB0IENvbnRyb2xsZXIiLCAweEZDNzAsIDB4RkNGRiB9OworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFjayBhIGRhdGEgYml0IHN0cmVhbSBpbnNpZGUgYSBtZXNzYWdlLgorICogSXQgd3JpdGVzIG51bV9iaXRzIG9mIHRoZSBkYXRhIGJ1ZmZlciBpbiBtc2cgc3RhcnRpbmcgYXQgc3RhcnRfYml0LgorICogTm90ZTogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYW55IHVudXNlZCBiaXQgaW4gdGhlIGRhdGEgc3RyZWFtCisgKiBpcyBzZXQgdG8gemVybyBzbyB0aGF0IHRoZSBvcnMgd2lsbCB3b3JrIGNvcnJlY3RseSAqLworI2RlZmluZSBCSVRTX1BFUl9CWVRFIDgKK3N0YXRpYyB2b2lkCitjYXRfcGFjayhfX3U4ICptc2csIGNvbnN0IF9fdTE2IHN0YXJ0X2JpdCwgX191OCAqZGF0YSwgY29uc3QgX191MTYgbnVtX2JpdHMpCit7CisJLyogY29tcHV0ZSBpbml0aWFsIHNoaWZ0IG5lZWRlZCAqLworCWNvbnN0IF9fdTE2IG9mZnNldCA9IHN0YXJ0X2JpdCAlIEJJVFNfUEVSX0JZVEU7CisJX191MTYgbGVuID0gbnVtX2JpdHMgLyBCSVRTX1BFUl9CWVRFOworCV9fdTE2IGJ5dGUgPSBzdGFydF9iaXQgLyBCSVRTX1BFUl9CWVRFOworCV9fdTE2IHJlc2lkdWUgPSAobnVtX2JpdHMgJSBCSVRTX1BFUl9CWVRFKSArIG9mZnNldDsKKwlpbnQgaTsKKworCS8qIGFkanVzdCBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBhIGJ5dGUgb2YgcmVzaWR1ZSAqLworCWlmKHJlc2lkdWUgPj0gQklUU19QRVJfQllURSkgeworCQlyZXNpZHVlIC09IEJJVFNfUEVSX0JZVEU7CisJCWxlbisrOworCX0KKworCS8qIGNsZWFyIG91dCB0aGUgYml0cy4gIFdlIGFzc3VtZSBoZXJlIHRoYXQgaWYgbGVuPT0wIHRoZW4KKwkgKiByZXNpZHVlID49IG9mZnNldC4gIFRoaXMgaXMgYWx3YXlzIHRydWUgZm9yIHRoZSBjYXRidXMKKwkgKiBvcGVyYXRpb25zICovCisJbXNnW2J5dGVdICY9IDB4ZmYgPDwgKEJJVFNfUEVSX0JZVEUgLSBvZmZzZXQpOyAKKwltc2dbYnl0ZSsrXSB8PSBkYXRhWzBdID4+IG9mZnNldDsKKwlpZihsZW4gPT0gMCkKKwkJcmV0dXJuOworCWZvcihpID0gMTsgaSA8IGxlbjsgaSsrKQorCQltc2dbYnl0ZSsrXSA9IChkYXRhW2ktMV0gPDwgKEJJVFNfUEVSX0JZVEUgLSBvZmZzZXQpKQorCQkJfCAoZGF0YVtpXSA+PiBvZmZzZXQpOworCWlmKHJlc2lkdWUgIT0gMCkgeworCQlfX3U4IG1hc2sgPSAweGZmID4+IHJlc2lkdWU7CisJCV9fdTggbGFzdF9ieXRlID0gZGF0YVtpLTFdIDw8IChCSVRTX1BFUl9CWVRFIC0gb2Zmc2V0KQorCQkJfCAoZGF0YVtpXSA+PiBvZmZzZXQpOworCQkKKwkJbGFzdF9ieXRlICY9IH5tYXNrOworCQltc2dbYnl0ZV0gJj0gbWFzazsKKwkJbXNnW2J5dGVdIHw9IGxhc3RfYnl0ZTsKKwl9CisJcmV0dXJuOworfQorLyogdW5wYWNrIHRoZSBkYXRhIGFnYWluIChzYW1lIGFyZ3VtZW50cyBhcyBjYXRfcGFjaygpKS4gZGF0YSBidWZmZXIKKyAqIG11c3QgYmUgemVybyBwb3B1bGF0ZWQuCisgKgorICogRnVuY3Rpb246IGdpdmVuIGEgbWVzc2FnZSBzdHJpbmcgbW92ZSB0byBzdGFydF9iaXQgYW5kIGNvcHkgbnVtX2JpdHMgaW50bworICogZGF0YSAoc3RhcnRpbmcgYXQgYml0IDAgaW4gZGF0YSkuCisgKi8KK3N0YXRpYyB2b2lkCitjYXRfdW5wYWNrKF9fdTggKm1zZywgY29uc3QgX191MTYgc3RhcnRfYml0LCBfX3U4ICpkYXRhLCBjb25zdCBfX3UxNiBudW1fYml0cykKK3sKKwkvKiBjb21wdXRlIGluaXRpYWwgc2hpZnQgbmVlZGVkICovCisJY29uc3QgX191MTYgb2Zmc2V0ID0gc3RhcnRfYml0ICUgQklUU19QRVJfQllURTsKKwlfX3UxNiBsZW4gPSBudW1fYml0cyAvIEJJVFNfUEVSX0JZVEU7CisJY29uc3QgX191OCBsYXN0X2JpdHMgPSBudW1fYml0cyAlIEJJVFNfUEVSX0JZVEU7CisJX191MTYgYnl0ZSA9IHN0YXJ0X2JpdCAvIEJJVFNfUEVSX0JZVEU7CisJaW50IGk7CisKKwlpZihsYXN0X2JpdHMgIT0gMCkKKwkJbGVuKys7CisKKwkvKiBzcGVjaWFsIGNhc2U6IHdhbnQgPCA4IGJpdHMgZnJvbSBtc2cgYW5kIHdlIGNhbiBnZXQgaXQgZnJvbQorCSAqIGEgc2luZ2xlIGJ5dGUgb2YgdGhlIG1zZyAqLworCWlmKGxlbiA9PSAwICYmIEJJVFNfUEVSX0JZVEUgLSBvZmZzZXQgPj0gbnVtX2JpdHMpIHsKKwkJZGF0YVswXSA9IG1zZ1tieXRlXSA8PCBvZmZzZXQ7CisJCWRhdGFbMF0gJj0gMHhmZiA+PiAoQklUU19QRVJfQllURSAtIG51bV9iaXRzKTsKKwkJcmV0dXJuOworCX0KKwlmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkvKiB0aGlzIGFubm95aW5nIGlmIGhhcyB0byBiZSBkb25lIGp1c3QgaW4gY2FzZSBhIHJlYWQgb2YKKwkJICogbXNnIG9uZSBiZXlvbmQgdGhlIGFycmF5IGNhdXNlcyBhIHBhbmljICovCisJCWlmKG9mZnNldCAhPSAwKSB7CisJCQlkYXRhW2ldID0gbXNnW2J5dGUrK10gPDwgb2Zmc2V0OworCQkJZGF0YVtpXSB8PSBtc2dbYnl0ZV0gPj4gKEJJVFNfUEVSX0JZVEUgLSBvZmZzZXQpOworCQl9CisJCWVsc2UgeworCQkJZGF0YVtpXSA9IG1zZ1tieXRlKytdOworCQl9CisJfQorCS8qIGRvIHdlIG5lZWQgdG8gdHJ1bmNhdGUgdGhlIGZpbmFsIGJ5dGUgKi8KKwlpZihsYXN0X2JpdHMgIT0gMCkgeworCQlkYXRhW2ktMV0gJj0gMHhmZiA8PCAoQklUU19QRVJfQllURSAtIGxhc3RfYml0cyk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2NhdF9idWlsZF9oZWFkZXIoX191OCAqaGVhZGVyLCBjb25zdCBfX3UxNiBsZW4sIGNvbnN0IF9fdTE2IHNtYWxsZXN0X3JlZ19iaXRzLAorCQkgY29uc3QgX191MTYgbG9uZ2VzdF9yZWdfYml0cykKK3sKKwlpbnQgaTsKKwlfX3UxNiBzdGFydF9iaXQgPSAoc21hbGxlc3RfcmVnX2JpdHMgLSAxKSAlIEJJVFNfUEVSX0JZVEU7CisJX191OCAqbGFzdF9ieXRlID0gJmhlYWRlcltsZW4gLSAxXTsKKworCWlmKHN0YXJ0X2JpdCA9PSAwKQorCQlzdGFydF9iaXQgPSAxOwkvKiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJpdCBpbiB0aGUgaGRyICovCisJCisJZm9yKGk9MDsgaSA8IGxlbjsgaSsrKQorCQloZWFkZXJbaV0gPSAwOworCisJZm9yKGkgPSBzdGFydF9iaXQ7IGkgPiAwOyBpLS0pCisJCSpsYXN0X2J5dGUgPSAoKCpsYXN0X2J5dGUpIDw8IDEpICsgMTsKKworfQorCitzdGF0aWMgaW50CitjYXRfc2VuZGluc3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwLCBfX3U4IHJlZywgX191OCBvcCkKK3sKKwlfX3U4IHBhcml0eSwgaW5zdCwgaW5zdF9idWZbNF0gPSB7IDAgfTsKKwlfX3U4IGlzZXFbVk9ZQUdFUl9NQVhfU0NBTl9QQVRIXSwgaHNlcVtWT1lBR0VSX01BWF9SRUdfU0laRV07CisJX191MTYgaWJ5dGVzLCBoYnl0ZXMsIHBhZGJpdHM7CisJaW50IGk7CisJCisJLyogCisJICogUGFyaXR5IGlzIHRoZSBwYXJpdHkgb2YgdGhlIHJlZ2lzdGVyIG51bWJlciArIDEgKFJFQURfUkVHSVNURVIKKwkgKiBhbmQgV1JJVEVfUkVHSVNURVIgYWx3YXlzIGFkZCAnMScgdG8gdGhlIG51bWJlciBvZiBiaXRzID09IDEpCisJICovCisJcGFyaXR5ID0gKF9fdTgpKDEgKyAocmVnICYgMHgwMSkgKworCSAgICAgICAgICgoX191OCkocmVnICYgMHgwMikgPj4gMSkgKworCSAgICAgICAgICgoX191OCkocmVnICYgMHgwNCkgPj4gMikgKworCSAgICAgICAgICgoX191OCkocmVnICYgMHgwOCkgPj4gMykpICUgMjsKKworCWluc3QgPSAoKHBhcml0eSA8PCA3KSB8IChyZWcgPDwgMikgfCBvcCk7CisKKwlvdXRiKFZPWUFHRVJfQ0FUX0lSQ1lDLCBDQVRfQ01EKTsKKwlpZighbW9kcC0+c2Nhbl9wYXRoX2Nvbm5lY3RlZCkgeworCQlpZihhc2ljcC0+YXNpY19pZCAhPSBWT1lBR0VSX0NBVF9JRCkgeworCQkJcHJpbnRrKCIqKldBUk5JTkcqKio6IGNhdF9zZW5kaW5zdCBoYXMgZGlzY29ubmVjdGVkIHNjYW4gcGF0aCBub3QgdG8gQ0FUIGFzaWNcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9IRUFERVIsIENBVF9EQVRBKTsKKwkJb3V0YihpbnN0LCBDQVRfREFUQSk7CisJCWlmKGluYihDQVRfREFUQSkgIT0gVk9ZQUdFUl9DQVRfSEVBREVSKSB7CisJCQlDREVCVUcoKCJWT1lBR0VSIENBVDogY2F0X3NlbmRpbnN0IGZhaWxlZCB0byBnZXQgQ0FUX0hFQURFUlxuIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlieXRlcyA9IG1vZHAtPmluc3RfYml0cyAvIEJJVFNfUEVSX0JZVEU7CisJaWYoKHBhZGJpdHMgPSBtb2RwLT5pbnN0X2JpdHMgJSBCSVRTX1BFUl9CWVRFKSAhPSAwKSB7CisJCXBhZGJpdHMgPSBCSVRTX1BFUl9CWVRFIC0gcGFkYml0czsKKwkJaWJ5dGVzKys7CisJfQorCWhieXRlcyA9IG1vZHAtPmxhcmdlc3RfcmVnIC8gQklUU19QRVJfQllURTsKKwlpZihtb2RwLT5sYXJnZXN0X3JlZyAlIEJJVFNfUEVSX0JZVEUpCisJCWhieXRlcysrOworCUNERUJVRygoImNhdF9zZW5kaW5zdDogaWJ5dGVzPSVkLCBoYnl0ZXM9JWRcbiIsIGlieXRlcywgaGJ5dGVzKSk7CisJLyogaW5pdGlhbGlzZSB0aGUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgdG8gMHhmZiAqLworCWZvcihpPTA7IGkgPCBpYnl0ZXMgKyBoYnl0ZXM7IGkrKykKKwkJaXNlcVtpXSA9IDB4ZmY7CisJY2F0X2J1aWxkX2hlYWRlcihoc2VxLCBoYnl0ZXMsIG1vZHAtPnNtYWxsZXN0X3JlZywgbW9kcC0+bGFyZ2VzdF9yZWcpOworCWNhdF9wYWNrKGlzZXEsIG1vZHAtPmluc3RfYml0cywgaHNlcSwgaGJ5dGVzICogQklUU19QRVJfQllURSk7CisJaW5zdF9idWZbMF0gPSBpbnN0OworCWluc3RfYnVmWzFdID0gMHhGRiA+PiAobW9kcC0+bGFyZ2VzdF9yZWcgJSBCSVRTX1BFUl9CWVRFKTsKKwljYXRfcGFjayhpc2VxLCBhc2ljcC0+Yml0X2xvY2F0aW9uLCBpbnN0X2J1ZiwgYXNpY3AtPmlyZWdfbGVuZ3RoKTsKKyNpZmRlZiBWT1lBR0VSX0NBVF9ERUJVRworCXByaW50aygiaW5zID0gMHgleCwgaXNlcTogIiwgaW5zdCk7CisJZm9yKGk9MDsgaTwgaWJ5dGVzICsgaGJ5dGVzOyBpKyspCisJCXByaW50aygiMHgleCAiLCBpc2VxW2ldKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlpZihjYXRfc2hpZnRvdXQoaXNlcSwgaWJ5dGVzLCBoYnl0ZXMsIHBhZGJpdHMpKSB7CisJCUNERUJVRygoIlZPWUFHRVIgQ0FUOiBjYXRfc2VuZGluc3Q6IGNhdF9zaGlmdG91dCBmYWlsZWRcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCUNERUJVRygoIkNBVCBTSElGVE9VVCBET05FXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NhdF9nZXRkYXRhKHZveWFnZXJfbW9kdWxlX3QgKm1vZHAsIHZveWFnZXJfYXNpY190ICphc2ljcCwgX191OCByZWcsIAorCSAgICBfX3U4ICp2YWx1ZSkKK3sKKwlpZighbW9kcC0+c2Nhbl9wYXRoX2Nvbm5lY3RlZCkgeworCQlpZihhc2ljcC0+YXNpY19pZCAhPSBWT1lBR0VSX0NBVF9JRCkgeworCQkJQ0RFQlVHKCgiVk9ZQUdFUiBDQVQ6IEVSUk9SOiBjYXRfZ2V0ZGF0YSB0byBDQVQgYXNpYyB3aXRoIHNjYW4gcGF0aCBjb25uZWN0ZWRcbiIpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmKHJlZyA+IFZPWUFHRVJfU1VCQUREUkhJKSAKKwkJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJb3V0YihWT1lBR0VSX0NBVF9EUkNZQywgQ0FUX0NNRCk7CisJCW91dGIoVk9ZQUdFUl9DQVRfSEVBREVSLCBDQVRfREFUQSk7CisJCSp2YWx1ZSA9IGluYihDQVRfREFUQSk7CisJCW91dGIoMHhBQSwgQ0FUX0RBVEEpOworCQlpZihpbmIoQ0FUX0RBVEEpICE9IFZPWUFHRVJfQ0FUX0hFQURFUikgeworCQkJQ0RFQlVHKCgiY2F0X2dldGRhdGE6IGZhaWxlZCB0byBnZXQgVk9ZQUdFUl9DQVRfSEVBREVSXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJZWxzZSB7CisJCV9fdTE2IHNiaXRzID0gbW9kcC0+bnVtX2FzaWNzIC0xICsgYXNpY3AtPmlyZWdfbGVuZ3RoOworCQlfX3UxNiBzYnl0ZXMgPSBzYml0cyAvIEJJVFNfUEVSX0JZVEU7CisJCV9fdTE2IHRieXRlczsKKwkJX191OCBzdHJpbmdbVk9ZQUdFUl9NQVhfU0NBTl9QQVRIXSwgdHJhaWxlcltWT1lBR0VSX01BWF9SRUdfU0laRV07CisJCV9fdTggcGFkYml0czsKKwkJaW50IGk7CisJCQorCQlvdXRiKFZPWUFHRVJfQ0FUX0RSQ1lDLCBDQVRfQ01EKTsKKworCQlpZigocGFkYml0cyA9IHNiaXRzICUgQklUU19QRVJfQllURSkgIT0gMCkgeworCQkJcGFkYml0cyA9IEJJVFNfUEVSX0JZVEUgLSBwYWRiaXRzOworCQkJc2J5dGVzKys7CisJCX0KKwkJdGJ5dGVzID0gYXNpY3AtPmlyZWdfbGVuZ3RoIC8gQklUU19QRVJfQllURTsKKwkJaWYoYXNpY3AtPmlyZWdfbGVuZ3RoICUgQklUU19QRVJfQllURSkKKwkJCXRieXRlcysrOworCQlDREVCVUcoKCJjYXRfZ2V0ZGF0YTogdGJ5dGVzID0gJWQsIHNieXRlcyA9ICVkLCBwYWRiaXRzID0gJWRcbiIsCisJCQl0Ynl0ZXMsCXNieXRlcywgcGFkYml0cykpOworCQljYXRfYnVpbGRfaGVhZGVyKHRyYWlsZXIsIHRieXRlcywgMSwgYXNpY3AtPmlyZWdfbGVuZ3RoKTsKKworCQkKKwkJZm9yKGkgPSB0Ynl0ZXMgLSAxOyBpID49IDA7IGktLSkgeworCQkJb3V0Yih0cmFpbGVyW2ldLCBDQVRfREFUQSk7CisJCQlzdHJpbmdbc2J5dGVzICsgaV0gPSBpbmIoQ0FUX0RBVEEpOworCQl9CisKKwkJZm9yKGkgPSBzYnl0ZXMgLSAxOyBpID49IDA7IGktLSkgeworCQkJb3V0YigweGFhLCBDQVRfREFUQSk7CisJCQlzdHJpbmdbaV0gPSBpbmIoQ0FUX0RBVEEpOworCQl9CisJCSp2YWx1ZSA9IDA7CisJCWNhdF91bnBhY2soc3RyaW5nLCBwYWRiaXRzICsgKHRieXRlcyAqIEJJVFNfUEVSX0JZVEUpICsgYXNpY3AtPmFzaWNfbG9jYXRpb24sIHZhbHVlLCBhc2ljcC0+aXJlZ19sZW5ndGgpOworI2lmZGVmIFZPWUFHRVJfQ0FUX0RFQlVHCisJCXByaW50aygidmFsdWU9MHgleCwgc3RyaW5nOiAiLCAqdmFsdWUpOworCQlmb3IoaT0wOyBpPCB0Ynl0ZXMrc2J5dGVzOyBpKyspCisJCQlwcmludGsoIjB4JXggIiwgc3RyaW5nW2ldKTsKKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCQorCQkvKiBzYW5pdHkgY2hlY2sgdGhlIHJlc3Qgb2YgdGhlIHJldHVybiAqLworCQlmb3IoaT0wOyBpIDwgdGJ5dGVzOyBpKyspIHsKKwkJCV9fdTggaW5wdXQgPSAwOworCisJCQljYXRfdW5wYWNrKHN0cmluZywgcGFkYml0cyArIChpICogQklUU19QRVJfQllURSksICZpbnB1dCwgQklUU19QRVJfQllURSk7CisJCQlpZih0cmFpbGVyW2ldICE9IGlucHV0KSB7CisJCQkJQ0RFQlVHKCgiY2F0X2dldGRhdGE6IGZhaWxlZCB0byBzYW5pdHkgY2hlY2sgcmVzdCBvZiByZXQoJWQpIDB4JXggIT0gMHgleFxuIiwgaSwgaW5wdXQsIHRyYWlsZXJbaV0pKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCQlDREVCVUcoKCJjYXRfZ2V0ZGF0YSBET05FXG4iKSk7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludAorY2F0X3NoaWZ0b3V0KF9fdTggKmRhdGEsIF9fdTE2IGRhdGFfYnl0ZXMsIF9fdTE2IGhlYWRlcl9ieXRlcywgX191OCBwYWRfYml0cykKK3sKKwlpbnQgaTsKKwkKKwlmb3IoaSA9IGRhdGFfYnl0ZXMgKyBoZWFkZXJfYnl0ZXMgLSAxOyBpID49IGhlYWRlcl9ieXRlczsgaS0tKQorCQlvdXRiKGRhdGFbaV0sIENBVF9EQVRBKTsKKworCWZvcihpID0gaGVhZGVyX2J5dGVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJX191OCBoZWFkZXIgPSAwOworCQlfX3U4IGlucHV0OworCisJCW91dGIoZGF0YVtpXSwgQ0FUX0RBVEEpOworCQlpbnB1dCA9IGluYihDQVRfREFUQSk7CisJCUNERUJVRygoImNhdF9zaGlmdG91dDogcmV0dXJuZWQgMHgleFxuIiwgaW5wdXQpKTsKKwkJY2F0X3VucGFjayhkYXRhLCAoKGRhdGFfYnl0ZXMgKyBpKSAqIEJJVFNfUEVSX0JZVEUpIC0gcGFkX2JpdHMsCisJCQkgICAmaGVhZGVyLCBCSVRTX1BFUl9CWVRFKTsKKwkJaWYoaW5wdXQgIT0gaGVhZGVyKSB7CisJCQlDREVCVUcoKCJWT1lBR0VSIENBVDogY2F0X3NoaWZ0b3V0IGZhaWxlZCB0byByZXR1cm4gaGVhZGVyIDB4JXggIT0gMHgleFxuIiwgaW5wdXQsIGhlYWRlcikpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NhdF9zZW5kZGF0YSh2b3lhZ2VyX21vZHVsZV90ICptb2RwLCB2b3lhZ2VyX2FzaWNfdCAqYXNpY3AsIAorCSAgICAgX191OCByZWcsIF9fdTggdmFsdWUpCit7CisJb3V0YihWT1lBR0VSX0NBVF9EUkNZQywgQ0FUX0NNRCk7CisJaWYoIW1vZHAtPnNjYW5fcGF0aF9jb25uZWN0ZWQpIHsKKwkJaWYoYXNpY3AtPmFzaWNfaWQgIT0gVk9ZQUdFUl9DQVRfSUQpIHsKKwkJCUNERUJVRygoIlZPWUFHRVIgQ0FUOiBFUlJPUjogc2NhbiBwYXRoIGRpc2Nvbm5lY3RlZCB3aGVuIGFzaWMgIT0gQ0FUXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlvdXRiKFZPWUFHRVJfQ0FUX0hFQURFUiwgQ0FUX0RBVEEpOworCQlvdXRiKHZhbHVlLCBDQVRfREFUQSk7CisJCWlmKGluYihDQVRfREFUQSkgIT0gVk9ZQUdFUl9DQVRfSEVBREVSKSB7CisJCQlDREVCVUcoKCJjYXRfc2VuZGRhdGE6IGZhaWxlZCB0byBnZXQgY29ycmVjdCBoZWFkZXIgcmVzcG9uc2UgdG8gc2VudCBkYXRhXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZihyZWcgPiBWT1lBR0VSX1NVQkFERFJISSkgeworCQkJb3V0YihWT1lBR0VSX0NBVF9SVU4sIENBVF9DTUQpOworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJb3V0YihWT1lBR0VSX0NBVF9SVU4sIENBVF9DTUQpOworCQl9CisJCQorCQlyZXR1cm4gMDsKKwl9CisJZWxzZSB7CisJCV9fdTE2IGhieXRlcyA9IGFzaWNwLT5pcmVnX2xlbmd0aCAvIEJJVFNfUEVSX0JZVEU7CisJCV9fdTE2IGRieXRlcyA9IChtb2RwLT5udW1fYXNpY3MgLSAxICsgYXNpY3AtPmlyZWdfbGVuZ3RoKS9CSVRTX1BFUl9CWVRFOworCQlfX3U4IHBhZGJpdHMsIGRzZXFbVk9ZQUdFUl9NQVhfU0NBTl9QQVRIXSwgCisJCQloc2VxW1ZPWUFHRVJfTUFYX1JFR19TSVpFXTsKKwkJaW50IGk7CisKKwkJaWYoKHBhZGJpdHMgPSAobW9kcC0+bnVtX2FzaWNzIC0gMSAKKwkJCSAgICAgICArIGFzaWNwLT5pcmVnX2xlbmd0aCkgJSBCSVRTX1BFUl9CWVRFKSAhPSAwKSB7CisJCQlwYWRiaXRzID0gQklUU19QRVJfQllURSAtIHBhZGJpdHM7CisJCQlkYnl0ZXMrKzsKKwkJfQorCQlpZihhc2ljcC0+aXJlZ19sZW5ndGggJSBCSVRTX1BFUl9CWVRFKQorCQkJaGJ5dGVzKys7CisJCQorCQljYXRfYnVpbGRfaGVhZGVyKGhzZXEsIGhieXRlcywgMSwgYXNpY3AtPmlyZWdfbGVuZ3RoKTsKKwkJCisJCWZvcihpID0gMDsgaSA8IGRieXRlcyArIGhieXRlczsgaSsrKQorCQkJZHNlcVtpXSA9IDB4ZmY7CisJCUNERUJVRygoImNhdF9zZW5kZGF0YTogZGJ5dGVzPSVkLCBoYnl0ZXM9JWQsIHBhZGJpdHM9JWRcbiIsCisJCQlkYnl0ZXMsIGhieXRlcywgcGFkYml0cykpOworCQljYXRfcGFjayhkc2VxLCBtb2RwLT5udW1fYXNpY3MgLSAxICsgYXNpY3AtPmlyZWdfbGVuZ3RoLAorCQkJIGhzZXEsIGhieXRlcyAqIEJJVFNfUEVSX0JZVEUpOworCQljYXRfcGFjayhkc2VxLCBhc2ljcC0+YXNpY19sb2NhdGlvbiwgJnZhbHVlLCAKKwkJCSBhc2ljcC0+aXJlZ19sZW5ndGgpOworI2lmZGVmIFZPWUFHRVJfQ0FUX0RFQlVHCisJCXByaW50aygiZHNlcSAiKTsKKwkJZm9yKGk9MDsgaTxoYnl0ZXMrZGJ5dGVzOyBpKyspIHsKKwkJCXByaW50aygiMHgleCAiLCBkc2VxW2ldKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIGNhdF9zaGlmdG91dChkc2VxLCBkYnl0ZXMsIGhieXRlcywgcGFkYml0cyk7CisJfQorfQorCitzdGF0aWMgaW50CitjYXRfd3JpdGUodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwLCBfX3U4IHJlZywKKwkgX191OCB2YWx1ZSkKK3sKKwlpZihjYXRfc2VuZGluc3QobW9kcCwgYXNpY3AsIHJlZywgVk9ZQUdFUl9XUklURV9DT05GSUcpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gY2F0X3NlbmRkYXRhKG1vZHAsIGFzaWNwLCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIGludAorY2F0X3JlYWQodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwLCBfX3U4IHJlZywKKwkgX191OCAqdmFsdWUpCit7CisJaWYoY2F0X3NlbmRpbnN0KG1vZHAsIGFzaWNwLCByZWcsIFZPWUFHRVJfUkVBRF9DT05GSUcpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gY2F0X2dldGRhdGEobW9kcCwgYXNpY3AsIHJlZywgdmFsdWUpOworfQorCitzdGF0aWMgaW50CitjYXRfc3ViYWRkcnNldHVwKHZveWFnZXJfbW9kdWxlX3QgKm1vZHAsIHZveWFnZXJfYXNpY190ICphc2ljcCwgX191MTYgb2Zmc2V0LAorCQkgX191MTYgbGVuKQoreworCV9fdTggdmFsOworCisJaWYobGVuID4gMSkgeworCQkvKiBzZXQgYXV0byBpbmNyZW1lbnQgKi8KKwkJX191OCBuZXd2YWw7CisJCQorCQlpZihjYXRfcmVhZChtb2RwLCBhc2ljcCwgVk9ZQUdFUl9BVVRPX0lOQ19SRUcsICZ2YWwpKSB7CisJCQlDREVCVUcoKCJjYXRfc3ViYWRkcnNldHVwOiByZWFkIG9mIFZPWUFHRVJfQVVUT19JTkNfUkVHIGZhaWxlZFxuIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJQ0RFQlVHKCgiY2F0X3N1YmFkZHJzZXR1cDogVk9ZQUdFUl9BVVRPX0lOQ19SRUcgPSAweCV4XG4iLCB2YWwpKTsKKwkJbmV3dmFsID0gdmFsIHwgVk9ZQUdFUl9BVVRPX0lOQzsKKwkJaWYobmV3dmFsICE9IHZhbCkgeworCQkJaWYoY2F0X3dyaXRlKG1vZHAsIGFzaWNwLCBWT1lBR0VSX0FVVE9fSU5DX1JFRywgdmFsKSkgeworCQkJCUNERUJVRygoImNhdF9zdWJhZGRyc2V0dXA6IHdyaXRlIHRvIFZPWUFHRVJfQVVUT19JTkNfUkVHIGZhaWxlZFxuIikpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCWlmKGNhdF93cml0ZShtb2RwLCBhc2ljcCwgVk9ZQUdFUl9TVUJBRERSTE8sIChfX3U4KShvZmZzZXQgJjB4ZmYpKSkgeworCQlDREVCVUcoKCJjYXRfc3ViYWRkcnNldHVwOiB3cml0ZSB0byBTVUJBRERSTE8gZmFpbGVkXG4iKSk7CisJCXJldHVybiAxOworCX0KKwlpZihhc2ljcC0+c3ViYWRkciA+IFZPWUFHRVJfU1VCQUREUl9MTykgeworCQlpZihjYXRfd3JpdGUobW9kcCwgYXNpY3AsIFZPWUFHRVJfU1VCQUREUkhJLCAoX191OCkob2Zmc2V0ID4+IDgpKSkgeworCQkJQ0RFQlVHKCgiY2F0X3N1YmFkZHJzZXR1cDogd3JpdGUgdG8gU1VCQUREUkhJIGZhaWxlZFxuIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJY2F0X3JlYWQobW9kcCwgYXNpY3AsIFZPWUFHRVJfU1VCQUREUkhJLCAmdmFsKTsKKwkJQ0RFQlVHKCgiY2F0X3N1YmFkZHJzZXR1cDogb2Zmc2V0ID0gJWQsIGhpID0gJWRcbiIsIG9mZnNldCwgdmFsKSk7CisJfQorCWNhdF9yZWFkKG1vZHAsIGFzaWNwLCBWT1lBR0VSX1NVQkFERFJMTywgJnZhbCk7CisJQ0RFQlVHKCgiY2F0X3N1YmFkZHJzZXR1cDogb2Zmc2V0ID0gJWQsIGxvID0gJWRcbiIsIG9mZnNldCwgdmFsKSk7CisJcmV0dXJuIDA7Cit9CisJCQorc3RhdGljIGludAorY2F0X3N1YndyaXRlKHZveWFnZXJfbW9kdWxlX3QgKm1vZHAsIHZveWFnZXJfYXNpY190ICphc2ljcCwgX191MTYgb2Zmc2V0LAorCSAgICBfX3UxNiBsZW4sIHZvaWQgKmJ1ZikKK3sKKwlpbnQgaSwgcmV0dmFsOworCisJLyogRklYTUU6IG5lZWQgc3BlY2lhbCBhY3Rpb25zIGZvciBWT1lBR0VSX0NBVF9JRCBoZXJlICovCisJaWYoYXNpY3AtPmFzaWNfaWQgPT0gVk9ZQUdFUl9DQVRfSUQpIHsKKwkJQ0RFQlVHKCgiY2F0X3N1YndyaXRlOiBBVFRFTVBUIFRPIFdSSVRFIFRPIENBVCBBU0lDXG4iKSk7CisJCS8qIEZJWE1FIC0tIFRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgaGFuZGxlZCBiZXR0ZXIKKwkJICogVGhlcmUgaXMgYSBwcm9ibGVtIHdyaXRpbmcgdG8gdGhlIGNhdCBhc2ljIGluIHRoZQorCQkgKiBQU0kuICBUaGUgMzB1cyBkZWxheSBzZWVtcyB0byB3b3JrLCB0aG91Z2ggKi8KKwkJdWRlbGF5KDMwKTsKKwl9CisJCQorCWlmKChyZXR2YWwgPSBjYXRfc3ViYWRkcnNldHVwKG1vZHAsIGFzaWNwLCBvZmZzZXQsIGxlbikpICE9IDApIHsKKwkJcHJpbnRrKCJjYXRfc3Vid3JpdGU6IGNhdF9zdWJhZGRyc2V0dXAgRkFJTEVEXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJCisJaWYoY2F0X3NlbmRpbnN0KG1vZHAsIGFzaWNwLCBWT1lBR0VSX1NVQkFERFJEQVRBLCBWT1lBR0VSX1dSSVRFX0NPTkZJRykpIHsKKwkJcHJpbnRrKCJjYXRfc3Vid3JpdGU6IGNhdF9zZW5kaW5zdCBGQUlMRURcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYoY2F0X3NlbmRkYXRhKG1vZHAsIGFzaWNwLCAweEZGLCAoKF9fdTggKilidWYpW2ldKSkgeworCQkJcHJpbnRrKCJjYXRfc3Vid3JpdGU6IGNhdF9zZW5kYXRhIGVsZW1lbnQgYXQgJWQgRkFJTEVEXG4iLCBpKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorc3RhdGljIGludAorY2F0X3N1YnJlYWQodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwLCBfX3UxNiBvZmZzZXQsCisJICAgIF9fdTE2IGxlbiwgdm9pZCAqYnVmKQoreworCWludCBpLCByZXR2YWw7CisKKwlpZigocmV0dmFsID0gY2F0X3N1YmFkZHJzZXR1cChtb2RwLCBhc2ljcCwgb2Zmc2V0LCBsZW4pKSAhPSAwKSB7CisJCUNERUJVRygoImNhdF9zdWJyZWFkOiBjYXRfc3ViYWRkcnNldHVwIEZBSUxFRFxuIikpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmKGNhdF9zZW5kaW5zdChtb2RwLCBhc2ljcCwgVk9ZQUdFUl9TVUJBRERSREFUQSwgVk9ZQUdFUl9SRUFEX0NPTkZJRykpIHsKKwkJQ0RFQlVHKCgiY2F0X3N1YnJlYWQ6IGNhdF9zZW5kaW5zdCBmYWlsZWRcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCWZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmKGNhdF9nZXRkYXRhKG1vZHAsIGFzaWNwLCAweEZGLAorCQkJICAgICAgICYoKF9fdTggKilidWYpW2ldKSkgeworCQkJQ0RFQlVHKCgiY2F0X3N1YnJlYWQ6IGNhdF9nZXRkYXRhIGVsZW1lbnQgJWQgZmFpbGVkXG4iLCBpKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBidWZmZXIgZm9yIHN0b3JpbmcgRVBST00gZGF0YSByZWFkIGluIGR1cmluZyBpbml0aWFsaXNhdGlvbiAqLworc3RhdGljIF9faW5pdGRhdGEgX191OCBlcHJvbV9idWZbMHhGRkZGXTsKK3N0YXRpYyB2b3lhZ2VyX21vZHVsZV90ICp2b3lhZ2VyX2luaXRpYWxfbW9kdWxlOworCisvKiBJbml0aWFsaXNlIHRoZSBjYXQgYnVzIGNvbXBvbmVudHMuICBXZSBhc3N1bWUgdGhpcyBpcyBjYWxsZWQgYnkgdGhlCisgKiBib290IGNwdSAqYWZ0ZXIqIGFsbCBtZW1vcnkgaW5pdGlhbGlzYXRpb24gaGFzIGJlZW4gZG9uZSAoc28gd2UgY2FuCisgKiB1c2Uga21hbGxvYykgYnV0IGJlZm9yZSBzbXAgaW5pdGlhbGlzYXRpb24sIHNvIHdlIGNhbiBwcm9iZSB0aGUgU01QCisgKiBjb25maWd1cmF0aW9uIGFuZCBwaWNrIHVwIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi4gICovCit2b2lkCit2b3lhZ2VyX2NhdF9pbml0KHZvaWQpCit7CisJdm95YWdlcl9tb2R1bGVfdCAqKm1vZHBwID0gJnZveWFnZXJfaW5pdGlhbF9tb2R1bGU7CisJdm95YWdlcl9hc2ljX3QgKiphc2ljcHA7CisJdm95YWdlcl9hc2ljX3QgKnFhYmNfYXNpYyA9IE5VTEw7CisJaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBxaWNfYWRkciA9IDA7CisJX191OCBxYWJjX2RhdGFbMHgyMF07CisJX191OCBudW1fc3VibW9kdWxlcywgdmFsOworCXZveWFnZXJfZXByb21faGRyX3QgKmVwcm9tX2hkciA9ICh2b3lhZ2VyX2Vwcm9tX2hkcl90ICopJmVwcm9tX2J1ZlswXTsKKwkKKwlfX3U4IGNtb3NbNF07CisJdW5zaWduZWQgbG9uZyBhZGRyOworCQorCS8qIGluaXRpYWxsaXNlIHRoZSBTVVMgbWFpbGJveCAqLworCWZvcihpPTA7IGk8c2l6ZW9mKGNtb3MpOyBpKyspCisJCWNtb3NbaV0gPSB2b3lhZ2VyX2V4dGVuZGVkX2Ntb3NfcmVhZChWT1lBR0VSX0RVTVBfTE9DQVRJT04gKyBpKTsKKwlhZGRyID0gKih1bnNpZ25lZCBsb25nICopY21vczsKKwlpZigoYWRkciAmIDB4ZmYwMDAwMDApICE9IDB4ZmYwMDAwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWb3lhZ2VyIGZhaWxlZCB0byBnZXQgU1VTIG1haWxib3ggKGFkZHIgPSAweCVseFxuIiwgYWRkcik7CisJfSBlbHNlIHsKKwkJc3RhdGljIHN0cnVjdCByZXNvdXJjZSByZXM7CisJCQorCQlyZXMubmFtZSA9ICJ2b3lhZ2VyIFNVUyI7CisJCXJlcy5zdGFydCA9IGFkZHI7CisJCXJlcy5lbmQgPSBhZGRyKzB4M2ZmOworCQkKKwkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZyZXMpOworCQl2b3lhZ2VyX1NVUyA9IChzdHJ1Y3Qgdm95YWdlcl9TVVMgKikKKwkJCWlvcmVtYXAoYWRkciwgMHg0MDApOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIlZveWFnZXIgU1VTIG1haWxib3ggdmVyc2lvbiAweCV4XG4iLAorCQkgICAgICAgdm95YWdlcl9TVVMtPlNVU192ZXJzaW9uKTsKKwkJdm95YWdlcl9TVVMtPmtlcm5lbF92ZXJzaW9uID0gVk9ZQUdFUl9NQUlMQk9YX1ZFUlNJT047CisJCXZveWFnZXJfU1VTLT5rZXJuZWxfZmxhZ3MgPSBWT1lBR0VSX09TX0hBU19TWVNJTlQ7CisJfQorCisJLyogY2xlYXIgdGhlIHByb2Nlc3NvciBjb3VudHMgKi8KKwl2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzID0gMDsKKwl2b3lhZ2VyX3F1YWRfcHJvY2Vzc29ycyA9IDA7CisKKworCisJcHJpbnRrKCJWT1lBR0VSOiBiZWdpbm5pbmcgQ0FUIGJ1cyBwcm9iZVxuIik7CisJLyogc2V0IHVwIHRoZSBTdXBlclNldCBQb3J0IEJsb2NrIHdoaWNoIHRlbGxzIHVzIHdoZXJlIHRoZQorCSAqIENBVCBjb21tdW5pY2F0aW9uIHBvcnQgaXMgKi8KKwlzc3BiID0gaW5iKFZPWUFHRVJfU1NQQl9SRUxPQ0FUSU9OX1BPUlQpICogMHgxMDA7CisJVkRFQlVHKCgiVk9ZQUdFUiBERUJVRzogc3NwYiA9IDB4JXhcbiIsIHNzcGIpKTsKKworCS8qIG5vdyBmaW5kIG91dCBpZiB3ZXJlIDggc2xvdCBvciBub3JtYWwgKi8KKwlpZigoaW5iKFZJQ19QUk9DX1dIT19BTV9JKSAmIEVJR0hUX1NMT1RfSURFTlRJRklFUikKKwkgICA9PSBFSUdIVF9TTE9UX0lERU5USUZJRVIpIHsKKwkJdm95YWdlcl84c2xvdCA9IDE7CisJCXByaW50ayhLRVJOX05PVElDRSAiVm95YWdlcjogRWlnaHQgc2xvdCA1MXh4IGNvbmZpZ3VyYXRpb24gZGV0ZWN0ZWRcbiIpOworCX0KKworCWZvcihpID0gVk9ZQUdFUl9NSU5fTU9EVUxFOworCSAgICBpIDw9IFZPWUFHRVJfTUFYX01PRFVMRTsgaSsrKSB7CisJCV9fdTggaW5wdXQ7CisJCWludCBhc2ljOworCQlfX3UxNiBlcHJvbV9zaXplOworCQlfX3UxNiBzcF9vZmZzZXQ7CisKKwkJb3V0YihWT1lBR0VSX0NBVF9ERVNFTEVDVCwgVk9ZQUdFUl9DQVRfQ09ORklHX1BPUlQpOworCQlvdXRiKGksIFZPWUFHRVJfQ0FUX0NPTkZJR19QT1JUKTsKKworCQkvKiBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIG1vZHVsZSAqLworCQlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJCW91dGIoVk9ZQUdFUl9DQVRfSVJDWUMsIENBVF9DTUQpOworCQlvdXRiKFZPWUFHRVJfQ0FUX0hFQURFUiwgQ0FUX0RBVEEpOworCQkvKiBzdHJlYW0gc2VyaWVzIG9mIGFsdGVybmF0aW5nIDEncyBhbmQgMCdzIHRvIHN0aW11bGF0ZQorCQkgKiByZXNwb25zZSAqLworCQlvdXRiKDB4QUEsIENBVF9EQVRBKTsKKwkJaW5wdXQgPSBpbmIoQ0FUX0RBVEEpOworCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCWlmKGlucHV0ICE9IFZPWUFHRVJfQ0FUX0hFQURFUikgeworCQkJY29udGludWU7CisJCX0KKwkJQ0RFQlVHKCgiVk9ZQUdFUiBERUJVRzogZm91bmQgbW9kdWxlIGlkIDB4JXgsICVzXG4iLCBpLAorCQkJY2F0X21vZHVsZV9uYW1lKGkpKSk7CisJCSptb2RwcCA9IGttYWxsb2Moc2l6ZW9mKHZveWFnZXJfbW9kdWxlX3QpLCBHRlBfS0VSTkVMKTsgLyomdm95YWdlcl9tb2R1bGVfc3RvcmFnZVtjYXRfY291bnQrK107Ki8KKwkJaWYoKm1vZHBwID09IE5VTEwpIHsKKwkJCXByaW50aygiKipXQVJOSU5HKioga21hbGxvYyBmYWlsdXJlIGluIGNhdF9pbml0XG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1lbXNldCgqbW9kcHAsIDAsIHNpemVvZih2b3lhZ2VyX21vZHVsZV90KSk7CisJCS8qIG5lZWQgdGVtcG9yYXJ5IGFzaWMgZm9yIGNhdF9zdWJyZWFkLiAgSXQgd2lsbCBiZQorCQkgKiBmaWxsZWQgaW4gY29ycmVjdGx5IGxhdGVyICovCisJCSgqbW9kcHApLT5hc2ljID0ga21hbGxvYyhzaXplb2Yodm95YWdlcl9hc2ljX3QpLCBHRlBfS0VSTkVMKTsgLyomdm95YWdlcl9hc2ljX3N0b3JhZ2VbYXNpY19jb3VudF07Ki8KKwkJaWYoKCptb2RwcCktPmFzaWMgPT0gTlVMTCkgeworCQkJcHJpbnRrKCIqKldBUk5JTkcqKiBrbWFsbG9jIGZhaWx1cmUgaW4gY2F0X2luaXRcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJbWVtc2V0KCgqbW9kcHApLT5hc2ljLCAwLCBzaXplb2Yodm95YWdlcl9hc2ljX3QpKTsKKwkJKCptb2RwcCktPmFzaWMtPmFzaWNfaWQgPSBWT1lBR0VSX0NBVF9JRDsKKwkJKCptb2RwcCktPmFzaWMtPnN1YmFkZHIgPSBWT1lBR0VSX1NVQkFERFJfSEk7CisJCSgqbW9kcHApLT5tb2R1bGVfYWRkciA9IGk7CisJCSgqbW9kcHApLT5zY2FuX3BhdGhfY29ubmVjdGVkID0gMDsKKwkJaWYoaSA9PSBWT1lBR0VSX1BTSSkgeworCQkJLyogRXhjZXB0aW9uIGxlZyBmb3IgbW9kdWxlcyB3aXRoIG5vIEVFUFJPTSAqLworCQkJcHJpbnRrKCJNb2R1bGUgXCIlc1wiXG4iLCBjYXRfbW9kdWxlX25hbWUoaSkpOworCQkJY29udGludWU7CisJCX0KKwkJCSAgICAgICAKKwkJQ0RFQlVHKCgiY2F0X2luaXQ6IFJlYWRpbmcgZWVwcm9tIGZvciBtb2R1bGUgMHgleCBhdCBvZmZzZXQgJWRcbiIsIGksIFZPWUFHRVJfWFNVTV9FTkRfT0ZGU0VUKSk7CisJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJY2F0X2Rpc2Nvbm5lY3QoKm1vZHBwLCAoKm1vZHBwKS0+YXNpYyk7CisJCWlmKGNhdF9zdWJyZWFkKCptb2RwcCwgKCptb2RwcCktPmFzaWMsCisJCQkgICAgICAgVk9ZQUdFUl9YU1VNX0VORF9PRkZTRVQsIHNpemVvZihlcHJvbV9zaXplKSwKKwkJCSAgICAgICAmZXByb21fc2l6ZSkpIHsKKwkJCXByaW50aygiKipXQVJOSU5HKio6IFZveWFnZXIgY291bGRuJ3QgcmVhZCBFUFJPTSBzaXplIGZvciBtb2R1bGUgMHgleFxuIiwgaSk7CisJCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZihlcHJvbV9zaXplID4gc2l6ZW9mKGVwcm9tX2J1ZikpIHsKKwkJCXByaW50aygiKipXQVJOSU5HKio6IFZveWFnZXIgaW5zdWZmaWNpZW50IHNpemUgdG8gcmVhZCBFUFJPTSBkYXRhLCBtb2R1bGUgMHgleC4gIE5lZWQgJWRcbiIsIGksIGVwcm9tX3NpemUpOworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJY29udGludWU7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJCUNERUJVRygoImNhdF9pbml0OiBtb2R1bGUgMHgleCwgZWVwcm9tX3NpemUgJWRcbiIsIGksIGVwcm9tX3NpemUpKTsKKwkJaWYoY2F0X3N1YnJlYWQoKm1vZHBwLCAoKm1vZHBwKS0+YXNpYywgMCwgCisJCQkgICAgICAgZXByb21fc2l6ZSwgZXByb21fYnVmKSkgeworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJY29udGludWU7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQlwcmludGsoIk1vZHVsZSBcIiVzXCIsIHZlcnNpb24gMHgleCwgdHJhY2VyIDB4JXgsIGFzaWNzICVkXG4iLAorCQkgICAgICAgY2F0X21vZHVsZV9uYW1lKGkpLCBlcHJvbV9oZHItPnZlcnNpb25faWQsCisJCSAgICAgICAqKChfX3UzMiAqKWVwcm9tX2hkci0+dHJhY2VyKSwgIGVwcm9tX2hkci0+bnVtX2FzaWNzKTsKKwkJKCptb2RwcCktPmVlX3NpemUgPSBlcHJvbV9oZHItPmVlX3NpemU7CisJCSgqbW9kcHApLT5udW1fYXNpY3MgPSBlcHJvbV9oZHItPm51bV9hc2ljczsKKwkJYXNpY3BwID0gJigoKm1vZHBwKS0+YXNpYyk7CisJCXNwX29mZnNldCA9IGVwcm9tX2hkci0+c2Nhbl9wYXRoX29mZnNldDsKKwkJLyogQWxsIHdlIHJlYWxseSBjYXJlIGFib3V0IGFyZSB0aGUgUXVhZCBjYXJkcy4gIFdlCisgICAgICAgICAgICAgICAgICogaWRlbnRpZnkgdGhlbSBiZWNhdXNlIHRoZXkgYXJlIGluIGEgcHJvY2Vzc29yIHNsb3QKKyAgICAgICAgICAgICAgICAgKiBhbmQgaGF2ZSBvbmx5IGZvdXIgYXNpY3MgKi8KKwkJaWYoKGkgPCAweDEwIHx8IChpPj0weDE0ICYmIGkgPCAweDFjKSB8fCBpPjB4MWYpKSB7CisJCQltb2RwcCA9ICYoKCptb2RwcCktPm5leHQpOworCQkJY29udGludWU7CisJCX0KKwkJLyogTm93IHdlIGtub3cgaXQncyBpbiBhIHByb2Nlc3NvciBzbG90LCBkb2VzIGl0IGhhdmUKKwkJICogYSBxdWFkIGJhc2Vib2FyZCBzdWJtb2R1bGUgKi8KKwkJb3V0YihWT1lBR0VSX0NBVF9SVU4sIENBVF9DTUQpOworCQljYXRfcmVhZCgqbW9kcHAsICgqbW9kcHApLT5hc2ljLCBWT1lBR0VSX1NVQk1PRFBSRVNFTlQsCisJCQkgJm51bV9zdWJtb2R1bGVzKTsKKwkJLyogbG93ZXN0IHR3byBiaXRzLCBhY3RpdmUgbG93ICovCisJCW51bV9zdWJtb2R1bGVzID0gfigweGZjIHwgbnVtX3N1Ym1vZHVsZXMpOworCQlDREVCVUcoKCJWT1lBR0VSIENBVDogJWQgc3VibW9kdWxlcyBwcmVzZW50XG4iLCBudW1fc3VibW9kdWxlcykpOworCQlpZihudW1fc3VibW9kdWxlcyA9PSAwKSB7CisJCQkvKiBmaWxsIGluIHRoZSBkeWFkaWMgZXh0ZW5kZWQgcHJvY2Vzc29ycyAqLworCQkJX191OCBjcHUgPSBpICYgMHgwNzsKKworCQkJcHJpbnRrKCJNb2R1bGUgXCIlc1wiOiBEeWFkaWMgUHJvY2Vzc29yIENhcmRcbiIsCisJCQkgICAgICAgY2F0X21vZHVsZV9uYW1lKGkpKTsKKwkJCXZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMgfD0gKDE8PGNwdSk7CisJCQljcHUgKz0gNDsKKwkJCXZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMgfD0gKDE8PGNwdSk7CisJCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIG5vdyB3ZSB3YW50IHRvIHJlYWQgdGhlIGFzaWNzIG9uIHRoZSBmaXJzdCBzdWJtb2R1bGUsCisJCSAqIHdoaWNoIHNob3VsZCBiZSB0aGUgcXVhZCBiYXNlIGJvYXJkICovCisKKwkJY2F0X3JlYWQoKm1vZHBwLCAoKm1vZHBwKS0+YXNpYywgVk9ZQUdFUl9TVUJNT0RTRUxFQ1QsICZ2YWwpOworCQlDREVCVUcoKCJjYXRfaW5pdDogU1VCTU9EU0VMRUNUIHZhbHVlID0gMHgleFxuIiwgdmFsKSk7CisJCXZhbCA9ICh2YWwgJiAweDdjKSB8IFZPWUFHRVJfUVVBRF9CQVNFQk9BUkQ7CisJCWNhdF93cml0ZSgqbW9kcHAsICgqbW9kcHApLT5hc2ljLCBWT1lBR0VSX1NVQk1PRFNFTEVDVCwgdmFsKTsKKworCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCQkgCisKKwkJQ0RFQlVHKCgiY2F0X2luaXQ6IFJlYWRpbmcgZWVwcm9tIGZvciBtb2R1bGUgMHgleCBhdCBvZmZzZXQgJWRcbiIsIGksIFZPWUFHRVJfWFNVTV9FTkRfT0ZGU0VUKSk7CisJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJY2F0X2Rpc2Nvbm5lY3QoKm1vZHBwLCAoKm1vZHBwKS0+YXNpYyk7CisJCWlmKGNhdF9zdWJyZWFkKCptb2RwcCwgKCptb2RwcCktPmFzaWMsCisJCQkgICAgICAgVk9ZQUdFUl9YU1VNX0VORF9PRkZTRVQsIHNpemVvZihlcHJvbV9zaXplKSwKKwkJCSAgICAgICAmZXByb21fc2l6ZSkpIHsKKwkJCXByaW50aygiKipXQVJOSU5HKio6IFZveWFnZXIgY291bGRuJ3QgcmVhZCBFUFJPTSBzaXplIGZvciBtb2R1bGUgMHgleFxuIiwgaSk7CisJCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZihlcHJvbV9zaXplID4gc2l6ZW9mKGVwcm9tX2J1ZikpIHsKKwkJCXByaW50aygiKipXQVJOSU5HKio6IFZveWFnZXIgaW5zdWZmaWNpZW50IHNpemUgdG8gcmVhZCBFUFJPTSBkYXRhLCBtb2R1bGUgMHgleC4gIE5lZWQgJWRcbiIsIGksIGVwcm9tX3NpemUpOworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJY29udGludWU7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJCUNERUJVRygoImNhdF9pbml0OiBtb2R1bGUgMHgleCwgZWVwcm9tX3NpemUgJWRcbiIsIGksIGVwcm9tX3NpemUpKTsKKwkJaWYoY2F0X3N1YnJlYWQoKm1vZHBwLCAoKm1vZHBwKS0+YXNpYywgMCwgCisJCQkgICAgICAgZXByb21fc2l6ZSwgZXByb21fYnVmKSkgeworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJY29udGludWU7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkvKiBOb3cgZG8gZXZlcnl0aGluZyBmb3IgdGhlIFFCQiBzdWJtb2R1bGUgMSAqLworCQkoKm1vZHBwKS0+ZWVfc2l6ZSA9IGVwcm9tX2hkci0+ZWVfc2l6ZTsKKwkJKCptb2RwcCktPm51bV9hc2ljcyA9IGVwcm9tX2hkci0+bnVtX2FzaWNzOworCQlhc2ljcHAgPSAmKCgqbW9kcHApLT5hc2ljKTsKKwkJc3Bfb2Zmc2V0ID0gZXByb21faGRyLT5zY2FuX3BhdGhfb2Zmc2V0OworCQkvKiBnZXQgcmlkIG9mIHRoZSBkdW1teSBDQVQgYXNpYyBhbmQgcmVhZCB0aGUgcmVhbCBvbmUgKi8KKwkJa2ZyZWUoKCptb2RwcCktPmFzaWMpOworCQlmb3IoYXNpYz0wOyBhc2ljIDwgKCptb2RwcCktPm51bV9hc2ljczsgYXNpYysrKSB7CisJCQlpbnQgajsKKwkJCXZveWFnZXJfYXNpY190ICphc2ljcCA9ICphc2ljcHAgCisJCQkJPSBrbWFsbG9jKHNpemVvZih2b3lhZ2VyX2FzaWNfdCksIEdGUF9LRVJORUwpOyAvKiZ2b3lhZ2VyX2FzaWNfc3RvcmFnZVthc2ljX2NvdW50KytdOyovCisJCQl2b3lhZ2VyX3NwX3RhYmxlX3QgKnNwX3RhYmxlOworCQkJdm95YWdlcl9hdF90ICphc2ljX3RhYmxlOworCQkJdm95YWdlcl9qdHRfdCAqanRhZ190YWJsZTsKKworCQkJaWYoYXNpY3AgPT0gTlVMTCkgeworCQkJCXByaW50aygiKipXQVJOSU5HKioga21hbGxvYyBmYWlsdXJlIGluIGNhdF9pbml0XG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW1lbXNldChhc2ljcCwgMCwgc2l6ZW9mKHZveWFnZXJfYXNpY190KSk7CisJCQlhc2ljcHAgPSAmKGFzaWNwLT5uZXh0KTsKKwkJCWFzaWNwLT5hc2ljX2xvY2F0aW9uID0gYXNpYzsKKwkJCXNwX3RhYmxlID0gKHZveWFnZXJfc3BfdGFibGVfdCAqKShlcHJvbV9idWYgKyBzcF9vZmZzZXQpOworCQkJYXNpY3AtPmFzaWNfaWQgPSBzcF90YWJsZS0+YXNpY19pZDsKKwkJCWFzaWNfdGFibGUgPSAodm95YWdlcl9hdF90ICopKGVwcm9tX2J1ZiArIHNwX3RhYmxlLT5hc2ljX2RhdGFfb2Zmc2V0KTsKKwkJCWZvcihqPTA7IGo8NDsgaisrKQorCQkJCWFzaWNwLT5qdGFnX2lkW2pdID0gYXNpY190YWJsZS0+anRhZ19pZFtqXTsKKwkJCWp0YWdfdGFibGUgPSAodm95YWdlcl9qdHRfdCAqKShlcHJvbV9idWYgKyBhc2ljX3RhYmxlLT5qdGFnX29mZnNldCk7CisJCQlhc2ljcC0+aXJlZ19sZW5ndGggPSBqdGFnX3RhYmxlLT5pcmVnX2xlbjsKKwkJCWFzaWNwLT5iaXRfbG9jYXRpb24gPSAoKm1vZHBwKS0+aW5zdF9iaXRzOworCQkJKCptb2RwcCktPmluc3RfYml0cyArPSBhc2ljcC0+aXJlZ19sZW5ndGg7CisJCQlpZihhc2ljcC0+aXJlZ19sZW5ndGggPiAoKm1vZHBwKS0+bGFyZ2VzdF9yZWcpCisJCQkJKCptb2RwcCktPmxhcmdlc3RfcmVnID0gYXNpY3AtPmlyZWdfbGVuZ3RoOworCQkJaWYgKGFzaWNwLT5pcmVnX2xlbmd0aCA8ICgqbW9kcHApLT5zbWFsbGVzdF9yZWcgfHwKKwkJCSAgICAoKm1vZHBwKS0+c21hbGxlc3RfcmVnID09IDApCisJCQkJKCptb2RwcCktPnNtYWxsZXN0X3JlZyA9IGFzaWNwLT5pcmVnX2xlbmd0aDsKKwkJCUNERUJVRygoImFzaWMgMHgleCwgaXJlZ19sZW5ndGg9JWQsIGJpdF9sb2NhdGlvbj0lZFxuIiwKKwkJCQlhc2ljcC0+YXNpY19pZCwgYXNpY3AtPmlyZWdfbGVuZ3RoLAorCQkJCWFzaWNwLT5iaXRfbG9jYXRpb24pKTsKKwkJCWlmKGFzaWNwLT5hc2ljX2lkID09IFZPWUFHRVJfUVVBRF9RQUJDKSB7CisJCQkJQ0RFQlVHKCgiVk9ZQUdFUiBDQVQ6IFFBQkMgQVNJQyBmb3VuZFxuIikpOworCQkJCXFhYmNfYXNpYyA9IGFzaWNwOworCQkJfQorCQkJc3Bfb2Zmc2V0ICs9IHNpemVvZih2b3lhZ2VyX3NwX3RhYmxlX3QpOworCQl9CisJCUNERUJVRygoIk1vZHVsZSBpbnN0X2JpdHMgPSAlZCwgbGFyZ2VzdF9yZWcgPSAlZCwgc21hbGxlc3RfcmVnPSVkXG4iLAorCQkJKCptb2RwcCktPmluc3RfYml0cywgKCptb2RwcCktPmxhcmdlc3RfcmVnLAorCQkJKCptb2RwcCktPnNtYWxsZXN0X3JlZykpOworCQkvKiBPSywgbm93IHdlIGhhdmUgdGhlIFFVQUQgQVNJQ3Mgc2V0IHVwLCB1c2UgdGhlbS4KKwkJICogd2UgbmVlZCB0bzoKKwkJICoKKwkJICogMS4gRmluZCB0aGUgTWVtb3J5IGFyZWEgZm9yIHRoZSBRdWFkIENQSXMuCisJCSAqIDIuIEZpbmQgdGhlIEV4dGVuZGVkIFZJQyBwcm9jZXNzb3IKKwkJICogMy4gQ29uZmlndXJlIGEgc2Vjb25kIGV4dGVuZGVkIFZJQyBwcm9jZXNzb3IgKFRoaXMKKwkJICogICAgY2Fubm90IGJlIGRvbmUgZm9yIHRoZSA1MXh4LgorCQkgKiAqLworCQlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJCWNhdF9jb25uZWN0KCptb2RwcCwgKCptb2RwcCktPmFzaWMpOworCQlDREVCVUcoKCJDQVQgQ09OTkVDVEVEISFcbiIpKTsKKwkJY2F0X3N1YnJlYWQoKm1vZHBwLCBxYWJjX2FzaWMsIDAsIHNpemVvZihxYWJjX2RhdGEpLCBxYWJjX2RhdGEpOworCQlxaWNfYWRkciA9IHFhYmNfZGF0YVs1XSA8PCA4OworCQlxaWNfYWRkciA9IChxaWNfYWRkciB8IHFhYmNfZGF0YVs2XSkgPDwgODsKKwkJcWljX2FkZHIgPSAocWljX2FkZHIgfCBxYWJjX2RhdGFbN10pIDw8IDg7CisJCXByaW50aygiTW9kdWxlIFwiJXNcIjogUXVhZCBQcm9jZXNzb3IgQ2FyZDsgQ1BJIDB4JWx4LCBTRVQ9MHgleFxuIiwKKwkJICAgICAgIGNhdF9tb2R1bGVfbmFtZShpKSwgcWljX2FkZHIsIHFhYmNfZGF0YVs4XSk7CisjaWYgMAkJCQkvKiBwbHVtYmluZyBmYWlscy0tLUZJWE1FICovCisJCWlmKChxYWJjX2RhdGFbOF0gJiAweGYwKSA9PSAwKSB7CisJCQkvKiBGSVhNRTogMzIgd2F5IDggQ1BVIHNsb3QgbW9uc3RlciBjYW5ub3QgYmUKKwkJCSAqIHBsdW1iZWQgdGhpcyB3YXktLS1uZWVkIHRvIGNoZWNrIGZvciBpdCAqLworCisJCQlwcmludGsoIlBsdW1iaW5nIHNlY29uZCBFeHRlbmRlZCBRdWFkIFByb2Nlc3NvclxuIik7CisJCQkvKiBzZWNvbmQgVklDIGxpbmUgaGFyZHdpcmVkIHRvIFF1YWQgQ1BVIDEgKi8KKwkJCXFhYmNfZGF0YVs4XSB8PSAweDIwOworCQkJY2F0X3N1YndyaXRlKCptb2RwcCwgcWFiY19hc2ljLCA4LCAxLCAmcWFiY19kYXRhWzhdKTsKKyNpZmRlZiBWT1lBR0VSX0NBVF9ERUJVRworCQkJLyogdmVyaWZ5IHBsdW1iaW5nICovCisJCQljYXRfc3VicmVhZCgqbW9kcHAsIHFhYmNfYXNpYywgOCwgMSwgJnFhYmNfZGF0YVs4XSk7CisJCQlpZigocWFiY19kYXRhWzhdICYgMHhmMCkgPT0gMCkgeworCQkJCUNERUJVRygoIlBMVU1CSU5HIEZBSUxFRDogMHgleFxuIiwgcWFiY19kYXRhWzhdKSk7CisJCQl9CisjZW5kaWYKKwkJfQorI2VuZGlmCisKKwkJeworCQkJc3RydWN0IHJlc291cmNlICpyZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpLEdGUF9LRVJORUwpOworCQkJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQkJcmVzLT5uYW1lID0ga21hbGxvYygxMjgsIEdGUF9LRVJORUwpOworCQkJc3ByaW50ZigoY2hhciAqKXJlcy0+bmFtZSwgIlZveWFnZXIgJXMgUXVhZCBDUEkiLCBjYXRfbW9kdWxlX25hbWUoaSkpOworCQkJcmVzLT5zdGFydCA9IHFpY19hZGRyOworCQkJcmVzLT5lbmQgPSBxaWNfYWRkciArIDB4M2ZmOworCQkJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7CisJCX0KKworCQlxaWNfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAocWljX2FkZHIsIDB4NDAwKTsKKwkJCQkKKwkJZm9yKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCQlfX3U4IGNwdTsKKworCQkJaWYodm95YWdlcl84c2xvdCkgeworCQkJCS8qIDggc2xvdCBoYXMgYSBkaWZmZXJlbnQgbWFwcGluZywKKwkJCQkgKiBlYWNoIHNsb3QgaGFzIG9ubHkgb25lIHZpYyBsaW5lLCBzbworCQkJCSAqIDEgY3B1IGluIGVhY2ggc2xvdCBtdXN0IGJlIDwgOCAqLworCQkJCWNwdSA9IChpICYgMHgwNykgKyBqKjg7CisJCQl9IGVsc2UgeworCQkJCWNwdSA9IChpICYgMHgwMykgKyBqKjQ7CisJCQl9CisJCQlpZiggKHFhYmNfZGF0YVs4XSAmICgxPDxqKSkpIHsKKwkJCQl2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzIHw9ICgxPDxjcHUpOworCQkJfQorCQkJaWYocWFiY19kYXRhWzhdICYgKDE8PChqKzQpKSApIHsKKwkJCQkvKiBTZWNvbmQgU0VUIHJlZ2lzdGVyIHBsdW1iZWQ6IFF1YWQKKwkJCQkgKiBjYXJkIGhhcyB0d28gVklDIGNvbm5lY3RlZCBDUFVzLgorCQkJCSAqIFNlY29uZGFyeSBjYW5ub3QgYmUgYm9vdGVkIGFzIGEgVklDCisJCQkJICogQ1BVICovCisJCQkJdm95YWdlcl9leHRlbmRlZF92aWNfcHJvY2Vzc29ycyB8PSAoMTw8Y3B1KTsKKwkJCQl2b3lhZ2VyX2FsbG93ZWRfYm9vdF9wcm9jZXNzb3JzICY9ICh+KDE8PGNwdSkpOworCQkJfQorCisJCQl2b3lhZ2VyX3F1YWRfcHJvY2Vzc29ycyB8PSAoMTw8Y3B1KTsKKwkJCXZveWFnZXJfcXVhZF9jcGlfYWRkcltjcHVdID0gKHN0cnVjdCB2b3lhZ2VyX3FpY19jcGkgKikKKwkJCQkocWljX2FkZHIrKGo8PDgpKTsKKwkJCUNERUJVRygoIkNQVSVkOiBDUEkgYWRkcmVzcyAweCVseFxuIiwgY3B1LAorCQkJCSh1bnNpZ25lZCBsb25nKXZveWFnZXJfcXVhZF9jcGlfYWRkcltjcHVdKSk7CisJCX0KKwkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCisJCQorCQkKKwkJKmFzaWNwcCA9IE5VTEw7CisJCW1vZHBwID0gJigoKm1vZHBwKS0+bmV4dCk7CisJfQorCSptb2RwcCA9IE5VTEw7CisJcHJpbnRrKCJDQVQgQnVzIEluaXRpYWxpc2F0aW9uIGZpbmlzaGVkOiBleHRlbmRlZCBwcm9jcyAweCV4LCBxdWFkIHByb2NzIDB4JXgsIGFsbG93ZWQgdmljIGJvb3QgPSAweCV4XG4iLCB2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzLCB2b3lhZ2VyX3F1YWRfcHJvY2Vzc29ycywgdm95YWdlcl9hbGxvd2VkX2Jvb3RfcHJvY2Vzc29ycyk7CisJcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmdmljX3Jlcyk7CisJaWYodm95YWdlcl9xdWFkX3Byb2Nlc3NvcnMpCisJCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnFpY19yZXMpOworCS8qIHNldCB1cCB0aGUgZnJvbnQgcG93ZXIgc3dpdGNoICovCit9CisKK2ludAordm95YWdlcl9jYXRfcmVhZGIoX191OCBtb2R1bGUsIF9fdTggYXNpYywgaW50IHJlZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2F0X2Rpc2Nvbm5lY3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwKSAKK3sKKwlfX3U4IHZhbDsKKwlpbnQgZXJyID0gMDsKKworCWlmKCFtb2RwLT5zY2FuX3BhdGhfY29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKwlpZihhc2ljcC0+YXNpY19pZCAhPSBWT1lBR0VSX0NBVF9JRCkgeworCQlDREVCVUcoKCJjYXRfZGlzY29ubmVjdDogQVNJQyBpcyBub3QgQ0FUXG4iKSk7CisJCXJldHVybiAxOworCX0KKwllcnIgPSBjYXRfcmVhZChtb2RwLCBhc2ljcCwgVk9ZQUdFUl9TQ0FOUEFUSCwgJnZhbCk7CisJaWYoZXJyKSB7CisJCUNERUJVRygoImNhdF9kaXNjb25uZWN0OiBmYWlsZWQgdG8gcmVhZCBTQ0FOUEFUSFxuIikpOworCQlyZXR1cm4gZXJyOworCX0KKwl2YWwgJj0gVk9ZQUdFUl9ESVNDT05ORUNUX0FTSUM7CisJZXJyID0gY2F0X3dyaXRlKG1vZHAsIGFzaWNwLCBWT1lBR0VSX1NDQU5QQVRILCB2YWwpOworCWlmKGVycikgeworCQlDREVCVUcoKCJjYXRfZGlzY29ubmVjdDogZmFpbGVkIHRvIHdyaXRlIFNDQU5QQVRIXG4iKSk7CisJCXJldHVybiBlcnI7CisJfQorCW91dGIoVk9ZQUdFUl9DQVRfRU5ELCBDQVRfQ01EKTsKKwlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJbW9kcC0+c2Nhbl9wYXRoX2Nvbm5lY3RlZCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2F0X2Nvbm5lY3Qodm95YWdlcl9tb2R1bGVfdCAqbW9kcCwgdm95YWdlcl9hc2ljX3QgKmFzaWNwKSAKK3sKKwlfX3U4IHZhbDsKKwlpbnQgZXJyID0gMDsKKworCWlmKG1vZHAtPnNjYW5fcGF0aF9jb25uZWN0ZWQpCisJCXJldHVybiAwOworCWlmKGFzaWNwLT5hc2ljX2lkICE9IFZPWUFHRVJfQ0FUX0lEKSB7CisJCUNERUJVRygoImNhdF9jb25uZWN0OiBBU0lDIGlzIG5vdCBDQVRcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZXJyID0gY2F0X3JlYWQobW9kcCwgYXNpY3AsIFZPWUFHRVJfU0NBTlBBVEgsICZ2YWwpOworCWlmKGVycikgeworCQlDREVCVUcoKCJjYXRfY29ubmVjdDogZmFpbGVkIHRvIHJlYWQgU0NBTlBBVEhcbiIpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJdmFsIHw9IFZPWUFHRVJfQ09OTkVDVF9BU0lDOworCWVyciA9IGNhdF93cml0ZShtb2RwLCBhc2ljcCwgVk9ZQUdFUl9TQ0FOUEFUSCwgdmFsKTsKKwlpZihlcnIpIHsKKwkJQ0RFQlVHKCgiY2F0X2Nvbm5lY3Q6IGZhaWxlZCB0byB3cml0ZSBTQ0FOUEFUSFxuIikpOworCQlyZXR1cm4gZXJyOworCX0KKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJb3V0YihWT1lBR0VSX0NBVF9SVU4sIENBVF9DTUQpOworCW1vZHAtPnNjYW5fcGF0aF9jb25uZWN0ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3ZveWFnZXJfY2F0X3Bvd2VyX29mZih2b2lkKQoreworCS8qIFBvd2VyIHRoZSBtYWNoaW5lIG9mZiBieSB3cml0aW5nIHRvIHRoZSBQU0kgb3ZlciB0aGUgQ0FUCisgICAgICAgICAqIGJ1cyAqLworCV9fdTggZGF0YTsKKwl2b3lhZ2VyX21vZHVsZV90IHBzaSA9IHsgMCB9OworCXZveWFnZXJfYXNpY190IHBzaV9hc2ljID0geyAwIH07CisKKwlwc2kuYXNpYyA9ICZwc2lfYXNpYzsKKwlwc2kuYXNpYy0+YXNpY19pZCA9IFZPWUFHRVJfQ0FUX0lEOworCXBzaS5hc2ljLT5zdWJhZGRyID0gVk9ZQUdFUl9TVUJBRERSX0hJOworCXBzaS5tb2R1bGVfYWRkciA9IFZPWUFHRVJfUFNJOworCXBzaS5zY2FuX3BhdGhfY29ubmVjdGVkID0gMDsKKworCW91dGIoVk9ZQUdFUl9DQVRfRU5ELCBDQVRfQ01EKTsKKwkvKiBDb25uZWN0IHRoZSBQU0kgdG8gdGhlIENBVCBCdXMgKi8KKwlvdXRiKFZPWUFHRVJfQ0FUX0RFU0VMRUNULCBWT1lBR0VSX0NBVF9DT05GSUdfUE9SVCk7CisJb3V0YihWT1lBR0VSX1BTSSwgVk9ZQUdFUl9DQVRfQ09ORklHX1BPUlQpOworCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwljYXRfZGlzY29ubmVjdCgmcHNpLCAmcHNpX2FzaWMpOworCS8qIFJlYWQgdGhlIHN0YXR1cyAqLworCWNhdF9zdWJyZWFkKCZwc2ksICZwc2lfYXNpYywgVk9ZQUdFUl9QU0lfR0VORVJBTF9SRUcsIDEsICZkYXRhKTsKKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJQ0RFQlVHKCgiUFNJIFNUQVRVUyAweCV4XG4iLCBkYXRhKSk7CisJLyogVGhlc2UgdHdvIHdyaXRlcyBhcmUgcG93ZXIgb2ZmIHByZXAgYW5kIHBlcmZvcm0gKi8KKwlkYXRhID0gUFNJX0NMRUFSOworCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwljYXRfc3Vid3JpdGUoJnBzaSwgJnBzaV9hc2ljLCBWT1lBR0VSX1BTSV9HRU5FUkFMX1JFRywgMSwgJmRhdGEpOworCW91dGIoVk9ZQUdFUl9DQVRfRU5ELCBDQVRfQ01EKTsKKwlkYXRhID0gUFNJX1BPV0VSX0RPV047CisJb3V0YihWT1lBR0VSX0NBVF9SVU4sIENBVF9DTUQpOworCWNhdF9zdWJ3cml0ZSgmcHNpLCAmcHNpX2FzaWMsIFZPWUFHRVJfUFNJX0dFTkVSQUxfUkVHLCAxLCAmZGF0YSk7CisJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworfQorCitzdHJ1Y3Qgdm95YWdlcl9zdGF0dXMgdm95YWdlcl9zdGF0dXMgPSB7IDAgfTsKKwordm9pZAordm95YWdlcl9jYXRfcHNpKF9fdTggY21kLCBfX3UxNiByZWcsIF9fdTggKmRhdGEpCit7CisJdm95YWdlcl9tb2R1bGVfdCBwc2kgPSB7IDAgfTsKKwl2b3lhZ2VyX2FzaWNfdCBwc2lfYXNpYyA9IHsgMCB9OworCisJcHNpLmFzaWMgPSAmcHNpX2FzaWM7CisJcHNpLmFzaWMtPmFzaWNfaWQgPSBWT1lBR0VSX0NBVF9JRDsKKwlwc2kuYXNpYy0+c3ViYWRkciA9IFZPWUFHRVJfU1VCQUREUl9ISTsKKwlwc2kubW9kdWxlX2FkZHIgPSBWT1lBR0VSX1BTSTsKKwlwc2kuc2Nhbl9wYXRoX2Nvbm5lY3RlZCA9IDA7CisKKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJLyogQ29ubmVjdCB0aGUgUFNJIHRvIHRoZSBDQVQgQnVzICovCisJb3V0YihWT1lBR0VSX0NBVF9ERVNFTEVDVCwgVk9ZQUdFUl9DQVRfQ09ORklHX1BPUlQpOworCW91dGIoVk9ZQUdFUl9QU0ksIFZPWUFHRVJfQ0FUX0NPTkZJR19QT1JUKTsKKwlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJY2F0X2Rpc2Nvbm5lY3QoJnBzaSwgJnBzaV9hc2ljKTsKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBWT1lBR0VSX1BTSV9SRUFEOgorCQljYXRfcmVhZCgmcHNpLCAmcHNpX2FzaWMsIHJlZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgVk9ZQUdFUl9QU0lfV1JJVEU6CisJCWNhdF93cml0ZSgmcHNpLCAmcHNpX2FzaWMsIHJlZywgKmRhdGEpOworCQlicmVhazsKKwljYXNlIFZPWUFHRVJfUFNJX1NVQlJFQUQ6CisJCWNhdF9zdWJyZWFkKCZwc2ksICZwc2lfYXNpYywgcmVnLCAxLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBWT1lBR0VSX1BTSV9TVUJXUklURToKKwkJY2F0X3N1YndyaXRlKCZwc2ksICZwc2lfYXNpYywgcmVnLCAxLCBkYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJWb3lhZ2VyIFBTSSwgdW5yZWNvZ25pc2VkIGNvbW1hbmQgJWRcbiIsIGNtZCk7CisJCWJyZWFrOworCX0KKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7Cit9CisKK3ZvaWQKK3ZveWFnZXJfY2F0X2RvX2NvbW1vbl9pbnRlcnJ1cHQodm9pZCkKK3sKKwkvKiBUaGlzIGlzIGNhdXNlZCBlaXRoZXIgYnkgYSBtZW1vcnkgcGFyaXR5IGVycm9yIG9yIHNvbWV0aGluZworCSAqIGluIHRoZSBQU0kgKi8KKwlfX3U4IGRhdGE7CisJdm95YWdlcl9tb2R1bGVfdCBwc2kgPSB7IDAgfTsKKwl2b3lhZ2VyX2FzaWNfdCBwc2lfYXNpYyA9IHsgMCB9OworCXN0cnVjdCB2b3lhZ2VyX3BzaSBwc2lfcmVnOworCWludCBpOworIHJlX3JlYWQ6CisJcHNpLmFzaWMgPSAmcHNpX2FzaWM7CisJcHNpLmFzaWMtPmFzaWNfaWQgPSBWT1lBR0VSX0NBVF9JRDsKKwlwc2kuYXNpYy0+c3ViYWRkciA9IFZPWUFHRVJfU1VCQUREUl9ISTsKKwlwc2kubW9kdWxlX2FkZHIgPSBWT1lBR0VSX1BTSTsKKwlwc2kuc2Nhbl9wYXRoX2Nvbm5lY3RlZCA9IDA7CisKKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJLyogQ29ubmVjdCB0aGUgUFNJIHRvIHRoZSBDQVQgQnVzICovCisJb3V0YihWT1lBR0VSX0NBVF9ERVNFTEVDVCwgVk9ZQUdFUl9DQVRfQ09ORklHX1BPUlQpOworCW91dGIoVk9ZQUdFUl9QU0ksIFZPWUFHRVJfQ0FUX0NPTkZJR19QT1JUKTsKKwlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJY2F0X2Rpc2Nvbm5lY3QoJnBzaSwgJnBzaV9hc2ljKTsKKwkvKiBSZWFkIHRoZSBzdGF0dXMuICBOT1RFOiBOZWVkIHRvIHJlYWQgKmFsbCogdGhlIFBTSSByZWdzIGhlcmUKKwkgKiBvdGhlcndpc2UgdGhlIGNtbiBpbnQgd2lsbCBiZSByZWFzc2VydGVkICovCisJZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKHBzaV9yZWcucmVncyk7IGkrKykgeworCQljYXRfcmVhZCgmcHNpLCAmcHNpX2FzaWMsIGksICYoKF9fdTggKikmcHNpX3JlZy5yZWdzKVtpXSk7CisJfQorCW91dGIoVk9ZQUdFUl9DQVRfRU5ELCBDQVRfQ01EKTsKKwlpZigocHNpX3JlZy5yZWdzLmNoZWNrYml0ICYgMHgwMikgPT0gMCkgeworCQlwc2lfcmVnLnJlZ3MuY2hlY2tiaXQgfD0gMHgwMjsKKwkJY2F0X3dyaXRlKCZwc2ksICZwc2lfYXNpYywgNSwgcHNpX3JlZy5yZWdzLmNoZWNrYml0KTsKKwkJcHJpbnRrKCJWT1lBR0VSIFJFLVJFQUQgUFNJXG4iKTsKKwkJZ290byByZV9yZWFkOworCX0KKwlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKHBzaV9yZWcuc3VicmVncyk7IGkrKykgeworCQkvKiBUaGlzIGxvb2tzIHN0cmFuZ2UsIGJ1dCB0aGUgUFNJIGRvZXNuJ3QgZG8gYXV0byBpbmNyZW1lbnQKKwkJICogY29ycmVjdGx5ICovCisJCWNhdF9zdWJyZWFkKCZwc2ksICZwc2lfYXNpYywgVk9ZQUdFUl9QU0lfU1VQUExZX1JFRyArIGksIAorCQkJICAgIDEsICYoKF9fdTggKikmcHNpX3JlZy5zdWJyZWdzKVtpXSk7IAorCX0KKwlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisjaWZkZWYgVk9ZQUdFUl9DQVRfREVCVUcKKwlwcmludGsoIlZPWUFHRVIgUFNJOiAiKTsKKwlmb3IoaT0wOyBpPHNpemVvZihwc2lfcmVnLnJlZ3MpOyBpKyspCisJCXByaW50aygiJTAyeCAiLCAoKF9fdTggKikmcHNpX3JlZy5yZWdzKVtpXSk7CisJcHJpbnRrKCJcbiAgICAgICAgICAgIik7CisJZm9yKGk9MDsgaTxzaXplb2YocHNpX3JlZy5zdWJyZWdzKTsgaSsrKQorCQlwcmludGsoIiUwMnggIiwgKChfX3U4ICopJnBzaV9yZWcuc3VicmVncylbaV0pOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCWlmKHBzaV9yZWcucmVncy5pbnRzdGF0dXMgJiBQU0lfTU9OKSB7CisJCS8qIHN3aXRjaCBvZmYgb3IgcG93ZXIgZmFpbCAqLworCisJCWlmKHBzaV9yZWcuc3VicmVncy5zdXBwbHkgJiBQU0lfU1dJVENIX09GRikgeworCQkJaWYodm95YWdlcl9zdGF0dXMuc3dpdGNoX29mZikgeworCQkJCXByaW50ayhLRVJOX0VSUiAiVm95YWdlciBmcm9udCBwYW5lbCBzd2l0Y2ggdHVybmVkIG9mZiBhZ2Fpbi0tLUltbWVkaWF0ZSBwb3dlciBvZmYhXG4iKTsKKwkJCQl2b3lhZ2VyX2NhdF9wb3dlcl9vZmYoKTsKKwkJCQkvKiBub3QgcmVhY2hlZCAqLworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlZveWFnZXIgZnJvbnQgcGFuZWwgc3dpdGNoIHR1cm5lZCBvZmZcbiIpOworCQkJCXZveWFnZXJfc3RhdHVzLnN3aXRjaF9vZmYgPSAxOworCQkJCXZveWFnZXJfc3RhdHVzLnJlcXVlc3RfZnJvbV9rZXJuZWwgPSAxOworCQkJCXVwKCZrdm95YWdlcmRfc2VtKTsKKwkJCX0KKwkJCS8qIFRlbGwgdGhlIGhhcmR3YXJlIHdlJ3JlIHRha2luZyBjYXJlIG9mIHRoZQorCQkJICogc2h1dGRvd24sIG90aGVyd2lzZSBpdCB3aWxsIHBvd2VyIHRoZSBib3ggb2ZmCisJCQkgKiB3aXRoaW4gMyBzZWNvbmRzIG9mIHRoZSBzd2l0Y2ggYmVpbmcgcHJlc3NlZCBhbmQsCisJCQkgKiB3aGljaCBpcyBtdWNoIG1vcmUgaW1wb3J0YW50IHRvIHVzLCBjb250aW51ZSB0byAKKwkJCSAqIGFzc2VydCB0aGUgY29tbW9uIGludGVycnVwdCAqLworCQkJZGF0YSA9IFBTSV9DTFJfU1dJVENIX09GRjsKKwkJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJCWNhdF9zdWJ3cml0ZSgmcHNpLCAmcHNpX2FzaWMsIFZPWUFHRVJfUFNJX1NVUFBMWV9SRUcsCisJCQkJICAgICAxLCAmZGF0YSk7CisJCQlvdXRiKFZPWUFHRVJfQ0FUX0VORCwgQ0FUX0NNRCk7CisJCX0gZWxzZSB7CisKKwkJCVZERUJVRygoIlZveWFnZXIgYWMgZmFpbCByZWcgMHgleFxuIiwKKwkJCQlwc2lfcmVnLnN1YnJlZ3MuQUNmYWlsKSk7CisJCQlpZigocHNpX3JlZy5zdWJyZWdzLkFDZmFpbCAmIEFDX0ZBSUxfU1RBVF9DSEFOR0UpID09IDApIHsKKwkJCQkvKiBObyBmdXJ0aGVyIHVwZGF0ZSAqLworCQkJCXJldHVybjsKKwkJCX0KKyNpZiAwCisJCQkvKiBEb24ndCBib3RoZXIgdHJ5aW5nIHRvIGZpbmQgb3V0IHdobyBmYWlsZWQuCisJCQkgKiBGSVhNRTogVGhpcyBwcm9iYWJseSBtYWtlcyB0aGUgY29kZSBpbmNvcnJlY3Qgb24KKwkJCSAqIGFueXRoaW5nIG90aGVyIHRoYW4gYSAzNDV4ICovCisJCQlmb3IoaT0wOyBpPCA1OyBpKyspIHsKKwkJCQlpZiggcHNpX3JlZy5zdWJyZWdzLkFDZmFpbCAmKDE8PGkpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXByaW50ayhLRVJOX05PVElDRSAiQUMgRkFJTCBJTiBTVVBQTFkgJWRcbiIsIGkpOworI2VuZGlmCisJCQkvKiBET04nVCBkbyB0aGlzOiBpdCBzaHV0cyBkb3duIHRoZSBBQyBQU0kgCisJCQlvdXRiKFZPWUFHRVJfQ0FUX1JVTiwgQ0FUX0NNRCk7CisJCQlkYXRhID0gUFNJX01BU0tfTUFTSyB8IGk7CisJCQljYXRfc3Vid3JpdGUoJnBzaSwgJnBzaV9hc2ljLCBWT1lBR0VSX1BTSV9NQVNLLAorCQkJCSAgICAgMSwgJmRhdGEpOworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiVm95YWdlciBBQyBwb3dlciBmYWlsdXJlXG4iKTsKKwkJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJCWRhdGEgPSBQU0lfQ09MRF9TVEFSVDsKKwkJCWNhdF9zdWJ3cml0ZSgmcHNpLCAmcHNpX2FzaWMsIFZPWUFHRVJfUFNJX0dFTkVSQUxfUkVHLAorCQkJCSAgICAgMSwgJmRhdGEpOworCQkJb3V0YihWT1lBR0VSX0NBVF9FTkQsIENBVF9DTUQpOworCQkJdm95YWdlcl9zdGF0dXMucG93ZXJfZmFpbCA9IDE7CisJCQl2b3lhZ2VyX3N0YXR1cy5yZXF1ZXN0X2Zyb21fa2VybmVsID0gMTsKKwkJCXVwKCZrdm95YWdlcmRfc2VtKTsKKwkJfQorCQkKKwkJCisJfSBlbHNlIGlmKHBzaV9yZWcucmVncy5pbnRzdGF0dXMgJiBQU0lfRkFVTFQpIHsKKwkJLyogTWFqb3IgZmF1bHQhICovCisJCXByaW50ayhLRVJOX0VSUiAiVm95YWdlciBQU0kgRGV0ZWN0ZWQgbWFqb3IgZmF1bHQsIGltbWVkaWF0ZSBwb3dlciBvZmYhXG4iKTsKKwkJdm95YWdlcl9jYXRfcG93ZXJfb2ZmKCk7CisJCS8qIG5vdCByZWFjaGVkICovCisJfSBlbHNlIGlmKHBzaV9yZWcucmVncy5pbnRzdGF0dXMgJiAoUFNJX0RDX0ZBSUwgfCBQU0lfQUxBUk0KKwkJCQkJICAgIHwgUFNJX0NVUlJFTlQgfCBQU0lfRFZNCisJCQkJCSAgICB8IFBTSV9QU0NGQVVMVCB8IFBTSV9TVEFUX0NIRykpIHsKKwkJLyogb3RoZXIgcHNpIGZhdWx0ICovCisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVm95YWdlciBQU0kgc3RhdHVzIDB4JXhcbiIsIGRhdGEpOworCQkvKiBjbGVhciB0aGUgUFNJIGZhdWx0ICovCisJCW91dGIoVk9ZQUdFUl9DQVRfUlVOLCBDQVRfQ01EKTsKKwkJY2F0X3dyaXRlKCZwc2ksICZwc2lfYXNpYywgVk9ZQUdFUl9QU0lfU1RBVFVTX1JFRywgMCk7CisJCW91dGIoVk9ZQUdFUl9DQVRfRU5ELCBDQVRfQ01EKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfc21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzZDczOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl9zbXAuYwpAQCAtMCwwICsxLDE5MzEgQEAKKy8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogOCAtKi0gKi8KKworLyogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDEKKyAqCisgKiBBdXRob3I6IEouRS5KLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20KKyAqCisgKiBsaW51eC9hcmNoL2kzODYva2VybmVsL3ZveWFnZXJfc21wLmMKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBzYW1lIGV4dGVybmFsIGVudHJpZXMgYXMgc21wLmMgYnV0IHVzZXMKKyAqIHRoZSB2b3lhZ2VyIGhhbCB0byBwcm92aWRlIHRoZSBmdW5jdGlvbmFsaXR5CisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgPGFzbS92b3lhZ2VyLmg+CisjaW5jbHVkZSA8YXNtL3ZpYy5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisKKy8qIFRMQiBzdGF0ZSAtLSB2aXNpYmxlIGV4dGVybmFsbHksIGluZGV4ZWQgcGh5c2ljYWxseSAqLworREVGSU5FX1BFUl9DUFUoc3RydWN0IHRsYl9zdGF0ZSwgY3B1X3RsYnN0YXRlKSBfX19fY2FjaGVsaW5lX2FsaWduZWQgPSB7ICZpbml0X21tLCAwIH07CisKKy8qIENQVSBJUlEgYWZmaW5pdHkgLS0gc2V0IHRvIGFsbCBvbmVzIGluaXRpYWxseSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X2lycV9hZmZpbml0eVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkID0geyBbMCAuLi4gTlJfQ1BVUy0xXSAgPSB+MFVMIH07CisKKy8qIHBlciBDUFUgZGF0YSBzdHJ1Y3R1cmUgKGZvciAvcHJvYy9jcHVpbmZvIGV0IGFsKSwgdmlzaWJsZSBleHRlcm5hbGx5CisgKiBpbmRleGVkIHBoeXNpY2FsbHkgKi8KK3N0cnVjdCBjcHVpbmZvX3g4NiBjcHVfZGF0YVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworCisvKiBwaHlzaWNhbCBJRCBvZiB0aGUgQ1BVIHVzZWQgdG8gYm9vdCB0aGUgc3lzdGVtICovCit1bnNpZ25lZCBjaGFyIGJvb3RfY3B1X2lkOworCisvKiBUaGUgbWVtb3J5IGxpbmUgYWRkcmVzc2VzIGZvciB0aGUgUXVhZCBDUElzICovCitzdHJ1Y3Qgdm95YWdlcl9xaWNfY3BpICp2b3lhZ2VyX3F1YWRfY3BpX2FkZHJbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKKworLyogVGhlIG1hc2tzIGZvciB0aGUgRXh0ZW5kZWQgVklDIHByb2Nlc3NvcnMsIGZpbGxlZCBpbiBieSBjYXRfaW5pdCAqLworX191MzIgdm95YWdlcl9leHRlbmRlZF92aWNfcHJvY2Vzc29ycyA9IDA7CisKKy8qIE1hc2tzIGZvciB0aGUgZXh0ZW5kZWQgUXVhZCBwcm9jZXNzb3JzIHdoaWNoIGNhbm5vdCBiZSBWSUMgYm9vdGVkICovCitfX3UzMiB2b3lhZ2VyX2FsbG93ZWRfYm9vdF9wcm9jZXNzb3JzID0gMDsKKworLyogVGhlIG1hc2sgZm9yIHRoZSBRdWFkIFByb2Nlc3NvcnMgKGJvdGggZXh0ZW5kZWQgYW5kIG5vbi1leHRlbmRlZCkgKi8KK19fdTMyIHZveWFnZXJfcXVhZF9wcm9jZXNzb3JzID0gMDsKKworLyogVG90YWwgY291bnQgb2YgbGl2ZSBDUFVzLCB1c2VkIGluIHByb2Nlc3MuYyB0byBkaXNwbGF5CisgKiB0aGUgQ1BVIGluZm9ybWF0aW9uIGFuZCBpbiBpcnEuYyBmb3IgdGhlIHBlciBDUFUgaXJxCisgKiBhY3Rpdml0eSBjb3VudC4gIEZpbmFsbHkgZXhwb3J0ZWQgYnkgaTM4Nl9rc3ltcy5jICovCitzdGF0aWMgaW50IHZveWFnZXJfZXh0ZW5kZWRfY3B1cyA9IDE7CisKKy8qIEhhdmUgd2UgZm91bmQgYW4gU01QIGJveCAtIHVzZWQgYnkgdGltZS5jIHRvIGRvIHRoZSBwcm9maWxpbmcKKyAgIGludGVycnVwdCBmb3IgdGltZXNsaWNpbmc7IGRvIG5vdCBzZXQgdG8gMSB1bnRpbCB0aGUgcGVyIENQVSB0aW1lcgorICAgaW50ZXJydXB0IGlzIGFjdGl2ZSAqLworaW50IHNtcF9mb3VuZF9jb25maWcgPSAwOworCisvKiBVc2VkIGZvciB0aGUgaW52YWxpZGF0ZSBtYXAgdGhhdCdzIGFsc28gY2hlY2tlZCBpbiB0aGUgc3BpbmxvY2sgKi8KK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNtcF9pbnZhbGlkYXRlX25lZWRlZDsKKworLyogQml0bWFzayBvZiBjdXJyZW50bHkgb25saW5lIENQVXMgLSB1c2VkIGJ5IHNldHVwLmMgZm9yCisgICAvcHJvYy9jcHVpbmZvLCB2aXNpYmxlIGV4dGVybmFsbHkgYnV0IHN0aWxsIHBoeXNpY2FsICovCitjcHVtYXNrX3QgY3B1X29ubGluZV9tYXAgPSBDUFVfTUFTS19OT05FOworCisvKiBCaXRtYXNrIG9mIENQVXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtIC0gZXhwb3J0ZWQgYnkgaTM4Nl9zeW1zLmMsIHVzZWQKKyAqIGJ5IHNjaGVkdWxlciBidXQgaW5kZXhlZCBwaHlzaWNhbGx5ICovCitjcHVtYXNrX3QgcGh5c19jcHVfcHJlc2VudF9tYXAgPSBDUFVfTUFTS19OT05FOworCisKKy8qIFRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHNlbmRfQ1BJKF9fdTMyIGNwdXNldCwgX191OCBjcGkpOworc3RhdGljIHZvaWQgYWNrX0NQSShfX3U4IGNwaSk7CitzdGF0aWMgaW50IGFja19RSUNfQ1BJKF9fdTggY3BpKTsKK3N0YXRpYyB2b2lkIGFja19zcGVjaWFsX1FJQ19DUEkoX191OCBjcGkpOworc3RhdGljIHZvaWQgYWNrX1ZJQ19DUEkoX191OCBjcGkpOworc3RhdGljIHZvaWQgc2VuZF9DUElfYWxsYnV0c2VsZihfX3U4IGNwaSk7CitzdGF0aWMgdm9pZCBlbmFibGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF92aWNfaXJxKHVuc2lnbmVkIGludCBpcnEpOworc3RhdGljIHZvaWQgZW5hYmxlX2xvY2FsX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2xvY2FsX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgdm9pZCBiZWZvcmVfaGFuZGxlX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgdm9pZCBhZnRlcl9oYW5kbGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIHNldF92aWNfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKTsKK3N0YXRpYyB2b2lkIGFja192aWNfaXJxKHVuc2lnbmVkIGludCBpcnEpOworc3RhdGljIHZvaWQgdmljX2VuYWJsZV9jcGkodm9pZCk7CitzdGF0aWMgdm9pZCBkb19ib290X2NwdShfX3U4IGNwdWlkKTsKK3N0YXRpYyB2b2lkIGRvX3F1YWRfYm9vdHN0cmFwKHZvaWQpOworc3RhdGljIGlubGluZSB2b2lkIHdyYXBwZXJfc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqKTsKKworaW50IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKTsKKworLyogSW5saW5lIGZ1bmN0aW9ucyAqLworc3RhdGljIGlubGluZSB2b2lkCitzZW5kX29uZV9RSUNfQ1BJKF9fdTggY3B1LCBfX3U4IGNwaSkKK3sKKwl2b3lhZ2VyX3F1YWRfY3BpX2FkZHJbY3B1XS0+cWljX2NwaVtjcGldLmNwaSA9CisJCShzbXBfcHJvY2Vzc29yX2lkKCkgPDwgMTYpICsgY3BpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NlbmRfUUlDX0NQSShfX3UzMiBjcHVzZXQsIF9fdTggY3BpKQoreworCWludCBjcHU7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZihjcHVzZXQgJiAoMTw8Y3B1KSkgeworI2lmZGVmIFZPWUFHRVJfREVCVUcKKwkJCWlmKCFjcHVfaXNzZXQoY3B1LCBjcHVfb25saW5lX21hcCkpCisJCQkJVkRFQlVHKCgiQ1BVJWQgc2VuZGluZyBjcGkgJWQgdG8gQ1BVJWQgbm90IGluIGNwdV9vbmxpbmVfbWFwXG4iLCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSwgY3BpLCBjcHUpKTsKKyNlbmRpZgorCQkJc2VuZF9vbmVfUUlDX0NQSShjcHUsIGNwaSAtIFFJQ19DUElfT0ZGU0VUKTsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitzZW5kX29uZV9DUEkoX191OCBjcHUsIF9fdTggY3BpKQoreworCWlmKHZveWFnZXJfcXVhZF9wcm9jZXNzb3JzICYgKDE8PGNwdSkpCisJCXNlbmRfb25lX1FJQ19DUEkoY3B1LCBjcGkgLSBRSUNfQ1BJX09GRlNFVCk7CisJZWxzZQorCQlzZW5kX0NQSSgxPDxjcHUsIGNwaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2VuZF9DUElfYWxsYnV0c2VsZihfX3U4IGNwaSkKK3sKKwlfX3U4IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlfX3UzMiBtYXNrID0gY3B1c19hZGRyKGNwdV9vbmxpbmVfbWFwKVswXSAmIH4oMSA8PCBjcHUpOworCXNlbmRfQ1BJKG1hc2ssIGNwaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citpc19jcHVfcXVhZCh2b2lkKQoreworCV9fdTggY3B1bWFzayA9IGluYihWSUNfUFJPQ19XSE9fQU1fSSk7CisJcmV0dXJuICgoY3B1bWFzayAmIFFVQURfSURFTlRJRklFUikgPT0gUVVBRF9JREVOVElGSUVSKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lzX2NwdV9leHRlbmRlZCh2b2lkKQoreworCV9fdTggY3B1ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlyZXR1cm4odm95YWdlcl9leHRlbmRlZF92aWNfcHJvY2Vzc29ycyAmICgxPDxjcHUpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lzX2NwdV92aWNfYm9vdCh2b2lkKQoreworCV9fdTggY3B1ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlyZXR1cm4odm95YWdlcl9leHRlbmRlZF92aWNfcHJvY2Vzc29ycworCSAgICAgICAmIHZveWFnZXJfYWxsb3dlZF9ib290X3Byb2Nlc3NvcnMgJiAoMTw8Y3B1KSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCithY2tfQ1BJKF9fdTggY3BpKQoreworCXN3aXRjaChjcGkpIHsKKwljYXNlIFZJQ19DUFVfQk9PVF9DUEk6CisJCWlmKGlzX2NwdV9xdWFkKCkgJiYgIWlzX2NwdV92aWNfYm9vdCgpKQorCQkJYWNrX1FJQ19DUEkoY3BpKTsKKwkJZWxzZQorCQkJYWNrX1ZJQ19DUEkoY3BpKTsKKwkJYnJlYWs7CisJY2FzZSBWSUNfU1lTX0lOVDoKKwljYXNlIFZJQ19DTU5fSU5UOiAKKwkJLyogVGhlc2UgYXJlIHNsaWdodGx5IHN0cmFuZ2UuICBFdmVuIG9uIHRoZSBRdWFkIGNhcmQsCisJCSAqIFRoZXkgYXJlIHZlY3RvcmVkIGFzIFZJQyBDUElzICovCisJCWlmKGlzX2NwdV9xdWFkKCkpCisJCQlhY2tfc3BlY2lhbF9RSUNfQ1BJKGNwaSk7CisJCWVsc2UKKwkJCWFja19WSUNfQ1BJKGNwaSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiVk9ZQUdFUiBFUlJPUjogQ1BJJWQgaXMgaW4gY29tbW9uIENQSSBjb2RlXG4iLCBjcGkpOworCQlicmVhazsKKwl9Cit9CisKKy8qIGxvY2FsIHZhcmlhYmxlcyAqLworCisvKiBUaGUgVklDIElSUSBkZXNjcmlwdG9ycyAtLSB0aGVzZSBsb29rIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlCisgKiA4MjU5IElSUXMgZXhjZXB0IHRoYXQgbWFza3MgYW5kIHRoaW5ncyBtdXN0IGJlIGtlcHQgcGVyIHByb2Nlc3NvcgorICovCitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHZpY19pcnFfdHlwZSA9IHsKKwkudHlwZW5hbWUgPSAiVklDLWxldmVsIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfdmljX2lycSwKKwkuc2h1dGRvd24gPSBkaXNhYmxlX3ZpY19pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV92aWNfaXJxLAorCS5kaXNhYmxlID0gZGlzYWJsZV92aWNfaXJxLAorCS5hY2sgPSBiZWZvcmVfaGFuZGxlX3ZpY19pcnEsCisJLmVuZCA9IGFmdGVyX2hhbmRsZV92aWNfaXJxLAorCS5zZXRfYWZmaW5pdHkgPSBzZXRfdmljX2lycV9hZmZpbml0eSwKK307CisKKy8qIHVzZWQgdG8gY291bnQgdXAgYXMgQ1BVcyBhcmUgYnJvdWdodCBvbiBsaW5lIChzdGFydHMgYXQgMCkgKi8KK3N0YXRpYyBpbnQgY3B1Y291bnQgPSAwOworCisvKiBzdGVhbCBhIHBhZ2UgZnJvbSB0aGUgYm90dG9tIG9mIG1lbW9yeSBmb3IgdGhlIHRyYW1wb2xpbmUgYW5kCisgKiBzcXVpcnJlbCBpdHMgYWRkcmVzcyBhd2F5IGhlcmUuICBUaGlzIHdpbGwgYmUgaW4ga2VybmVsIHZpcnR1YWwKKyAqIHNwYWNlICovCitzdGF0aWMgX191MzIgdHJhbXBvbGluZV9iYXNlOworCisvKiBUaGUgcGVyIGNwdSBwcm9maWxlIHN0dWZmIC0gdXNlZCBpbiBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0ICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwcm9mX211bHRpcGxpZXIpID0gMTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHByb2Zfb2xkX211bHRpcGxpZXIpID0gMTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHByb2ZfY291bnRlcikgPSAgMTsKKworLyogdGhlIG1hcCB1c2VkIHRvIGNoZWNrIGlmIGEgQ1BVIGhhcyBib290ZWQgKi8KK3N0YXRpYyBfX3UzMiBjcHVfYm9vdGVkX21hcDsKKworLyogdGhlIHN5bmNocm9uaXplIGZsYWcgdXNlZCB0byBob2xkIGFsbCBzZWNvbmRhcnkgQ1BVcyBzcGlubmluZyBpbgorICogYSB0aWdodCBsb29wIHVudGlsIHRoZSBib290IHNlcXVlbmNlIGlzIHJlYWR5IGZvciB0aGVtICovCitzdGF0aWMgY3B1bWFza190IHNtcF9jb21tZW5jZWRfbWFzayA9IENQVV9NQVNLX05PTkU7CisKKy8qIFRoaXMgaXMgZm9yIHRoZSBuZXcgZHluYW1pYyBDUFUgYm9vdCBjb2RlICovCitjcHVtYXNrX3QgY3B1X2NhbGxpbl9tYXAgPSBDUFVfTUFTS19OT05FOworY3B1bWFza190IGNwdV9jYWxsb3V0X21hcCA9IENQVV9NQVNLX05PTkU7CisKKy8qIFRoZSBwZXIgcHJvY2Vzc29yIElSUSBtYXNrcyAodGhlc2UgYXJlIHVzdWFsbHkga2VwdCBpbiBzeW5jKSAqLworc3RhdGljIF9fdTE2IHZpY19pcnFfbWFza1tOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworCisvKiB0aGUgbGlzdCBvZiBJUlFzIHRvIGJlIGVuYWJsZWQgYnkgdGhlIFZJQ19FTkFCTEVfSVJRX0NQSSAqLworc3RhdGljIF9fdTE2IHZpY19pcnFfZW5hYmxlX21hc2tbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsgMCB9OworCisvKiBMb2NrIGZvciBlbmFibGUvZGlzYWJsZSBvZiBWSUMgaW50ZXJydXB0cyAqLworc3RhdGljICBfX2NhY2hlbGluZV9hbGlnbmVkIERFRklORV9TUElOTE9DSyh2aWNfaXJxX2xvY2spOworCisvKiBUaGUgYm9vdCBwcm9jZXNzb3IgaXMgY29ycmVjdGx5IHNldCB1cCBpbiBQQyBtb2RlIHdoZW4gaXQgCisgKiBjb21lcyB1cCwgYnV0IHRoZSBzZWNvbmRhcmllcyBuZWVkIHRoZWlyIG1hc3Rlci9zbGF2ZSA4MjU5CisgKiBwYWlycyBpbml0aWFsaXppbmcgY29ycmVjdGx5ICovCisKKy8qIEludGVycnVwdCBjb3VudGVycyAocGVyIGNwdSkgYW5kIHRvdGFsIC0gdXNlZCB0byB0cnkgdG8KKyAqIGV2ZW4gdXAgdGhlIGludGVycnVwdCBoYW5kbGluZyByb3V0aW5lcyAqLworc3RhdGljIGxvbmcgdmljX2ludHJfdG90YWwgPSAwOworc3RhdGljIGxvbmcgdmljX2ludHJfY291bnRbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsgMCB9Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgdmljX3RpY2tbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsgMCB9OworCisvKiBTaW5jZSB3ZSBjYW4gb25seSB1c2UgQ1BJMCwgd2UgZmFrZSBhbGwgdGhlIG90aGVyIENQSXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZpY19jcGlfbWFpbGJveFtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworCisvKiBkZWJ1Z2dpbmcgcm91dGluZSB0byByZWFkIHRoZSBpc3Igb2YgdGhlIGNwdSdzIHBpYyAqLworc3RhdGljIGlubGluZSBfX3UxNgordmljX3JlYWRfaXNyKHZvaWQpCit7CisJX191MTYgaXNyOworCisJb3V0YigweDBiLCAweGEwKTsKKwlpc3IgPSBpbmIoMHhhMCkgPDwgODsKKwlvdXRiKDB4MGIsIDB4MjApOworCWlzciB8PSBpbmIoMHgyMCk7CisKKwlyZXR1cm4gaXNyOworfQorCitzdGF0aWMgX19pbml0IHZvaWQKK3FpY19zZXR1cCh2b2lkKQoreworCWlmKCFpc19jcHVfcXVhZCgpKSB7CisJCS8qIG5vdCBhIHF1YWQsIG5vIHNldHVwICovCisJCXJldHVybjsKKwl9CisJb3V0YihRSUNfREVGQVVMVF9NQVNLMCwgUUlDX01BU0tfUkVHSVNURVIwKTsKKwlvdXRiKFFJQ19DUElfRU5BQkxFLCBRSUNfTUFTS19SRUdJU1RFUjEpOworCQorCWlmKGlzX2NwdV9leHRlbmRlZCgpKSB7CisJCS8qIHRoZSBRSUMgZHVwbGljYXRlIG9mIHRoZSBWSUMgYmFzZSByZWdpc3RlciAqLworCQlvdXRiKFZJQ19ERUZBVUxUX0NQSV9CQVNFLCBRSUNfVklDX0NQSV9CQVNFX1JFR0lTVEVSKTsKKwkJb3V0YihRSUNfREVGQVVMVF9DUElfQkFTRSwgUUlDX0NQSV9CQVNFX1JFR0lTVEVSKTsKKworCQkvKiBGSVhNRTogc2hvdWxkIHNldCB1cCB0aGUgUUlDIHRpbWVyIGFuZCBtZW1vcnkgcGFyaXR5CisJCSAqIGVycm9yIHZlY3RvcnMgaGVyZSAqLworCX0KK30KKworc3RhdGljIF9faW5pdCB2b2lkCit2aWNfc2V0dXBfcGljKHZvaWQpCit7CisJb3V0YigxLCBWSUNfUkVESVJFQ1RfUkVHSVNURVJfMSk7CisJLyogY2xlYXIgdGhlIGNsYWltIHJlZ2lzdGVycyBmb3IgZHluYW1pYyByb3V0aW5nICovCisJb3V0YigwLCBWSUNfQ0xBSU1fUkVHSVNURVJfMCk7CisJb3V0YigwLCBWSUNfQ0xBSU1fUkVHSVNURVJfMSk7CisKKwlvdXRiKDAsIFZJQ19QUklPUklUWV9SRUdJU1RFUik7CisJLyogU2V0IHRoZSBQcmltYXJ5IGFuZCBTZWNvbmRhcnkgTWljcm9jaGFubmVsIHZlY3RvcgorCSAqIGJhc2VzIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBvcmRpbmFyeSBpbnRlcnJ1cHRzCisJICoKKwkgKiBGSVhNRTogVGhpcyB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCB1c2luZyBzZXBhcmF0ZQorCSAqIHZlY3RvcnMuICovCisJb3V0YihGSVJTVF9FWFRFUk5BTF9WRUNUT1IsIFZJQ19QUklNQVJZX01DX0JBU0UpOworCW91dGIoRklSU1RfRVhURVJOQUxfVkVDVE9SLCBWSUNfU0VDT05EQVJZX01DX0JBU0UpOworCS8qIE5vdyBpbml0aWFsbGlzZSB0aGUgbWFzdGVyIFBJQyBiZWxvbmdpbmcgdG8gdGhpcyBDUFUgYnkKKwkgKiBzZW5kaW5nIHRoZSBmb3VyIElDV3MgKi8KKworCS8qIElDVzE6IGxldmVsIHRyaWdnZXJlZCwgSUNXNCBuZWVkZWQgKi8KKwlvdXRiKDB4MTksIDB4MjApOworCisJLyogSUNXMjogdmVjdG9yIGJhc2UgKi8KKwlvdXRiKEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiwgMHgyMSk7CisKKwkvKiBJQ1czOiBzbGF2ZSBhdCBsaW5lIDIgKi8KKwlvdXRiKDB4MDQsIDB4MjEpOworCisJLyogSUNXNDogODA4NiBtb2RlICovCisJb3V0YigweDAxLCAweDIxKTsKKworCS8qIG5vdyB0aGUgc2FtZSBmb3IgdGhlIHNsYXZlIFBJQyAqLworCisJLyogSUNXMTogbGV2ZWwgdHJpZ2dlciwgSUNXNCBuZWVkZWQgKi8KKwlvdXRiKDB4MTksIDB4QTApOworCisJLyogSUNXMjogc2xhdmUgdmVjdG9yIGJhc2UgKi8KKwlvdXRiKEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiArIDgsIDB4QTEpOworCQorCS8qIElDVzM6IHNsYXZlIElEICovCisJb3V0YigweDAyLCAweEExKTsKKworCS8qIElDVzQ6IDgwODYgbW9kZSAqLworCW91dGIoMHgwMSwgMHhBMSk7Cit9CisKK3N0YXRpYyB2b2lkCitkb19xdWFkX2Jvb3RzdHJhcCh2b2lkKQoreworCWlmKGlzX2NwdV9xdWFkKCkgJiYgaXNfY3B1X3ZpY19ib290KCkpIHsKKwkJaW50IGk7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCV9fdTggY3B1aWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkJZm9yKGkgPSAwOyBpPDQ7IGkrKykgeworCQkJLyogRklYTUU6IHRoaXMgd291bGQgYmUgPj4zICYweDcgb24gdGhlIDMyIHdheSAqLworCQkJaWYoKChjcHVpZCA+PiAyKSAmIDB4MDMpID09IGkpCisJCQkJLyogZG9uJ3QgbG93ZXIgb3VyIG93biBtYXNrISAqLworCQkJCWNvbnRpbnVlOworCisJCQkvKiBtYXNxdWVyYWRlIGFzIGxvY2FsIFF1YWQgQ1BVICovCisJCQlvdXRiKFFJQ19DUFVJRF9FTkFCTEUgfCBpLCBRSUNfUFJPQ0VTU09SX0lEKTsKKwkJCS8qIGVuYWJsZSB0aGUgc3RhcnR1cCBDUEkgKi8KKwkJCW91dGIoUUlDX0JPT1RfQ1BJX01BU0ssIFFJQ19NQVNLX1JFR0lTVEVSMSk7CisJCQkvKiByZXN0b3JlIGNwdSBpZCAqLworCQkJb3V0YigwLCBRSUNfUFJPQ0VTU09SX0lEKTsKKwkJfQorCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorfQorCisKKy8qIFNldCB1cCBhbGwgdGhlIGJhc2ljIHN0dWZmOiByZWFkIHRoZSBTTVAgY29uZmlnIGFuZCBtYWtlIGFsbCB0aGUKKyAqIFNNUCBpbmZvcm1hdGlvbiByZWZsZWN0IG9ubHkgdGhlIGJvb3QgY3B1LiAgQWxsIG90aGVycyB3aWxsIGJlCisgKiBicm91Z2h0IG9uLWxpbmUgbGF0ZXIuICovCit2b2lkIF9faW5pdCAKK2ZpbmRfc21wX2NvbmZpZyh2b2lkKQoreworCWludCBpOworCisJYm9vdF9jcHVfaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCXByaW50aygiVk9ZQUdFUiBTTVA6IEJvb3QgY3B1IGlzICVkXG4iLCBib290X2NwdV9pZCk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBDUFUgc3RydWN0dXJlcyAobW92ZWQgZnJvbSBzbXBfYm9vdF9jcHVzKSAqLworCWZvcihpPTA7IGk8TlJfQ1BVUzsgaSsrKSB7CisJCWNwdV9pcnFfYWZmaW5pdHlbaV0gPSB+MDsKKwl9CisJY3B1X29ubGluZV9tYXAgPSBjcHVtYXNrX29mX2NwdShib290X2NwdV9pZCk7CisKKwkvKiBUaGUgYm9vdCBDUFUgbXVzdCBiZSBleHRlbmRlZCAqLworCXZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMgPSAxPDxib290X2NwdV9pZDsKKwkvKiBpbml0aWFsbHksIGFsbCBvZiB0aGUgZmlyc3QgOCBjcHUncyBjYW4gYm9vdCAqLworCXZveWFnZXJfYWxsb3dlZF9ib290X3Byb2Nlc3NvcnMgPSAweGZmOworCS8qIHNldCB1cCBldmVyeXRoaW5nIGZvciBqdXN0IHRoaXMgQ1BVLCB3ZSBjYW4gYWx0ZXIKKwkgKiB0aGlzIGFzIHdlIHN0YXJ0IHRoZSBvdGhlciBDUFVzIGxhdGVyICovCisJLyogbm93IGdldCB0aGUgQ1BVIGRpc3Bvc2l0aW9uIGZyb20gdGhlIGV4dGVuZGVkIENNT1MgKi8KKwljcHVzX2FkZHIocGh5c19jcHVfcHJlc2VudF9tYXApWzBdID0gdm95YWdlcl9leHRlbmRlZF9jbW9zX3JlYWQoVk9ZQUdFUl9QUk9DRVNTT1JfUFJFU0VOVF9NQVNLKTsKKwljcHVzX2FkZHIocGh5c19jcHVfcHJlc2VudF9tYXApWzBdIHw9IHZveWFnZXJfZXh0ZW5kZWRfY21vc19yZWFkKFZPWUFHRVJfUFJPQ0VTU09SX1BSRVNFTlRfTUFTSyArIDEpIDw8IDg7CisJY3B1c19hZGRyKHBoeXNfY3B1X3ByZXNlbnRfbWFwKVswXSB8PSB2b3lhZ2VyX2V4dGVuZGVkX2Ntb3NfcmVhZChWT1lBR0VSX1BST0NFU1NPUl9QUkVTRU5UX01BU0sgKyAyKSA8PCAxNjsKKwljcHVzX2FkZHIocGh5c19jcHVfcHJlc2VudF9tYXApWzBdIHw9IHZveWFnZXJfZXh0ZW5kZWRfY21vc19yZWFkKFZPWUFHRVJfUFJPQ0VTU09SX1BSRVNFTlRfTUFTSyArIDMpIDw8IDI0OworCXByaW50aygiVk9ZQUdFUiBTTVA6IHBoeXNfY3B1X3ByZXNlbnRfbWFwID0gMHglbHhcbiIsIGNwdXNfYWRkcihwaHlzX2NwdV9wcmVzZW50X21hcClbMF0pOworCS8qIEhlcmUgd2Ugc2V0IHVwIHRoZSBWSUMgdG8gZW5hYmxlIFNNUCAqLworCS8qIGVuYWJsZSB0aGUgQ1BJcyBieSB3cml0aW5nIHRoZSBiYXNlIHZlY3RvciB0byB0aGVpciByZWdpc3RlciAqLworCW91dGIoVklDX0RFRkFVTFRfQ1BJX0JBU0UsIFZJQ19DUElfQkFTRV9SRUdJU1RFUik7CisJb3V0YigxLCBWSUNfUkVESVJFQ1RfUkVHSVNURVJfMSk7CisJLyogc2V0IHRoZSBjbGFpbSByZWdpc3RlcnMgZm9yIHN0YXRpYyByb3V0aW5nIC0tLSBCb290IENQVSBnZXRzCisJICogYWxsIGludGVycnVwdHMgdW50aWxsIGFsbCBvdGhlciBDUFVzIHN0YXJ0ZWQgKi8KKwlvdXRiKDB4ZmYsIFZJQ19DTEFJTV9SRUdJU1RFUl8wKTsKKwlvdXRiKDB4ZmYsIFZJQ19DTEFJTV9SRUdJU1RFUl8xKTsKKwkvKiBTZXQgdGhlIFByaW1hcnkgYW5kIFNlY29uZGFyeSBNaWNyb2NoYW5uZWwgdmVjdG9yCisJICogYmFzZXMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG9yZGluYXJ5IGludGVycnVwdHMKKwkgKgorCSAqIEZJWE1FOiBUaGlzIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHVzaW5nIHNlcGFyYXRlCisJICogdmVjdG9ycy4gKi8KKwlvdXRiKEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiwgVklDX1BSSU1BUllfTUNfQkFTRSk7CisJb3V0YihGSVJTVF9FWFRFUk5BTF9WRUNUT1IsIFZJQ19TRUNPTkRBUllfTUNfQkFTRSk7CisKKwkvKiBGaW5hbGx5IHRlbGwgdGhlIGZpcm13YXJlIHRoYXQgd2UncmUgZHJpdmluZyAqLworCW91dGIoaW5iKFZPWUFHRVJfU1VTX0lOX0NPTlRST0xfUE9SVCkgfCBWT1lBR0VSX0lOX0NPTlRST0xfRkxBRywKKwkgICAgIFZPWUFHRVJfU1VTX0lOX0NPTlRST0xfUE9SVCk7CisKKwljdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSA9IGJvb3RfY3B1X2lkOworfQorCisvKgorICoJVGhlIGJvb3RzdHJhcCBrZXJuZWwgZW50cnkgY29kZSBoYXMgc2V0IHRoZXNlIHVwLiBTYXZlIHRoZW0KKyAqCWZvciBhIGdpdmVuIENQVSwgaWQgaXMgcGh5c2ljYWwgKi8KK3ZvaWQgX19pbml0CitzbXBfc3RvcmVfY3B1X2luZm8oaW50IGlkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYz0mY3B1X2RhdGFbaWRdOworCisJKmMgPSBib290X2NwdV9kYXRhOworCisJaWRlbnRpZnlfY3B1KGMpOworfQorCisvKiBzZXQgdXAgdGhlIHRyYW1wb2xpbmUgYW5kIHJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY29kZSAqLworc3RhdGljIF9fdTMyIF9faW5pdAorc2V0dXBfdHJhbXBvbGluZSh2b2lkKQoreworCS8qIHRoZXNlIHR3byBhcmUgZ2xvYmFsIHN5bWJvbHMgaW4gdHJhbXBvbGluZS5TICovCisJZXh0ZXJuIF9fdTggdHJhbXBvbGluZV9lbmRbXTsKKwlleHRlcm4gX191OCB0cmFtcG9saW5lX2RhdGFbXTsKKworCW1lbWNweSgoX191OCAqKXRyYW1wb2xpbmVfYmFzZSwgdHJhbXBvbGluZV9kYXRhLAorCSAgICAgICB0cmFtcG9saW5lX2VuZCAtIHRyYW1wb2xpbmVfZGF0YSk7CisJcmV0dXJuIHZpcnRfdG9fcGh5cygoX191OCAqKXRyYW1wb2xpbmVfYmFzZSk7Cit9CisKKy8qIFJvdXRpbmUgaW5pdGlhbGx5IGNhbGxlZCB3aGVuIGEgbm9uLWJvb3QgQ1BVIGlzIGJyb3VnaHQgb25saW5lICovCitzdGF0aWMgdm9pZCBfX2luaXQKK3N0YXJ0X3NlY29uZGFyeSh2b2lkICp1bnVzZWQpCit7CisJX191OCBjcHVpZCA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCS8qIGV4dGVybmFsIGZ1bmN0aW9ucyBub3QgZGVmaW5lZCBpbiB0aGUgaGVhZGVycyAqLworCWV4dGVybiB2b2lkIGNhbGlicmF0ZV9kZWxheSh2b2lkKTsKKworCWNwdV9pbml0KCk7CisKKwkvKiBPSywgd2UncmUgaW4gdGhlIHJvdXRpbmUgKi8KKwlhY2tfQ1BJKFZJQ19DUFVfQk9PVF9DUEkpOworCisJLyogc2V0dXAgdGhlIDgyNTkgbWFzdGVyIHNsYXZlIHBhaXIgYmVsb25naW5nIHRvIHRoaXMgQ1BVIC0tLQorICAgICAgICAgKiB3ZSB3b24ndCBhY3R1YWxseSByZWNlaXZlIGFueSB1bnRpbCB0aGUgYm9vdCBDUFUKKyAgICAgICAgICogcmVsaW5xdWlzaGVzIGl0J3Mgc3RhdGljIHJvdXRpbmcgbWFzayAqLworCXZpY19zZXR1cF9waWMoKTsKKworCXFpY19zZXR1cCgpOworCisJaWYoaXNfY3B1X3F1YWQoKSAmJiAhaXNfY3B1X3ZpY19ib290KCkpIHsKKwkJLyogY2xlYXIgdGhlIGJvb3QgQ1BJICovCisJCV9fdTggZHVtbXk7CisKKwkJZHVtbXkgPSB2b3lhZ2VyX3F1YWRfY3BpX2FkZHJbY3B1aWRdLT5xaWNfY3BpW1ZJQ19DUFVfQk9PVF9DUEldLmNwaTsKKwkJcHJpbnRrKCJyZWFkIGR1bW15ICVkXG4iLCBkdW1teSk7CisJfQorCisJLyogbG93ZXIgdGhlIG1hc2sgdG8gcmVjZWl2ZSBDUElzICovCisJdmljX2VuYWJsZV9jcGkoKTsKKworCVZERUJVRygoIlZPWUFHRVIgU01QOiBDUFUlZCwgc3RhY2sgYXQgYWJvdXQgJXBcbiIsIGNwdWlkLCAmY3B1aWQpKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJLyogZ2V0IG91ciBib2dvbWlwcyAqLworCWNhbGlicmF0ZV9kZWxheSgpOworCisJLyogc2F2ZSBvdXIgcHJvY2Vzc29yIHBhcmFtZXRlcnMgKi8KKwlzbXBfc3RvcmVfY3B1X2luZm8oY3B1aWQpOworCisJLyogaWYgd2UncmUgYSBxdWFkLCB3ZSBtYXkgbmVlZCB0byBib290c3RyYXAgb3RoZXIgQ1BVcyAqLworCWRvX3F1YWRfYm9vdHN0cmFwKCk7CisKKwkvKiBGSVhNRTogdGhpcyBpcyByYXRoZXIgYSBwb29yIGhhY2sgdG8gcHJldmVudCB0aGUgQ1BVCisJICogYWN0aXZhdGluZyBzb2Z0aXJxcyB3aGlsZSBpdCdzIHN1cHBvc2VkIHRvIGJlIHdhaXRpbmcgZm9yCisJICogcGVybWlzc2lvbiB0byBwcm9jZWVkLiAgV2l0aG91dCB0aGlzLCB0aGUgbmV3IHBlciBDUFUgc3R1ZmYKKwkgKiBpbiB0aGUgc29mdGlycXMgd2lsbCBmYWlsICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwljcHVfc2V0KGNwdWlkLCBjcHVfY2FsbGluX21hcCk7CisKKwkvKiBzaWduYWwgdGhhdCB3ZSdyZSBkb25lICovCisJY3B1X2Jvb3RlZF9tYXAgPSAxOworCisJd2hpbGUgKCFjcHVfaXNzZXQoY3B1aWQsIHNtcF9jb21tZW5jZWRfbWFzaykpCisJCXJlcF9ub3AoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlsb2NhbF9mbHVzaF90bGIoKTsKKworCWNwdV9zZXQoY3B1aWQsIGNwdV9vbmxpbmVfbWFwKTsKKwl3bWIoKTsKKwljcHVfaWRsZSgpOworfQorCisKKy8qIFJvdXRpbmUgdG8ga2ljayBzdGFydCB0aGUgZ2l2ZW4gQ1BVIGFuZCB3YWl0IGZvciBpdCB0byByZXBvcnQgcmVhZHkKKyAqIChvciB0aW1lb3V0IGluIHN0YXJ0dXApLiAgV2hlbiB0aGlzIHJvdXRpbmUgcmV0dXJucywgdGhlIHJlcXVlc3RlZAorICogQ1BVIGlzIGVpdGhlciBmdWxseSBydW5uaW5nIGFuZCBjb25maWd1cmVkIG9yIGtub3duIHRvIGJlIGRlYWQuCisgKgorICogV2UgY2FsbCB0aGlzIHJvdXRpbmUgc2VxdWVudGlhbGx5IDEgQ1BVIGF0IGEgdGltZSwgc28gbm8gbmVlZCBmb3IKKyAqIGxvY2tpbmcgKi8KKworc3RhdGljIHZvaWQgX19pbml0Citkb19ib290X2NwdShfX3U4IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGU7CisJaW50IHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcXVhZF9ib290ID0gKDE8PGNwdSkgJiB2b3lhZ2VyX3F1YWRfcHJvY2Vzc29ycyAKKwkJJiB+KCB2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzCisJCSAgICAgJiB2b3lhZ2VyX2FsbG93ZWRfYm9vdF9wcm9jZXNzb3JzKTsKKworCS8qIEZvciB0aGUgNDg2LCB3ZSBjYW4ndCB1c2UgdGhlIDRNYiBwYWdlIHRhYmxlIHRyaWNrLCBzbworCSAqIG11c3QgbWFwIGEgcmVnaW9uIG9mIG1lbW9yeSAqLworI2lmZGVmIENPTkZJR19NNDg2CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyAqcGFnZV90YWJsZV9jb3BpZXMgPSAodW5zaWduZWQgbG9uZyAqKQorCQlfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisjZW5kaWYKKwlwZ2RfdCBvcmlnX3N3YXBwZXJfcGdfZGlyMDsKKworCS8qIFRoaXMgaXMgYW4gYXJlYSBpbiBoZWFkLlMgd2hpY2ggd2FzIHVzZWQgdG8gc2V0IHVwIHRoZQorCSAqIGluaXRpYWwga2VybmVsIHN0YWNrLiAgV2UgbmVlZCB0byBhbHRlciB0aGlzIHRvIGdpdmUgdGhlCisJICogYm9vdGluZyBDUFUgYSBuZXcgc3RhY2sgKHRha2VuIGZyb20gaXRzIGlkbGUgcHJvY2VzcykgKi8KKwlleHRlcm4gc3RydWN0IHsKKwkJX191OCAqZXNwOworCQl1bnNpZ25lZCBzaG9ydCBzczsKKwl9IHN0YWNrX3N0YXJ0OworCS8qIFRoaXMgaXMgdGhlIGZvcm1hdCBvZiB0aGUgQ1BJIElEVCBnYXRlIChpbiByZWFsIG1vZGUpIHdoaWNoCisJICogd2UncmUgaGlqYWNraW5nIHRvIGJvb3QgdGhlIENQVSAqLworCXVuaW9uIAlJRFRGb3JtYXQgeworCQlzdHJ1Y3Qgc2VnIHsKKwkJCV9fdTE2CU9mZnNldDsKKwkJCV9fdTE2CVNlZ21lbnQ7CisJCX0gaWR0OworCQlfX3UzMiB2YWw7CisJfSBoaWphY2tfc291cmNlOworCisJX191MzIgKmhpamFja192ZWN0b3I7CisJX191MzIgc3RhcnRfcGh5c19hZGRyZXNzID0gc2V0dXBfdHJhbXBvbGluZSgpOworCisJLyogVGhlcmUncyBhIGNsZXZlciB0cmljayB0byB0aGlzOiBUaGUgbGludXggdHJhbXBvbGluZSBpcworCSAqIGNvbXBpbGVkIHRvIGJlZ2luIGF0IGFic29sdXRlIGxvY2F0aW9uIHplcm8sIHNvIG1ha2UgdGhlCisJICogYWRkcmVzcyB6ZXJvIGJ1dCBoYXZlIHRoZSBkYXRhIHNlZ21lbnQgc2VsZWN0b3IgY29tcGVuc2F0ZQorCSAqIGZvciB0aGUgYWN0dWFsIGFkZHJlc3MgKi8KKwloaWphY2tfc291cmNlLmlkdC5PZmZzZXQgPSBzdGFydF9waHlzX2FkZHJlc3MgJiAweDAwMEY7CisJaGlqYWNrX3NvdXJjZS5pZHQuU2VnbWVudCA9IChzdGFydF9waHlzX2FkZHJlc3MgPj4gNCkgJiAweEZGRkY7CisKKwljcHVjb3VudCsrOworCWlkbGUgPSBmb3JrX2lkbGUoY3B1KTsKKwlpZihJU19FUlIoaWRsZSkpCisJCXBhbmljKCJmYWlsZWQgZm9yayBmb3IgQ1BVJWQiLCBjcHUpOworCWlkbGUtPnRocmVhZC5laXAgPSAodW5zaWduZWQgbG9uZykgc3RhcnRfc2Vjb25kYXJ5OworCS8qIGluaXRfdGFza3MgKGluIHNjaGVkLmMpIGlzIGluZGV4ZWQgbG9naWNhbGx5ICovCisJc3RhY2tfc3RhcnQuZXNwID0gKHZvaWQgKikgaWRsZS0+dGhyZWFkLmVzcDsKKworCWlycV9jdHhfaW5pdChjcHUpOworCisJLyogTm90ZTogRG9uJ3QgbW9kaWZ5IGluaXRpYWwgc3Mgb3ZlcnJpZGUgKi8KKwlWREVCVUcoKCJWT1lBR0VSIFNNUDogQm9vdGluZyBDUFUlZCBhdCAweCVseFsleDoleF0sIHN0YWNrICVwXG4iLCBjcHUsIAorCQkodW5zaWduZWQgbG9uZyloaWphY2tfc291cmNlLnZhbCwgaGlqYWNrX3NvdXJjZS5pZHQuU2VnbWVudCwKKwkJaGlqYWNrX3NvdXJjZS5pZHQuT2Zmc2V0LCBzdGFja19zdGFydC5lc3ApKTsKKwkvKiBzZXQgdGhlIG9yaWdpbmFsIHN3YXBwZXJfcGdfZGlyWzBdIHRvIG1hcCAwIHRvIDRNYiB0cmFuc3BhcmVudGx5CisJICogKHNvIHRoYXQgdGhlIGJvb3RpbmcgQ1BVIGNhbiBmaW5kIHN0YXJ0XzMyICovCisJb3JpZ19zd2FwcGVyX3BnX2RpcjAgPSBzd2FwcGVyX3BnX2RpclswXTsKKyNpZmRlZiBDT05GSUdfTTQ4NgorCWlmKHBhZ2VfdGFibGVfY29waWVzID09IE5VTEwpCisJCXBhbmljKCJObyBmcmVlIG1lbW9yeSBmb3IgNDg2IHBhZ2UgdGFibGVzXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCBQQUdFX1NJWkUvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOyBpKyspCisJCXBhZ2VfdGFibGVfY29waWVzW2ldID0gKGkgKiBQQUdFX1NJWkUpIAorCQkJfCBfUEFHRV9SVyB8IF9QQUdFX1VTRVIgfCBfUEFHRV9QUkVTRU5UOworCisJKCh1bnNpZ25lZCBsb25nICopc3dhcHBlcl9wZ19kaXIpWzBdID0gCisJCSgodmlydF90b19waHlzKHBhZ2VfdGFibGVfY29waWVzKSkgJiBQQUdFX01BU0spCisJCXwgX1BBR0VfUlcgfCBfUEFHRV9VU0VSIHwgX1BBR0VfUFJFU0VOVDsKKyNlbHNlCisJKCh1bnNpZ25lZCBsb25nICopc3dhcHBlcl9wZ19kaXIpWzBdID0gCisJCSh2aXJ0X3RvX3BoeXMocGcwKSAmIFBBR0VfTUFTSykKKwkJfCBfUEFHRV9SVyB8IF9QQUdFX1VTRVIgfCBfUEFHRV9QUkVTRU5UOworI2VuZGlmCisKKwlpZihxdWFkX2Jvb3QpIHsKKwkJcHJpbnRrKCJDUFUgJWQ6IG5vbiBleHRlbmRlZCBRdWFkIGJvb3RcbiIsIGNwdSk7CisJCWhpamFja192ZWN0b3IgPSAoX191MzIgKilwaHlzX3RvX3ZpcnQoKFZJQ19DUFVfQk9PVF9DUEkgKyBRSUNfREVGQVVMVF9DUElfQkFTRSkqNCk7CisJCSpoaWphY2tfdmVjdG9yID0gaGlqYWNrX3NvdXJjZS52YWw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJDUFUlZDogZXh0ZW5kZWQgVklDIGJvb3RcbiIsIGNwdSk7CisJCWhpamFja192ZWN0b3IgPSAoX191MzIgKilwaHlzX3RvX3ZpcnQoKFZJQ19DUFVfQk9PVF9DUEkgKyBWSUNfREVGQVVMVF9DUElfQkFTRSkqNCk7CisJCSpoaWphY2tfdmVjdG9yID0gaGlqYWNrX3NvdXJjZS52YWw7CisJCS8qIFZJQyBlcnJhdGEsIG1heSBhbHNvIHJlY2VpdmUgaW50ZXJydXB0IGF0IHRoaXMgYWRkcmVzcyAqLworCQloaWphY2tfdmVjdG9yID0gKF9fdTMyICopcGh5c190b192aXJ0KChWSUNfQ1BVX0JPT1RfRVJSQVRBX0NQSSArIFZJQ19ERUZBVUxUX0NQSV9CQVNFKSo0KTsKKwkJKmhpamFja192ZWN0b3IgPSBoaWphY2tfc291cmNlLnZhbDsKKwl9CisJLyogQWxsIG5vbi1ib290IENQVXMgc3RhcnQgd2l0aCBpbnRlcnJ1cHRzIGZ1bGx5IG1hc2tlZC4gIE5lZWQKKwkgKiB0byBsb3dlciB0aGUgbWFzayBvZiB0aGUgQ1BJIHdlJ3JlIGFib3V0IHRvIHNlbmQuICBXZSBkbworCSAqIHRoaXMgaW4gdGhlIFZJQyBieSBtYXNxdWVyYWRpbmcgYXMgdGhlIHByb2Nlc3NvciB3ZSdyZQorCSAqIGFib3V0IHRvIGJvb3QgYW5kIGxvd2VyaW5nIGl0cyBpbnRlcnJ1cHQgbWFzayAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZihxdWFkX2Jvb3QpIHsKKwkJc2VuZF9vbmVfUUlDX0NQSShjcHUsIFZJQ19DUFVfQk9PVF9DUEkpOworCX0gZWxzZSB7CisJCW91dGIoVklDX0NQVV9NQVNRVUVSQURFX0VOQUJMRSB8IGNwdSwgVklDX1BST0NFU1NPUl9JRCk7CisJCS8qIGhlcmUgd2UncmUgYWx0ZXJpbmcgcmVnaXN0ZXJzIGJlbG9uZ2luZyB0byBgY3B1JyAqLworCQkKKwkJb3V0YihWSUNfQk9PVF9JTlRFUlJVUFRfTUFTSywgMHgyMSk7CisJCS8qIG5vdyBnbyBiYWNrIHRvIG91ciBvcmlnaW5hbCBpZGVudGl0eSAqLworCQlvdXRiKGJvb3RfY3B1X2lkLCBWSUNfUFJPQ0VTU09SX0lEKTsKKworCQkvKiBhbmQgYm9vdCB0aGUgQ1BVICovCisKKwkJc2VuZF9DUEkoKDE8PGNwdSksIFZJQ19DUFVfQk9PVF9DUEkpOworCX0KKwljcHVfYm9vdGVkX21hcCA9IDA7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyogbm93IHdhaXQgZm9yIGl0IHRvIGJlY29tZSByZWFkeSAob3IgdGltZW91dCkgKi8KKwlmb3IodGltZW91dCA9IDA7IHRpbWVvdXQgPCA1MDAwMDsgdGltZW91dCsrKSB7CisJCWlmKGNwdV9ib290ZWRfbWFwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKwkvKiByZXNldCB0aGUgcGFnZSB0YWJsZSAqLworCXN3YXBwZXJfcGdfZGlyWzBdID0gb3JpZ19zd2FwcGVyX3BnX2RpcjA7CisJbG9jYWxfZmx1c2hfdGxiKCk7CisjaWZkZWYgQ09ORklHX000ODYKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZV90YWJsZV9jb3BpZXMpOworI2VuZGlmCisJICAKKwlpZiAoY3B1X2Jvb3RlZF9tYXApIHsKKwkJVkRFQlVHKCgiQ1BVJWQ6IEJvb3RlZCBzdWNjZXNzZnVsbHksIGJhY2sgaW4gQ1BVICVkXG4iLAorCQkJY3B1LCBzbXBfcHJvY2Vzc29yX2lkKCkpKTsKKwkKKwkJcHJpbnRrKCJDUFUlZDogIiwgY3B1KTsKKwkJcHJpbnRfY3B1X2luZm8oJmNwdV9kYXRhW2NwdV0pOworCQl3bWIoKTsKKwkJY3B1X3NldChjcHUsIGNwdV9jYWxsb3V0X21hcCk7CisJfQorCWVsc2UgeworCQlwcmludGsoIkNQVSVkIEZBSUxFRCBUTyBCT09UOiAiLCBjcHUpOworCQlpZiAoKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBoeXNfdG9fdmlydChzdGFydF9waHlzX2FkZHJlc3MpKT09MHhBNSkKKwkJCXByaW50aygiU3R1Y2suXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJOb3QgcmVzcG9uZGluZy5cbiIpOworCQkKKwkJY3B1Y291bnQtLTsKKwl9Cit9CisKK3ZvaWQgX19pbml0CitzbXBfYm9vdF9jcHVzKHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBDQVQgQlVTIGluaXRpYWxpc2F0aW9uIG11c3QgYmUgZG9uZSBhZnRlciB0aGUgbWVtb3J5ICovCisJLyogRklYTUU6IFRoZSBMNCBoYXMgYSBjYXRidXMgdG9vLCBpdCBqdXN0IG5lZWRzIHRvIGJlCisJICogYWNjZXNzZWQgaW4gYSB0b3RhbGx5IGRpZmZlcmVudCB3YXkgKi8KKwlpZih2b3lhZ2VyX2xldmVsID09IDUpIHsKKwkJdm95YWdlcl9jYXRfaW5pdCgpOworCisJCS8qIG5vdyB0aGF0IHRoZSBjYXQgaGFzIHByb2JlZCB0aGUgVm95YWdlciBTeXN0ZW0gQnVzLCBzYW5pdHkKKwkJICogY2hlY2sgdGhlIGNwdSBtYXAgKi8KKwkJaWYoICgodm95YWdlcl9xdWFkX3Byb2Nlc3NvcnMgfCB2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzKQorCQkgICAgICYgY3B1c19hZGRyKHBoeXNfY3B1X3ByZXNlbnRfbWFwKVswXSkgIT0gY3B1c19hZGRyKHBoeXNfY3B1X3ByZXNlbnRfbWFwKVswXSkgeworCQkJLyogc2hvdWxkIHBhbmljICovCisJCQlwcmludGsoIlxuXG4qKipXQVJOSU5HKioqIFNhbml0eSBjaGVjayBvZiBDUFUgcHJlc2VudCBtYXAgRkFJTEVEXG4iKTsKKwkJfQorCX0gZWxzZSBpZih2b3lhZ2VyX2xldmVsID09IDQpCisJCXZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMgPSBjcHVzX2FkZHIocGh5c19jcHVfcHJlc2VudF9tYXApWzBdOworCisJLyogdGhpcyBzZXRzIHVwIHRoZSBpZGxlIHRhc2sgdG8gcnVuIG9uIHRoZSBjdXJyZW50IGNwdSAqLworCXZveWFnZXJfZXh0ZW5kZWRfY3B1cyA9IDE7CisJLyogUmVtb3ZlIHRoZSBnbG9iYWxfaXJxX2hvbGRlciBzZXR0aW5nLCBpdCB0cmlnZ2VycyBhIEJVRygpIG9uCisJICogc2NoZWR1bGUgYXQgdGhlIG1vbWVudCAqLworCS8vZ2xvYmFsX2lycV9ob2xkZXIgPSBib290X2NwdV9pZDsKKworCS8qIEZJWE1FOiBOZWVkIHRvIGRvIHNvbWV0aGluZyBhYm91dCB0aGlzIGJ1dCBjdXJyZW50bHkgb25seSB3b3JrcworCSAqIG9uIENQVXMgd2l0aCBhIHRzYyB3aGljaCBub25lIG9mIG1pbmUgaGF2ZS4gCisJc21wX3R1bmVfc2NoZWR1bGluZygpOworCSAqLworCXNtcF9zdG9yZV9jcHVfaW5mbyhib290X2NwdV9pZCk7CisJcHJpbnRrKCJDUFUlZDogIiwgYm9vdF9jcHVfaWQpOworCXByaW50X2NwdV9pbmZvKCZjcHVfZGF0YVtib290X2NwdV9pZF0pOworCisJaWYoaXNfY3B1X3F1YWQoKSkgeworCQkvKiBib290aW5nIG9uIGEgUXVhZCBDUFUgKi8KKwkJcHJpbnRrKCJWT1lBR0VSIFNNUDogQm9vdCBDUFUgaXMgUXVhZFxuIik7CisJCXFpY19zZXR1cCgpOworCQlkb19xdWFkX2Jvb3RzdHJhcCgpOworCX0KKworCS8qIGVuYWJsZSBvdXIgb3duIENQSXMgKi8KKwl2aWNfZW5hYmxlX2NwaSgpOworCisJY3B1X3NldChib290X2NwdV9pZCwgY3B1X29ubGluZV9tYXApOworCWNwdV9zZXQoYm9vdF9jcHVfaWQsIGNwdV9jYWxsb3V0X21hcCk7CisJCisJLyogbG9vcCBvdmVyIGFsbCB0aGUgZXh0ZW5kZWQgVklDIENQVXMgYW5kIGJvb3QgdGhlbS4gIFRoZSAKKwkgKiBRdWFkIENQVXMgbXVzdCBiZSBib290c3RyYXBwZWQgYnkgdGhlaXIgZXh0ZW5kZWQgVklDIGNwdSAqLworCWZvcihpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZihpID09IGJvb3RfY3B1X2lkIHx8ICFjcHVfaXNzZXQoaSwgcGh5c19jcHVfcHJlc2VudF9tYXApKQorCQkJY29udGludWU7CisJCWRvX2Jvb3RfY3B1KGkpOworCQkvKiBUaGlzIHVkZWxheSBzZWVtcyB0byBiZSBuZWVkZWQgZm9yIHRoZSBRdWFkIGJvb3RzCisJCSAqIGRvbid0IHJlbW92ZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcgKi8KKwkJdWRlbGF5KDEwMDApOworCX0KKwkvKiB3ZSBjb3VsZCBjb21wdXRlIHRoZSB0b3RhbCBib2dvbWlwcyBoZXJlLCBidXQgd2h5IGJvdGhlcj8sCisJICogQ29kZSBhZGRlZCBmcm9tIHNtcGJvb3QuYyAqLworCXsKKwkJdW5zaWduZWQgbG9uZyBib2dvc3VtID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKKwkJCWlmIChjcHVfaXNzZXQoaSwgY3B1X29ubGluZV9tYXApKQorCQkJCWJvZ29zdW0gKz0gY3B1X2RhdGFbaV0ubG9vcHNfcGVyX2ppZmZ5OworCQlwcmludGsoS0VSTl9JTkZPICJUb3RhbCBvZiAlZCBwcm9jZXNzb3JzIGFjdGl2YXRlZCAoJWx1LiUwMmx1IEJvZ29NSVBTKS5cbiIsCisJCQljcHVjb3VudCsxLAorCQkJYm9nb3N1bS8oNTAwMDAwL0haKSwKKwkJCShib2dvc3VtLyg1MDAwL0haKSklMTAwKTsKKwl9CisJdm95YWdlcl9leHRlbmRlZF9jcHVzID0gaHdlaWdodDMyKHZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMpOworCXByaW50aygiVk9ZQUdFUjogRXh0ZW5kZWQgKGludGVycnVwdCBoYW5kbGluZyBDUFVzKTogJWQsIG5vbi1leHRlbmRlZDogJWRcbiIsIHZveWFnZXJfZXh0ZW5kZWRfY3B1cywgbnVtX2Jvb3RpbmdfY3B1cygpIC0gdm95YWdlcl9leHRlbmRlZF9jcHVzKTsKKwkvKiB0aGF0J3MgaXQsIHN3aXRjaCB0byBzeW1tZXRyaWMgbW9kZSAqLworCW91dGIoMCwgVklDX1BSSU9SSVRZX1JFR0lTVEVSKTsKKwlvdXRiKDAsIFZJQ19DTEFJTV9SRUdJU1RFUl8wKTsKKwlvdXRiKDAsIFZJQ19DTEFJTV9SRUdJU1RFUl8xKTsKKwkKKwlWREVCVUcoKCJWT1lBR0VSIFNNUDogQm9vdGVkIHdpdGggJWQgQ1BVc1xuIiwgbnVtX2Jvb3RpbmdfY3B1cygpKSk7Cit9CisKKy8qIFJlbG9hZCB0aGUgc2Vjb25kYXJ5IENQVXMgdGFzayBzdHJ1Y3R1cmUgKHRoaXMgZnVuY3Rpb24gZG9lcyBub3QKKyAqIHJldHVybiApICovCit2b2lkIF9faW5pdCAKK2luaXRpYWxpemVfc2Vjb25kYXJ5KHZvaWQpCit7CisjaWYgMAorCS8vIEFDIGtlcm5lbHMgb25seQorCXNldF9jdXJyZW50KGhhcmRfZ2V0X2N1cnJlbnQoKSk7CisjZW5kaWYKKworCS8qCisJICogV2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBsb2FkIHRoZSBmdWxsIFRTUywKKwkgKiBiYXNpY2FsbHkganVzdCB0aGUgc3RhY2sgcG9pbnRlciBhbmQgdGhlIGVpcC4KKwkgKi8KKworCWFzbSB2b2xhdGlsZSgKKwkJIm1vdmwgJTAsJSVlc3Bcblx0IgorCQkiam1wIColMSIKKwkJOgorCQk6InIiIChjdXJyZW50LT50aHJlYWQuZXNwKSwiciIgKGN1cnJlbnQtPnRocmVhZC5laXApKTsKK30KKworLyogaGFuZGxlIGEgVm95YWdlciBTWVNfSU5UIC0tIElmIHdlIGRvbid0LCB0aGUgYmFzZSBib2FyZCB3aWxsCisgKiBwYW5pYyB0aGUgc3lzdGVtLgorICoKKyAqIFN5c3RlbSBpbnRlcnJ1cHRzIG9jY3VyIGJlY2F1c2Ugc29tZSBwcm9ibGVtIHdhcyBkZXRlY3RlZCBvbiB0aGUKKyAqIHZhcmlvdXMgYnVzc2VzLiAgVG8gZmluZCBvdXQgd2hhdCB5b3UgaGF2ZSB0byBwcm9iZSBhbGwgdGhlCisgKiBoYXJkd2FyZSB2aWEgdGhlIENBVCBidXMuICBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkbyBub3RoaW5nLiAqLworZmFzdGNhbGwgdm9pZAorc21wX3ZpY19zeXNfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWFja19DUEkoVklDX1NZU19JTlQpOworCXByaW50aygiVm95YWdlciBTWVNURU0gSU5URVJSVVBUXG4iKTsKK30KKworLyogSGFuZGxlIGEgdm95YWdlciBDTU5fSU5UOyBUaGVzZSBpbnRlcnJ1cHRzIG9jY3VyIGVpdGhlciBiZWNhdXNlIG9mCisgKiBhIHN5c3RlbSBzdGF0dXMgY2hhbmdlIG9yIGJlY2F1c2UgYSBzaW5nbGUgYml0IG1lbW9yeSBlcnJvcgorICogb2NjdXJyZWQuICBGSVhNRTogQXQgdGhlIG1vbWVudCwgaWdub3JlIGFsbCB0aGlzLiAqLworZmFzdGNhbGwgdm9pZAorc21wX3ZpY19jbW5faW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0YXRpYyBfX3U4IGluX2Ntbl9pbnQgPSAwOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY21uX2ludF9sb2NrKTsKKworCS8qIGNvbW1vbiBpbnRzIGFyZSBicm9hZGNhc3QsIHNvIG1ha2Ugc3VyZSB3ZSBvbmx5IGRvIHRoaXMgb25jZSAqLworCV9yYXdfc3Bpbl9sb2NrKCZjbW5faW50X2xvY2spOworCWlmKGluX2Ntbl9pbnQpCisJCWdvdG8gdW5sb2NrX2VuZDsKKworCWluX2Ntbl9pbnQrKzsKKwlfcmF3X3NwaW5fdW5sb2NrKCZjbW5faW50X2xvY2spOworCisJVkRFQlVHKCgiVm95YWdlciBDT01NT04gSU5URVJSVVBUXG4iKSk7CisKKwlpZih2b3lhZ2VyX2xldmVsID09IDUpCisJCXZveWFnZXJfY2F0X2RvX2NvbW1vbl9pbnRlcnJ1cHQoKTsKKworCV9yYXdfc3Bpbl9sb2NrKCZjbW5faW50X2xvY2spOworCWluX2Ntbl9pbnQgPSAwOworIHVubG9ja19lbmQ6CisJX3Jhd19zcGluX3VubG9jaygmY21uX2ludF9sb2NrKTsKKwlhY2tfQ1BJKFZJQ19DTU5fSU5UKTsKK30KKworLyoKKyAqIFJlc2NoZWR1bGUgY2FsbCBiYWNrLiBOb3RoaW5nIHRvIGRvLCBhbGwgdGhlIHdvcmsgaXMgZG9uZQorICogYXV0b21hdGljYWxseSB3aGVuIHdlIHJldHVybiBmcm9tIHRoZSBpbnRlcnJ1cHQuICAqLworc3RhdGljIHZvaWQKK3NtcF9yZXNjaGVkdWxlX2ludGVycnVwdCh2b2lkKQoreworCS8qIGRvIG5vdGhpbmcgKi8KK30KKworc3RhdGljIHN0cnVjdCBtbV9zdHJ1Y3QgKiBmbHVzaF9tbTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZsdXNoX3ZhOworc3RhdGljIERFRklORV9TUElOTE9DSyh0bGJzdGF0ZV9sb2NrKTsKKyNkZWZpbmUgRkxVU0hfQUxMCTB4ZmZmZmZmZmYKKworLyoKKyAqIFdlIGNhbm5vdCBjYWxsIG1tZHJvcCgpIGJlY2F1c2Ugd2UgYXJlIGluIGludGVycnVwdCBjb250ZXh0LCAKKyAqIGluc3RlYWQgdXBkYXRlIG1tLT5jcHVfdm1fbWFzay4KKyAqCisgKiBXZSBuZWVkIHRvIHJlbG9hZCAlY3IzIHNpbmNlIHRoZSBwYWdlIHRhYmxlcyBtYXkgYmUgZ29pbmcKKyAqIGF3YXkgZnJvbSB1bmRlciB1cy4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbGVhdmVfbW0gKHVuc2lnbmVkIGxvbmcgY3B1KQoreworCWlmIChwZXJfY3B1KGNwdV90bGJzdGF0ZSwgY3B1KS5zdGF0ZSA9PSBUTEJTVEFURV9PSykKKwkJQlVHKCk7CisJY3B1X2NsZWFyKGNwdSwgcGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuYWN0aXZlX21tLT5jcHVfdm1fbWFzayk7CisJbG9hZF9jcjMoc3dhcHBlcl9wZ19kaXIpOworfQorCisKKy8qCisgKiBJbnZhbGlkYXRlIGNhbGwtYmFjaworICovCitzdGF0aWMgdm9pZCAKK3NtcF9pbnZhbGlkYXRlX2ludGVycnVwdCh2b2lkKQoreworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKCF0ZXN0X2JpdChjcHUsICZzbXBfaW52YWxpZGF0ZV9uZWVkZWQpKQorCQlyZXR1cm47CisJLyogVGhpcyB3aWxsIGZsb29kIG1lc3NhZ2VzLiAgRG9uJ3QgdW5jb21tZW50IHVubGVzcyB5b3Ugc2VlCisJICogUHJvYmxlbXMgd2l0aCBjcm9zcyBjcHUgaW52YWxpZGF0aW9uCisJVkRFQlVHKCgiVk9ZQUdFUiBTTVA6IENQVSVkIHJlY2VpdmVkIElOVkFMSURBVEVfQ1BJXG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCkpKTsKKwkqLworCisJaWYgKGZsdXNoX21tID09IHBlcl9jcHUoY3B1X3RsYnN0YXRlLCBjcHUpLmFjdGl2ZV9tbSkgeworCQlpZiAocGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuc3RhdGUgPT0gVExCU1RBVEVfT0spIHsKKwkJCWlmIChmbHVzaF92YSA9PSBGTFVTSF9BTEwpCisJCQkJbG9jYWxfZmx1c2hfdGxiKCk7CisJCQllbHNlCisJCQkJX19mbHVzaF90bGJfb25lKGZsdXNoX3ZhKTsKKwkJfSBlbHNlCisJCQlsZWF2ZV9tbShjcHUpOworCX0KKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwljbGVhcl9iaXQoY3B1LCAmc21wX2ludmFsaWRhdGVfbmVlZGVkKTsKKwlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOworfQorCisvKiBBbGwgdGhlIG5ldyBmbHVzaCBvcGVyYXRpb25zIGZvciAyLjQgKi8KKworCisvKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdpdGggYSBwaHlzaWNhbCBjcHUgbWFzayAqLworc3RhdGljIHZvaWQKK2ZsdXNoX3RsYl9vdGhlcnMgKHVuc2lnbmVkIGxvbmcgY3B1bWFzaywgc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJCQl1bnNpZ25lZCBsb25nIHZhKQoreworCWludCBzdHVjayA9IDUwMDAwOworCisJaWYgKCFjcHVtYXNrKQorCQlCVUcoKTsKKwlpZiAoKGNwdW1hc2sgJiBjcHVzX2FkZHIoY3B1X29ubGluZV9tYXApWzBdKSAhPSBjcHVtYXNrKQorCQlCVUcoKTsKKwlpZiAoY3B1bWFzayAmICgxIDw8IHNtcF9wcm9jZXNzb3JfaWQoKSkpCisJCUJVRygpOworCWlmICghbW0pCisJCUJVRygpOworCisJc3Bpbl9sb2NrKCZ0bGJzdGF0ZV9sb2NrKTsKKwkKKwlmbHVzaF9tbSA9IG1tOworCWZsdXNoX3ZhID0gdmE7CisJYXRvbWljX3NldF9tYXNrKGNwdW1hc2ssICZzbXBfaW52YWxpZGF0ZV9uZWVkZWQpOworCS8qCisJICogV2UgaGF2ZSB0byBzZW5kIHRoZSBDUEkgb25seSB0bworCSAqIENQVXMgYWZmZWN0ZWQuCisJICovCisJc2VuZF9DUEkoY3B1bWFzaywgVklDX0lOVkFMSURBVEVfQ1BJKTsKKworCXdoaWxlIChzbXBfaW52YWxpZGF0ZV9uZWVkZWQpIHsKKwkJbWIoKTsKKwkJaWYoLS1zdHVjayA9PSAwKSB7CisJCQlwcmludGsoIioqKldBUk5JTkcqKiogU3R1Y2sgZG9pbmcgaW52YWxpZGF0ZSBDUEkgKENQVSVkKVxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogVW5jb21tZW50IG9ubHkgdG8gZGVidWcgaW52YWxpZGF0aW9uIHByb2JsZW1zCisJVkRFQlVHKCgiVk9ZQUdFUiBTTVA6IENvbXBsZXRlZCBpbnZhbGlkYXRlIENQSSAoQ1BVJWQpXG4iLCBjcHUpKTsKKwkqLworCisJZmx1c2hfbW0gPSBOVUxMOworCWZsdXNoX3ZhID0gMDsKKwlzcGluX3VubG9jaygmdGxic3RhdGVfbG9jayk7Cit9CisKK3ZvaWQKK2ZsdXNoX3RsYl9jdXJyZW50X3Rhc2sodm9pZCkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXVuc2lnbmVkIGxvbmcgY3B1X21hc2s7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCWNwdV9tYXNrID0gY3B1c19hZGRyKG1tLT5jcHVfdm1fbWFzaylbMF0gJiB+KDEgPDwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlsb2NhbF9mbHVzaF90bGIoKTsKKwlpZiAoY3B1X21hc2spCisJCWZsdXNoX3RsYl9vdGhlcnMoY3B1X21hc2ssIG1tLCBGTFVTSF9BTEwpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworCit2b2lkCitmbHVzaF90bGJfbW0gKHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSkKK3sKKwl1bnNpZ25lZCBsb25nIGNwdV9tYXNrOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwljcHVfbWFzayA9IGNwdXNfYWRkcihtbS0+Y3B1X3ZtX21hc2spWzBdICYgfigxIDw8IHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwlpZiAoY3VycmVudC0+YWN0aXZlX21tID09IG1tKSB7CisJCWlmIChjdXJyZW50LT5tbSkKKwkJCWxvY2FsX2ZsdXNoX3RsYigpOworCQllbHNlCisJCQlsZWF2ZV9tbShzbXBfcHJvY2Vzc29yX2lkKCkpOworCX0KKwlpZiAoY3B1X21hc2spCisJCWZsdXNoX3RsYl9vdGhlcnMoY3B1X21hc2ssIG1tLCBGTFVTSF9BTEwpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKwordm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsIHVuc2lnbmVkIGxvbmcgdmEpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXVuc2lnbmVkIGxvbmcgY3B1X21hc2s7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCWNwdV9tYXNrID0gY3B1c19hZGRyKG1tLT5jcHVfdm1fbWFzaylbMF0gJiB+KDEgPDwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlpZiAoY3VycmVudC0+YWN0aXZlX21tID09IG1tKSB7CisJCWlmKGN1cnJlbnQtPm1tKQorCQkJX19mbHVzaF90bGJfb25lKHZhKTsKKwkJIGVsc2UKKwkJIAlsZWF2ZV9tbShzbXBfcHJvY2Vzc29yX2lkKCkpOworCX0KKworCWlmIChjcHVfbWFzaykKKwkJZmx1c2hfdGxiX290aGVycyhjcHVfbWFzaywgbW0sIHZhKTsKKworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKKy8qIGVuYWJsZSB0aGUgcmVxdWVzdGVkIElSUXMgKi8KK3N0YXRpYyB2b2lkCitzbXBfZW5hYmxlX2lycV9pbnRlcnJ1cHQodm9pZCkKK3sKKwlfX3U4IGlycTsKKwlfX3U4IGNwdSA9IGdldF9jcHUoKTsKKworCVZERUJVRygoIlZPWUFHRVIgU01QOiBDUFUlZCBlbmFibGluZyBpcnEgbWFzayAweCV4XG4iLCBjcHUsCisJICAgICAgIHZpY19pcnFfZW5hYmxlX21hc2tbY3B1XSkpOworCisJc3Bpbl9sb2NrKCZ2aWNfaXJxX2xvY2spOworCWZvcihpcnEgPSAwOyBpcnEgPCAxNjsgaXJxKyspIHsKKwkJaWYodmljX2lycV9lbmFibGVfbWFza1tjcHVdICYgKDE8PGlycSkpCisJCQllbmFibGVfbG9jYWxfdmljX2lycShpcnEpOworCX0KKwl2aWNfaXJxX2VuYWJsZV9tYXNrW2NwdV0gPSAwOworCXNwaW5fdW5sb2NrKCZ2aWNfaXJxX2xvY2spOworCisJcHV0X2NwdV9ub19yZXNjaGVkKCk7Cit9CisJCisvKgorICoJQ1BVIGhhbHQgY2FsbC1iYWNrCisgKi8KK3N0YXRpYyB2b2lkCitzbXBfc3RvcF9jcHVfZnVuY3Rpb24odm9pZCAqZHVtbXkpCit7CisJVkRFQlVHKCgiVk9ZQUdFUiBTTVA6IENQVSVkIGlzIFNUT1BQSU5HXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpKTsKKwljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlmb3IoOzspCisJICAgICAgIF9fYXNtX18oImhsdCIpOworfQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNhbGxfbG9jayk7CisKK3N0cnVjdCBjYWxsX2RhdGFfc3RydWN0IHsKKwl2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pOworCXZvaWQgKmluZm87CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBzdGFydGVkOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZmluaXNoZWQ7CisJaW50IHdhaXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgKiBjYWxsX2RhdGE7CisKKy8qIGV4ZWN1dGUgYSB0aHJlYWQgb24gYSBuZXcgQ1BVLiAgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBtdXN0IGJlCisgKiBwcmV2aW91c2x5IHNldCB1cC4gIFRoaXMgaXMgdXNlZCB0byBzY2hlZHVsZSBhIGZ1bmN0aW9uIGZvcgorICogZXhlY3V0aW9uIG9uIGFsbCBDUFUncyAtIHNldCB1cCB0aGUgZnVuY3Rpb24gdGhlbiBicm9hZGNhc3QgYQorICogZnVuY3Rpb25faW50ZXJydXB0IENQSSB0byBjb21lIGhlcmUgb24gZWFjaCBDUFUgKi8KK3N0YXRpYyB2b2lkCitzbXBfY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQodm9pZCkKK3sKKwl2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pID0gY2FsbF9kYXRhLT5mdW5jOworCXZvaWQgKmluZm8gPSBjYWxsX2RhdGEtPmluZm87CisJLyogbXVzdCB0YWtlIGNvcHkgb2Ygd2FpdCBiZWNhdXNlIGNhbGxfZGF0YSBtYXkgYmUgcmVwbGFjZWQKKwkgKiB1bmxlc3MgdGhlIGZ1bmN0aW9uIGlzIHdhaXRpbmcgZm9yIHVzIHRvIGZpbmlzaCAqLworCWludCB3YWl0ID0gY2FsbF9kYXRhLT53YWl0OworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJLyoKKwkgKiBOb3RpZnkgaW5pdGlhdGluZyBDUFUgdGhhdCBJJ3ZlIGdyYWJiZWQgdGhlIGRhdGEgYW5kIGFtCisJICogYWJvdXQgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24KKwkgKi8KKwltYigpOworCWlmKCF0ZXN0X2FuZF9jbGVhcl9iaXQoY3B1LCAmY2FsbF9kYXRhLT5zdGFydGVkKSkgeworCQkvKiBJZiB0aGUgYml0IHdhc24ndCBzZXQsIHRoaXMgY291bGQgYmUgYSByZXBsYXkgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVk9ZQUdFUiBTTVA6IENQVSAlZCByZWNlaXZlZCBjYWxsIGZ1bnRpb24gd2l0aCBubyBjYWxsIHBlbmRpbmdcbiIsIGNwdSk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHRoZSBpbmZvIHN0cnVjdHVyZSBtYXkgYmUgb3V0IG9mIHNjb3BlIHVubGVzcyB3YWl0PT0xCisJICovCisJaXJxX2VudGVyKCk7CisJKCpmdW5jKShpbmZvKTsKKwlpcnFfZXhpdCgpOworCWlmICh3YWl0KSB7CisJCW1iKCk7CisJCWNsZWFyX2JpdChjcHUsICZjYWxsX2RhdGEtPmZpbmlzaGVkKTsKKwl9Cit9CisKKy8qIENhbGwgdGhpcyBmdW5jdGlvbiBvbiBhbGwgQ1BVcyB1c2luZyB0aGUgZnVuY3Rpb25faW50ZXJydXB0IGFib3ZlIAorICAgIDxmdW5jPiBUaGUgZnVuY3Rpb24gdG8gcnVuLiBUaGlzIG11c3QgYmUgZmFzdCBhbmQgbm9uLWJsb2NraW5nLgorICAgIDxpbmZvPiBBbiBhcmJpdHJhcnkgcG9pbnRlciB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi4KKyAgICA8cmV0cnk+IElmIHRydWUsIGtlZXAgcmV0cnlpbmcgdW50aWwgcmVhZHkuCisgICAgPHdhaXQ+IElmIHRydWUsIHdhaXQgdW50aWwgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZCBvbiBvdGhlciBDUFVzLgorICAgIFtSRVRVUk5TXSAwIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBzdGF0dXMgY29kZS4gRG9lcyBub3QgcmV0dXJuIHVudGlsCisgICAgcmVtb3RlIENQVXMgYXJlIG5lYXJseSByZWFkeSB0byBleGVjdXRlIDw8ZnVuYz4+IG9yIGFyZSBvciBoYXZlIGV4ZWN1dGVkLgorKi8KK2ludAorc21wX2NhbGxfZnVuY3Rpb24gKHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sIGludCByZXRyeSwKKwkJICAgaW50IHdhaXQpCit7CisJc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgZGF0YTsKKwlfX3UzMiBtYXNrID0gY3B1c19hZGRyKGNwdV9vbmxpbmVfbWFwKVswXTsKKworCW1hc2sgJj0gfigxPDxzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJaWYgKCFtYXNrKQorCQlyZXR1cm4gMDsKKworCS8qIENhbiBkZWFkbG9jayB3aGVuIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgKi8KKwlXQVJOX09OKGlycXNfZGlzYWJsZWQoKSk7CisKKwlkYXRhLmZ1bmMgPSBmdW5jOworCWRhdGEuaW5mbyA9IGluZm87CisJZGF0YS5zdGFydGVkID0gbWFzazsKKwlkYXRhLndhaXQgPSB3YWl0OworCWlmICh3YWl0KQorCQlkYXRhLmZpbmlzaGVkID0gbWFzazsKKworCXNwaW5fbG9jaygmY2FsbF9sb2NrKTsKKwljYWxsX2RhdGEgPSAmZGF0YTsKKwl3bWIoKTsKKwkvKiBTZW5kIGEgbWVzc2FnZSB0byBhbGwgb3RoZXIgQ1BVcyBhbmQgd2FpdCBmb3IgdGhlbSB0byByZXNwb25kICovCisJc2VuZF9DUElfYWxsYnV0c2VsZihWSUNfQ0FMTF9GVU5DVElPTl9DUEkpOworCisJLyogV2FpdCBmb3IgcmVzcG9uc2UgKi8KKwl3aGlsZSAoZGF0YS5zdGFydGVkKQorCQliYXJyaWVyKCk7CisKKwlpZiAod2FpdCkKKwkJd2hpbGUgKGRhdGEuZmluaXNoZWQpCisJCQliYXJyaWVyKCk7CisKKwlzcGluX3VubG9jaygmY2FsbF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBTb3JyeSBhYm91dCB0aGUgbmFtZS4gIEluIGFuIEFQSUMgYmFzZWQgc3lzdGVtLCB0aGUgQVBJQ3MKKyAqIHRoZW1zZWx2ZXMgYXJlIHByb2dyYW1tZWQgdG8gc2VuZCBhIHRpbWVyIGludGVycnVwdC4gIFRoaXMgaXMgdXNlZAorICogYnkgbGludXggdG8gcmVzY2hlZHVsZSB0aGUgcHJvY2Vzc29yLiAgVm95YWdlciBkb2Vzbid0IGhhdmUgdGhpcywKKyAqIHNvIHdlIHVzZSB0aGUgc3lzdGVtIGNsb2NrIHRvIGludGVycnVwdCBvbmUgcHJvY2Vzc29yLCB3aGljaCBpbgorICogdHVybiwgYnJvYWRjYXN0cyBhIHRpbWVyIENQSSB0byBhbGwgdGhlIG90aGVycyAtLS0gd2UgcmVjZWl2ZSB0aGF0CisgKiBDUEkgaGVyZS4gIFdlIGRvbid0IHVzZSB0aGlzIGFjdHVhbGx5IGZvciBjb3VudGluZyBzbyBsb3NpbmcKKyAqIHRpY2tzIGRvZXNuJ3QgbWF0dGVyIAorICoKKyAqIEZJWE1FOiBGb3IgdGhvc2UgQ1BVJ3Mgd2hpY2ggYWN0dWFsbHkgaGF2ZSBhIGxvY2FsIEFQSUMsIHdlIGNvdWxkCisgKiB0cnkgdG8gdXNlIGl0IHRvIHRyaWdnZXIgdGhpcyBpbnRlcnJ1cHQgaW5zdGVhZCBvZiBoYXZpbmcgdG8KKyAqIGJyb2FkY2FzdCB0aGUgdGltZXIgdGljay4gIFVuZm9ydHVuYXRlbHksIGFsbCBteSBwZW50aXVtIERZQURzIGhhdmUKKyAqIG5vIGxvY2FsIEFQSUMsIHNvIEkgY2FuJ3QgZG8gdGhpcworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY3VycmVudGx5IGEgcGxhY2Vob2xkZXIgYW5kIGlzIHVudXNlZCBpbiB0aGUgY29kZSAqLworZmFzdGNhbGwgdm9pZCAKK3NtcF9hcGljX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl3cmFwcGVyX3NtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQocmVncyk7Cit9CisKKy8qIEFsbCBvZiB0aGUgUVVBRCBpbnRlcnJ1cHQgR0FURVMgKi8KK2Zhc3RjYWxsIHZvaWQKK3NtcF9xaWNfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWFja19RSUNfQ1BJKFFJQ19USU1FUl9DUEkpOworCXdyYXBwZXJfc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdChyZWdzKTsKK30KKworZmFzdGNhbGwgdm9pZAorc21wX3FpY19pbnZhbGlkYXRlX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlhY2tfUUlDX0NQSShRSUNfSU5WQUxJREFURV9DUEkpOworCXNtcF9pbnZhbGlkYXRlX2ludGVycnVwdCgpOworfQorCitmYXN0Y2FsbCB2b2lkCitzbXBfcWljX3Jlc2NoZWR1bGVfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWFja19RSUNfQ1BJKFFJQ19SRVNDSEVEVUxFX0NQSSk7CisJc21wX3Jlc2NoZWR1bGVfaW50ZXJydXB0KCk7Cit9CisKK2Zhc3RjYWxsIHZvaWQKK3NtcF9xaWNfZW5hYmxlX2lycV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJYWNrX1FJQ19DUEkoUUlDX0VOQUJMRV9JUlFfQ1BJKTsKKwlzbXBfZW5hYmxlX2lycV9pbnRlcnJ1cHQoKTsKK30KKworZmFzdGNhbGwgdm9pZAorc21wX3FpY19jYWxsX2Z1bmN0aW9uX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlhY2tfUUlDX0NQSShRSUNfQ0FMTF9GVU5DVElPTl9DUEkpOworCXNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOworfQorCitmYXN0Y2FsbCB2b2lkCitzbXBfdmljX2NwaV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJX191OCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZihpc19jcHVfcXVhZCgpKQorCQlhY2tfUUlDX0NQSShWSUNfQ1BJX0xFVkVMMCk7CisJZWxzZQorCQlhY2tfVklDX0NQSShWSUNfQ1BJX0xFVkVMMCk7CisKKwlpZih0ZXN0X2FuZF9jbGVhcl9iaXQoVklDX1RJTUVSX0NQSSwgJnZpY19jcGlfbWFpbGJveFtjcHVdKSkKKwkJd3JhcHBlcl9zbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHJlZ3MpOworCWlmKHRlc3RfYW5kX2NsZWFyX2JpdChWSUNfSU5WQUxJREFURV9DUEksICZ2aWNfY3BpX21haWxib3hbY3B1XSkpCisJCXNtcF9pbnZhbGlkYXRlX2ludGVycnVwdCgpOworCWlmKHRlc3RfYW5kX2NsZWFyX2JpdChWSUNfUkVTQ0hFRFVMRV9DUEksICZ2aWNfY3BpX21haWxib3hbY3B1XSkpCisJCXNtcF9yZXNjaGVkdWxlX2ludGVycnVwdCgpOworCWlmKHRlc3RfYW5kX2NsZWFyX2JpdChWSUNfRU5BQkxFX0lSUV9DUEksICZ2aWNfY3BpX21haWxib3hbY3B1XSkpCisJCXNtcF9lbmFibGVfaXJxX2ludGVycnVwdCgpOworCWlmKHRlc3RfYW5kX2NsZWFyX2JpdChWSUNfQ0FMTF9GVU5DVElPTl9DUEksICZ2aWNfY3BpX21haWxib3hbY3B1XSkpCisJCXNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOworfQorCitzdGF0aWMgdm9pZAorZG9fZmx1c2hfdGxiX2FsbCh2b2lkKiBpbmZvKQoreworCXVuc2lnbmVkIGxvbmcgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJX19mbHVzaF90bGJfYWxsKCk7CisJaWYgKHBlcl9jcHUoY3B1X3RsYnN0YXRlLCBjcHUpLnN0YXRlID09IFRMQlNUQVRFX0xBWlkpCisJCWxlYXZlX21tKGNwdSk7Cit9CisKKworLyogZmx1c2ggdGhlIFRMQiBvZiBldmVyeSBhY3RpdmUgQ1BVIGluIHRoZSBzeXN0ZW0gKi8KK3ZvaWQKK2ZsdXNoX3RsYl9hbGwodm9pZCkKK3sKKwlvbl9lYWNoX2NwdShkb19mbHVzaF90bGJfYWxsLCAwLCAxLCAxKTsKK30KKworLyogdXNlZCB0byBzZXQgdXAgdGhlIHRyYW1wb2xpbmUgZm9yIG90aGVyIENQVXMgd2hlbiB0aGUgbWVtb3J5IG1hbmFnZXIKKyAqIGlzIHNvcnRlZCBvdXQgKi8KK3ZvaWQgX19pbml0CitzbXBfYWxsb2NfbWVtb3J5KHZvaWQpCit7CisJdHJhbXBvbGluZV9iYXNlID0gKF9fdTMyKWFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKFBBR0VfU0laRSk7CisJaWYoX19wYSh0cmFtcG9saW5lX2Jhc2UpID49IDB4OTMwMDApCisJCUJVRygpOworfQorCisvKiBzZW5kIGEgcmVzY2hlZHVsZSBDUEkgdG8gb25lIENQVSBieSBwaHlzaWNhbCBDUFUgbnVtYmVyKi8KK3ZvaWQKK3NtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKK3sKKwlzZW5kX29uZV9DUEkoY3B1LCBWSUNfUkVTQ0hFRFVMRV9DUEkpOworfQorCisKK2ludAoraGFyZF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpCit7CisJX191OCBpOworCV9fdTggY3B1bWFzayA9IGluYihWSUNfUFJPQ19XSE9fQU1fSSk7CisJaWYoKGNwdW1hc2sgJiBRVUFEX0lERU5USUZJRVIpID09IFFVQURfSURFTlRJRklFUikKKwkJcmV0dXJuIGNwdW1hc2sgJiAweDFGOworCisJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmKGNwdW1hc2sgJiAoMTw8aSkpCisJCQlyZXR1cm4gaTsKKwl9CisJcHJpbnRrKCIqKiBXQVJOSU5HICoqIElsbGVnYWwgY3B1aWQgcmV0dXJuZWQgYnkgVklDOiAlZCIsIGNwdW1hc2spOworCXJldHVybiAwOworfQorCisvKiBicm9hZGNhc3QgYSBoYWx0IHRvIGFsbCBvdGhlciBDUFVzICovCit2b2lkCitzbXBfc2VuZF9zdG9wKHZvaWQpCit7CisJc21wX2NhbGxfZnVuY3Rpb24oc21wX3N0b3BfY3B1X2Z1bmN0aW9uLCBOVUxMLCAxLCAxKTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgaW4gdGltZS5jIHdoZW4gYSBjbG9jayB0aWNrIGZpcmVzCisgKiB3ZSBuZWVkIHRvIHJlLWJyb2FkY2FzdCB0aGUgdGljayB0byBhbGwgQ1BVcyAqLwordm9pZAorc21wX3ZpY190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2VuZF9DUElfYWxsYnV0c2VsZihWSUNfVElNRVJfQ1BJKTsKKwlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHJlZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyYXBwZXJfc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpcnFfZW50ZXIoKTsKKwlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHJlZ3MpOworCWlycV9leGl0KCk7Cit9CisKKy8qIGxvY2FsIChwZXIgQ1BVKSB0aW1lciBpbnRlcnJ1cHQuICBJdCBkb2VzIGJvdGggcHJvZmlsaW5nIGFuZAorICogcHJvY2VzcyBzdGF0aXN0aWNzL3Jlc2NoZWR1bGluZy4KKyAqCisgKiBXZSBkbyBwcm9maWxpbmcgaW4gZXZlcnkgbG9jYWwgdGljaywgc3RhdGlzdGljcy9yZXNjaGVkdWxpbmcKKyAqIGhhcHBlbiBvbmx5IGV2ZXJ5ICdwcm9maWxpbmcgbXVsdGlwbGllcicgdGlja3MuIFRoZSBkZWZhdWx0CisgKiBtdWx0aXBsaWVyIGlzIDEgYW5kIGl0IGNhbiBiZSBjaGFuZ2VkIGJ5IHdyaXRpbmcgdGhlIG5ldyBtdWx0aXBsaWVyCisgKiB2YWx1ZSBpbnRvIC9wcm9jL3Byb2ZpbGUuCisgKi8KK3ZvaWQKK3NtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJbG9uZyB3ZWlnaHQ7CisKKwlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORywgcmVncyk7CisJaWYgKC0tcGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSkgPD0gMCkgeworCQkvKgorCQkgKiBUaGUgbXVsdGlwbGllciBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZ290CisJCSAqIHRvIHRoaXMgcG9pbnQgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgd3JpdGluZyB0bworCQkgKiAvcHJvYy9wcm9maWxlLiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBhZGp1c3QgdGhlIEFQSUMKKwkJICogdGltZXIgYWNjb3JkaW5nbHkuCisJCSAqCisJCSAqIEludGVycnVwdHMgYXJlIGFscmVhZHkgbWFza2VkIG9mZiBhdCB0aGlzIHBvaW50LgorCQkgKi8KKwkJcGVyX2NwdShwcm9mX2NvdW50ZXIsY3B1KSA9IHBlcl9jcHUocHJvZl9tdWx0aXBsaWVyLCBjcHUpOworCQlpZiAocGVyX2NwdShwcm9mX2NvdW50ZXIsIGNwdSkgIT0KKwkJCQkJcGVyX2NwdShwcm9mX29sZF9tdWx0aXBsaWVyLCBjcHUpKSB7CisJCQkvKiBGSVhNRTogbmVlZCB0byB1cGRhdGUgdGhlIHZpYyB0aW1lciB0aWNrIGhlcmUgKi8KKwkJCXBlcl9jcHUocHJvZl9vbGRfbXVsdGlwbGllciwgY3B1KSA9CisJCQkJCQlwZXJfY3B1KHByb2ZfY291bnRlciwgY3B1KTsKKwkJfQorCisJCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisJfQorCisJaWYoICgoMTw8Y3B1KSAmIHZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnMpID09IDApCisJCS8qIG9ubHkgZXh0ZW5kZWQgVklDIHByb2Nlc3NvcnMgcGFydGljaXBhdGUgaW4KKwkJICogaW50ZXJydXB0IGRpc3RyaWJ1dGlvbiAqLworCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIHRha2UgdGhlICdsb25nJyByZXR1cm4gcGF0aCwgYW5kIHRoZXJlIGV2ZXJ5IHN1YnN5c3RlbQorCSAqIGdyYWJzIHRoZSBhcHJvcHJpYXRlIGxvY2tzIChrZXJuZWwgbG9jay8gaXJxIGxvY2spLgorCSAqCisJICogd2UgbWlnaHQgd2FudCB0byBkZWNvdXBsZSBwcm9maWxpbmcgZnJvbSB0aGUgJ2xvbmcgcGF0aCcsCisJICogYW5kIGRvIHRoZSBwcm9maWxpbmcgdG90YWxseSBpbiBhc3NlbWJseS4KKwkgKgorCSAqIEN1cnJlbnRseSB0aGlzIGlzbid0IHRvbyBtdWNoIG9mIGFuIGlzc3VlIChwZXJmb3JtYW5jZSB3aXNlKSwKKwkgKiB3ZSBjYW4gdGFrZSBtb3JlIHRoYW4gMTAwSyBsb2NhbCBpcnFzIHBlciBzZWNvbmQgb24gYSAxMDAgTUh6IFA1LgorCSAqLworCisJaWYoKCsrdmljX3RpY2tbY3B1XSAmIDB4NykgIT0gMCkKKwkJcmV0dXJuOworCS8qIGdldCBoZXJlIGV2ZXJ5IDE2IHRpY2tzIChhYm91dCBldmVyeSAxLzYgb2YgYSBzZWNvbmQpICovCisKKwkvKiBDaGFuZ2Ugb3VyIHByaW9yaXR5IHRvIGdpdmUgc29tZW9uZSBlbHNlIGEgY2hhbmNlIGF0IGdldHRpbmcKKyAgICAgICAgICogdGhlIElSUS4gVGhlIGFsZ29yaXRobSBnb2VzIGxpa2UgdGhpczoKKwkgKgorCSAqIEluIHRoZSBWSUMsIHRoZSBkeW5hbWljYWxseSByb3V0ZWQgaW50ZXJydXB0IGlzIGFsd2F5cworCSAqIGhhbmRsZWQgYnkgdGhlIGxvd2VzdCBwcmlvcml0eSBlbGlnaWJsZSAoaS5lLiByZWNlaXZpbmcKKwkgKiBpbnRlcnJ1cHRzKSBDUFUuICBJZiA+MSBlbGlnaWJsZSBDUFVzIGFyZSBlcXVhbCBsb3dlc3QsIHRoZQorCSAqIGxvd2VzdCBwcm9jZXNzb3IgbnVtYmVyIGdldHMgaXQuCisJICoKKwkgKiBUaGUgcHJpb3JpdHkgb2YgYSBDUFUgaXMgY29udHJvbGxlZCBieSBhIHNwZWNpYWwgcGVyLUNQVQorCSAqIFZJQyBwcmlvcml0eSByZWdpc3RlciB3aGljaCBpcyAzIGJpdHMgd2lkZSAwIGJlaW5nIGxvd2VzdAorCSAqIGFuZCA3IGhpZ2hlc3QgcHJpb3JpdHkuLgorCSAqCisJICogVGhlcmVmb3JlIHdlIHN1YnRyYWN0IHRoZSBhdmVyYWdlIG51bWJlciBvZiBpbnRlcnJ1cHRzIGZyb20KKwkgKiB0aGUgbnVtYmVyIHdlJ3ZlIGZpZWxkZWQuICBJZiB0aGlzIG51bWJlciBpcyBuZWdhdGl2ZSwgd2UKKwkgKiBsb3dlciB0aGUgYWN0aXZpdHkgY291bnQgYW5kIGlmIGl0IGlzIHBvc2l0aXZlLCB3ZSByYWlzZQorCSAqIGl0LgorCSAqCisJICogSSdtIGFmcmFpZCB0aGlzIHN0aWxsIGxlYWRzIHRvIG9kZCBsb29raW5nIGludGVycnVwdCBjb3VudHM6CisJICogdGhlIHRvdGFscyBhcmUgYWxsIHJvdWdobHkgZXF1YWwsIGJ1dCB0aGUgaW5kaXZpZHVhbCBvbmVzCisJICogbG9vayByYXRoZXIgc2tld2VkLgorCSAqCisJICogRklYTUU6IFRoaXMgYWxnb3JpdGhtIGlzIHRvdGFsIGNyYXAgd2hlbiBtaXhlZCB3aXRoIFNNUAorCSAqIGFmZmluaXR5IGNvZGUgc2luY2Ugd2Ugbm93IHRyeSB0byBldmVuIHVwIHRoZSBpbnRlcnJ1cHQKKwkgKiBjb3VudHMgd2hlbiBhbiBhZmZpbml0eSBiaW5kaW5nIGlzIGtlZXBpbmcgdGhlbSBvbiBhCisJICogcGFydGljdWxhciBDUFUqLworCXdlaWdodCA9ICh2aWNfaW50cl9jb3VudFtjcHVdKnZveWFnZXJfZXh0ZW5kZWRfY3B1cworCQkgIC0gdmljX2ludHJfdG90YWwpID4+IDQ7CisJd2VpZ2h0ICs9IDQ7CisJaWYod2VpZ2h0ID4gNykKKwkJd2VpZ2h0ID0gNzsKKwlpZih3ZWlnaHQgPCAwKQorCQl3ZWlnaHQgPSAwOworCQorCW91dGIoKF9fdTgpd2VpZ2h0LCBWSUNfUFJJT1JJVFlfUkVHSVNURVIpOworCisjaWZkZWYgVk9ZQUdFUl9ERUJVRworCWlmKCh2aWNfdGlja1tjcHVdICYgMHhGRkYpID09IDApIHsKKwkJLyogcHJpbnQgdGhpcyBtZXNzYWdlIHJvdWdobHkgZXZlcnkgMjUgc2VjcyAqLworCQlwcmludGsoIlZPWUFHRVIgU01QOiB2aWNfdGlja1slZF0gPSAlbHUsIHdlaWdodCA9ICVsZFxuIiwKKwkJICAgICAgIGNwdSwgdmljX3RpY2tbY3B1XSwgd2VpZ2h0KTsKKwl9CisjZW5kaWYKK30KKworLyogc2V0dXAgdGhlIHByb2ZpbGluZyB0aW1lciAqLworaW50IAorc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCBtdWx0aXBsaWVyKQoreworCWludCBpOworCisJaWYgKCAoIW11bHRpcGxpZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIAorCSAqIFNldCB0aGUgbmV3IG11bHRpcGxpZXIgZm9yIGVhY2ggQ1BVLiBDUFVzIGRvbid0IHN0YXJ0IHVzaW5nIHRoZQorCSAqIG5ldyB2YWx1ZXMgdW50aWwgdGhlIG5leHQgdGltZXIgaW50ZXJydXB0IGluIHdoaWNoIHRoZXkgZG8gcHJvY2VzcworCSAqIGFjY291bnRpbmcuCisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7ICsraSkKKwkJcGVyX2NwdShwcm9mX211bHRpcGxpZXIsIGkpID0gbXVsdGlwbGllcjsKKworCXJldHVybiAwOworfQorCisKKy8qICBUaGUgQ1BJcyBhcmUgaGFuZGxlZCBpbiB0aGUgcGVyIGNwdSA4MjU5cywgc28gdGhleSBtdXN0IGJlCisgKiAgZW5hYmxlZCB0byBiZSByZWNlaXZlZDogRklYOiBlbmFibGluZyB0aGUgQ1BJcyBpbiB0aGUgZWFybHkKKyAqICBib290IHNlcXVlbmNlIGludGVyZmVyZXMgd2l0aCBidWcgY2hlY2tpbmc7IGVuYWJsZSB0aGVtIGxhdGVyCisgKiAgb24gaW4gc21wX2luaXQgKi8KKyNkZWZpbmUgVklDX1NFVF9HQVRFKGNwaSwgdmVjdG9yKSBcCisJc2V0X2ludHJfZ2F0ZSgoY3BpKSArIFZJQ19ERUZBVUxUX0NQSV9CQVNFLCAodmVjdG9yKSkKKyNkZWZpbmUgUUlDX1NFVF9HQVRFKGNwaSwgdmVjdG9yKSBcCisJc2V0X2ludHJfZ2F0ZSgoY3BpKSArIFFJQ19ERUZBVUxUX0NQSV9CQVNFLCAodmVjdG9yKSkKKwordm9pZCBfX2luaXQKK3NtcF9pbnRyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qIGluaXRpYWxpemUgdGhlIHBlciBjcHUgaXJxIG1hc2sgdG8gYWxsIGRpc2FibGVkICovCisJZm9yKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQorCQl2aWNfaXJxX21hc2tbaV0gPSAweEZGRkY7CisKKwlWSUNfU0VUX0dBVEUoVklDX0NQSV9MRVZFTDAsIHZpY19jcGlfaW50ZXJydXB0KTsKKworCVZJQ19TRVRfR0FURShWSUNfU1lTX0lOVCwgdmljX3N5c19pbnRlcnJ1cHQpOworCVZJQ19TRVRfR0FURShWSUNfQ01OX0lOVCwgdmljX2Ntbl9pbnRlcnJ1cHQpOworCisJUUlDX1NFVF9HQVRFKFFJQ19USU1FUl9DUEksIHFpY190aW1lcl9pbnRlcnJ1cHQpOworCVFJQ19TRVRfR0FURShRSUNfSU5WQUxJREFURV9DUEksIHFpY19pbnZhbGlkYXRlX2ludGVycnVwdCk7CisJUUlDX1NFVF9HQVRFKFFJQ19SRVNDSEVEVUxFX0NQSSwgcWljX3Jlc2NoZWR1bGVfaW50ZXJydXB0KTsKKwlRSUNfU0VUX0dBVEUoUUlDX0VOQUJMRV9JUlFfQ1BJLCBxaWNfZW5hYmxlX2lycV9pbnRlcnJ1cHQpOworCVFJQ19TRVRfR0FURShRSUNfQ0FMTF9GVU5DVElPTl9DUEksIHFpY19jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCk7CisJCisKKwkvKiBub3cgcHV0IHRoZSBWSUMgZGVzY3JpcHRvciBpbnRvIHRoZSBmaXJzdCA0OCBJUlFzIAorCSAqCisJICogVGhpcyBpcyBmb3IgbGF0ZXI6IGZpcnN0IDE2IGNvcnJlc3BvbmQgdG8gUEMgSVJRczsgbmV4dCAxNgorCSAqIGFyZSBQcmltYXJ5IE1DIElSUXMgYW5kIGZpbmFsIDE2IGFyZSBTZWNvbmRhcnkgTUMgSVJRcyAqLworCWZvcihpID0gMDsgaSA8IDQ4OyBpKyspCisJCWlycV9kZXNjW2ldLmhhbmRsZXIgPSAmdmljX2lycV90eXBlOworfQorCisvKiBzZW5kIGEgQ1BJIGF0IGxldmVsIGNwaSB0byBhIHNldCBvZiBjcHVzIGluIGNwdXNldCAoc2V0IDEgYml0IHBlcgorICogcHJvY2Vzc29yIHRvIHJlY2VpdmUgQ1BJICovCitzdGF0aWMgdm9pZAorc2VuZF9DUEkoX191MzIgY3B1c2V0LCBfX3U4IGNwaSkKK3sKKwlpbnQgY3B1OworCV9fdTMyIHF1YWRfY3B1c2V0ID0gKGNwdXNldCAmIHZveWFnZXJfcXVhZF9wcm9jZXNzb3JzKTsKKworCWlmKGNwaSA8IFZJQ19TVEFSVF9GQUtFX0NQSSkgeworCQkvKiBmYWtlIENQSSBhcmUgb25seSB1c2VkIGZvciBib290aW5nLCBzbyBzZW5kIHRvIHRoZSAKKwkJICogZXh0ZW5kZWQgcXVhZHMgYXMgd2VsbC0tLVF1YWRzIG11c3QgYmUgVklDIGJvb3RlZCAqLworCQlvdXRiKChfX3U4KShjcHVzZXQpLCBWSUNfQ1BJX1JlZ2lzdGVyc1tjcGldKTsKKwkJcmV0dXJuOworCX0KKwlpZihxdWFkX2NwdXNldCkKKwkJc2VuZF9RSUNfQ1BJKHF1YWRfY3B1c2V0LCBjcGkpOworCWNwdXNldCAmPSB+cXVhZF9jcHVzZXQ7CisJY3B1c2V0ICY9IDB4ZmY7CQkvKiBvbmx5IGZpcnN0IDggQ1BVcyB2YWlsZCBmb3IgVklDIENQSSAqLworCWlmKGNwdXNldCA9PSAwKQorCQlyZXR1cm47CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYoY3B1c2V0ICYgKDE8PGNwdSkpCisJCQlzZXRfYml0KGNwaSwgJnZpY19jcGlfbWFpbGJveFtjcHVdKTsKKwl9CisJaWYoY3B1c2V0KQorCQlvdXRiKChfX3U4KWNwdXNldCwgVklDX0NQSV9SZWdpc3RlcnNbVklDX0NQSV9MRVZFTDBdKTsKK30KKworLyogQWNrbm93bGVkZ2UgcmVjZWlwdCBvZiBDUEkgaW4gdGhlIFFJQywgY2xlYXIgaW4gUUlDIGhhcmR3YXJlIGFuZAorICogc2V0IHRoZSBjYWNoZSBsaW5lIHRvIHNoYXJlZCBieSByZWFkaW5nIGl0LgorICoKKyAqIERPTidUIG1ha2UgdGhpcyBpbmxpbmUgb3RoZXJ3aXNlIHRoZSBjYWNoZSBsaW5lIHJlYWQgd2lsbCBiZQorICogb3B0aW1pc2VkIGF3YXkKKyAqICovCitzdGF0aWMgaW50CithY2tfUUlDX0NQSShfX3U4IGNwaSkgeworCV9fdTggY3B1ID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwljcGkgJj0gNzsKKworCW91dGIoMTw8Y3BpLCBRSUNfSU5URVJSVVBUX0NMRUFSMSk7CisJcmV0dXJuIHZveWFnZXJfcXVhZF9jcGlfYWRkcltjcHVdLT5xaWNfY3BpW2NwaV0uY3BpOworfQorCitzdGF0aWMgdm9pZAorYWNrX3NwZWNpYWxfUUlDX0NQSShfX3U4IGNwaSkKK3sKKwlzd2l0Y2goY3BpKSB7CisJY2FzZSBWSUNfQ01OX0lOVDoKKwkJb3V0YihRSUNfQ01OX0lOVCwgUUlDX0lOVEVSUlVQVF9DTEVBUjApOworCQlicmVhazsKKwljYXNlIFZJQ19TWVNfSU5UOgorCQlvdXRiKFFJQ19TWVNfSU5ULCBRSUNfSU5URVJSVVBUX0NMRUFSMCk7CisJCWJyZWFrOworCX0KKwkvKiBhbHNvIGNsZWFyIGF0IHRoZSBWSUMsIGp1c3QgaW4gY2FzZSAobm9wIGZvciBub24tZXh0ZW5kZWQgcHJvYykgKi8KKwlhY2tfVklDX0NQSShjcGkpOworfQorCisvKiBBY2tub3dsZWRnZSByZWNlaXB0IG9mIENQSSBpbiB0aGUgVklDIChlc3NlbnRpYWxseSBhbiBFT0kpICovCitzdGF0aWMgdm9pZAorYWNrX1ZJQ19DUEkoX191OCBjcGkpCit7CisjaWZkZWYgVk9ZQUdFUl9ERUJVRworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX191MTYgaXNyOworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlzciA9IHZpY19yZWFkX2lzcigpOworCWlmKChpc3IgJiAoMTw8KGNwaSAmNykpKSA9PSAwKSB7CisJCXByaW50aygiVk9ZQUdFUiBTTVA6IENQVSVkIGxvc3QgQ1BJJWRcbiIsIGNwdSwgY3BpKTsKKwl9CisjZW5kaWYKKwkvKiBzZW5kIHNwZWNpZmljIEVPSTsgdGhlIHR3byBzeXN0ZW0gaW50ZXJydXB0cyBoYXZlCisJICogYml0IDQgc2V0IGZvciBhIHNlcGFyYXRlIHZlY3RvciBidXQgYmVoYXZlIGFzIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgMyBiaXQgaW50ciAqLworCW91dGJfcCgweDYwfChjcGkgJiA3KSwweDIwKTsKKworI2lmZGVmIFZPWUFHRVJfREVCVUcKKwlpZigodmljX3JlYWRfaXNyKCkgJiAoMTw8KGNwaSAmNykpKSAhPSAwKSB7CisJCXByaW50aygiVk9ZQUdFUiBTTVA6IENQVSVkIHN0aWxsIGFzc2VydGluZyBDUEklZFxuIiwgY3B1LCBjcGkpOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisjZW5kaWYKK30KKworLyogY3JpYmJlZCB3aXRoIHRoYW5rcyBmcm9tIGlycS5jICovCisjZGVmaW5lIF9fYnl0ZSh4LHkpIAkoKCh1bnNpZ25lZCBjaGFyICopJih5KSlbeF0pCisjZGVmaW5lIGNhY2hlZF8yMShjcHUpCShfX2J5dGUoMCx2aWNfaXJxX21hc2tbY3B1XSkpCisjZGVmaW5lIGNhY2hlZF9BMShjcHUpCShfX2J5dGUoMSx2aWNfaXJxX21hc2tbY3B1XSkpCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3N0YXJ0dXBfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWVuYWJsZV92aWNfaXJxKGlycSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGVuYWJsZSBhbmQgZGlzYWJsZSByb3V0aW5lcy4gIFRoaXMgaXMgd2hlcmUgd2UgcnVuIGludG8KKyAqIGNvbmZsaWN0aW5nIGFyY2hpdGVjdHVyYWwgcGhpbG9zb3BoeS4gIEZ1bmRhbWVudGFsbHksIHRoZSB2b3lhZ2VyCisgKiBhcmNoaXRlY3R1cmUgZG9lcyBub3QgZXhwZWN0IHRvIGhhdmUgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzIGdsb2JhbGx5CisgKiAodGhlIElSUSBjb250cm9sbGVycyBiZWxvbmcgdG8gZWFjaCBDUFUpLiAgVGhlIHByb2Nlc3NvciBtYXNxdWVyYWRlCisgKiB3aGljaCBpcyB1c2VkIHRvIHN0YXJ0IHRoZSBzeXN0ZW0gc2hvdWxkbid0IGJlIHVzZWQgaW4gYSBydW5uaW5nIE9TCisgKiBzaW5jZSBpdCB3aWxsIGNhdXNlIGdyZWF0IGNvbmZ1c2lvbiBpZiB0d28gc2VwYXJhdGUgQ1BVcyBkcml2ZSB0bworICogdGhlIHNhbWUgSVJRIGNvbnRyb2xsZXIgKEkga25vdywgSSd2ZSB0cmllZCBpdCkuCisgKgorICogVGhlIHNvbHV0aW9uIGlzIGEgdmFyaWFudCBvbiB0aGUgTkNSIGxhenkgU1BMIGRlc2lnbjoKKyAqCisgKiAxKSBUbyBkaXNhYmxlIGFuIGludGVycnVwdCwgZG8gbm90aGluZyAob3RoZXIgdGhhbiBzZXQgdGhlCisgKiAgICBJUlFfRElTQUJMRUQgZmxhZykuICBUaGlzIGRhcmVzIHRoZSBpbnRlcnJ1cHQgYWN0dWFsbHkgdG8gYXJyaXZlLgorICoKKyAqIDIpIElmIHRoZSBpbnRlcnJ1cHQgZGFyZXMgdG8gY29tZSBpbiwgcmFpc2UgdGhlIGxvY2FsIG1hc2sgYWdhaW5zdAorICogICAgaXQgKHRoaXMgd2lsbCByZXN1bHQgaW4gYWxsIHRoZSBDUFUgbWFza3MgYmVpbmcgcmFpc2VkCisgKiAgICBldmVudHVhbGx5KS4KKyAqCisgKiAzKSBUbyBlbmFibGUgdGhlIGludGVycnVwdCwgbG93ZXIgdGhlIG1hc2sgb24gdGhlIGxvY2FsIENQVSBhbmQKKyAqICAgIGJyb2FkY2FzdCBhbiBJbnRlcnJ1cHQgZW5hYmxlIENQSSB3aGljaCBjYXVzZXMgYWxsIG90aGVyIENQVXMgdG8KKyAqICAgIGFkanVzdCB0aGVpciBtYXNrcyBhY2NvcmRpbmdseS4gICovCisKK3N0YXRpYyB2b2lkCitlbmFibGVfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qIGxpbnV4IGRvZXNuJ3QgdG8gcHJvY2Vzc29yLWlycSBhZmZpbml0eSwgc28gZW5hYmxlIG9uCisJICogYWxsIENQVXMgd2Uga25vdyBhYm91dCAqLworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCksIHJlYWxfY3B1OworCV9fdTE2IG1hc2sgPSAoMTw8aXJxKTsKKwlfX3UzMiBwcm9jZXNzb3JMaXN0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJVkRFQlVHKCgiVk9ZQUdFUjogZW5hYmxlX3ZpY19pcnEoJWQpIENQVSVkIGFmZmluaXR5IDB4JWx4XG4iLAorCQlpcnEsIGNwdSwgY3B1X2lycV9hZmZpbml0eVtjcHVdKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpY19pcnFfbG9jaywgZmxhZ3MpOworCWZvcl9lYWNoX29ubGluZV9jcHUocmVhbF9jcHUpIHsKKwkJaWYoISh2b3lhZ2VyX2V4dGVuZGVkX3ZpY19wcm9jZXNzb3JzICYgKDE8PHJlYWxfY3B1KSkpCisJCQljb250aW51ZTsKKwkJaWYoIShjcHVfaXJxX2FmZmluaXR5W3JlYWxfY3B1XSAmIG1hc2spKSB7CisJCQkvKiBpcnEgaGFzIG5vIGFmZmluaXR5IGZvciB0aGlzIENQVSwgaWdub3JlICovCisJCQljb250aW51ZTsKKwkJfQorCQlpZihyZWFsX2NwdSA9PSBjcHUpIHsKKwkJCWVuYWJsZV9sb2NhbF92aWNfaXJxKGlycSk7CisJCX0KKwkJZWxzZSBpZih2aWNfaXJxX21hc2tbcmVhbF9jcHVdICYgbWFzaykgeworCQkJdmljX2lycV9lbmFibGVfbWFza1tyZWFsX2NwdV0gfD0gbWFzazsKKwkJCXByb2Nlc3Nvckxpc3QgfD0gKDE8PHJlYWxfY3B1KTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWNfaXJxX2xvY2ssIGZsYWdzKTsKKwlpZihwcm9jZXNzb3JMaXN0KQorCQlzZW5kX0NQSShwcm9jZXNzb3JMaXN0LCBWSUNfRU5BQkxFX0lSUV9DUEkpOworfQorCitzdGF0aWMgdm9pZAorZGlzYWJsZV92aWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJLyogbGF6eSBkaXNhYmxlLCBkbyBub3RoaW5nICovCit9CisKK3N0YXRpYyB2b2lkCitlbmFibGVfbG9jYWxfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCV9fdTE2IG1hc2sgPSB+KDEgPDwgaXJxKTsKKwlfX3UxNiBvbGRfbWFzayA9IHZpY19pcnFfbWFza1tjcHVdOworCisJdmljX2lycV9tYXNrW2NwdV0gJj0gbWFzazsKKwlpZih2aWNfaXJxX21hc2tbY3B1XSA9PSBvbGRfbWFzaykKKwkJcmV0dXJuOworCisJVkRFQlVHKCgiVk9ZQUdFUiBERUJVRzogRW5hYmxpbmcgaXJxICVkIGluIGhhcmR3YXJlIG9uIENQVSAlZFxuIiwKKwkJaXJxLCBjcHUpKTsKKworCWlmIChpcnEgJiA4KSB7CisJCW91dGJfcChjYWNoZWRfQTEoY3B1KSwweEExKTsKKwkJKHZvaWQpaW5iX3AoMHhBMSk7CisJfQorCWVsc2UgeworCQlvdXRiX3AoY2FjaGVkXzIxKGNwdSksMHgyMSk7CisJCSh2b2lkKWluYl9wKDB4MjEpOworCX0KK30KKworc3RhdGljIHZvaWQKK2Rpc2FibGVfbG9jYWxfdmljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCV9fdTE2IG1hc2sgPSAoMSA8PCBpcnEpOworCV9fdTE2IG9sZF9tYXNrID0gdmljX2lycV9tYXNrW2NwdV07CisKKwlpZihpcnEgPT0gNykKKwkJcmV0dXJuOworCisJdmljX2lycV9tYXNrW2NwdV0gfD0gbWFzazsKKwlpZihvbGRfbWFzayA9PSB2aWNfaXJxX21hc2tbY3B1XSkKKwkJcmV0dXJuOworCisJVkRFQlVHKCgiVk9ZQUdFUiBERUJVRzogRGlzYWJsaW5nIGlycSAlZCBpbiBoYXJkd2FyZSBvbiBDUFUgJWRcbiIsCisJCWlycSwgY3B1KSk7CisKKwlpZiAoaXJxICYgOCkgeworCQlvdXRiX3AoY2FjaGVkX0ExKGNwdSksMHhBMSk7CisJCSh2b2lkKWluYl9wKDB4QTEpOworCX0KKwllbHNlIHsKKwkJb3V0Yl9wKGNhY2hlZF8yMShjcHUpLDB4MjEpOworCQkodm9pZClpbmJfcCgweDIxKTsKKwl9Cit9CisKKy8qIFRoZSBWSUMgaXMgbGV2ZWwgdHJpZ2dlcmVkLCBzbyB0aGUgYWNrIGNhbiBvbmx5IGJlIGlzc3VlZCBhZnRlciB0aGUKKyAqIGludGVycnVwdCBjb21wbGV0ZXMuICBIb3dldmVyLCB3ZSBkbyBWb3lhZ2VyIGxhenkgaW50ZXJydXB0CisgKiBoYW5kbGluZyBoZXJlOiBJdCBpcyBhbiBleHRyZW1lbHkgZXhwZW5zaXZlIG9wZXJhdGlvbiB0byBtYXNrIGFuCisgKiBpbnRlcnJ1cHQgaW4gdGhlIHZpYywgc28gd2UgbWVyZWx5IHNldCBhIGZsYWcgKElSUV9ESVNBQkxFRCkuICBJZgorICogdGhpcyBpbnRlcnJ1cHQgYWN0dWFsbHkgY29tZXMgaW4sIHRoZW4gd2UgbWFzayBhbmQgYWNrIGhlcmUgdG8gcHVzaAorICogdGhlIGludGVycnVwdCBvZmYgdG8gYW5vdGhlciBDUFUgKi8KK3N0YXRpYyB2b2lkCitiZWZvcmVfaGFuZGxlX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJX191OCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlfcmF3X3NwaW5fbG9jaygmdmljX2lycV9sb2NrKTsKKwl2aWNfaW50cl90b3RhbCsrOworCXZpY19pbnRyX2NvdW50W2NwdV0rKzsKKworCWlmKCEoY3B1X2lycV9hZmZpbml0eVtjcHVdICYgKDE8PGlycSkpKSB7CisJCS8qIFRoZSBpcnEgaXMgbm90IGluIG91ciBhZmZpbml0eSBtYXNrLCBwdXNoIGl0IG9mZgorCQkgKiBvbnRvIGFub3RoZXIgQ1BVICovCisJCVZERUJVRygoIlZPWUFHRVIgREVCVUc6IGFmZmluaXR5IHRyaWdnZXJlZCBkaXNhYmxlIG9mIGlycSAlZCBvbiBjcHUgJWRcbiIsCisJCQlpcnEsIGNwdSkpOworCQlkaXNhYmxlX2xvY2FsX3ZpY19pcnEoaXJxKTsKKwkJLyogc2V0IElSUV9JTlBST0dSRVNTIHRvIHByZXZlbnQgdGhlIGhhbmRsZXIgaW4gaXJxLmMgZnJvbQorCQkgKiBhY3R1YWxseSBjYWxsaW5nIHRoZSBpbnRlcnJ1cHQgcm91dGluZSAqLworCQlkZXNjLT5zdGF0dXMgfD0gSVJRX1JFUExBWSB8IElSUV9JTlBST0dSRVNTOworCX0gZWxzZSBpZihkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpIHsKKwkJLyogRGFtbiwgdGhlIGludGVycnVwdCBhY3R1YWxseSBhcnJpdmVkLCBkbyB0aGUgbGF6eQorCQkgKiBkaXNhYmxlIHRoaW5nLiBUaGUgaW50ZXJydXB0IHJvdXRpbmUgaW4gaXJxLmMgd2lsbAorCQkgKiBub3QgaGFuZGxlIGEgSVJRX0RJU0FCTEVEIGludGVycnVwdCwgc28gbm90aGluZyBtb3JlCisJCSAqIG5lZWQgYmUgZG9uZSBoZXJlICovCisJCVZERUJVRygoIlZPWUFHRVIgREVCVUc6IGxhenkgZGlzYWJsZSBvZiBpcnEgJWQgb24gQ1BVICVkXG4iLAorCQkJaXJxLCBjcHUpKTsKKwkJZGlzYWJsZV9sb2NhbF92aWNfaXJxKGlycSk7CisJCWRlc2MtPnN0YXR1cyB8PSBJUlFfUkVQTEFZOworCX0gZWxzZSB7CisJCWRlc2MtPnN0YXR1cyAmPSB+SVJRX1JFUExBWTsKKwl9CisKKwlfcmF3X3NwaW5fdW5sb2NrKCZ2aWNfaXJxX2xvY2spOworfQorCisvKiBGaW5pc2ggdGhlIFZJQyBpbnRlcnJ1cHQ6IGJhc2ljYWxseSBtYXNrICovCitzdGF0aWMgdm9pZAorYWZ0ZXJfaGFuZGxlX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpcnFfZGVzY190ICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisKKwlfcmF3X3NwaW5fbG9jaygmdmljX2lycV9sb2NrKTsKKwl7CisJCXVuc2lnbmVkIGludCBzdGF0dXMgPSBkZXNjLT5zdGF0dXMgJiB+SVJRX0lOUFJPR1JFU1M7CisjaWZkZWYgVk9ZQUdFUl9ERUJVRworCQlfX3UxNiBpc3I7CisjZW5kaWYKKworCQlkZXNjLT5zdGF0dXMgPSBzdGF0dXM7CisJCWlmICgoc3RhdHVzICYgSVJRX0RJU0FCTEVEKSkKKwkJCWRpc2FibGVfbG9jYWxfdmljX2lycShpcnEpOworI2lmZGVmIFZPWUFHRVJfREVCVUcKKwkJLyogREVCVUc6IGJlZm9yZSB3ZSBhY2ssIGNoZWNrIHdoYXQncyBpbiBwcm9ncmVzcyAqLworCQlpc3IgPSB2aWNfcmVhZF9pc3IoKTsKKwkJaWYoKGlzciAmICgxPDxpcnEpICYmICEoc3RhdHVzICYgSVJRX1JFUExBWSkpID09IDApIHsKKwkJCWludCBpOworCQkJX191OCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJCQlfX3U4IHJlYWxfY3B1OworCQkJaW50IG1hc2s7IC8qIFVtLi4uIGluaXRpYWxpemUgbWU/Pz8gLS1SUiAqLworCisJCQlwcmludGsoIlZPWUFHRVIgU01QOiBDUFUlZCBsb3N0IGludGVycnVwdCAlZFxuIiwKKwkJCSAgICAgICBjcHUsIGlycSk7CisJCQlmb3JfZWFjaF9jcHUocmVhbF9jcHUsIG1hc2spIHsKKworCQkJCW91dGIoVklDX0NQVV9NQVNRVUVSQURFX0VOQUJMRSB8IHJlYWxfY3B1LAorCQkJCSAgICAgVklDX1BST0NFU1NPUl9JRCk7CisJCQkJaXNyID0gdmljX3JlYWRfaXNyKCk7CisJCQkJaWYoaXNyICYgKDE8PGlycSkpIHsKKwkJCQkJcHJpbnRrKCJWT1lBR0VSIFNNUDogQ1BVJWQgYWNrIGlycSAlZFxuIiwKKwkJCQkJICAgICAgIHJlYWxfY3B1LCBpcnEpOworCQkJCQlhY2tfdmljX2lycShpcnEpOworCQkJCX0KKwkJCQlvdXRiKGNwdSwgVklDX1BST0NFU1NPUl9JRCk7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBWT1lBR0VSX0RFQlVHICovCisJCS8qIGFzIHNvb24gYXMgd2UgYWNrLCB0aGUgaW50ZXJydXB0IGlzIGVsaWdpYmxlIGZvcgorCQkgKiByZWNlaXB0IGJ5IGFub3RoZXIgQ1BVIHNvIGV2ZXJ5dGhpbmcgbXVzdCBiZSBpbgorCQkgKiBvcmRlciBoZXJlICAqLworCQlhY2tfdmljX2lycShpcnEpOworCQlpZihzdGF0dXMgJiBJUlFfUkVQTEFZKSB7CisJCQkvKiByZXBsYXkgaXMgc2V0IGlmIHdlIGRpc2FibGUgdGhlIGludGVycnVwdAorCQkJICogaW4gdGhlIGJlZm9yZV9oYW5kbGVfdmljX2lycSgpIHJvdXRpbmUsIHNvCisJCQkgKiBjbGVhciB0aGUgaW4gcHJvZ3Jlc3MgYml0IGhlcmUgdG8gYWxsb3cgdGhlCisJCQkgKiBuZXh0IENQVSB0byBoYW5kbGUgdGhpcyBjb3JyZWN0bHkgKi8KKwkJCWRlc2MtPnN0YXR1cyAmPSB+KElSUV9SRVBMQVkgfCBJUlFfSU5QUk9HUkVTUyk7CisJCX0KKyNpZmRlZiBWT1lBR0VSX0RFQlVHCisJCWlzciA9IHZpY19yZWFkX2lzcigpOworCQlpZigoaXNyICYgKDE8PGlycSkpICE9IDApCisJCQlwcmludGsoIlZPWUFHRVIgU01QOiBhZnRlcl9oYW5kbGVfdmljX2lycSgpIGFmdGVyIGFjayBpcnE9JWQsIGlzcj0weCV4XG4iLAorCQkJICAgICAgIGlycSwgaXNyKTsKKyNlbmRpZiAvKiBWT1lBR0VSX0RFQlVHICovCisJfQorCV9yYXdfc3Bpbl91bmxvY2soJnZpY19pcnFfbG9jayk7CisKKwkvKiBBbGwgY29kZSBhZnRlciB0aGlzIHBvaW50IGlzIG91dCBvZiB0aGUgbWFpbiBwYXRoIC0gdGhlIElSUQorCSAqIG1heSBiZSBpbnRlcmNlcHRlZCBieSBhbm90aGVyIENQVSBpZiByZWFzc2VydGVkICovCit9CisKKworLyogTGludXggcHJvY2Vzc29yIC0gaW50ZXJydXB0IGFmZmluaXR5IG1hbmlwdWxhdGlvbnMuCisgKgorICogRm9yIGVhY2ggcHJvY2Vzc29yLCB3ZSBtYWludGFpbiBhIDMyIGJpdCBpcnEgYWZmaW5pdHkgbWFzay4KKyAqIEluaXRpYWxseSBpdCBpcyBzZXQgdG8gYWxsIDEncyBzbyBldmVyeSBwcm9jZXNzb3IgYWNjZXB0cyBldmVyeQorICogaW50ZXJydXB0LiAgSW4gdGhpcyBjYWxsLCB3ZSBjaGFuZ2UgdGhlIHByb2Nlc3NvcidzIGFmZmluaXR5IG1hc2s6CisgKgorICogQ2hhbmdlIGZyb20gZW5hYmxlIHRvIGRpc2FibGU6CisgKgorICogSWYgdGhlIGludGVycnVwdCBldmVyIGNvbWVzIGluIHRvIHRoZSBwcm9jZXNzb3IsIHdlIHdpbGwgZGlzYWJsZSBpdAorICogYW5kIGFjayBpdCB0byBwdXNoIGl0IG9mZiB0byBhbm90aGVyIENQVSwgc28ganVzdCBhY2NlcHQgdGhlIG1hc2sgaGVyZS4KKyAqCisgKiBDaGFuZ2UgZnJvbSBkaXNhYmxlIHRvIGVuYWJsZToKKyAqCisgKiBjaGFuZ2UgdGhlIG1hc2sgYW5kIHRoZW4gZG8gYW4gaW50ZXJydXB0IGVuYWJsZSBDUEkgdG8gcmUtZW5hYmxlIG9uCisgKiB0aGUgc2VsZWN0ZWQgcHJvY2Vzc29ycyAqLworCit2b2lkCitzZXRfdmljX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3sKKwkvKiBPbmx5IGV4dGVuZGVkIHByb2Nlc3NvcnMgaGFuZGxlIGludGVycnVwdHMgKi8KKwl1bnNpZ25lZCBsb25nIHJlYWxfbWFzazsKKwl1bnNpZ25lZCBsb25nIGlycV9tYXNrID0gMSA8PCBpcnE7CisJaW50IGNwdTsKKworCXJlYWxfbWFzayA9IGNwdXNfYWRkcihtYXNrKVswXSAmIHZveWFnZXJfZXh0ZW5kZWRfdmljX3Byb2Nlc3NvcnM7CisJCisJaWYoY3B1c19hZGRyKG1hc2spWzBdID09IDApCisJCS8qIGNhbid0IGhhdmUgbm8gY3B1J3MgdG8gYWNjZXB0IHRoZSBpbnRlcnJ1cHQgLS0gZXh0cmVtZWx5CisJCSAqIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4gKi8KKwkJcmV0dXJuOworCisJaWYoaXJxID09IDApCisJCS8qIGNhbid0IGNoYW5nZSB0aGUgYWZmaW5pdHkgb2YgdGhlIHRpbWVyIElSUS4gIFRoaXMKKwkJICogaXMgZHVlIHRvIHRoZSBjb25zdHJhaW50IGluIHRoZSB2b3lhZ2VyCisJCSAqIGFyY2hpdGVjdHVyZSB0aGF0IHRoZSBDUEkgYWxzbyBjb21lcyBpbiBvbiBhbmQgSVJRCisJCSAqIGxpbmUgYW5kIHdlIGhhdmUgY2hvc2VuIElSUTAgZm9yIHRoaXMuICBJZiB5b3UKKwkJICogcmFpc2UgdGhlIG1hc2sgb24gdGhpcyBpbnRlcnJ1cHQsIHRoZSBwcm9jZXNzb3IKKwkJICogd2lsbCBuby1sb25nZXIgYmUgYWJsZSB0byBhY2NlcHQgVklDIENQSXMgKi8KKwkJcmV0dXJuOworCisJaWYoaXJxID49IDMyKSAKKwkJLyogWW91IGNhbiBvbmx5IGhhdmUgMzIgaW50ZXJydXB0cyBpbiBhIHZveWFnZXIgc3lzdGVtCisJCSAqIChhbmQgMzIgb25seSBpZiB5b3UgaGF2ZSBhIHNlY29uZGFyeSBtaWNyb2NoYW5uZWwKKwkJICogYnVzKSAqLworCQlyZXR1cm47CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQl1bnNpZ25lZCBsb25nIGNwdV9tYXNrID0gMSA8PCBjcHU7CisJCQorCQlpZihjcHVfbWFzayAmIHJlYWxfbWFzaykgeworCQkJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoaXMgY3B1ICovCisJCQljcHVfaXJxX2FmZmluaXR5W2NwdV0gfD0gaXJxX21hc2s7CisJCX0gZWxzZSB7CisJCQkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoaXMgY3B1ICovCisJCQljcHVfaXJxX2FmZmluaXR5W2NwdV0gJj0gfmlycV9tYXNrOworCQl9CisJfQorCS8qIHRoaXMgaXMgbWFnaWMsIHdlIG5vdyBoYXZlIHRoZSBjb3JyZWN0IGFmZmluaXR5IG1hcHMsIHNvCisJICogZW5hYmxlIHRoZSBpbnRlcnJ1cHQuICBUaGlzIHdpbGwgc2VuZCBhbiBlbmFibGUgQ1BJIHRvCisJICogdGhvc2UgY3B1J3Mgd2hvIG5lZWQgdG8gZW5hYmxlIGl0IGluIHRoZWlyIGxvY2FsIG1hc2tzLAorCSAqIGNhdXNpbmcgdGhlbSB0byBjb3JyZWN0IGZvciB0aGUgbmV3IGFmZmluaXR5IC4gSWYgdGhlCisJICogaW50ZXJydXB0IGlzIGN1cnJlbnRseSBnbG9iYWxseSBkaXNhYmxlZCwgaXQgd2lsbCBzaW1wbHkgYmUKKwkgKiBkaXNhYmxlZCBhZ2FpbiBhcyBpdCBjb21lcyBpbiAodm95YWdlciBsYXp5IGRpc2FibGUpLiAgSWYKKwkgKiB0aGUgYWZmaW5pdHkgbWFwIGlzIHRpZ2h0ZW5lZCB0byBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgb24gYQorCSAqIGNwdSwgaXQgd2lsbCBiZSBwdXNoZWQgb2ZmIHdoZW4gaXQgY29tZXMgaW4gKi8KKwllbmFibGVfdmljX2lycShpcnEpOworfQorCitzdGF0aWMgdm9pZAorYWNrX3ZpY19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoaXJxICYgOCkgeworCQlvdXRiKDB4NjIsMHgyMCk7CS8qIFNwZWNpZmljIEVPSSB0byBjYXNjYWRlICovCisJCW91dGIoMHg2MHwoaXJxICYgNyksMHhBMCk7CisJfSBlbHNlIHsKKwkJb3V0YigweDYwIHwgKGlycSAmIDcpLDB4MjApOworCX0KK30KKworLyogZW5hYmxlIHRoZSBDUElzLiAgSW4gdGhlIFZJQywgdGhlIENQSXMgYXJlIGRlbGl2ZXJlZCBieSB0aGUgODI1OQorICogYnV0IGFyZSBub3QgdmVjdG9yZWQgYnkgaXQuICBUaGlzIG1lYW5zIHRoYXQgdGhlIDgyNTkgbWFzayBtdXN0IGJlCisgKiBsb3dlcmVkIHRvIHJlY2VpdmUgdGhlbSAqLworc3RhdGljIF9faW5pdCB2b2lkCit2aWNfZW5hYmxlX2NwaSh2b2lkKQoreworCV9fdTggY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCQorCS8qIGp1c3QgdGFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgbWFzayAobm9wIGZvciBib290IGNwdSkgKi8KKwl2aWNfaXJxX21hc2tbY3B1XSA9IHZpY19pcnFfbWFza1tib290X2NwdV9pZF07CisKKwllbmFibGVfbG9jYWxfdmljX2lycShWSUNfQ1BJX0xFVkVMMCk7CisJZW5hYmxlX2xvY2FsX3ZpY19pcnEoVklDX0NQSV9MRVZFTDEpOworCS8qIGZvciBzeXMgaW50IGFuZCBjbW4gaW50ICovCisJZW5hYmxlX2xvY2FsX3ZpY19pcnEoNyk7CisKKwlpZihpc19jcHVfcXVhZCgpKSB7CisJCW91dGIoUUlDX0RFRkFVTFRfTUFTSzAsIFFJQ19NQVNLX1JFR0lTVEVSMCk7CisJCW91dGIoUUlDX0NQSV9FTkFCTEUsIFFJQ19NQVNLX1JFR0lTVEVSMSk7CisJCVZERUJVRygoIlZPWUFHRVIgU01QOiBRSUMgRU5BQkxFIENQSTogQ1BVJWQ6IE1BU0sgMHgleFxuIiwKKwkJCWNwdSwgUUlDX0NQSV9FTkFCTEUpKTsKKwl9CisKKwlWREVCVUcoKCJWT1lBR0VSIFNNUDogRU5BQkxFIENQSTogQ1BVJWQ6IE1BU0sgMHgleFxuIiwKKwkJY3B1LCB2aWNfaXJxX21hc2tbY3B1XSkpOworfQorCit2b2lkCit2b3lhZ2VyX3NtcF9kdW1wKCkKK3sKKwlpbnQgb2xkX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1OworCisJLyogZHVtcCB0aGUgaW50ZXJydXB0IG1hc2tzIG9mIGVhY2ggcHJvY2Vzc29yICovCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJX191MTYgaW1yLCBpc3IsIGlycjsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCW91dGIoVklDX0NQVV9NQVNRVUVSQURFX0VOQUJMRSB8IGNwdSwgVklDX1BST0NFU1NPUl9JRCk7CisJCWltciA9IChpbmIoMHhhMSkgPDwgOCkgfCBpbmIoMHgyMSk7CisJCW91dGIoMHgwYSwgMHhhMCk7CisJCWlyciA9IGluYigweGEwKSA8PCA4OworCQlvdXRiKDB4MGEsIDB4MjApOworCQlpcnIgfD0gaW5iKDB4MjApOworCQlvdXRiKDB4MGIsIDB4YTApOworCQlpc3IgPSBpbmIoMHhhMCkgPDwgODsKKwkJb3V0YigweDBiLCAweDIwKTsKKwkJaXNyIHw9IGluYigweDIwKTsKKwkJb3V0YihvbGRfY3B1LCBWSUNfUFJPQ0VTU09SX0lEKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlwcmludGsoIlx0Q1BVJWQ6IG1hc2s9MHgleCwgSU1SPTB4JXgsIElSUj0weCV4LCBJU1I9MHgleFxuIiwKKwkJICAgICAgIGNwdSwgdmljX2lycV9tYXNrW2NwdV0sIGltciwgaXJyLCBpc3IpOworI2lmIDAKKwkJLyogVGhlc2UgbGluZXMgYXJlIHB1dCBpbiB0byB0cnkgdG8gdW5zdGljayBhbiB1biBhY2snZCBpcnEgKi8KKwkJaWYoaXNyICE9IDApIHsKKwkJCWludCBpcnE7CisJCQlmb3IoaXJxPTA7IGlycTwxNjsgaXJxKyspIHsKKwkJCQlpZihpc3IgJiAoMTw8aXJxKSkgeworCQkJCQlwcmludGsoIlx0Q1BVJWQ6IGFjayBpcnEgJWRcbiIsCisJCQkJCSAgICAgICBjcHUsIGlycSk7CisJCQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCQkJb3V0YihWSUNfQ1BVX01BU1FVRVJBREVfRU5BQkxFIHwgY3B1LAorCQkJCQkgICAgIFZJQ19QUk9DRVNTT1JfSUQpOworCQkJCQlhY2tfdmljX2lycShpcnEpOworCQkJCQlvdXRiKG9sZF9jcHUsIFZJQ19QUk9DRVNTT1JfSUQpOworCQkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYKKwl9Cit9CisKK3ZvaWQKK3NtcF92b3lhZ2VyX3Bvd2VyX29mZih2b2lkICpkdW1teSkKK3sKKwlpZihzbXBfcHJvY2Vzc29yX2lkKCkgPT0gYm9vdF9jcHVfaWQpIAorCQl2b3lhZ2VyX3Bvd2VyX29mZigpOworCWVsc2UKKwkJc21wX3N0b3BfY3B1X2Z1bmN0aW9uKE5VTEwpOworfQorCit2b2lkIF9faW5pdAorc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJLyogRklYTUU6IGlnbm9yZSBtYXhfY3B1cyBmb3Igbm93ICovCisJc21wX2Jvb3RfY3B1cygpOworfQorCit2b2lkIF9fZGV2aW5pdCBzbXBfcHJlcGFyZV9ib290X2NwdSh2b2lkKQoreworCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CisJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9jYWxsb3V0X21hcCk7Cit9CisKK2ludCBfX2RldmluaXQKK19fY3B1X3VwKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyogVGhpcyBvbmx5IHdvcmtzIGF0IGJvb3QgZm9yIHg4Ni4gIFNlZSAicmV3cml0ZSIgYWJvdmUuICovCisJaWYgKGNwdV9pc3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzaykpCisJCXJldHVybiAtRU5PU1lTOworCisJLyogSW4gY2FzZSBvbmUgZGlkbid0IGNvbWUgdXAgKi8KKwlpZiAoIWNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkKKwkJcmV0dXJuIC1FSU87CisJLyogVW5sZWFzaCB0aGUgQ1BVISAqLworCWNwdV9zZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spOworCXdoaWxlICghY3B1X2lzc2V0KGNwdSwgY3B1X29ubGluZV9tYXApKQorCQltYigpOworCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCAKK3NtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCXphcF9sb3dfbWFwcGluZ3MoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl90aHJlYWQuYyBiL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvdm95YWdlcl90aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTgwZWVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX3RocmVhZC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiAtKi0gbW9kZTogYzsgYy1iYXNpYy1vZmZzZXQ6IDggLSotICovCisKKy8qIENvcHlyaWdodCAoQykgMjAwMQorICoKKyAqIEF1dGhvcjogSi5FLkouQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbQorICoKKyAqIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvdm95YWdlcl90aHJlYWQuYworICoKKyAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBtYWNoaW5lIHN0YXR1cyBtb25pdG9yIHRocmVhZCBmb3IgdGhlCisgKiB2b3lhZ2VyIGFyY2hpdGVjdHVyZS4gIFRoaXMgYWxsb3dzIHVzIHRvIG1vbml0b3IgdGhlIG1hY2hpbmUKKyAqIGVudmlyb25tZW50ICh0ZW1wLCB2b2x0YWdlLCBmYW4gZnVuY3Rpb24pIGFuZCB0aGUgZnJvbnQgcGFuZWwgYW5kCisgKiBpbnRlcm5hbCBVUFMuICBJZiBhIGZhdWx0IGlzIGRldGVjdGVkLCB0aGlzIHRocmVhZCB0YWtlcyBjb3JyZWN0aXZlCisgKiBhY3Rpb24gKHVzdWFsbHkganVzdCBpbmZvcm1pbmcgaW5pdCkKKyAqICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vdm95YWdlci5oPgorI2luY2x1ZGUgPGFzbS92aWMuaD4KKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCisjZGVmaW5lIFRIUkVBRF9OQU1FICJrdm95YWdlcmQiCisKKy8qIGV4dGVybmFsIHZhcmlhYmxlcyAqLworaW50IGt2b3lhZ2VyZF9ydW5uaW5nID0gMDsKK0RFQ0xBUkVfTVVURVhfTE9DS0VEKGt2b3lhZ2VyZF9zZW0pOworCitzdGF0aWMgaW50IHRocmVhZCh2b2lkICopOworCitzdGF0aWMgX191OCBzZXRfdGltZW91dCA9IDA7CisKKy8qIFN0YXJ0IHRoZSBtYWNoaW5lIG1vbml0b3IgdGhyZWFkLiAgUmV0dXJuIDEgaWYgT0ssIDAgaWYgZmFpbCAqLworc3RhdGljIGludCBfX2luaXQKK3ZveWFnZXJfdGhyZWFkX3N0YXJ0KHZvaWQpCit7CisJaWYoa2VybmVsX3RocmVhZCh0aHJlYWQsIE5VTEwsIENMT05FX0tFUk5FTCkgPCAwKSB7CisJCS8qIFRoaXMgaXMgc2VyaW91cywgYnV0IG5vdCBmYXRhbCAqLworCQlwcmludGsoS0VSTl9FUlIgIlZveWFnZXI6IEZhaWxlZCB0byBjcmVhdGUgc3lzdGVtIG1vbml0b3IgdGhyZWFkISEhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitleGVjdXRlKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlpbnQgcmV0OworCisJY2hhciAqZW52cFtdID0geworCQkiSE9NRT0vIiwKKwkJIlRFUk09bGludXgiLAorCQkiUEFUSD0vc2JpbjovdXNyL3NiaW46L2JpbjovdXNyL2JpbiIsCisJCU5VTEwsCisJfTsKKwljaGFyICphcmd2W10gPSB7CisJCSIvYmluL2Jhc2giLAorCQkiLWMiLAorCQkoY2hhciAqKXN0cmluZywKKwkJTlVMTCwKKwl9OworCisJaWYgKChyZXQgPSBjYWxsX3VzZXJtb2RlaGVscGVyKGFyZ3ZbMF0sIGFyZ3YsIGVudnAsIDEpKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVm95YWdlciBmYWlsZWQgdG8gcnVuIFwiJXNcIjogJWlcbiIsCisJCSAgICAgICBzdHJpbmcsIHJldCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitjaGVja19mcm9tX2tlcm5lbCh2b2lkKQoreworCWlmKHZveWFnZXJfc3RhdHVzLnN3aXRjaF9vZmYpIHsKKwkJCisJCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjb25maWd1cmVhYmxlIHZpYSBwcm9jICovCisJCWV4ZWN1dGUoInVtYXNrIDYwMDsgZWNobyAwID4gL2V0Yy9pbml0cnVubHZsOyBraWxsIC1IVVAgMSIpOworCX0gZWxzZSBpZih2b3lhZ2VyX3N0YXR1cy5wb3dlcl9mYWlsKSB7CisJCVZERUJVRygoIlZveWFnZXIgZGFlbW9uIGRldGVjdGVkIEFDIHBvd2VyIGZhaWx1cmVcbiIpKTsKKwkJCisJCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjb25maWd1cmVhYmxlIHZpYSBwcm9jICovCisJCWV4ZWN1dGUoInVtYXNrIDYwMDsgZWNobyBGID4gL2V0Yy9wb3dlcnN0YXR1czsga2lsbCAtUFdSIDEiKTsKKwkJc2V0X3RpbWVvdXQgPSAxOworCX0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2NvbnRpbnVpbmdfY29uZGl0aW9uKHZvaWQpCit7CisJaWYodm95YWdlcl9zdGF0dXMucG93ZXJfZmFpbCkgeworCQlfX3U4IGRhdGE7CisJCXZveWFnZXJfY2F0X3BzaShWT1lBR0VSX1BTSV9TVUJSRUFELCAKKwkJCQlWT1lBR0VSX1BTSV9BQ19GQUlMX1JFRywgJmRhdGEpOworCQlpZigoZGF0YSAmIDB4MWYpID09IDApIHsKKwkJCS8qIGFsbCBwb3dlciByZXN0b3JlZCAqLworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJWT1lBR0VSIEFDIHBvd2VyIHJlc3RvcmVkLCBjYW5jZWxsaW5nIHNodXRkb3duXG4iKTsKKwkJCS8qIEZJWE1FOiBzaG91bGQgYmUgdXNlciBjb25maWd1cmVhYmxlICovCisJCQlleGVjdXRlKCJ1bWFzayA2MDA7IGVjaG8gTyA+IC9ldGMvcG93ZXJzdGF0dXM7IGtpbGwgLVBXUiAxIik7CisJCQlzZXRfdGltZW91dCA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCit3YWtldXAodW5zaWduZWQgbG9uZyB1bnVzZWQpCit7CisJdXAoJmt2b3lhZ2VyZF9zZW0pOworfQorCitzdGF0aWMgaW50Cit0aHJlYWQodm9pZCAqdW51c2VkKQoreworCXN0cnVjdCB0aW1lcl9saXN0IHdha2V1cF90aW1lcjsKKworCWt2b3lhZ2VyZF9ydW5uaW5nID0gMTsKKworCXJlcGFyZW50X3RvX2luaXQoKTsKKwlkYWVtb25pemUoVEhSRUFEX05BTUUpOworCisJc2V0X3RpbWVvdXQgPSAwOworCisJaW5pdF90aW1lcigmd2FrZXVwX3RpbWVyKTsKKworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCWN1cnJlbnQtPnNpZ25hbC0+dHR5ID0gTlVMTDsKKworCXByaW50ayhLRVJOX05PVElDRSAiVm95YWdlciBzdGFydGluZyBtb25pdG9yIHRocmVhZFxuIik7CisKKwlmb3IoOzspIHsKKwkJZG93bl9pbnRlcnJ1cHRpYmxlKCZrdm95YWdlcmRfc2VtKTsKKwkJVkRFQlVHKCgiVm95YWdlciBEYWVtb24gYXdva2VuXG4iKSk7CisJCWlmKHZveWFnZXJfc3RhdHVzLnJlcXVlc3RfZnJvbV9rZXJuZWwgPT0gMCkgeworCQkJLyogcHJvYmFibHkgYXdva2VuIGZyb20gdGltZW91dCAqLworCQkJY2hlY2tfY29udGludWluZ19jb25kaXRpb24oKTsKKwkJfSBlbHNlIHsKKwkJCWNoZWNrX2Zyb21fa2VybmVsKCk7CisJCQl2b3lhZ2VyX3N0YXR1cy5yZXF1ZXN0X2Zyb21fa2VybmVsID0gMDsKKwkJfQorCQlpZihzZXRfdGltZW91dCkgeworCQkJZGVsX3RpbWVyKCZ3YWtldXBfdGltZXIpOworCQkJd2FrZXVwX3RpbWVyLmV4cGlyZXMgPSBIWiArIGppZmZpZXM7CisJCQl3YWtldXBfdGltZXIuZnVuY3Rpb24gPSB3YWtldXA7CisJCQlhZGRfdGltZXIoJndha2V1cF90aW1lcik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAordm95YWdlcl90aHJlYWRfc3RvcCh2b2lkKQoreworCS8qIEZJWE1FOiBkbyBub3RoaW5nIGF0IHRoZSBtb21lbnQgKi8KK30KKworbW9kdWxlX2luaXQodm95YWdlcl90aHJlYWRfc3RhcnQpOworLy9tb2R1bGVfZXhpdCh2b3lhZ2VyX3RocmVhZF9zdG9wKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzk0M2ZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L01ha2VmaWxlCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgICAgICAgICAgICAgICBNYWtlZmlsZSBmb3Igd20tRlBVLWVtdQorIworCisjREVCVUcJPSAtRERFQlVHR0lORworREVCVUcJPQorUEFSQU5PSUQgPSAtRFBBUkFOT0lECitDRkxBR1MJOj0gJChDRkxBR1MpICQoUEFSQU5PSUQpICQoREVCVUcpIC1mbm8tYnVpbHRpbiAkKE1BVEhfRU1VTEFUSU9OKQorCitFWFRSQV9BRkxBR1MJOj0gJChQQVJBTk9JRCkKKworIyBGcm9tICdDJyBsYW5ndWFnZSBzb3VyY2VzOgorQ19PQkpTID1mcHVfZW50cnkubyBlcnJvcnMubyBcCisJZnB1X2FyaXRoLm8gZnB1X2F1eC5vIGZwdV9ldGMubyBmcHVfdGFncy5vIGZwdV90cmlnLm8gXAorCWxvYWRfc3RvcmUubyBnZXRfYWRkcmVzcy5vIFwKKwlwb2x5X2F0YW4ubyBwb2x5X2wyLm8gcG9seV8yeG0xLm8gcG9seV9zaW4ubyBwb2x5X3Rhbi5vIFwKKwlyZWdfYWRkX3N1Yi5vIHJlZ19jb21wYXJlLm8gcmVnX2NvbnN0YW50Lm8gcmVnX2NvbnZlcnQubyBcCisJcmVnX2xkX3N0ci5vIHJlZ19kaXZpZGUubyByZWdfbXVsLm8KKworIyBGcm9tIDgweDg2IGFzc2VtYmxlciBzb3VyY2VzOgorQV9PQkpTID1yZWdfdV9hZGQubyByZWdfdV9kaXYubyByZWdfdV9tdWwubyByZWdfdV9zdWIubyBcCisJZGl2X3NtYWxsLm8gcmVnX25vcm0ubyByZWdfcm91bmQubyBcCisJd21fc2hyeC5vIHdtX3NxcnQubyBcCisJZGl2X1hzaWcubyBwb2x5bm9tX1hzaWcubyByb3VuZF9Yc2lnLm8gXAorCXNocl9Yc2lnLm8gbXVsX1hzaWcubworCitvYmoteSA9JChDX09CSlMpICQoQV9PQkpTKQorCitwcm90bzoKKwljcHJvdG8gLWUgLURNQUtJTkdfUFJPVE8gKi5jID5mcHVfcHJvdG8uaApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L1JFQURNRSBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyMzU0OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9SRUFETUUKQEAgLTAsMCArMSw0MjcgQEAKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHdtLUZQVS1lbXUgICBhbiBGUFUgZW11bGF0b3IgZm9yIDgwMzg2IGFuZCA4MDQ4NlNYIG1pY3JvcHJvY2Vzc29ycy4gICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NSwxOTk2LDE5OTcsMTk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsIGJpbGxtQG1lbGJwYy5vcmcuYXUgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICB8CisgfCAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyAgICAgIHwKKyB8ICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgIHwKKyB8ICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgfAorIHwgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICB8CisgfCAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICB8CisgfCAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgIHwKKyB8ICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworCisKK3dtLUZQVS1lbXUgaXMgYW4gRlBVIGVtdWxhdG9yIGZvciBMaW51eC4gSXQgaXMgZGVyaXZlZCBmcm9tIHdtLWVtdTM4Nword2hpY2ggd2FzIG15IDgwMzg3IGVtdWxhdG9yIGZvciBlYXJseSB2ZXJzaW9ucyBvZiBkamdwcCAoZ2NjIHVuZGVyCittc2Rvcyk7IHdtLWVtdTM4NyB3YXMgaW4gdHVybiBiYXNlZCB1cG9uIGVtdTM4NyB3aGljaCB3YXMgd3JpdHRlbiBieQorREogRGVsb3JpZSBmb3IgZGpncHAuICBUaGUgaW50ZXJmYWNlIHRvIHRoZSBMaW51eCBrZXJuZWwgaXMgYmFzZWQgdXBvbgordGhlIG9yaWdpbmFsIExpbnV4IG1hdGggZW11bGF0b3IgYnkgTGludXMgVG9ydmFsZHMuCisKK015IHRhcmdldCBGUFUgZm9yIHdtLUZQVS1lbXUgaXMgdGhhdCBkZXNjcmliZWQgaW4gdGhlIEludGVsNDg2CitQcm9ncmFtbWVyJ3MgUmVmZXJlbmNlIE1hbnVhbCAoMTk5MiBlZGl0aW9uKS4gVW5mb3J0dW5hdGVseSwgbnVtZXJvdXMKK2ZhY2V0cyBvZiB0aGUgZnVuY3Rpb25pbmcgb2YgdGhlIEZQVSBhcmUgbm90IHdlbGwgY292ZXJlZCBpbiB0aGUKK1JlZmVyZW5jZSBNYW51YWwuIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgbWFudWFsIGhhcyBiZWVuIHN1cHBsZW1lbnRlZAord2l0aCBtZWFzdXJlbWVudHMgb24gcmVhbCA4MDQ4NidzLiBVbmZvcnR1bmF0ZWx5LCBpdCBpcyBzaW1wbHkgbm90Citwb3NzaWJsZSB0byBiZSBzdXJlIHRoYXQgYWxsIG9mIHRoZSBwZWN1bGlhcml0aWVzIG9mIHRoZSA4MDQ4NiBoYXZlCitiZWVuIGRpc2NvdmVyZWQsIHNvIHRoZXJlIGlzIGFsd2F5cyBsaWtlbHkgdG8gYmUgb2JzY3VyZSBkaWZmZXJlbmNlcworaW4gdGhlIGRldGFpbGVkIGJlaGF2aW91ciBvZiB0aGUgZW11bGF0b3IgYW5kIGEgcmVhbCA4MDQ4Ni4KKword20tRlBVLWVtdSBkb2VzIG5vdCBpbXBsZW1lbnQgYWxsIG9mIHRoZSBiZWhhdmlvdXIgb2YgdGhlIDgwNDg2IEZQVSwKK2J1dCBpcyB2ZXJ5IGNsb3NlLiAgU2VlICJMaW1pdGF0aW9ucyIgbGF0ZXIgaW4gdGhpcyBmaWxlIGZvciBhIGxpc3Qgb2YKK3NvbWUgZGlmZmVyZW5jZXMuCisKK1BsZWFzZSByZXBvcnQgYnVncywgZXRjIHRvIG1lIGF0OgorICAgICAgIGJpbGxtQG1lbGJwYy5vcmcuYXUKK29yICAgICBiLm1ldHplbnRoZW5AbWVkb3RvLnVuaW1lbGIuZWR1LmF1CisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBlbXVsYXRvciBhbmQgb24gZmxvYXRpbmcgcG9pbnQgdG9waWNzLCBzZWUKK215IHdlYiBwYWdlcywgY3VycmVudGx5IGF0ICBodHRwOi8vd3d3LnN1YnVyYmlhLm5ldC9+YmlsbG0vCisKKworLS1CaWxsIE1ldHplbnRoZW4KKyAgRGVjZW1iZXIgMTk5OQorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEludGVybmFscyBvZiB3bS1GUFUtZW11IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK051bWVyaWMgYWxnb3JpdGhtczoKKygxKSBBZGQsIHN1YnRyYWN0LCBhbmQgbXVsdGlwbHkuIE5vdGhpbmcgcmVtYXJrYWJsZSBpbiB0aGVzZS4KKygyKSBEaXZpZGUgaGFzIGJlZW4gdHVuZWQgdG8gZ2V0IHJlYXNvbmFibGUgcGVyZm9ybWFuY2UuIFRoZSBhbGdvcml0aG0KKyAgICBpcyBub3QgdGhlIG9idmlvdXMgb25lIHdoaWNoIG1vc3QgcGVvcGxlIHNlZW0gdG8gdXNlLCBidXQgaXMgZGVzaWduZWQKKyAgICB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSA4MDM4Ni4gSSBleHBlY3QgdGhhdAorICAgIGl0IGhhcyBiZWVuIGludmVudGVkIG1hbnkgdGltZXMgYmVmb3JlIEkgZGlzY292ZXJlZCBpdCwgYnV0IEkgaGF2ZSBub3QKKyAgICBzZWVuIGl0LiBJdCBpcyBiYXNlZCB1cG9uIG9uZSBvZiB0aG9zZSBpZGVhcyB3aGljaCBvbmUgY2FycmllcyBhcm91bmQKKyAgICBmb3IgeWVhcnMgd2l0aG91dCBldmVyIGJvdGhlcmluZyB0byBjaGVjayBpdCBvdXQuCisoMykgVGhlIHNxcnQgZnVuY3Rpb24gaGFzIGJlZW4gdHVuZWQgdG8gZ2V0IGdvb2QgcGVyZm9ybWFuY2UuIEl0IGlzIGJhc2VkCisgICAgdXBvbiBOZXd0b24ncyBjbGFzc2ljIG1ldGhvZC4gUGVyZm9ybWFuY2Ugd2FzIGltcHJvdmVkIGJ5IGNhcGl0YWxpemluZworICAgIHVwb24gdGhlIHByb3BlcnRpZXMgb2YgTmV3dG9uJ3MgbWV0aG9kLCBhbmQgdGhlIGNvZGUgaXMgb25jZSBhZ2FpbgorICAgIHN0cnVjdHVyZWQgdGFraW5nIGFjY291bnQgb2YgdGhlIDgwMzg2IGNoYXJhY3RlcmlzdGljcy4KKyg0KSBUaGUgdHJpZywgbG9nLCBhbmQgZXhwIGZ1bmN0aW9ucyBhcmUgYmFzZWQgaW4gZWFjaCBjYXNlIHVwb24gcXVhc2ktCisgICAgIm9wdGltYWwiIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbnMuIE15IGRlZmluaXRpb24gb2YgIm9wdGltYWwiIHdhcworICAgIGJhc2VkIHVwb24gZ2V0dGluZyBnb29kIGFjY3VyYWN5IHdpdGggcmVhc29uYWJsZSBzcGVlZC4KKyg1KSBUaGUgYXJndW1lbnQgcmVkdWNpbmcgY29kZSBmb3IgdGhlIHRyaWcgZnVuY3Rpb24gZWZmZWN0aXZlbHkgdXNlcworICAgIGEgdmFsdWUgb2YgcGkgd2hpY2ggaXMgYWNjdXJhdGUgdG8gbW9yZSB0aGFuIDEyOCBiaXRzLiBBcyBhIGNvbnNlcXVlbmNlLAorICAgIHRoZSByZWR1Y2VkIGFyZ3VtZW50IGlzIGFjY3VyYXRlIHRvIG1vcmUgdGhhbiA2NCBiaXRzIGZvciBhcmd1bWVudHMgdXAKKyAgICB0byBhIGZldyBwaSwgYW5kIGFjY3VyYXRlIHRvIG1vcmUgdGhhbiA2NCBiaXRzIGZvciBtb3N0IGFyZ3VtZW50cywKKyAgICBldmVuIGZvciBhcmd1bWVudHMgYXBwcm9hY2hpbmcgMl42My4gVGhpcyBpcyBmYXIgc3VwZXJpb3IgdG8gYW4KKyAgICA4MDQ4Niwgd2hpY2ggdXNlcyBhIHZhbHVlIG9mIHBpIHdoaWNoIGlzIGFjY3VyYXRlIHRvIDY2IGJpdHMuCisKK1RoZSBjb2RlIG9mIHRoZSBlbXVsYXRvciBpcyBjb21wbGljYXRlZCBzbGlnaHRseSBieSB0aGUgbmVlZCB0bworYWNjb3VudCBmb3IgYSBsaW1pdGVkIGZvcm0gb2YgcmUtZW50cmFuY3kuIE5vcm1hbGx5LCB0aGUgZW11bGF0b3Igd2lsbAorZW11bGF0ZSBlYWNoIEZQVSBpbnN0cnVjdGlvbiB0byBjb21wbGV0aW9uIHdpdGhvdXQgaW50ZXJydXB0aW9uLgorSG93ZXZlciwgaXQgbWF5IGhhcHBlbiB0aGF0IHdoZW4gdGhlIGVtdWxhdG9yIGlzIGFjY2Vzc2luZyB0aGUgdXNlcgorbWVtb3J5IHNwYWNlLCBzd2FwcGluZyBtYXkgYmUgbmVlZGVkLiBJbiB0aGlzIGNhc2UgdGhlIGVtdWxhdG9yIG1heSBiZQordGVtcG9yYXJpbHkgc3VzcGVuZGVkIHdoaWxlIGRpc2sgaS9vIHRha2VzIHBsYWNlLiBEdXJpbmcgdGhpcyB0aW1lCithbm90aGVyIHByb2Nlc3MgbWF5IHVzZSB0aGUgZW11bGF0b3IsIHRoZXJlYnkgcGVyaGFwcyBjaGFuZ2luZyBzdGF0aWMKK3ZhcmlhYmxlcy4gVGhlIGNvZGUgd2hpY2ggYWNjZXNzZXMgdXNlciBtZW1vcnkgaXMgY29uZmluZWQgdG8gZml2ZQorZmlsZXM6CisgICAgZnB1X2VudHJ5LmMKKyAgICByZWdfbGRfc3RyLmMKKyAgICBsb2FkX3N0b3JlLmMKKyAgICBnZXRfYWRkcmVzcy5jCisgICAgZXJyb3JzLmMKK0FzIGZyb20gdmVyc2lvbiAxLjEyIG9mIHRoZSBlbXVsYXRvciwgbm8gc3RhdGljIHZhcmlhYmxlcyBhcmUgdXNlZAorKGFwYXJ0IGZyb20gdGhvc2UgaW4gdGhlIGtlcm5lbCdzIHBlci1wcm9jZXNzIHRhYmxlcykuIFRoZSBlbXVsYXRvciBpcwordGhlcmVmb3JlIG5vdyBmdWxseSByZS1lbnRyYW50LCByYXRoZXIgdGhhbiBoYXZpbmcganVzdCB0aGUgcmVzdHJpY3RlZAorZm9ybSBvZiByZS1lbnRyYW5jeSB3aGljaCBpcyByZXF1aXJlZCBieSB0aGUgTGludXgga2VybmVsLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaW1pdGF0aW9ucyBvZiB3bS1GUFUtZW11IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IHdtLUZQVS1lbXUKKyh2ZXJzaW9uIDIuMDEpIGFuZCB0aGUgODA0ODYgRlBVIChhcGFydCBmcm9tIGJ1Z3MpLiAgVGhlIGRpZmZlcmVuY2VzCithcmUgZmV3ZXIgdGhhbiB0aG9zZSB3aGljaCBhcHBsaWVkIHRvIHRoZSAxLnh4IHNlcmllcyBvZiB0aGUgZW11bGF0b3IuCitTb21lIG9mIHRoZSBtb3JlIGltcG9ydGFudCBkaWZmZXJlbmNlcyBhcmUgbGlzdGVkIGJlbG93OgorCitUaGUgUm91bmR1cCBmbGFnIGRvZXMgbm90IGhhdmUgbXVjaCBtZWFuaW5nIGZvciB0aGUgdHJhbnNjZW5kZW50YWwKK2Z1bmN0aW9ucyBhbmQgaXRzIDgwNDg2IHZhbHVlIHdpdGggdGhlc2UgZnVuY3Rpb25zIGlzIGxpa2VseSB0byBkaWZmZXIKK2Zyb20gaXRzIGVtdWxhdG9yIHZhbHVlLgorCitJbiBhIGZldyByYXJlIGNhc2VzIHRoZSBVbmRlcmZsb3cgZmxhZyBvYnRhaW5lZCB3aXRoIHRoZSBlbXVsYXRvciB3aWxsCitiZSBkaWZmZXJlbnQgZnJvbSB0aGF0IG9idGFpbmVkIHdpdGggYW4gODA0ODYuIFRoaXMgb2NjdXJzIHdoZW4gdGhlCitmb2xsb3dpbmcgY29uZGl0aW9ucyBhcHBseSBzaW11bHRhbmVvdXNseToKKyhhKSB0aGUgb3BlcmFuZHMgaGF2ZSBhIGhpZ2hlciBwcmVjaXNpb24gdGhhbiB0aGUgY3VycmVudCBzZXR0aW5nIG9mIHRoZQorICAgIHByZWNpc2lvbiBjb250cm9sIChQQykgZmxhZ3MuCisoYikgdGhlIHVuZGVyZmxvdyBleGNlcHRpb24gaXMgbWFza2VkLgorKGMpIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGV4YWN0IHJlc3VsdCAoYmVmb3JlIHJvdW5kaW5nKSBpcyBsZXNzIHRoYW4gMl4tMTYzODIuCisoZCkgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZmluYWwgcmVzdWx0IChhZnRlciByb3VuZGluZykgaXMgZXhhY3RseSAyXi0xNjM4Mi4KKyhlKSB0aGUgbWFnbml0dWRlIG9mIHRoZSBleGFjdCByZXN1bHQgd291bGQgYmUgZXhhY3RseSAyXi0xNjM4MiBpZiB0aGUKKyAgICBvcGVyYW5kcyB3ZXJlIHJvdW5kZWQgdG8gdGhlIGN1cnJlbnQgcHJlY2lzaW9uIGJlZm9yZSB0aGUgYXJpdGhtZXRpYworICAgIG9wZXJhdGlvbiB3YXMgcGVyZm9ybWVkLgorSWYgYWxsIG9mIHRoZXNlIGFwcGx5LCB0aGUgZW11bGF0b3Igd2lsbCBzZXQgdGhlIFVuZGVyZmxvdyBmbGFnIGJ1dCBhIHJlYWwKKzgwNDg2IHdpbGwgbm90LgorCitOT1RFOiBDZXJ0YWluIGZvcm1hdHMgb2YgRXh0ZW5kZWQgUmVhbCBhcmUgVU5TVVBQT1JURUQuIFRoZXkgYXJlCit1bnN1cHBvcnRlZCBieSB0aGUgODA0ODYuIFRoZXkgYXJlIHRoZSBQc2V1ZG8tTmFOcywgUHNldWRvaW5maW5pdGllcywKK2FuZCBVbm5vcm1hbHMuIE5vbmUgb2YgdGhlc2Ugd2lsbCBiZSBnZW5lcmF0ZWQgYnkgYW4gODA0ODYgb3IgYnkgdGhlCitlbXVsYXRvci4gRG8gbm90IHVzZSB0aGVtLiBUaGUgZW11bGF0b3IgdHJlYXRzIHRoZW0gZGlmZmVyZW50bHkgaW4KK2RldGFpbCBmcm9tIHRoZSB3YXkgYW4gODA0ODYgZG9lcy4KKworU2VsZiBtb2RpZnlpbmcgY29kZSBjYW4gY2F1c2UgdGhlIGVtdWxhdG9yIHRvIGZhaWwuIEFuIGV4YW1wbGUgb2Ygc3VjaAorY29kZSBpczoKKyAgICAgICAgICBtb3ZsICVlc3AsWyVlYnhdCisJICBmbGQxCitUaGUgRlBVIGluc3RydWN0aW9uIG1heSBiZSAodXN1YWxseSB3aWxsIGJlKSBsb2FkZWQgaW50byB0aGUgcHJlLWZldGNoCitxdWV1ZSBvZiB0aGUgQ1BVIGJlZm9yZSB0aGUgbW92IGluc3RydWN0aW9uIGlzIGV4ZWN1dGVkLiBJZiB0aGUKK2Rlc3RpbmF0aW9uIG9mIHRoZSAnbW92bCcgb3ZlcmxhcHMgdGhlIEZQVSBpbnN0cnVjdGlvbiB0aGVuIHRoZSBieXRlcworaW4gdGhlIHByZWZldGNoIHF1ZXVlIGFuZCBtZW1vcnkgd2lsbCBiZSBpbmNvbnNpc3RlbnQgd2hlbiB0aGUgRlBVCitpbnN0cnVjdGlvbiBpcyBleGVjdXRlZC4gVGhlIGVtdWxhdG9yIHdpbGwgYmUgaW52b2tlZCBidXQgd2lsbCBub3QgYmUKK2FibGUgdG8gZmluZCB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggY2F1c2VkIHRoZSBkZXZpY2Utbm90LXByZXNlbnQKK2V4Y2VwdGlvbi4gRm9yIHRoaXMgY2FzZSwgdGhlIGVtdWxhdG9yIGNhbm5vdCBlbXVsYXRlIHRoZSBiZWhhdmlvdXIgb2YKK2FuIDgwNDg2RFguCisKK0hhbmRsaW5nIG9mIHRoZSBhZGRyZXNzIHNpemUgb3ZlcnJpZGUgcHJlZml4IGJ5dGUgKDB4NjcpIGhhcyBub3QgYmVlbgorZXh0ZW5zaXZlbHkgdGVzdGVkIHlldC4gQSBtYWpvciBwcm9ibGVtIGV4aXN0cyBiZWNhdXNlIHVzaW5nIGl0IGluCit2bTg2IG1vZGUgY2FuIGNhdXNlIGEgZ2VuZXJhbCBwcm90ZWN0aW9uIGZhdWx0LiBBZGRyZXNzIG9mZnNldHMKK2dyZWF0ZXIgdGhhbiAweGZmZmYgYXBwZWFyIHRvIGJlIGlsbGVnYWwgaW4gdm04NiBtb2RlIGJ1dCBhcmUgcXVpdGUKK2FjY2VwdGFibGUgKGFuZCB3b3JrKSBpbiByZWFsIG1vZGUuIEEgc21hbGwgdGVzdCBwcm9ncmFtIGRldmVsb3BlZCB0bworY2hlY2sgdGhlIGFkZHJlc3NpbmcsIGFuZCB3aGljaCBydW5zIHN1Y2Nlc3NmdWxseSBpbiByZWFsIG1vZGUsCitjcmFzaGVzIGRvc2VtdSB1bmRlciBMaW51eCBhbmQgYWxzbyBicmluZ3MgV2luZG93cyBkb3duIHdpdGggYSBnZW5lcmFsCitwcm90ZWN0aW9uIGZhdWx0IG1lc3NhZ2Ugd2hlbiBydW4gdW5kZXIgdGhlIE1TLURPUyBwcm9tcHQgb2YgV2luZG93cworMy4xLiAoVGhlIHByb2dyYW0gc2ltcGx5IHJlYWRzIGRhdGEgZnJvbSBhIHZhbGlkIGFkZHJlc3MpLgorCitUaGUgZW11bGF0b3Igc3VwcG9ydHMgMTYtYml0IHByb3RlY3RlZCBtb2RlLCB3aXRoIG9uZSBkaWZmZXJlbmNlIGZyb20KK2FuIDgwNDg2RFguICBBIDgwNDg2RFggd2lsbCBhbGxvdyBzb21lIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyB0bword3JpdGUgYSBmZXcgYnl0ZXMgYmVsb3cgdGhlIGxvd2VzdCBhZGRyZXNzIG9mIHRoZSBzdGFjay4gIFRoZSBlbXVsYXRvcgord2lsbCBub3QgYWxsb3cgdGhpcyBpbiAxNi1iaXQgcHJvdGVjdGVkIG1vZGU6IG5vIGluc3RydWN0aW9ucyBhcmUKK2FsbG93ZWQgdG8gd3JpdGUgb3V0c2lkZSB0aGUgYm91bmRzIHNldCBieSB0aGUgcHJvdGVjdGlvbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGVyZm9ybWFuY2Ugb2Ygd20tRlBVLWVtdSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTcGVlZC4KKy0tLS0tCisKK1RoZSBzcGVlZCBvZiBmbG9hdGluZyBwb2ludCBjb21wdXRhdGlvbiB3aXRoIHRoZSBlbXVsYXRvciB3aWxsIGRlcGVuZAordXBvbiBpbnN0cnVjdGlvbiBtaXguIFJlbGF0aXZlIHBlcmZvcm1hbmNlIGlzIGJlc3QgZm9yIHRoZSBpbnN0cnVjdGlvbnMKK3doaWNoIHJlcXVpcmUgbW9zdCBjb21wdXRhdGlvbi4gVGhlIHNpbXBsZSBpbnN0cnVjdGlvbnMgYXJlIGFkdmVyc2VseQorYWZmZWN0ZWQgYnkgdGhlIEZQVSBpbnN0cnVjdGlvbiB0cmFwIG92ZXJoZWFkLgorCisKK1RpbWluZzogU29tZSBzaW1wbGUgdGltaW5nIHRlc3RzIGhhdmUgYmVlbiBtYWRlIG9uIHRoZSBlbXVsYXRvciBmdW5jdGlvbnMuCitUaGUgdGltZXMgaW5jbHVkZSBsb2FkL3N0b3JlIGluc3RydWN0aW9ucy4gQWxsIHRpbWVzIGFyZSBpbiBtaWNyb3NlY29uZHMKK21lYXN1cmVkIG9uIGEgMzNNSHogMzg2IHdpdGggNjRrIGNhY2hlLiBUaGUgVHVyYm8gQyB0ZXN0cyB3ZXJlIHVuZGVyCittcy1kb3MsIHRoZSBuZXh0IHR3byBjb2x1bW5zIGFyZSBmb3IgZW11bGF0b3JzIHJ1bm5pbmcgd2l0aCB0aGUgZGpncHAKK21zLWRvcyBleHRlbmRlci4gVGhlIGZpbmFsIGNvbHVtbiBpcyBmb3Igd20tRlBVLWVtdSBpbiBMaW51eCAwLjk3LAordXNpbmcgbGlibTQuMCAoaGFyZCkuCisKK2Z1bmN0aW9uICAgICAgVHVyYm8gQyAgICAgICAgZGpncHAgMS4wNiAgICAgICAgV00tZW11Mzg3ICAgICB3bS1GUFUtZW11CisKKyAgICsgICAgICAgICAgNjAuNSAgICAgICAgICAgMTU0LjggICAgICAgICAgICAgIDc2LjUgICAgICAgICAgMTM5LjQKKyAgIC0gICAgICAgICAgNjEuMS02NS41ICAgICAgMTU3LjMtMTYwLjggICAgICAgIDc2LjItNzkuNSAgICAgMTQyLjktMTQ0LjcKKyAgICogICAgICAgICAgNzEuMCAgICAgICAgICAgMTkwLjggICAgICAgICAgICAgIDc5LjYgICAgICAgICAgMTQ2LjYKKyAgIC8gICAgICAgICAgNjEuMi03NS4wICAgICAgMjYxLjQtMjY2LjkgICAgICAgIDc1LjMtOTEuNiAgICAgMTQyLjItMTU4LjEKKworIHNpbigpICAgICAgICAzMTAuOCAgICAgICAgICA0NjkyLjAgICAgICAgICAgICAzMTkuMCAgICAgICAgICAzOTguNQorIGNvcygpICAgICAgICAyODQuNCAgICAgICAgICA0ODU1LjIgICAgICAgICAgICAzMDguMCAgICAgICAgICAzODguNworIHRhbigpICAgICAgICA0OTUuMCAgICAgICAgICA4ODA3LjEgICAgICAgICAgICAzOTQuOSAgICAgICAgICA1MDQuNworIGF0YW4oKSAgICAgICAzMjguOSAgICAgICAgICA0ODY2LjQgICAgICAgICAgICA2MDEuMSAgICAgICAgICA0MTkuNS00OTEuOQorCisgc3FydCgpICAgICAgIDEyOC43ICAgICAgICAgIGNyYXNoZWQgICAgICAgICAgIDE0NS4yICAgICAgICAgIDIyNy4wCisgbG9nKCkgICAgICAgIDQxMy4xLTQxOS4xICAgIDUxMDMuNC01MzU0LjIxICAgIDI1NC43LTI4Mi4yICAgIDQwOS40LTQzNy4xCisgZXhwKCkgICAgICAgIDQ3OS4xICAgICAgICAgIDY2MTkuMiAgICAgICAgICAgIDQ2OS4xICAgICAgICAgIDg1MC44CisKKworVGhlIHBlcmZvcm1hbmNlIHVuZGVyIExpbnV4IGlzIGltcHJvdmVkIGJ5IHRoZSB1c2Ugb2YgbG9vay1haGVhZCBjb2RlLgorVGhlIGZvbGxvd2luZyByZXN1bHRzIHNob3cgdGhlIGltcHJvdmVtZW50IHdoaWNoIGlzIG9idGFpbmVkIHVuZGVyCitMaW51eCBkdWUgdG8gdGhlIGxvb2stYWhlYWQgY29kZS4gQWxzbyBnaXZlbiBhcmUgdGhlIHRpbWVzIGZvciB0aGUKK29yaWdpbmFsIExpbnV4IGVtdWxhdG9yIHdpdGggdGhlIDQuMSAnc29mdCcgbGliLgorCisgWyBMaW51cycgbm90ZTogSSBjaGFuZ2VkIGxvb2stYWhlYWQgdG8gYmUgdGhlIGRlZmF1bHQgdW5kZXIgbGludXgsIGFzCisgICB0aGVyZSB3YXMgbm8gcmVhc29uIG5vdCB0byB1c2UgaXQgYWZ0ZXIgSSBoYWQgZWRpdGVkIGl0IHRvIGJlCisgICBkaXNhYmxlZCBkdXJpbmcgdHJhY2luZyBdCisKKyAgICAgICAgICAgIHdtLUZQVS1lbXUgdyAgICAgb3JpZ2luYWwgdworICAgICAgICAgICAgbG9vay1haGVhZCAgICAgICAnc29mdCcgbGliCisgICArICAgICAgICAgMTA2LjQgICAgICAgICAgICAgMTkwLjIKKyAgIC0gICAgICAgICAxMDguNi0xMTEuNiAgICAgIDE5Mi40LTIxNi4yCisgICAqICAgICAgICAgMTEzLjQgICAgICAgICAgICAgMTkzLjEKKyAgIC8gICAgICAgICAxMDguOC0xMjQuNCAgICAgIDcwMC4xLTcwNi4yCisKKyBzaW4oKSAgICAgICAzOTAuNSAgICAgICAgICAgIDI2NDIuMAorIGNvcygpICAgICAgIDM4MS41ICAgICAgICAgICAgMjc2Ny40CisgdGFuKCkgICAgICAgNDk2LjUgICAgICAgICAgICAzMTUzLjMKKyBhdGFuKCkgICAgICAzNjcuMi00MzUuNSAgICAgMjQzOS40LTMzOTYuOAorCisgc3FydCgpICAgICAgMTk1LjEgICAgICAgICAgICA0NzMyLjUKKyBsb2coKSAgICAgICAzNTguMC0zODcuNSAgICAgMzM1OS4yLTMzOTAuMworIGV4cCgpICAgICAgIDYxOS4zICAgICAgICAgICAgNDA0Ni40CisKKworVGhlc2UgZmlndXJlcyBhcmUgbm93IHNvbWV3aGF0IG91dC1vZi1kYXRlLiBUaGUgZW11bGF0b3IgaGFzIGJlY29tZQorcHJvZ3Jlc3NpdmVseSBzbG93ZXIgZm9yIG1vc3QgZnVuY3Rpb25zIGFzIG1vcmUgb2YgdGhlIDgwNDg2IGZlYXR1cmVzCitoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWNjdXJhY3kgb2Ygd20tRlBVLWVtdSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1RoZSBhY2N1cmFjeSBvZiB0aGUgZW11bGF0b3IgaXMgaW4gYWxtb3N0IGFsbCBjYXNlcyBlcXVhbCB0byBvciBiZXR0ZXIKK3RoYW4gdGhhdCBvZiBhbiBJbnRlbCA4MDQ4NiBGUFUuCisKK1RoZSByZXN1bHRzIG9mIHRoZSBiYXNpYyBhcml0aG1ldGljIGZ1bmN0aW9ucyAoKywtLCosLyksIGFuZCBmc3FydAorbWF0Y2ggdGhvc2Ugb2YgYW4gODA0ODYgRlBVLiBUaGV5IGFyZSB0aGUgYmVzdCBwb3NzaWJsZTsgdGhlIGVycm9yIGZvcgordGhlc2UgbmV2ZXIgZXhjZWVkcyAxLzIgYW4gbHNiLiBUaGUgZnByZW0gYW5kIGZwcmVtMSBpbnN0cnVjdGlvbnMKK3JldHVybiBleGFjdCByZXN1bHRzOyB0aGV5IGhhdmUgbm8gZXJyb3IuCisKKworVGhlIGZvbGxvd2luZyB0YWJsZSBjb21wYXJlcyB0aGUgZW11bGF0b3IgYWNjdXJhY3kgZm9yIHRoZSBzcXJ0KCksCit0cmlnIGFuZCBsb2cgZnVuY3Rpb25zIGFnYWluc3QgdGhlIFR1cmJvIEMgImVtdWxhdG9yIi4gRm9yIHRoaXMgdGFibGUsCitlYWNoIGZ1bmN0aW9uIHdhcyB0ZXN0ZWQgYXQgYWJvdXQgNDAwIHBvaW50cy4gSWRlYWwgd29yc3QtY2FzZSByZXN1bHRzCit3b3VsZCBiZSA2NCBiaXRzLiBUaGUgcmVkdWNlZCBUdXJibyBDIGFjY3VyYWN5IG9mIGNvcygpIGFuZCB0YW4oKSBmb3IKK2FyZ3VtZW50cyBncmVhdGVyIHRoYW4gcGkvNCBjYW4gYmUgdGhvdWdodCBvZiBhcyBiZWluZyByZWxhdGVkIHRvIHRoZQorcHJlY2lzaW9uIG9mIHRoZSBhcmd1bWVudCB4OyBlLmcuIGFuIGFyZ3VtZW50IG9mIHBpLzItKDFlLTEwKSB3aGljaCBpcworYWNjdXJhdGUgdG8gNjQgYml0cyBjYW4gcmVzdWx0IGluIGEgcmVsYXRpdmUgYWNjdXJhY3kgaW4gY29zKCkgb2YKK2Fib3V0IDY0ICsgbG9nMihjb3MoeCkpID0gMzEgYml0cy4KKworCitGdW5jdGlvbiAgICAgIFRlc3RlZCB4IHJhbmdlICAgICAgICAgICAgV29yc3QgcmVzdWx0ICAgICAgICAgICAgICAgIFR1cmJvIEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVsYXRpdmUgYml0cykKKworc3FydCh4KSAgICAgICAxIC4uIDIgICAgICAgICAgICAgICAgICAgIDY0LjEgICAgICAgICAgICAgICAgICAgICAgICAgNjMuMgorYXRhbih4KSAgICAgICAxZS0xMCAuLiAyMDAgICAgICAgICAgICAgIDY0LjIgICAgICAgICAgICAgICAgICAgICAgICAgNjIuOAorY29zKHgpICAgICAgICAwIC4uIHBpLzItKDFlLTEwKSAgICAgICAgIDY0LjQgKHggPD0gcGkvNCkgICAgICAgICAgICAgNjIuNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LjEgKHggPSBwaS8yLSgxZS0xMCkpICAgICAgMzEuOQorc2luKHgpICAgICAgICAxZS0xMCAuLiBwaS8yICAgICAgICAgICAgIDY0LjAgICAgICAgICAgICAgICAgICAgICAgICAgNjIuOAordGFuKHgpICAgICAgICAxZS0xMCAuLiBwaS8yLSgxZS0xMCkgICAgIDY0LjAgKHggPD0gcGkvNCkgICAgICAgICAgICAgNjIuMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LjEgKHggPSBwaS8yLSgxZS0xMCkpICAgICAgMzEuOQorZXhwKHgpICAgICAgICAwIC4uIDEgICAgICAgICAgICAgICAgICAgIDYzLjEgKiogICAgICAgICAgICAgICAgICAgICAgNjIuOQorbG9nKHgpICAgICAgICAxKzFlLTYgLi4gMiAgICAgICAgICAgICAgIDYzLjggKiogICAgICAgICAgICAgICAgICAgICAgNjIuMQorCisqKiBUaGUgYWNjdXJhY3kgZm9yIGV4cCgpIGFuZCBsb2coKSBpcyBsb3cgYmVjYXVzZSB0aGUgRlBVIChlbXVsYXRvcikKK2RvZXMgbm90IGNvbXB1dGUgdGhlbSBkaXJlY3RseTsgdHdvIG9wZXJhdGlvbnMgYXJlIHJlcXVpcmVkLgorCisKK1RoZSBlbXVsYXRvciBwYXNzZXMgdGhlICJwYXJhbm9pYSIgdGVzdHMgKGNvbXBpbGVkIHdpdGggZ2NjIDIuMy4zIG9yCitsYXRlcikgZm9yICdmbG9hdCcgdmFyaWFibGVzICgyNCBiaXQgcHJlY2lzaW9uIG51bWJlcnMpIHdoZW4gcHJlY2lzaW9uCitjb250cm9sIGlzIHNldCB0byAyNCwgNTMgb3IgNjQgYml0cywgYW5kIGZvciAnZG91YmxlJyB2YXJpYWJsZXMgKDUzCitiaXQgcHJlY2lzaW9uIG51bWJlcnMpIHdoZW4gcHJlY2lzaW9uIGNvbnRyb2wgaXMgc2V0IHRvIDUzIGJpdHMgKGEKK3Byb3Blcmx5IHBlcmZvcm1pbmcgRlBVIGNhbm5vdCBwYXNzIHRoZSAncGFyYW5vaWEnIHRlc3RzIGZvciAnZG91YmxlJwordmFyaWFibGVzIHdoZW4gcHJlY2lzaW9uIGNvbnRyb2wgaXMgc2V0IHRvIDY0IGJpdHMpLgorCitUaGUgY29kZSBmb3IgcmVkdWNpbmcgdGhlIGFyZ3VtZW50IGZvciB0aGUgdHJpZyBmdW5jdGlvbnMgKGZzaW4sIGZjb3MsCitmcHRhbiBhbmQgZnNpbmNvcykgaGFzIGJlZW4gaW1wcm92ZWQgYW5kIG5vdyBlZmZlY3RpdmVseSB1c2VzIGEgdmFsdWUKK2ZvciBwaSB3aGljaCBpcyBhY2N1cmF0ZSB0byBtb3JlIHRoYW4gMTI4IGJpdHMgcHJlY2lzaW9uLiBBcyBhCitjb25zZXF1ZW5jZSwgdGhlIGFjY3VyYWN5IG9mIHRoZXNlIGZ1bmN0aW9ucyBmb3IgbGFyZ2UgYXJndW1lbnRzIGhhcworYmVlbiBkcmFtYXRpY2FsbHkgaW1wcm92ZWQgKGFuZCBpcyBub3cgdmVyeSBtdWNoIGJldHRlciB0aGFuIGFuIDgwNDg2CitGUFUpLiBUaGVyZSBpcyBhbHNvIG5vdyBubyBkZWdyYWRhdGlvbiBvZiBhY2N1cmFjeSBmb3IgZmNvcyBhbmQgZnB0YW4KK2ZvciBvcGVyYW5kcyBjbG9zZSB0byBwaS8yLiBNZWFzdXJlZCByZXN1bHRzIGFyZSAobm90ZSB0aGF0IHRoZQorZGVmaW5pdGlvbiBvZiBhY2N1cmFjeSBoYXMgY2hhbmdlZCBzbGlnaHRseSBmcm9tIHRoYXQgdXNlZCBmb3IgdGhlCithYm92ZSB0YWJsZSk6CisKK0Z1bmN0aW9uICAgICAgVGVzdGVkIHggcmFuZ2UgICAgICAgICAgV29yc3QgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFic29sdXRlIGJpdHMpCisKK2Nvcyh4KSAgICAgICAgMCAuLiA5LjIyZSsxOCAgICAgICAgICAgICAgNjIuMAorc2luKHgpICAgICAgICAxZS0xNiAuLiA5LjIyZSsxOCAgICAgICAgICA2Mi4xCit0YW4oeCkgICAgICAgIDFlLTE2IC4uIDkuMjJlKzE4ICAgICAgICAgIDYxLjgKKworSXQgaXMgcG9zc2libGUgd2l0aCBzb21lIGVmZm9ydCB0byBmaW5kIHZlcnkgbGFyZ2UgYXJndW1lbnRzIHdoaWNoCitnaXZlIG11Y2ggZGVncmFkZWQgcHJlY2lzaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGludGVnZXIgbnVtYmVyCisgICAgICAgICAgIDgyMjc3NDAwNTg0MTExNjI2MTYuMAoraXMgd2l0aGluIGFib3V0IDEwZS03IG9mIGEgbXVsdGlwbGUgb2YgcGkuIFRvIGZpbmQgdGhlIHRhbiAoZm9yCitleGFtcGxlKSBvZiB0aGlzIG51bWJlciB0byA2NCBiaXRzIHByZWNpc2lvbiBpdCB3b3VsZCBiZSBuZWNlc3NhcnkgdG8KK2hhdmUgYSB2YWx1ZSBvZiBwaSB3aGljaCBoYWQgYWJvdXQgMTUwIGJpdHMgcHJlY2lzaW9uLiBUaGUgRlBVCitlbXVsYXRvciBjb21wdXRlcyB0aGUgcmVzdWx0IHRvIGFib3V0IDQyLjYgYml0cyBwcmVjaXNpb24gKHRoZSBjb3JyZWN0CityZXN1bHQgaXMgYWJvdXQgLTkuNzM5NzE1ZS04KS4gT24gdGhlIG90aGVyIGhhbmQsIGFuIDgwNDg2IEZQVSByZXR1cm5zCiswLjAxMDU5LCB3aGljaCBpbiByZWxhdGl2ZSB0ZXJtcyBpcyBob3BlbGVzc2x5IGluYWNjdXJhdGUuCisKK0ZvciBhcmd1bWVudHMgY2xvc2UgdG8gY3JpdGljYWwgYW5nbGVzICh3aGljaCBvY2N1ciBhdCBtdWx0aXBsZXMgb2YKK3BpLzIpIHRoZSBlbXVsYXRvciBpcyBtb3JlIGFjY3VyYXRlIHRoYW4gYW4gODA0ODYgRlBVLiBGb3IgdmVyeSBsYXJnZQorYXJndW1lbnRzLCB0aGUgZW11bGF0b3IgaXMgZmFyIG1vcmUgYWNjdXJhdGUuCisKKworUHJpb3IgdG8gdmVyc2lvbiAxLjIwIG9mIHRoZSBlbXVsYXRvciwgdGhlIGFjY3VyYWN5IG9mIHRoZSByZXN1bHRzIGZvcgordGhlIHRyYW5zY2VuZGVudGFsIGZ1bmN0aW9ucyAoaW4gdGhlaXIgcHJpbmNpcGFsIHJhbmdlKSB3YXMgbm90IGFzCitnb29kIGFzIHRoZSByZXN1bHRzIGZyb20gYW4gODA0ODYgRlBVLiBGcm9tIHZlcnNpb24gMS4yMCwgdGhlIGFjY3VyYWN5CitoYXMgYmVlbiBjb25zaWRlcmFibHkgaW1wcm92ZWQgYW5kIHRoZXNlIGZ1bmN0aW9ucyBub3cgZ2l2ZSBtZWFzdXJlZAord29yc3QtY2FzZSByZXN1bHRzIHdoaWNoIGFyZSBiZXR0ZXIgdGhhbiB0aGUgd29yc3QtY2FzZSByZXN1bHRzIGdpdmVuCitieSBhbiA4MDQ4NiBGUFUuCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgZ2l2ZXMgdGhlIG1lYXN1cmVkIHJlc3VsdHMgZm9yIHRoZSBlbXVsYXRvci4gVGhlCitudW1iZXIgb2YgcmFuZG9tbHkgc2VsZWN0ZWQgYXJndW1lbnRzIGluIGVhY2ggY2FzZSBpcyBhYm91dCBoYWxmIGEKK21pbGxpb24uICBUaGUgZ3JvdXAgb2YgdGhyZWUgY29sdW1ucyBnaXZlcyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBnaXZlbgorYWNjdXJhY3kgaW4gbnVtYmVyIG9mIHRpbWVzIHBlciBtaWxsaW9uLCB0aHVzIHRoZSBzZWNvbmQgb2YgdGhlc2UKK2NvbHVtbnMgc2hvd3MgdGhhdCBhbiBhY2N1cmFjeSBvZiBiZXR3ZWVuIDYzLjgwIGFuZCA2My44OSBiaXRzIHdhcworZm91bmQgYXQgYSByYXRlIG9mIDEzMyB0aW1lcyBwZXIgb25lIG1pbGxpb24gbWVhc3VyZW1lbnRzIGZvciBmc2luLgorVGhlIHJlc3VsdHMgc2hvdyB0aGF0IHRoZSBmc2luLCBmY29zIGFuZCBmcHRhbiBpbnN0cnVjdGlvbnMgcmV0dXJuCityZXN1bHRzIHdoaWNoIGFyZSBpbiBlcnJvciAoaS5lLiBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIGJlc3QgcG9zc2libGUKK3Jlc3VsdCAod2hpY2ggaXMgNjQgYml0cykpIGZvciBhYm91dCBvbmUgcGVyIGNlbnQgb2YgYWxsIGFyZ3VtZW50cworYmV0d2VlbiAtcGkvMiBhbmQgK3BpLzIuICBUaGUgb3RoZXIgaW5zdHJ1Y3Rpb25zIGhhdmUgYSBsb3dlcgorZnJlcXVlbmN5IG9mIHJlc3VsdHMgd2hpY2ggYXJlIGluIGVycm9yLiAgVGhlIGxhc3QgdHdvIGNvbHVtbnMgZ2l2ZQordGhlIHdvcnN0IGFjY3VyYWN5IHdoaWNoIHdhcyBmb3VuZCAoaW4gYml0cykgYW5kIHRoZSBhcHByb3hpbWF0ZSB2YWx1ZQorb2YgdGhlIGFyZ3VtZW50IHdoaWNoIHByb2R1Y2VkIGl0LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSAocGVyIE0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLQoraW5zdHIgICBhcmcgcmFuZ2UgICAgIyB0ZXN0cyAgIDYzLjcgICA2My44ICAgIDYzLjkgICB3b3JzdCAgIGF0IGFyZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgICBiaXRzICAgIGJpdHMgICAgYml0cworLS0tLS0gIC0tLS0tLS0tLS0tLSAgLS0tLS0tLSAgIC0tLS0gICAtLS0tICAgLS0tLS0gICAtLS0tLSAgLS0tLS0tLS0KK2ZzaW4gICAgICgwLHBpLzIpICAgICA1NDc3NTYgICAgICAwICAgIDEzMyAgIDEwNjczICAgNjMuODkgIDAuNDUxMzE3CitmY29zICAgICAoMCxwaS8yKSAgICAgNTQ3NTYzICAgICAgMCAgICAxMjYgICAxMDUzMiAgIDYzLjg1ICAwLjcwMDgwMQorZnB0YW4gICAgKDAscGkvMikgICAgIDUzNjI3NCAgICAgMTEgICAgMjY3ICAgMTAwNTkgICA2My43NCAgMC43ODQ4NzYKK2ZwYXRhbiAgNCBxdWFkcmFudHMgICA1MTcwODcgICAgICAwICAgICAgOCAgICAxODU1ICAgNjMuODggIDAuNDM1MTIxICg0cSkKK2Z5bDJ4ICAgICAoMCwyMCkgICAgICA1NDE4NjEgICAgICAwICAgICAgMCAgICAxMzIzICAgNjMuOTQgIDEuNDA5MjMgICh4KQorZnlsMnhwMSAoLS4yOTMsLjQxNCkgIDUyMDI1NiAgICAgIDAgICAgICAwICAgIDU2NzggICA2My45MyAgMC40MDg1NDIgKHgpCitmMnhtMSAgICAgKC0xLDEpICAgICAgNTM4ODQ3ICAgICAgNCAgICA0ODEgICAgNjQ4OCAgIDYzLjc5ICAwLjE2NzcwOQorCisKK1Rlc3RzIHBlcmZvcm1lZCBvbiBhbiA4MDQ4NiBGUFUgc2hvd2VkIHJlc3VsdHMgb2YgbG93ZXIgYWNjdXJhY3kuIFRoZQorZm9sbG93aW5nIHRhYmxlIGdpdmVzIHRoZSByZXN1bHRzIHdoaWNoIHdlcmUgb2J0YWluZWQgd2l0aCBhbiBBTUQKKzQ4NkRYMi82NiAob3RoZXIgdGVzdHMgaW5kaWNhdGUgdGhhdCBhbiBJbnRlbCA0ODZEWCBwcm9kdWNlcworaWRlbnRpY2FsIHJlc3VsdHMpLiAgVGhlIHRlc3RzIHdlcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHRob3NlIHVzZWQKK3RvIG1lYXN1cmUgdGhlIGVtdWxhdG9yICh0aGUgdmFsdWVzLCBiZWluZyByYW5kb20sIHdlcmUgaW4gZ2VuZXJhbCBub3QKK3RoZSBzYW1lKS4gIFRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdHMgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gYXJlIGdpdmVuCithdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSwgaW4gY2FzZSBlYWNoIGFib3V0IDEwMGsgdGVzdHMgd2VyZSBwZXJmb3JtZWQuCitBbm90aGVyIGxpbmUgb2YgZmlndXJlcyBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSBzaG93cyB0aGF0IG1vc3Qgb2YgdGhlCitpbnN0cnVjdGlvbnMgcmV0dXJuIHJlc3VsdHMgd2hpY2ggYXJlIGluIGVycm9yIGZvciBtb3JlIHRoYW4gMTAKK3BlcmNlbnQgb2YgdGhlIGFyZ3VtZW50cyB0ZXN0ZWQuCisKK1RoZSBudW1iZXJzIGluIHRoZSBib2R5IG9mIHRoZSB0YWJsZSBnaXZlIHRoZSBhcHByb3ggbnVtYmVyIG9mIHRpbWVzIGEKK3Jlc3VsdCBvZiB0aGUgZ2l2ZW4gYWNjdXJhY3kgaW4gYml0cyAoZ2l2ZW4gaW4gdGhlIGxlZnQtbW9zdCBjb2x1bW4pCit3YXMgb2J0YWluZWQgcGVyIG9uZSBtaWxsaW9uIGFyZ3VtZW50cy4gRm9yIHRocmVlIG9mIHRoZSBpbnN0cnVjdGlvbnMsCit0d28gY29sdW1ucyBvZiByZXN1bHRzIGFyZSBnaXZlbjogKiBUaGUgc2Vjb25kIGNvbHVtbiBmb3IgZjJ4bTEgZ2l2ZXMKK3RoZSBudW1iZXIgY2FzZXMgd2hlcmUgdGhlIHJlc3VsdHMgb2YgdGhlIGZpcnN0IGNvbHVtbiB3ZXJlIGZvciBhCitwb3NpdGl2ZSBhcmd1bWVudCwgdGhpcyBzaG93cyB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gZ2l2ZXMgYmV0dGVyCityZXN1bHRzIGZvciBwb3NpdGl2ZSBhcmd1bWVudHMgdGhhbiBpdCBkb2VzIGZvciBuZWdhdGl2ZS4gICogSW4gdGhlCitjYXNlcyBvZiBmY29zIGFuZCBmcHRhbiwgdGhlIGZpcnN0IGNvbHVtbiBnaXZlcyB0aGUgcmVzdWx0cyB3aGVuIGFsbAorY2FzZXMgd2hlcmUgYXJndW1lbnRzIGdyZWF0ZXIgdGhhbiAxLjUgd2VyZSByZW1vdmVkIGZyb20gdGhlIHJlc3VsdHMKK2dpdmVuIGluIHRoZSBzZWNvbmQgY29sdW1uLiBVbmxpa2UgdGhlIGVtdWxhdG9yLCBhbiA4MDQ4NiBGUFUgcmV0dXJucworcmVzdWx0cyBvZiByZWxhdGl2ZWx5IHBvb3IgYWNjdXJhY3kgZm9yIHRoZXNlIGluc3RydWN0aW9ucyB3aGVuIHRoZQorYXJndW1lbnQgYXBwcm9hY2hlcyBwaS8yLiBUaGUgdGFibGUgZG9lcyBub3Qgc2hvdyB0aG9zZSBjYXNlcyB3aGVuIHRoZQorYWNjdXJhY3kgb2YgdGhlIHJlc3VsdHMgd2VyZSBsZXNzIHRoYW4gNjIgYml0cywgd2hpY2ggb2NjdXJzIHF1aXRlCitvZnRlbiBmb3IgZnNpbiBhbmQgZnB0YW4gd2hlbiB0aGUgYXJndW1lbnQgYXBwcm9hY2hlcyBwaS8yLiBUaGlzIHBvb3IKK2FjY3VyYWN5IGlzIGRpc2N1c3NlZCBhYm92ZSBpbiByZWxhdGlvbiB0byB0aGUgVHVyYm8gQyAiZW11bGF0b3IiLCBhbmQKK3RoZSBhY2N1cmFjeSBvZiB0aGUgdmFsdWUgb2YgcGkuCisKKworYml0cyAgIGYyeG0xICBmMnhtMSBmcGF0YW4gICBmY29zICAgZmNvcyAgZnlsMnggZnlsMnhwMSAgZnNpbiAgZnB0YW4gIGZwdGFuCis2Mi4wICAgICAgIDAgICAgICAwICAgICAgMCAgICAgIDAgICAgNDM3ICAgICAgMCAgICAgIDAgICAgICAwICAgICAgMCAgICA5MjUKKzYyLjEgICAgICAgMCAgICAgIDAgICAgIDEwICAgICAgMCAgICA4OTQgICAgICAwICAgICAgMCAgICAgIDAgICAgICAwICAgMTAyMworNjIuMiAgICAgIDE0ICAgICAgMCAgICAgIDAgICAgICAwICAgMTAzMyAgICAgIDAgICAgICAwICAgICAgMCAgICAgIDAgICAgOTQ1Cis2Mi4zICAgICAgNTcgICAgICAwICAgICAgMCAgICAgIDAgICAxMjAyICAgICAgMCAgICAgIDAgICAgICAwICAgICAgMCAgIDEwMjMKKzYyLjQgICAgIDM4NSAgICAgIDAgICAgICAwICAgICAxMCAgIDEyOTIgICAgICAwICAgICAyMyAgICAgIDAgICAgICAwICAgMTE3OAorNjIuNSAgICAxMTQwICAgICAgMCAgICAgIDAgICAgMTE5ICAgMTY0OSAgICAgIDAgICAgIDM5ICAgICAgMCAgICAgIDAgICAxMTQ5Cis2Mi42ICAgIDIwMzcgICAgICAwICAgICAgMCAgICAxODkgICAxNjIwICAgICAgMCAgICAgMTYgICAgICAwICAgICAgMCAgIDExNjkKKzYyLjcgICAgNTA4NiAgICAgMTQgICAgICAwICAgIDY0NiAgIDIzMTUgICAgIDEwICAgIDEwMSAgICAgMzUgICAgIDM5ICAgMTQwMgorNjIuOCAgICA4ODE4ICAgICA4NiAgICAgIDAgICAgOTg0ICAgMzA1MCAgICAgNTkgICAgMjg3ICAgIDEzMSAgICAyMjQgICAyMDM2Cis2Mi45ICAgMTEzNDAgICAxMzU1ICAgICAgMCAgIDIxMjYgICA0MTUzICAgICA3OSAgICA2MDUgICAgMzU3ICAgIDMyMSAgIDE5NDgKKzYzLjAgICAxNTU1NyAgIDQ3NTAgICAgICAwICAgMzMxOSAgIDUzNzYgICAgMjQ2ICAgMTI4MSAgICA4NjIgICAgODA4ICAgMjY4OAorNjMuMSAgIDIwMDE2ICAgODI4OCAgICAgIDAgICA0NjIwICAgNjYyOCAgICA1MTEgICAyNTY5ICAgMTcyMyAgIDE1MTAgICAzMzAyCis2My4yICAgMjQ5NDUgIDExMTI3ICAgICAxMCAgIDY1ODggICA4MDk4ICAgMTEyMCAgIDQ0NzAgICAyOTY4ICAgMjk5MCAgIDQ3MjQKKzYzLjMgICAyNTY4NiAgMTIzODIgICAgIDY5ICAgODc3NCAgMTA2ODIgICAxOTA2ICAgNjc3NSAgIDQ0ODIgICA1NDc0ICAgNzIzNgorNjMuNCAgIDI5MjE5ICAxNDcyMiAgICAgNzkgIDExMTA5ICAxMjMxMSAgIDMwOTQgICA5NDE0ICAgNzI1OSAgIDg5MTIgIDEwNTg3Cis2My41ICAgMzA0NTggIDE0OTM2ICAgIDM5MyAgMTM4MDIgIDE1MDE0ICAgNTg3NCAgMTI2NjYgICA5NjA5ICAxMzc2MiAgMTUyNjIKKzYzLjYgICAzMjQzOSAgMTY0NDggICAxMjc3ICAxNzk0NSAgMTkwMjggIDEwMjI2ICAxNTUzNyAgMTQ2NTcgIDE5MTU4ICAyMDM0NgorNjMuNyAgIDM1MDMxICAxNjgwNSAgIDQwNjcgIDIzMDAzICAyMzk0NyAgMTg5MTAgIDIwMTE2ICAyMTMzMyAgMjUwMDEgIDI2MjA5Cis2My44ICAgMzMyNTEgIDE1ODIwICAgNzY3MyAgMjQ3ODEgIDI1Njc1ICAyNDYxNyAgMjUzNTQgIDI0NDQwICAyOTQzMyAgMzAzMjkKKzYzLjkgICAzMzI5MyAgMTY4MzMgIDE4NTI5ICAyODMxOCAgMjkyMzMgIDMxMjY3ICAzMTQ3MCAgMjc3NDggIDI5Njc2ICAzMDYwMQorCitQZXIgY2VudCB3aXRoIGVycm9yOgorICAgICAgICAzMC45ICAgICAgICAgICAzLjIgICAgICAgICAgMTguNSAgICA5LjggICAxMy4xICAgMTEuNiAgICAgICAgICAxNy40CitUb3RhbCBhcmd1bWVudHMgdGVzdGVkOgorICAgICAgIDcwMTk0ICA3MDA5OSAxMDE3ODQgMTAwNjQxIDEwMDY0MSAxMDE3OTkgMTI4ODUzIDExNDg5MyAxMDI2NzUgMTAyNjc1CisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250cmlidXRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIG51bWJlciBvZiBwZW9wbGUgaGF2ZSBjb250cmlidXRlZCB0byB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlCitlbXVsYXRvciwgb2Z0ZW4gYnkganVzdCByZXBvcnRpbmcgYnVncywgc29tZXRpbWVzIHdpdGggc3VnZ2VzdGVkCitmaXhlcywgYW5kIGEgZmV3IGtpbmQgcGVvcGxlIGhhdmUgcHJvdmlkZWQgbWUgd2l0aCBhY2Nlc3MgaW4gb25lIHdheQorb3IgYW5vdGhlciB0byBhbiA4MDQ4NiBtYWNoaW5lLiBDb250cmlidXRvcnMgaW5jbHVkZSAodG8gdGhvc2UgcGVvcGxlCit3aG8gSSBtYXkgaGF2ZSBmb3Jnb3R0ZW4sIHBsZWFzZSBmb3JnaXZlIG1lKToKKworTGludXMgVG9ydmFsZHMKK1RvbW15LlRob3JuQGRhaW1pLmFhdS5kaworQW5kcmV3LlRyaWRnZWxsQGFudS5lZHUuYXUKK05pY2sgSG9sbG93YXksIGFsZmllQGRjcy53YXJ3aWNrLmFjLnVrCitIZXJtYW5vIE1vdXJhLCBtb3VyYUBkY3MuZ2xhLmFjLnVrCitKb24gSmFnZ2VyLCBKLkphZ2dlckBzY3AuYWMudWsKK0xlbm5hcnQgQmVuc2Nob3AKK0JyaWFuIEdhbGxldywgZ2VlaytAQ01VLkVEVQorVGhvbWFzIFN0YW5pc3pld3NraSwgdHMzditAYW5kcmV3LmNtdS5lZHUKK01hcnRpbiBIb3dlbGwsIG1waEBwbGFzbWEuYXBhbmEub3JnLmF1CitNIFNhZ2dhZiwgYWxzYWdnYWZAYXRoZW5hLm1pdC5lZHUKK1BldGVyIEJhcmtlciwgUEVURVJAc29jcHN5LnNjaS5mYXUuZWR1Cit0b21AdmxzaXZpZS50dXdpZW4uYWMuYXQKK0RhbiBSdXNzZWwsIHJ1c3NlZEBycGkuZWR1CitEYW5pZWwgQ2Fyb3NvbmUsIGRhbmllbGNlQGVlLm11Lm96LmF1CitjYWVAanBtb3JnYW4uY29tCitIYW1pc2ggQ29sZW1hbiwgdDkzMzA5M0BtaW55b3MueHgucm1pdC5vei5hdQorQnJ1Y2UgRXZhbnMsIGJkZUBrcmFsaXplYy56ZXRhLm9yZy5hdQorVGltbyBLb3J2b2xhLCBUaW1vLktvcnZvbGFAaHV0LmZpCitSaWNrIEx5b25zLCByaWNrQHJhem9yYmFjay5icmlzbmV0Lm9yZy5hdQorUmljaywganJzQHdvcmxkLnN0ZC5jb20KKyAKKy4uLmFuZCBudW1lcm91cyBvdGhlcnMgd2hvIHJlc3BvbmRlZCB0byBteSByZXF1ZXN0IGZvciBoZWxwIHdpdGgKK2EgcmVhbCA4MDQ4Ni4KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L2NvbnRyb2xfdy5oIGIvYXJjaC9pMzg2L21hdGgtZW11L2NvbnRyb2xfdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMjI3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvY29udHJvbF93LmgKQEAgLTAsMCArMSw0NSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgY29udHJvbF93LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgICBiaWxsbUB2YXhjLmNjLm1vbmFzaC5lZHUuYXUgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX0NPTlRST0xXX0hfCisjZGVmaW5lIF9DT05UUk9MV19IXworCisjaWZkZWYgX19BU1NFTUJMWV9fCisjZGVmaW5lCV9Db25zdF8oeCkJJCMjeAorI2Vsc2UKKyNkZWZpbmUJX0NvbnN0Xyh4KQl4CisjZW5kaWYKKworI2RlZmluZSBDV19SQwkJX0NvbnN0XygweDBDMDApCS8qIHJvdW5kaW5nIGNvbnRyb2wgKi8KKyNkZWZpbmUgQ1dfUEMJCV9Db25zdF8oMHgwMzAwKQkvKiBwcmVjaXNpb24gY29udHJvbCAqLworCisjZGVmaW5lIENXX1ByZWNpc2lvbglDb25zdF8oMHgwMDIwKQkvKiBsb3NzIG9mIHByZWNpc2lvbiBtYXNrICovCisjZGVmaW5lIENXX1VuZGVyZmxvdwlDb25zdF8oMHgwMDEwKQkvKiB1bmRlcmZsb3cgbWFzayAqLworI2RlZmluZSBDV19PdmVyZmxvdwlDb25zdF8oMHgwMDA4KQkvKiBvdmVyZmxvdyBtYXNrICovCisjZGVmaW5lIENXX1plcm9EaXYJQ29uc3RfKDB4MDAwNCkJLyogZGl2aWRlIGJ5IHplcm8gbWFzayAqLworI2RlZmluZSBDV19EZW5vcm1hbAlDb25zdF8oMHgwMDAyKQkvKiBkZW5vcm1hbGl6ZWQgb3BlcmFuZCBtYXNrICovCisjZGVmaW5lIENXX0ludmFsaWQJQ29uc3RfKDB4MDAwMSkJLyogaW52YWxpZCBvcGVyYXRpb24gbWFzayAqLworCisjZGVmaW5lIENXX0V4Y2VwdGlvbnMgIAlfQ29uc3RfKDB4MDAzZikJLyogYWxsIG1hc2tzICovCisKKyNkZWZpbmUgUkNfUk5ECQlfQ29uc3RfKDB4MDAwMCkKKyNkZWZpbmUgUkNfRE9XTgkJX0NvbnN0XygweDA0MDApCisjZGVmaW5lIFJDX1VQCQlfQ29uc3RfKDB4MDgwMCkKKyNkZWZpbmUgUkNfQ0hPUAkJX0NvbnN0XygweDBDMDApCisKKy8qIHAgMTUtNTogUHJlY2lzaW9uIGNvbnRyb2wgYml0cyBhZmZlY3Qgb25seSB0aGUgZm9sbG93aW5nOgorICAgQURELCBTVUIoUiksIE1VTCwgRElWKFIpLCBhbmQgU1FSVCAqLworI2RlZmluZSBQUl8yNF9CSVRTICAgICAgICBfQ29uc3RfKDB4MDAwKQorI2RlZmluZSBQUl81M19CSVRTICAgICAgICBfQ29uc3RfKDB4MjAwKQorI2RlZmluZSBQUl82NF9CSVRTICAgICAgICBfQ29uc3RfKDB4MzAwKQorI2RlZmluZSBQUl9SRVNFUlZFRF9CSVRTICBfQ29uc3RfKDB4MTAwKQorLyogRlVMTF9QUkVDSVNJT04gc2ltdWxhdGVzIGFsbCBleGNlcHRpb25zIG1hc2tlZCAqLworI2RlZmluZSBGVUxMX1BSRUNJU0lPTiAgKFBSXzY0X0JJVFMgfCBSQ19STkQgfCAweDNmKQorCisjZW5kaWYgLyogX0NPTlRST0xXX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZGl2X1hzaWcuUyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9kaXZfWHNpZy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3N2JhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvZGl2X1hzaWcuUwpAQCAtMCwwICsxLDM2NSBAQAorCS5maWxlCSJkaXZfWHNpZy5TIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgZGl2X1hzaWcuUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgRGl2aXNpb24gc3Vicm91dGluZSBmb3IgOTYgYml0IHF1YW50aXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5NCwxOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsIGJpbGxtQGphY29iaS5tYXRocy5tb25hc2guZWR1LmF1IHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgRGl2aWRlIHRoZSA5NiBiaXQgcXVhbnRpdHkgcG9pbnRlZCB0byBieSBhLCBieSB0aGF0IHBvaW50ZWQgdG8gYnkgYiwgYW5kICB8CisgfCBwdXQgdGhlIDk2IGJpdCByZXN1bHQgYXQgdGhlIGxvY2F0aW9uIGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgVGhlIHJlc3VsdCBtYXkgbm90IGJlIGFjY3VyYXRlIHRvIDk2IGJpdHMuIEl0IGlzIGludGVuZGVkIGZvciB1c2Ugd2hlcmUgICB8CisgfCBhIHJlc3VsdCBiZXR0ZXIgdGhhbiA2NCBiaXRzIGlzIHJlcXVpcmVkLiBUaGUgcmVzdWx0IHNob3VsZCB1c3VhbGx5IGJlICAgIHwKKyB8IGdvb2QgdG8gYXQgbGVhc3QgOTQgYml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgVGhlIHJldHVybmVkIHJlc3VsdCBpcyBhY3R1YWxseSBkaXZpZGVkIGJ5IG9uZSBoYWxmLiBUaGlzIGlzIGRvbmUgdG8gICAgICB8CisgfCBwcmV2ZW50IG92ZXJmbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIC5hYWFhYWFhYWFhYWFhYSAvIC5iYmJiYmJiYmJiYmJiICAtPiAgLmRkZGRkZGRkZGRkZCAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICB2b2lkIGRpdl9Yc2lnKFhzaWcgKmEsIFhzaWcgKmIsIFhzaWcgKmRlc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJmcHVfZW11LmgiCisKKworI2RlZmluZQlYc2lnTEwoeCkJKHgpCisjZGVmaW5lCVhzaWdMKHgpCTQoeCkKKyNkZWZpbmUJWHNpZ0goeCkJOCh4KQorCisKKyNpZm5kZWYgTk9OX1JFRU5UUkFOVF9GUFUKKy8qCisJTG9jYWwgc3RvcmFnZSBvbiB0aGUgc3RhY2s6CisJQWNjdW11bGF0b3I6CUZQVV9hY2N1bV8zOkZQVV9hY2N1bV8yOkZQVV9hY2N1bV8xOkZQVV9hY2N1bV8wCisgKi8KKyNkZWZpbmUgRlBVX2FjY3VtXzMJLTQoJWVicCkKKyNkZWZpbmUgRlBVX2FjY3VtXzIJLTgoJWVicCkKKyNkZWZpbmUgRlBVX2FjY3VtXzEJLTEyKCVlYnApCisjZGVmaW5lIEZQVV9hY2N1bV8wCS0xNiglZWJwKQorI2RlZmluZSBGUFVfcmVzdWx0XzMJLTIwKCVlYnApCisjZGVmaW5lIEZQVV9yZXN1bHRfMgktMjQoJWVicCkKKyNkZWZpbmUgRlBVX3Jlc3VsdF8xCS0yOCglZWJwKQorCisjZWxzZQorLmRhdGEKKy8qCisJTG9jYWwgc3RvcmFnZSBpbiBhIHN0YXRpYyBhcmVhOgorCUFjY3VtdWxhdG9yOglGUFVfYWNjdW1fMzpGUFVfYWNjdW1fMjpGUFVfYWNjdW1fMTpGUFVfYWNjdW1fMAorICovCisJLmFsaWduIDQsMAorRlBVX2FjY3VtXzM6CisJLmxvbmcJMAorRlBVX2FjY3VtXzI6CisJLmxvbmcJMAorRlBVX2FjY3VtXzE6CisJLmxvbmcJMAorRlBVX2FjY3VtXzA6CisJLmxvbmcJMAorRlBVX3Jlc3VsdF8zOgorCS5sb25nCTAKK0ZQVV9yZXN1bHRfMjoKKwkubG9uZwkwCitGUFVfcmVzdWx0XzE6CisJLmxvbmcJMAorI2VuZGlmIC8qIE5PTl9SRUVOVFJBTlRfRlBVICovCisKKworLnRleHQKK0VOVFJZKGRpdl9Yc2lnKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorI2lmbmRlZiBOT05fUkVFTlRSQU5UX0ZQVQorCXN1YmwJJDI4LCVlc3AKKyNlbmRpZiAvKiBOT05fUkVFTlRSQU5UX0ZQVSAqLyAKKworCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJcHVzaGwJJWVieAorCisJbW92bAlQQVJBTTEsJWVzaQkvKiBwb2ludGVyIHRvIG51bSAqLworCW1vdmwJUEFSQU0yLCVlYngJLyogcG9pbnRlciB0byBkZW5vbSAqLworCisjaWZkZWYgUEFSQU5PSUQKKwl0ZXN0bAkkMHg4MDAwMDAwMCwgWHNpZ0goJWVieCkJLyogRGl2aXNvciAqLworCWplCUxfYnVnZ2VkCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBEaXZpZGU6ICAgUmV0dXJuICBhcmcxL2FyZzIgdG8gYXJnMy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgVGhlIG1heGltdW0gcmV0dXJuZWQgdmFsdWUgaXMgKGlnbm9yaW5nIGV4cG9uZW50cykgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgLmZmZmZmZmZmIGZmZmZmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gID0gIDEuZmZmZmZmZmYgZmZmZmZmZmUgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgIC44MDAwMDAwMCAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IGFuZCB0aGUgbWluaW11bSBpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAuODAwMDAwMDAgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAgPSAgLjgwMDAwMDAwIDAwMDAwMDAxICAgKHJvdW5kZWQpICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgLmZmZmZmZmZmIGZmZmZmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBTYXZlIGV4dGVuZGVkIGRpdmlkZW5kIGluIGxvY2FsIHJlZ2lzdGVyICovCisKKwkvKiBEaXZpZGUgYnkgMiB0byBwcmV2ZW50IG92ZXJmbG93ICovCisJY2xjCisJbW92bAlYc2lnSCglZXNpKSwlZWF4CisJcmNybAklZWF4CisJbW92bAklZWF4LEZQVV9hY2N1bV8zCisJbW92bAlYc2lnTCglZXNpKSwlZWF4CisJcmNybAklZWF4CisJbW92bAklZWF4LEZQVV9hY2N1bV8yCisJbW92bAlYc2lnTEwoJWVzaSksJWVheAorCXJjcmwJJWVheAorCW1vdmwJJWVheCxGUFVfYWNjdW1fMQorCW1vdmwJJDAsJWVheAorCXJjcmwJJWVheAorCW1vdmwJJWVheCxGUFVfYWNjdW1fMAorCisJbW92bAlGUFVfYWNjdW1fMiwlZWF4CS8qIEdldCB0aGUgY3VycmVudCBudW0gKi8KKwltb3ZsCUZQVV9hY2N1bV8zLCVlZHgKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEluaXRpYWxpemF0aW9uIGRvbmUuCisgICBEbyB0aGUgZmlyc3QgMzIgYml0cy4gKi8KKworCS8qIFdlIHdpbGwgZGl2aWRlIGJ5IGEgbnVtYmVyIHdoaWNoIGlzIHRvbyBsYXJnZSAqLworCW1vdmwJWHNpZ0goJWVieCksJWVjeAorCWFkZGwJJDEsJWVjeAorCWpuYwlMRmlyc3RfZGl2X25vdF8xCisKKwkvKiBoZXJlIHdlIG5lZWQgdG8gZGl2aWRlIGJ5IDEwMDAwMDAwMGgsCisJICAgaS5lLiwgbm8gZGl2aXNpb24gYXQgYWxsLi4gKi8KKwltb3YJJWVkeCwlZWF4CisJam1wCUxGaXJzdF9kaXZfZG9uZQorCitMRmlyc3RfZGl2X25vdF8xOgorCWRpdmwJJWVjeAkJLyogRGl2aWRlIHRoZSBudW1lcmF0b3IgYnkgdGhlIGF1Z21lbnRlZAorCQkJCSAgIGRlbm9tIG1zIGR3ICovCisKK0xGaXJzdF9kaXZfZG9uZToKKwltb3ZsCSVlYXgsRlBVX3Jlc3VsdF8zCS8qIFB1dCB0aGUgcmVzdWx0IGluIHRoZSBhbnN3ZXIgKi8KKworCW11bGwJWHNpZ0goJWVieCkJLyogbXVsIGJ5IHRoZSBtcyBkdyBvZiB0aGUgZGVub20gKi8KKworCXN1YmwJJWVheCxGUFVfYWNjdW1fMgkvKiBTdWJ0cmFjdCBmcm9tIHRoZSBudW0gbG9jYWwgcmVnICovCisJc2JibAklZWR4LEZQVV9hY2N1bV8zCisKKwltb3ZsCUZQVV9yZXN1bHRfMywlZWF4CS8qIEdldCB0aGUgcmVzdWx0IGJhY2sgKi8KKwltdWxsCVhzaWdMKCVlYngpCS8qIG5vdyBtdWwgdGhlIGxzIGR3IG9mIHRoZSBkZW5vbSAqLworCisJc3VibAklZWF4LEZQVV9hY2N1bV8xCS8qIFN1YnRyYWN0IGZyb20gdGhlIG51bSBsb2NhbCByZWcgKi8KKwlzYmJsCSVlZHgsRlBVX2FjY3VtXzIKKwlzYmJsCSQwLEZQVV9hY2N1bV8zCisJamUJTERvXzJuZF8zMl9iaXRzCQkvKiBNdXN0IGNoZWNrIGZvciBub24temVybyByZXN1bHQgaGVyZSAqLworCisjaWZkZWYgUEFSQU5PSUQKKwlqYglMX2J1Z2dlZF8xCisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKKwkvKiBuZWVkIHRvIHN1YnRyYWN0IGFub3RoZXIgb25jZSBvZiB0aGUgZGVub20gKi8KKwlpbmNsCUZQVV9yZXN1bHRfMwkvKiBDb3JyZWN0IHRoZSBhbnN3ZXIgKi8KKworCW1vdmwJWHNpZ0woJWVieCksJWVheAorCW1vdmwJWHNpZ0goJWVieCksJWVkeAorCXN1YmwJJWVheCxGUFVfYWNjdW1fMQkvKiBTdWJ0cmFjdCBmcm9tIHRoZSBudW0gbG9jYWwgcmVnICovCisJc2JibAklZWR4LEZQVV9hY2N1bV8yCisKKyNpZmRlZiBQQVJBTk9JRAorCXNiYmwJJDAsRlBVX2FjY3VtXzMKKwlqbmUJTF9idWdnZWRfMQkvKiBNdXN0IGNoZWNrIGZvciBub24temVybyByZXN1bHQgaGVyZSAqLworI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogSGFsZiBvZiB0aGUgbWFpbiBwcm9ibGVtIGlzIGRvbmUsIHRoZXJlIGlzIGp1c3QgYSByZWR1Y2VkIG51bWVyYXRvcgorICAgdG8gaGFuZGxlIG5vdy4KKyAgIFdvcmsgd2l0aCB0aGUgc2Vjb25kIDMyIGJpdHMsIEZQVV9hY2N1bV8wIG5vdCB1c2VkIGZyb20gbm93IG9uICovCitMRG9fMm5kXzMyX2JpdHM6CisJbW92bAlGUFVfYWNjdW1fMiwlZWR4CS8qIGdldCB0aGUgcmVkdWNlZCBudW0gKi8KKwltb3ZsCUZQVV9hY2N1bV8xLCVlYXgKKworCS8qIG5lZWQgdG8gY2hlY2sgZm9yIHBvc3NpYmxlIHN1YnNlcXVlbnQgb3ZlcmZsb3cgKi8KKwljbXBsCVhzaWdIKCVlYngpLCVlZHgKKwlqYglMRG9fMm5kX2RpdgorCWphCUxQcmV2ZW50XzJuZF9vdmVyZmxvdworCisJY21wbAlYc2lnTCglZWJ4KSwlZWF4CisJamIJTERvXzJuZF9kaXYKKworTFByZXZlbnRfMm5kX292ZXJmbG93OgorLyogVGhlIG51bWVyYXRvciBpcyBncmVhdGVyIG9yIGVxdWFsLCB3b3VsZCBjYXVzZSBvdmVyZmxvdyAqLworCS8qIHByZXZlbnQgb3ZlcmZsb3cgKi8KKwlzdWJsCVhzaWdMKCVlYngpLCVlYXgKKwlzYmJsCVhzaWdIKCVlYngpLCVlZHgKKwltb3ZsCSVlZHgsRlBVX2FjY3VtXzIKKwltb3ZsCSVlYXgsRlBVX2FjY3VtXzEKKworCWluY2wJRlBVX3Jlc3VsdF8zCS8qIFJlZmxlY3QgdGhlIHN1YnRyYWN0aW9uIGluIHRoZSBhbnN3ZXIgKi8KKworI2lmZGVmIFBBUkFOT0lECisJamUJTF9idWdnZWRfMgkvKiBDYW4ndCBidW1wIHRoZSByZXN1bHQgdG8gMS4wICovCisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKK0xEb18ybmRfZGl2OgorCWNtcGwJJDAsJWVjeAkJLyogYXVnbWVudGVkIGRlbm9tIG1zdyAqLworCWpueglMU2Vjb25kX2Rpdl9ub3RfMQorCisJLyogJWVjeCA9PSAwLCB3ZSBhcmUgZGl2aWRpbmcgYnkgMS4wICovCisJbW92CSVlZHgsJWVheAorCWptcAlMU2Vjb25kX2Rpdl9kb25lCisKK0xTZWNvbmRfZGl2X25vdF8xOgorCWRpdmwJJWVjeAkJLyogRGl2aWRlIHRoZSBudW1lcmF0b3IgYnkgdGhlIGRlbm9tIG1zIGR3ICovCisKK0xTZWNvbmRfZGl2X2RvbmU6CisJbW92bAklZWF4LEZQVV9yZXN1bHRfMgkvKiBQdXQgdGhlIHJlc3VsdCBpbiB0aGUgYW5zd2VyICovCisKKwltdWxsCVhzaWdIKCVlYngpCS8qIG11bCBieSB0aGUgbXMgZHcgb2YgdGhlIGRlbm9tICovCisKKwlzdWJsCSVlYXgsRlBVX2FjY3VtXzEJLyogU3VidHJhY3QgZnJvbSB0aGUgbnVtIGxvY2FsIHJlZyAqLworCXNiYmwJJWVkeCxGUFVfYWNjdW1fMgorCisjaWZkZWYgUEFSQU5PSUQKKwlqYwlMX2J1Z2dlZF8yCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworCW1vdmwJRlBVX3Jlc3VsdF8yLCVlYXgJLyogR2V0IHRoZSByZXN1bHQgYmFjayAqLworCW11bGwJWHNpZ0woJWVieCkJLyogbm93IG11bCB0aGUgbHMgZHcgb2YgdGhlIGRlbm9tICovCisKKwlzdWJsCSVlYXgsRlBVX2FjY3VtXzAJLyogU3VidHJhY3QgZnJvbSB0aGUgbnVtIGxvY2FsIHJlZyAqLworCXNiYmwJJWVkeCxGUFVfYWNjdW1fMQkvKiBTdWJ0cmFjdCBmcm9tIHRoZSBudW0gbG9jYWwgcmVnICovCisJc2JibAkkMCxGUFVfYWNjdW1fMgorCisjaWZkZWYgUEFSQU5PSUQKKwlqYwlMX2J1Z2dlZF8yCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworCWp6CUxEb18zcmRfMzJfYml0cworCisjaWZkZWYgUEFSQU5PSUQKKwljbXBsCSQxLEZQVV9hY2N1bV8yCisJam5lCUxfYnVnZ2VkXzIKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworCS8qIG5lZWQgdG8gc3VidHJhY3QgYW5vdGhlciBvbmNlIG9mIHRoZSBkZW5vbSAqLworCW1vdmwJWHNpZ0woJWVieCksJWVheAorCW1vdmwJWHNpZ0goJWVieCksJWVkeAorCXN1YmwJJWVheCxGUFVfYWNjdW1fMAkvKiBTdWJ0cmFjdCBmcm9tIHRoZSBudW0gbG9jYWwgcmVnICovCisJc2JibAklZWR4LEZQVV9hY2N1bV8xCisJc2JibAkkMCxGUFVfYWNjdW1fMgorCisjaWZkZWYgUEFSQU5PSUQKKwlqYwlMX2J1Z2dlZF8yCisJam5lCUxfYnVnZ2VkXzIKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworCWFkZGwJJDEsRlBVX3Jlc3VsdF8yCS8qIENvcnJlY3QgdGhlIGFuc3dlciAqLworCWFkY2wJJDAsRlBVX3Jlc3VsdF8zCisKKyNpZmRlZiBQQVJBTk9JRAorCWpjCUxfYnVnZ2VkXzIJLyogTXVzdCBjaGVjayBmb3Igbm9uLXplcm8gcmVzdWx0IGhlcmUgKi8KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFRoZSBkaXZpc2lvbiBpcyBlc3NlbnRpYWxseSBmaW5pc2hlZCBoZXJlLCB3ZSBqdXN0IG5lZWQgdG8gcGVyZm9ybQorICAgdGlkeWluZyBvcGVyYXRpb25zLgorICAgRGVhbCB3aXRoIHRoZSAzcmQgMzIgYml0cyAqLworTERvXzNyZF8zMl9iaXRzOgorCS8qIFdlIHVzZSBhbiBhcHByb3hpbWF0aW9uIGZvciB0aGUgdGhpcmQgMzIgYml0cy4KKwlUbyB0YWtlIGFjY291bnQgb2YgdGhlIDNyZCAzMiBiaXRzIG9mIHRoZSBkaXZpc29yCisJKGNhbGwgdGhlbSBkZWwpLCB3ZSBzdWJ0cmFjdCAgZGVsICogKGEvYikgKi8KKworCW1vdmwJRlBVX3Jlc3VsdF8zLCVlYXgJLyogYS9iICovCisJbXVsbAlYc2lnTEwoJWVieCkJCS8qIGRlbCAqLworCisJc3VibAklZWR4LEZQVV9hY2N1bV8xCisKKwkvKiBBIGJvcnJvdyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlICovCisJam5iCUxUZXN0X292ZXIKKworCW1vdmwJWHNpZ0goJWVieCksJWVkeAorCWFkZGwJJWVkeCxGUFVfYWNjdW1fMQorCisJc3VibAkkMSxGUFVfcmVzdWx0XzIJCS8qIEFkanVzdCB0aGUgYW5zd2VyICovCisJc2JibAkkMCxGUFVfcmVzdWx0XzMKKworCS8qIFRoZSBhYm92ZSBhZGRpdGlvbiBtaWdodCBub3QgaGF2ZSBiZWVuIGVub3VnaCwgY2hlY2sgYWdhaW4uICovCisJbW92bAlGUFVfYWNjdW1fMSwlZWR4CS8qIGdldCB0aGUgcmVkdWNlZCBudW0gKi8KKwljbXBsCVhzaWdIKCVlYngpLCVlZHgJLyogZGVub20gKi8KKwlqYglMRG9fM3JkX2RpdgorCisJbW92bAlYc2lnSCglZWJ4KSwlZWR4CisJYWRkbAklZWR4LEZQVV9hY2N1bV8xCisKKwlzdWJsCSQxLEZQVV9yZXN1bHRfMgkJLyogQWRqdXN0IHRoZSBhbnN3ZXIgKi8KKwlzYmJsCSQwLEZQVV9yZXN1bHRfMworCWptcAlMRG9fM3JkX2RpdgorCitMVGVzdF9vdmVyOgorCW1vdmwJRlBVX2FjY3VtXzEsJWVkeAkvKiBnZXQgdGhlIHJlZHVjZWQgbnVtICovCisKKwkvKiBuZWVkIHRvIGNoZWNrIGZvciBwb3NzaWJsZSBzdWJzZXF1ZW50IG92ZXJmbG93ICovCisJY21wbAlYc2lnSCglZWJ4KSwlZWR4CS8qIGRlbm9tICovCisJamIJTERvXzNyZF9kaXYKKworCS8qIHByZXZlbnQgb3ZlcmZsb3cgKi8KKwlzdWJsCVhzaWdIKCVlYngpLCVlZHgKKwltb3ZsCSVlZHgsRlBVX2FjY3VtXzEKKworCWFkZGwJJDEsRlBVX3Jlc3VsdF8yCS8qIFJlZmxlY3QgdGhlIHN1YnRyYWN0aW9uIGluIHRoZSBhbnN3ZXIgKi8KKwlhZGNsCSQwLEZQVV9yZXN1bHRfMworCitMRG9fM3JkX2RpdjoKKwltb3ZsCUZQVV9hY2N1bV8wLCVlYXgKKwltb3ZsCUZQVV9hY2N1bV8xLCVlZHgKKwlkaXZsCVhzaWdIKCVlYngpCisKKwltb3ZsICAgICVlYXgsRlBVX3Jlc3VsdF8xICAgICAgIC8qIFJvdWdoIGVzdGltYXRlIG9mIHRoaXJkIHdvcmQgKi8KKworCW1vdmwJUEFSQU0zLCVlc2kJCS8qIHBvaW50ZXIgdG8gYW5zd2VyICovCisKKwltb3ZsCUZQVV9yZXN1bHRfMSwlZWF4CisJbW92bAklZWF4LFhzaWdMTCglZXNpKQorCW1vdmwJRlBVX3Jlc3VsdF8yLCVlYXgKKwltb3ZsCSVlYXgsWHNpZ0woJWVzaSkKKwltb3ZsCUZQVV9yZXN1bHRfMywlZWF4CisJbW92bAklZWF4LFhzaWdIKCVlc2kpCisKK0xfZXhpdDoKKwlwb3BsCSVlYngKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKworCWxlYXZlCisJcmV0CisKKworI2lmZGVmIFBBUkFOT0lECisvKiBUaGUgbG9naWMgaXMgd3JvbmcgaWYgd2UgZ290IGhlcmUgKi8KK0xfYnVnZ2VkOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjQwCisJY2FsbAlFWENFUFRJT04KKwlwb3AJJWVieAorCWptcAlMX2V4aXQKKworTF9idWdnZWRfMToKKwlwdXNobAlFWF9JTlRFUk5BTHwweDI0MQorCWNhbGwJRVhDRVBUSU9OCisJcG9wCSVlYngKKwlqbXAJTF9leGl0CisKK0xfYnVnZ2VkXzI6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyNDIKKwljYWxsCUVYQ0VQVElPTgorCXBvcAklZWJ4CisJam1wCUxfZXhpdAorI2VuZGlmIC8qIFBBUkFOT0lEICovIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L2Rpdl9zbWFsbC5TIGIvYXJjaC9pMzg2L21hdGgtZW11L2Rpdl9zbWFsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MDk5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvZGl2X3NtYWxsLlMKQEAgLTAsMCArMSw0NyBAQAorCS5maWxlCSJkaXZfc21hbGwuUyIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIGRpdl9zbWFsbC5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IERpdmlkZSBhIDY0IGJpdCBpbnRlZ2VyIGJ5IGEgMzIgYml0IGludGVnZXIgJiByZXR1cm4gcmVtYWluZGVyLiAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCBiaWxsbUBqYWNvYmkubWF0aHMubW9uYXNoLmVkdS5hdSB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICAgIHVuc2lnbmVkIGxvbmcgRlBVX2Rpdl9zbWFsbCh1bnNpZ25lZCBsb25nIGxvbmcgKngsIHVuc2lnbmVkIGxvbmcgeSkgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorCisudGV4dAorRU5UUlkoRlBVX2Rpdl9zbWFsbCkKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKworCXB1c2hsCSVlc2kKKworCW1vdmwJUEFSQU0xLCVlc2kJLyogcG9pbnRlciB0byBudW0gKi8KKwltb3ZsCVBBUkFNMiwlZWN4CS8qIFRoZSBkZW5vbWluYXRvciAqLworCisJbW92bAk0KCVlc2kpLCVlYXgJLyogR2V0IHRoZSBjdXJyZW50IG51bSBtc3cgKi8KKwl4b3JsCSVlZHgsJWVkeAorCWRpdmwJJWVjeAorCisJbW92bAklZWF4LDQoJWVzaSkKKworCW1vdmwJKCVlc2kpLCVlYXgJLyogR2V0IHRoZSBudW0gbHN3ICovCisJZGl2bAklZWN4CisKKwltb3ZsCSVlYXgsKCVlc2kpCisKKwltb3ZsCSVlZHgsJWVheAkvKiBSZXR1cm4gdGhlIHJlbWFpbmRlciBpbiBlYXggKi8KKworCXBvcGwJJWVzaQorCisJbGVhdmUKKwlyZXQKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L2Vycm9ycy5jIGIvYXJjaC9pMzg2L21hdGgtZW11L2Vycm9ycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYjBkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvZXJyb3JzLmMKQEAgLTAsMCArMSw3MzkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIGVycm9ycy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBUaGUgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zIGZvciB3bS1GUFUtZW11ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk0LDE5OTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCBBdXN0cmFsaWEgfAorIHwgICAgICAgICAgICAgICAgICBFLW1haWwgICBiaWxsbUBqYWNvYmkubWF0aHMubW9uYXNoLmVkdS5hdSAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8IE5vdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgVGhlIGZpbGUgY29udGFpbnMgY29kZSB3aGljaCBhY2Nlc3NlcyB1c2VyIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBFbXVsYXRvciBzdGF0aWMgZGF0YSBtYXkgY2hhbmdlIHdoZW4gdXNlciBtZW1vcnkgaXMgYWNjZXNzZWQsIGR1ZSB0byAgIHwKKyB8ICAgIG90aGVyIHByb2Nlc3NlcyB1c2luZyB0aGUgZW11bGF0b3Igd2hpbGUgc3dhcHBpbmcgaXMgaW4gcHJvZ3Jlc3MuICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJzdGF0dXNfdy5oIgorI2luY2x1ZGUgImNvbnRyb2xfdy5oIgorI2luY2x1ZGUgInJlZ19jb25zdGFudC5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworLyogKi8KKyN1bmRlZiBQUklOVF9NRVNTQUdFUworLyogKi8KKworCisjaWYgMAordm9pZCBVbl9pbXBsKHZvaWQpCit7CisgIHVfY2hhciBieXRlMSwgRlBVX21vZHJtOworICB1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBGUFVfT1JJR19FSVA7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIC8qIE5vIG5lZWQgdG8gY2hlY2sgYWNjZXNzX29rKCksIHdlIGhhdmUgcHJldmlvdXNseSBmZXRjaGVkIHRoZXNlIGJ5dGVzLiAqLworICBwcmludGsoIlVuaW1wbGVtZW50ZWQgRlBVIE9wY29kZSBhdCBlaXA9JXAgOiAiLCAodm9pZCBfX3VzZXIgKikgYWRkcmVzcyk7CisgIGlmICggRlBVX0NTID09IF9fVVNFUl9DUyApCisgICAgeworICAgICAgd2hpbGUgKCAxICkKKwl7CisJICBGUFVfZ2V0X3VzZXIoYnl0ZTEsICh1X2NoYXIgX191c2VyICopIGFkZHJlc3MpOworCSAgaWYgKCAoYnl0ZTEgJiAweGY4KSA9PSAweGQ4ICkgYnJlYWs7CisJICBwcmludGsoIlslMDJ4XSIsIGJ5dGUxKTsKKwkgIGFkZHJlc3MrKzsKKwl9CisgICAgICBwcmludGsoIiUwMnggIiwgYnl0ZTEpOworICAgICAgRlBVX2dldF91c2VyKEZQVV9tb2RybSwgMSArICh1X2NoYXIgX191c2VyICopIGFkZHJlc3MpOworICAgICAgCisgICAgICBpZiAoRlBVX21vZHJtID49IDAzMDApCisJcHJpbnRrKCIlMDJ4ICglMDJ4KyVkKVxuIiwgRlBVX21vZHJtLCBGUFVfbW9kcm0gJiAweGY4LCBGUFVfbW9kcm0gJiA3KTsKKyAgICAgIGVsc2UKKwlwcmludGsoIi8lZFxuIiwgKEZQVV9tb2RybSA+PiAzKSAmIDcpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50aygiY3Mgc2VsZWN0b3IgPSAlMDR4XG4iLCBGUFVfQ1MpOworICAgIH0KKworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKworfQorI2VuZGlmICAvKiAgMCAgKi8KKworCisvKgorICAgQ2FsbGVkIGZvciBvcGNvZGVzIHdoaWNoIGFyZSBpbGxlZ2FsIGFuZCB3aGljaCBhcmUga25vd24gdG8gcmVzdWx0IGluIGEKKyAgIFNJR0lMTCB3aXRoIGEgcmVhbCA4MDQ4Ni4KKyAgICovCit2b2lkIEZQVV9pbGxlZ2FsKHZvaWQpCit7CisgIG1hdGhfYWJvcnQoRlBVX2luZm8sU0lHSUxMKTsKK30KKworCisKK3ZvaWQgRlBVX3ByaW50YWxsKHZvaWQpCit7CisgIGludCBpOworICBzdGF0aWMgY29uc3QgY2hhciAqdGFnX2Rlc2NbXSA9IHsgIlZhbGlkIiwgIlplcm8iLCAiRVJST1IiLCAiRW1wdHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlTm9ybSIsICJJbmYiLCAiTmFOIiB9OworICB1X2NoYXIgYnl0ZTEsIEZQVV9tb2RybTsKKyAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gRlBVX09SSUdfRUlQOworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAvKiBObyBuZWVkIHRvIGNoZWNrIGFjY2Vzc19vaygpLCB3ZSBoYXZlIHByZXZpb3VzbHkgZmV0Y2hlZCB0aGVzZSBieXRlcy4gKi8KKyAgcHJpbnRrKCJBdCAlcDoiLCAodm9pZCAqKSBhZGRyZXNzKTsKKyAgaWYgKCBGUFVfQ1MgPT0gX19VU0VSX0NTICkKKyAgICB7CisjZGVmaW5lIE1BWF9QUklOVEVEX0JZVEVTIDIwCisgICAgICBmb3IgKCBpID0gMDsgaSA8IE1BWF9QUklOVEVEX0JZVEVTOyBpKysgKQorCXsKKwkgIEZQVV9nZXRfdXNlcihieXRlMSwgKHVfY2hhciBfX3VzZXIgKikgYWRkcmVzcyk7CisJICBpZiAoIChieXRlMSAmIDB4ZjgpID09IDB4ZDggKQorCSAgICB7CisJICAgICAgcHJpbnRrKCIgJTAyeCIsIGJ5dGUxKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgcHJpbnRrKCIgWyUwMnhdIiwgYnl0ZTEpOworCSAgYWRkcmVzcysrOworCX0KKyAgICAgIGlmICggaSA9PSBNQVhfUFJJTlRFRF9CWVRFUyApCisJcHJpbnRrKCIgW21vcmUuLl1cbiIpOworICAgICAgZWxzZQorCXsKKwkgIEZQVV9nZXRfdXNlcihGUFVfbW9kcm0sIDEgKyAodV9jaGFyIF9fdXNlciAqKSBhZGRyZXNzKTsKKwkgIAorCSAgaWYgKEZQVV9tb2RybSA+PSAwMzAwKQorCSAgICBwcmludGsoIiAlMDJ4ICglMDJ4KyVkKVxuIiwgRlBVX21vZHJtLCBGUFVfbW9kcm0gJiAweGY4LCBGUFVfbW9kcm0gJiA3KTsKKwkgIGVsc2UKKwkgICAgcHJpbnRrKCIgLyVkLCBtb2Q9JWQgcm09JWRcbiIsCisJCSAgIChGUFVfbW9kcm0gPj4gMykgJiA3LCAoRlBVX21vZHJtID4+IDYpICYgMywgRlBVX21vZHJtICYgNyk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50aygiJTA0eFxuIiwgRlBVX0NTKTsKKyAgICB9CisKKyAgcGFydGlhbF9zdGF0dXMgPSBzdGF0dXNfd29yZCgpOworCisjaWZkZWYgREVCVUdHSU5HCitpZiAoIHBhcnRpYWxfc3RhdHVzICYgU1dfQmFja3dhcmQgKSAgICBwcmludGsoIlNXOiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4iKTsKK2lmICggcGFydGlhbF9zdGF0dXMgJiBTV19DMyApICAgICAgICAgIHByaW50aygiU1c6IGNvbmRpdGlvbiBiaXQgM1xuIik7CitpZiAoIHBhcnRpYWxfc3RhdHVzICYgU1dfQzIgKSAgICAgICAgICBwcmludGsoIlNXOiBjb25kaXRpb24gYml0IDJcbiIpOworaWYgKCBwYXJ0aWFsX3N0YXR1cyAmIFNXX0MxICkgICAgICAgICAgcHJpbnRrKCJTVzogY29uZGl0aW9uIGJpdCAxXG4iKTsKK2lmICggcGFydGlhbF9zdGF0dXMgJiBTV19DMCApICAgICAgICAgIHByaW50aygiU1c6IGNvbmRpdGlvbiBiaXQgMFxuIik7CitpZiAoIHBhcnRpYWxfc3RhdHVzICYgU1dfU3VtbWFyeSApICAgICBwcmludGsoIlNXOiBleGNlcHRpb24gc3VtbWFyeVxuIik7CitpZiAoIHBhcnRpYWxfc3RhdHVzICYgU1dfU3RhY2tfRmF1bHQgKSBwcmludGsoIlNXOiBzdGFjayBmYXVsdFxuIik7CitpZiAoIHBhcnRpYWxfc3RhdHVzICYgU1dfUHJlY2lzaW9uICkgICBwcmludGsoIlNXOiBsb3NzIG9mIHByZWNpc2lvblxuIik7CitpZiAoIHBhcnRpYWxfc3RhdHVzICYgU1dfVW5kZXJmbG93ICkgICBwcmludGsoIlNXOiB1bmRlcmZsb3dcbiIpOworaWYgKCBwYXJ0aWFsX3N0YXR1cyAmIFNXX092ZXJmbG93ICkgICAgcHJpbnRrKCJTVzogb3ZlcmZsb3dcbiIpOworaWYgKCBwYXJ0aWFsX3N0YXR1cyAmIFNXX1plcm9fRGl2ICkgICAgcHJpbnRrKCJTVzogZGl2aWRlIGJ5IHplcm9cbiIpOworaWYgKCBwYXJ0aWFsX3N0YXR1cyAmIFNXX0Rlbm9ybV9PcCApICAgcHJpbnRrKCJTVzogZGVub3JtYWxpemVkIG9wZXJhbmRcbiIpOworaWYgKCBwYXJ0aWFsX3N0YXR1cyAmIFNXX0ludmFsaWQgKSAgICAgcHJpbnRrKCJTVzogaW52YWxpZCBvcGVyYXRpb25cbiIpOworI2VuZGlmIC8qIERFQlVHR0lORyAqLworCisgIHByaW50aygiIFNXOiBiPSVkIHN0PSVsZCBlcz0lZCBzZj0lZCBjYz0lZCVkJWQlZCBlZj0lZCVkJWQlZCVkJWRcbiIsCisJIHBhcnRpYWxfc3RhdHVzICYgMHg4MDAwID8gMSA6IDAsICAgLyogYnVzeSAqLworCSAocGFydGlhbF9zdGF0dXMgJiAweDM4MDApID4+IDExLCAgIC8qIHN0YWNrIHRvcCBwb2ludGVyICovCisJIHBhcnRpYWxfc3RhdHVzICYgMHg4MCA/IDEgOiAwLCAgICAgLyogRXJyb3Igc3VtbWFyeSBzdGF0dXMgKi8KKwkgcGFydGlhbF9zdGF0dXMgJiAweDQwID8gMSA6IDAsICAgICAvKiBTdGFjayBmbGFnICovCisJIHBhcnRpYWxfc3RhdHVzICYgU1dfQzM/MTowLCBwYXJ0aWFsX3N0YXR1cyAmIFNXX0MyPzE6MCwgLyogY2MgKi8KKwkgcGFydGlhbF9zdGF0dXMgJiBTV19DMT8xOjAsIHBhcnRpYWxfc3RhdHVzICYgU1dfQzA/MTowLCAvKiBjYyAqLworCSBwYXJ0aWFsX3N0YXR1cyAmIFNXX1ByZWNpc2lvbj8xOjAsIHBhcnRpYWxfc3RhdHVzICYgU1dfVW5kZXJmbG93PzE6MCwKKwkgcGFydGlhbF9zdGF0dXMgJiBTV19PdmVyZmxvdz8xOjAsIHBhcnRpYWxfc3RhdHVzICYgU1dfWmVyb19EaXY/MTowLAorCSBwYXJ0aWFsX3N0YXR1cyAmIFNXX0Rlbm9ybV9PcD8xOjAsIHBhcnRpYWxfc3RhdHVzICYgU1dfSW52YWxpZD8xOjApOworICAKK3ByaW50aygiIENXOiBpYz0lZCByYz0lbGQlbGQgcGM9JWxkJWxkIGllbT0lZCAgICAgZWY9JWQlZCVkJWQlZCVkXG4iLAorCSBjb250cm9sX3dvcmQgJiAweDEwMDAgPyAxIDogMCwKKwkgKGNvbnRyb2xfd29yZCAmIDB4ODAwKSA+PiAxMSwgKGNvbnRyb2xfd29yZCAmIDB4NDAwKSA+PiAxMCwKKwkgKGNvbnRyb2xfd29yZCAmIDB4MjAwKSA+PiA5LCAoY29udHJvbF93b3JkICYgMHgxMDApID4+IDgsCisJIGNvbnRyb2xfd29yZCAmIDB4ODAgPyAxIDogMCwKKwkgY29udHJvbF93b3JkICYgU1dfUHJlY2lzaW9uPzE6MCwgY29udHJvbF93b3JkICYgU1dfVW5kZXJmbG93PzE6MCwKKwkgY29udHJvbF93b3JkICYgU1dfT3ZlcmZsb3c/MTowLCBjb250cm9sX3dvcmQgJiBTV19aZXJvX0Rpdj8xOjAsCisJIGNvbnRyb2xfd29yZCAmIFNXX0Rlbm9ybV9PcD8xOjAsIGNvbnRyb2xfd29yZCAmIFNXX0ludmFsaWQ/MTowKTsKKworICBmb3IgKCBpID0gMDsgaSA8IDg7IGkrKyApCisgICAgeworICAgICAgRlBVX1JFRyAqciA9ICZzdChpKTsKKyAgICAgIHVfY2hhciB0YWdpID0gRlBVX2dldHRhZ2koaSk7CisgICAgICBzd2l0Y2ggKHRhZ2kpCisJeworCWNhc2UgVEFHX0VtcHR5OgorCSAgY29udGludWU7CisJICBicmVhazsKKwljYXNlIFRBR19aZXJvOgorCWNhc2UgVEFHX1NwZWNpYWw6CisJICB0YWdpID0gRlBVX1NwZWNpYWwocik7CisJY2FzZSBUQUdfVmFsaWQ6CisJICBwcmludGsoInN0KCVkKSAgJWMgLiUwNGx4ICUwNGx4ICUwNGx4ICUwNGx4IGUlKy02ZCAiLCBpLAorCQkgZ2V0c2lnbihyKSA/ICctJyA6ICcrJywKKwkJIChsb25nKShyLT5zaWdoID4+IDE2KSwKKwkJIChsb25nKShyLT5zaWdoICYgMHhGRkZGKSwKKwkJIChsb25nKShyLT5zaWdsID4+IDE2KSwKKwkJIChsb25nKShyLT5zaWdsICYgMHhGRkZGKSwKKwkJIGV4cG9uZW50KHIpIC0gRVhQX0JJQVMgKyAxKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBwcmludGsoIldob29wcyEgRXJyb3IgaW4gZXJyb3JzLmM6IHRhZyVkIGlzICVkICIsIGksIHRhZ2kpOworCSAgY29udGludWU7CisJICBicmVhazsKKwl9CisgICAgICBwcmludGsoIiVzXG4iLCB0YWdfZGVzY1soaW50KSAodW5zaWduZWQpIHRhZ2ldKTsKKyAgICB9CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworfQorCitzdGF0aWMgc3RydWN0IHsKKyAgaW50IHR5cGU7CisgIGNvbnN0IGNoYXIgKm5hbWU7Cit9IGV4Y2VwdGlvbl9uYW1lc1tdID0geworICB7IEVYX1N0YWNrT3ZlciwgInN0YWNrIG92ZXJmbG93IiB9LAorICB7IEVYX1N0YWNrVW5kZXIsICJzdGFjayB1bmRlcmZsb3ciIH0sCisgIHsgRVhfUHJlY2lzaW9uLCAibG9zcyBvZiBwcmVjaXNpb24iIH0sCisgIHsgRVhfVW5kZXJmbG93LCAidW5kZXJmbG93IiB9LAorICB7IEVYX092ZXJmbG93LCAib3ZlcmZsb3ciIH0sCisgIHsgRVhfWmVyb0RpdiwgImRpdmlkZSBieSB6ZXJvIiB9LAorICB7IEVYX0Rlbm9ybWFsLCAiZGVub3JtYWxpemVkIG9wZXJhbmQiIH0sCisgIHsgRVhfSW52YWxpZCwgImludmFsaWQgb3BlcmF0aW9uIiB9LAorICB7IEVYX0lOVEVSTkFMLCAiSU5URVJOQUwgQlVHIGluICJGUFVfVkVSU0lPTiB9LAorICB7IDAsIE5VTEwgfQorfTsKKworLyoKKyBFWF9JTlRFUk5BTCBpcyBhbHdheXMgZ2l2ZW4gd2l0aCBhIGNvZGUgd2hpY2ggaW5kaWNhdGVzIHdoZXJlIHRoZQorIGVycm9yIHdhcyBkZXRlY3RlZC4KKworIEludGVybmFsIGVycm9yIHR5cGVzOgorICAgICAgIDB4MTQgICBpbiBmcHVfZXRjLmMKKyAgICAgICAweDFubiAgaW4gYSAqLmMgZmlsZToKKyAgICAgICAgICAgICAgMHgxMDEgIGluIHJlZ19hZGRfc3ViLmMKKyAgICAgICAgICAgICAgMHgxMDIgIGluIHJlZ19tdWwuYworICAgICAgICAgICAgICAweDEwNCAgaW4gcG9seV9hdGFuLmMKKyAgICAgICAgICAgICAgMHgxMDUgIGluIHJlZ19tdWwuYworICAgICAgICAgICAgICAweDEwNyAgaW4gZnB1X3RyaWcuYworCSAgICAgIDB4MTA4ICBpbiByZWdfY29tcGFyZS5jCisJICAgICAgMHgxMDkgIGluIHJlZ19jb21wYXJlLmMKKwkgICAgICAweDExMCAgaW4gcmVnX2FkZF9zdWIuYworCSAgICAgIDB4MTExICBpbiBmcGVfZW50cnkuYworCSAgICAgIDB4MTEyICBpbiBmcHVfdHJpZy5jCisJICAgICAgMHgxMTMgIGluIGVycm9ycy5jCisJICAgICAgMHgxMTUgIGluIGZwdV90cmlnLmMKKwkgICAgICAweDExNiAgaW4gZnB1X3RyaWcuYworCSAgICAgIDB4MTE3ICBpbiBmcHVfdHJpZy5jCisJICAgICAgMHgxMTggIGluIGZwdV90cmlnLmMKKwkgICAgICAweDExOSAgaW4gZnB1X3RyaWcuYworCSAgICAgIDB4MTIwICBpbiBwb2x5X2F0YW4uYworCSAgICAgIDB4MTIxICBpbiByZWdfY29tcGFyZS5jCisJICAgICAgMHgxMjIgIGluIHJlZ19jb21wYXJlLmMKKwkgICAgICAweDEyMyAgaW4gcmVnX2NvbXBhcmUuYworCSAgICAgIDB4MTI1ICBpbiBmcHVfdHJpZy5jCisJICAgICAgMHgxMjYgIGluIGZwdV9lbnRyeS5jCisJICAgICAgMHgxMjcgIGluIHBvbHlfMnhtMS5jCisJICAgICAgMHgxMjggIGluIGZwdV9lbnRyeS5jCisJICAgICAgMHgxMjkgIGluIGZwdV9lbnRyeS5jCisJICAgICAgMHgxMzAgIGluIGdldF9hZGRyZXNzLmMKKwkgICAgICAweDEzMSAgaW4gZ2V0X2FkZHJlc3MuYworCSAgICAgIDB4MTMyICBpbiBnZXRfYWRkcmVzcy5jCisJICAgICAgMHgxMzMgIGluIGdldF9hZGRyZXNzLmMKKwkgICAgICAweDE0MCAgaW4gbG9hZF9zdG9yZS5jCisJICAgICAgMHgxNDEgIGluIGxvYWRfc3RvcmUuYworICAgICAgICAgICAgICAweDE1MCAgaW4gcG9seV9zaW4uYworICAgICAgICAgICAgICAweDE1MSAgaW4gcG9seV9zaW4uYworCSAgICAgIDB4MTYwICBpbiByZWdfbGRfc3RyLmMKKwkgICAgICAweDE2MSAgaW4gcmVnX2xkX3N0ci5jCisJICAgICAgMHgxNjIgIGluIHJlZ19sZF9zdHIuYworCSAgICAgIDB4MTYzICBpbiByZWdfbGRfc3RyLmMKKwkgICAgICAweDE2NCAgaW4gcmVnX2xkX3N0ci5jCisJICAgICAgMHgxNzAgIGluIGZwdV90YWdzLmMKKwkgICAgICAweDE3MSAgaW4gZnB1X3RhZ3MuYworCSAgICAgIDB4MTcyICBpbiBmcHVfdGFncy5jCisJICAgICAgMHgxODAgIGluIHJlZ19jb252ZXJ0LmMKKyAgICAgICAweDJubiAgaW4gYW4gKi5TIGZpbGU6CisgICAgICAgICAgICAgIDB4MjAxICBpbiByZWdfdV9hZGQuUworICAgICAgICAgICAgICAweDIwMiAgaW4gcmVnX3VfZGl2LlMKKyAgICAgICAgICAgICAgMHgyMDMgIGluIHJlZ191X2Rpdi5TCisgICAgICAgICAgICAgIDB4MjA0ICBpbiByZWdfdV9kaXYuUworICAgICAgICAgICAgICAweDIwNSAgaW4gcmVnX3VfbXVsLlMKKyAgICAgICAgICAgICAgMHgyMDYgIGluIHJlZ191X3N1Yi5TCisgICAgICAgICAgICAgIDB4MjA3ICBpbiB3bV9zcXJ0LlMKKwkgICAgICAweDIwOCAgaW4gcmVnX2Rpdi5TCisgICAgICAgICAgICAgIDB4MjA5ICBpbiByZWdfdV9zdWIuUworICAgICAgICAgICAgICAweDIxMCAgaW4gcmVnX3Vfc3ViLlMKKyAgICAgICAgICAgICAgMHgyMTEgIGluIHJlZ191X3N1Yi5TCisgICAgICAgICAgICAgIDB4MjEyICBpbiByZWdfdV9zdWIuUworCSAgICAgIDB4MjEzICBpbiB3bV9zcXJ0LlMKKwkgICAgICAweDIxNCAgaW4gd21fc3FydC5TCisJICAgICAgMHgyMTUgIGluIHdtX3NxcnQuUworCSAgICAgIDB4MjIwICBpbiByZWdfbm9ybS5TCisJICAgICAgMHgyMjEgIGluIHJlZ19ub3JtLlMKKwkgICAgICAweDIzMCAgaW4gcmVnX3JvdW5kLlMKKwkgICAgICAweDIzMSAgaW4gcmVnX3JvdW5kLlMKKwkgICAgICAweDIzMiAgaW4gcmVnX3JvdW5kLlMKKwkgICAgICAweDIzMyAgaW4gcmVnX3JvdW5kLlMKKwkgICAgICAweDIzNCAgaW4gcmVnX3JvdW5kLlMKKwkgICAgICAweDIzNSAgaW4gcmVnX3JvdW5kLlMKKwkgICAgICAweDIzNiAgaW4gcmVnX3JvdW5kLlMKKwkgICAgICAweDI0MCAgaW4gZGl2X1hzaWcuUworCSAgICAgIDB4MjQxICBpbiBkaXZfWHNpZy5TCisJICAgICAgMHgyNDIgIGluIGRpdl9Yc2lnLlMKKyAqLworCithc21saW5rYWdlIHZvaWQgRlBVX2V4Y2VwdGlvbihpbnQgbikKK3sKKyAgaW50IGksIGludF90eXBlOworCisgIGludF90eXBlID0gMDsgICAgICAgICAvKiBOZWVkZWQgb25seSB0byBzdG9wIGNvbXBpbGVyIHdhcm5pbmdzICovCisgIGlmICggbiAmIEVYX0lOVEVSTkFMICkKKyAgICB7CisgICAgICBpbnRfdHlwZSA9IG4gLSBFWF9JTlRFUk5BTDsKKyAgICAgIG4gPSBFWF9JTlRFUk5BTDsKKyAgICAgIC8qIFNldCBsb3RzIG9mIGV4Y2VwdGlvbiBiaXRzISAqLworICAgICAgcGFydGlhbF9zdGF0dXMgfD0gKFNXX0V4Y19NYXNrIHwgU1dfU3VtbWFyeSB8IFNXX0JhY2t3YXJkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBFeHRyYWN0IG9ubHkgdGhlIGJpdHMgd2hpY2ggd2UgdXNlIHRvIHNldCB0aGUgc3RhdHVzIHdvcmQgKi8KKyAgICAgIG4gJj0gKFNXX0V4Y19NYXNrKTsKKyAgICAgIC8qIFNldCB0aGUgY29ycmVzcG9uZGluZyBleGNlcHRpb24gYml0ICovCisgICAgICBwYXJ0aWFsX3N0YXR1cyB8PSBuOworICAgICAgLyogU2V0IHN1bW1hcnkgYml0cyBpZmYgZXhjZXB0aW9uIGlzbid0IG1hc2tlZCAqLworICAgICAgaWYgKCBwYXJ0aWFsX3N0YXR1cyAmIH5jb250cm9sX3dvcmQgJiBDV19FeGNlcHRpb25zICkKKwlwYXJ0aWFsX3N0YXR1cyB8PSAoU1dfU3VtbWFyeSB8IFNXX0JhY2t3YXJkKTsKKyAgICAgIGlmICggbiAmIChTV19TdGFja19GYXVsdCB8IEVYX1ByZWNpc2lvbikgKQorCXsKKwkgIGlmICggIShuICYgU1dfQzEpICkKKwkgICAgLyogVGhpcyBiaXQgZGlzdGluZ3Vpc2hlcyBvdmVyLSBmcm9tIHVuZGVyZmxvdyBmb3IgYSBzdGFjayBmYXVsdCwKKwkgICAgICAgYW5kIHJvdW5kdXAgZnJvbSByb3VuZC1kb3duIGZvciBwcmVjaXNpb24gbG9zcy4gKi8KKwkgICAgcGFydGlhbF9zdGF0dXMgJj0gflNXX0MxOworCX0KKyAgICB9CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIGlmICggKH5jb250cm9sX3dvcmQgJiBuICYgQ1dfRXhjZXB0aW9ucykgfHwgKG4gPT0gRVhfSU5URVJOQUwpICkKKyAgICB7CisjaWZkZWYgUFJJTlRfTUVTU0FHRVMKKyAgICAgIC8qIE15IG1lc3NhZ2UgZnJvbSB0aGUgc3BvbnNvciAqLworICAgICAgcHJpbnRrKEZQVV9WRVJTSU9OIiAiX19EQVRFX18iIChDKSBXLiBNZXR6ZW50aGVuLlxuIik7CisjZW5kaWYgLyogUFJJTlRfTUVTU0FHRVMgKi8KKyAgICAgIAorICAgICAgLyogR2V0IGEgbmFtZSBzdHJpbmcgZm9yIGVycm9yIHJlcG9ydGluZyAqLworICAgICAgZm9yIChpPTA7IGV4Y2VwdGlvbl9uYW1lc1tpXS50eXBlOyBpKyspCisJaWYgKCAoZXhjZXB0aW9uX25hbWVzW2ldLnR5cGUgJiBuKSA9PSBleGNlcHRpb25fbmFtZXNbaV0udHlwZSApCisJICBicmVhazsKKyAgICAgIAorICAgICAgaWYgKGV4Y2VwdGlvbl9uYW1lc1tpXS50eXBlKQorCXsKKyNpZmRlZiBQUklOVF9NRVNTQUdFUworCSAgcHJpbnRrKCJGUCBFeGNlcHRpb246ICVzIVxuIiwgZXhjZXB0aW9uX25hbWVzW2ldLm5hbWUpOworI2VuZGlmIC8qIFBSSU5UX01FU1NBR0VTICovCisJfQorICAgICAgZWxzZQorCXByaW50aygiRlBVIGVtdWxhdG9yOiBVbmtub3duIEV4Y2VwdGlvbjogMHglMDR4IVxuIiwgbik7CisgICAgICAKKyAgICAgIGlmICggbiA9PSBFWF9JTlRFUk5BTCApCisJeworCSAgcHJpbnRrKCJGUFUgZW11bGF0b3I6IEludGVybmFsIGVycm9yIHR5cGUgMHglMDR4XG4iLCBpbnRfdHlwZSk7CisJICBGUFVfcHJpbnRhbGwoKTsKKwl9CisjaWZkZWYgUFJJTlRfTUVTU0FHRVMKKyAgICAgIGVsc2UKKwlGUFVfcHJpbnRhbGwoKTsKKyNlbmRpZiAvKiBQUklOVF9NRVNTQUdFUyAqLworCisgICAgICAvKgorICAgICAgICogVGhlIDgwNDg2IGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQgb24gdGhlIG5leHQgbm9uLWNvbnRyb2wgRlBVCisgICAgICAgKiBpbnN0cnVjdGlvbi4gU28gd2UgbmVlZCBzb21lIG1lYW5zIG9mIGZsYWdnaW5nIGl0LgorICAgICAgICogV2UgdXNlIHRoZSBFUyAoRXJyb3IgU3VtbWFyeSkgYml0IGZvciB0aGlzLgorICAgICAgICovCisgICAgfQorICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisjaWZkZWYgX19ERUJVR19fCisgIG1hdGhfYWJvcnQoRlBVX2luZm8sU0lHRlBFKTsKKyNlbmRpZiAvKiBfX0RFQlVHX18gKi8KKworfQorCisKKy8qIFJlYWwgb3BlcmF0aW9uIGF0dGVtcHRlZCBvbiBhIE5hTi4gKi8KKy8qIFJldHVybnMgPCAwIGlmIHRoZSBleGNlcHRpb24gaXMgdW5tYXNrZWQgKi8KK2ludCByZWFsXzFvcF9OYU4oRlBVX1JFRyAqYSkKK3sKKyAgaW50IHNpZ25hbGxpbmcsIGlzTmFOOworCisgIGlzTmFOID0gKGV4cG9uZW50KGEpID09IEVYUF9PVkVSKSAmJiAoYS0+c2lnaCAmIDB4ODAwMDAwMDApOworCisgIC8qIFRoZSBkZWZhdWx0IHJlc3VsdCBmb3IgdGhlIGNhc2Ugb2YgdHdvICJlcXVhbCIgTmFOcyAoc2lnbnMgbWF5CisgICAgIGRpZmZlcikgaXMgY2hvc2VuIHRvIHJlcHJvZHVjZSA4MDQ4NiBiZWhhdmlvdXIgKi8KKyAgc2lnbmFsbGluZyA9IGlzTmFOICYmICEoYS0+c2lnaCAmIDB4NDAwMDAwMDApOworCisgIGlmICggIXNpZ25hbGxpbmcgKQorICAgIHsKKyAgICAgIGlmICggIWlzTmFOICkgIC8qIHBzZXVkby1OYU4sIG9yIG90aGVyIHVuc3VwcG9ydGVkPyAqLworCXsKKwkgIGlmICggY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCApCisJICAgIHsKKwkgICAgICAvKiBNYXNrZWQgcmVzcG9uc2UgKi8KKwkgICAgICByZWdfY29weSgmQ09OU1RfUU5hTiwgYSk7CisJICAgIH0KKwkgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKwkgIHJldHVybiAoIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKSA/IEZQVV9FeGNlcHRpb24gOiAwKSB8IFRBR19TcGVjaWFsOworCX0KKyAgICAgIHJldHVybiBUQUdfU3BlY2lhbDsKKyAgICB9CisKKyAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKyAgICB7CisgICAgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisgICAgICBpZiAoICEoYS0+c2lnaCAmIDB4ODAwMDAwMDApICkgIC8qIHBzZXVkby1OYU4gPyAqLworCXsKKwkgIHJlZ19jb3B5KCZDT05TVF9RTmFOLCBhKTsKKwl9CisgICAgICAvKiBlbnN1cmUgYSBRdWlldCBOYU4gKi8KKyAgICAgIGEtPnNpZ2ggfD0gMHg0MDAwMDAwMDsKKyAgICB9CisKKyAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCisgIHJldHVybiAoIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKSA/IEZQVV9FeGNlcHRpb24gOiAwKSB8IFRBR19TcGVjaWFsOworfQorCisKKy8qIFJlYWwgb3BlcmF0aW9uIGF0dGVtcHRlZCBvbiB0d28gb3BlcmFuZHMsIG9uZSBhIE5hTi4gKi8KKy8qIFJldHVybnMgPCAwIGlmIHRoZSBleGNlcHRpb24gaXMgdW5tYXNrZWQgKi8KK2ludCByZWFsXzJvcF9OYU4oRlBVX1JFRyBjb25zdCAqYiwgdV9jaGFyIHRhZ2IsCisJCSBpbnQgZGVzdHN0bnIsCisJCSBGUFVfUkVHIGNvbnN0ICpkZWZhdWx0TmFOKQoreworICBGUFVfUkVHICpkZXN0ID0gJnN0KGRlc3RzdG5yKTsKKyAgRlBVX1JFRyBjb25zdCAqYSA9IGRlc3Q7CisgIHVfY2hhciB0YWdhID0gRlBVX2dldHRhZ2koZGVzdHN0bnIpOworICBGUFVfUkVHIGNvbnN0ICp4OworICBpbnQgc2lnbmFsbGluZywgdW5zdXBwb3J0ZWQ7CisKKyAgaWYgKCB0YWdhID09IFRBR19TcGVjaWFsICkKKyAgICB0YWdhID0gRlBVX1NwZWNpYWwoYSk7CisgIGlmICggdGFnYiA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnYiA9IEZQVV9TcGVjaWFsKGIpOworCisgIC8qIFRXX05hTiBpcyBhbHNvIHVzZWQgZm9yIHVuc3VwcG9ydGVkIGRhdGEgdHlwZXMuICovCisgIHVuc3VwcG9ydGVkID0gKCh0YWdhID09IFRXX05hTikKKwkJICYmICEoKGV4cG9uZW50KGEpID09IEVYUF9PVkVSKSAmJiAoYS0+c2lnaCAmIDB4ODAwMDAwMDApKSkKKyAgICB8fCAoKHRhZ2IgPT0gVFdfTmFOKQorCSYmICEoKGV4cG9uZW50KGIpID09IEVYUF9PVkVSKSAmJiAoYi0+c2lnaCAmIDB4ODAwMDAwMDApKSk7CisgIGlmICggdW5zdXBwb3J0ZWQgKQorICAgIHsKKyAgICAgIGlmICggY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCApCisJeworCSAgLyogTWFza2VkIHJlc3BvbnNlICovCisJICBGUFVfY29weV90b19yZWdpKCZDT05TVF9RTmFOLCBUQUdfU3BlY2lhbCwgZGVzdHN0bnIpOworCX0KKyAgICAgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKyAgICAgIHJldHVybiAoIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKSA/IEZQVV9FeGNlcHRpb24gOiAwKSB8IFRBR19TcGVjaWFsOworICAgIH0KKworICBpZiAodGFnYSA9PSBUV19OYU4pCisgICAgeworICAgICAgeCA9IGE7CisgICAgICBpZiAodGFnYiA9PSBUV19OYU4pCisJeworCSAgc2lnbmFsbGluZyA9ICEoYS0+c2lnaCAmIGItPnNpZ2ggJiAweDQwMDAwMDAwKTsKKwkgIGlmICggc2lnbmlmaWNhbmQoYikgPiBzaWduaWZpY2FuZChhKSApCisJICAgIHggPSBiOworCSAgZWxzZSBpZiAoIHNpZ25pZmljYW5kKGIpID09IHNpZ25pZmljYW5kKGEpICkKKwkgICAgeworCSAgICAgIC8qIFRoZSBkZWZhdWx0IHJlc3VsdCBmb3IgdGhlIGNhc2Ugb2YgdHdvICJlcXVhbCIgTmFOcyAoc2lnbnMgbWF5CisJCSBkaWZmZXIpIGlzIGNob3NlbiB0byByZXByb2R1Y2UgODA0ODYgYmVoYXZpb3VyICovCisJICAgICAgeCA9IGRlZmF1bHROYU47CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogcmV0dXJuIHRoZSBxdWlldCB2ZXJzaW9uIG9mIHRoZSBOYU4gaW4gYSAqLworCSAgc2lnbmFsbGluZyA9ICEoYS0+c2lnaCAmIDB4NDAwMDAwMDApOworCX0KKyAgICB9CisgIGVsc2UKKyNpZmRlZiBQQVJBTk9JRAorICAgIGlmICh0YWdiID09IFRXX05hTikKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworICAgIHsKKyAgICAgIHNpZ25hbGxpbmcgPSAhKGItPnNpZ2ggJiAweDQwMDAwMDAwKTsKKyAgICAgIHggPSBiOworICAgIH0KKyNpZmRlZiBQQVJBTk9JRAorICBlbHNlCisgICAgeworICAgICAgc2lnbmFsbGluZyA9IDA7CisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMTMpOworICAgICAgeCA9ICZDT05TVF9RTmFOOworICAgIH0KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisgIGlmICggKCFzaWduYWxsaW5nKSB8fCAoY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCkgKQorICAgIHsKKyAgICAgIGlmICggISB4ICkKKwl4ID0gYjsKKworICAgICAgaWYgKCAhKHgtPnNpZ2ggJiAweDgwMDAwMDAwKSApICAvKiBwc2V1ZG8tTmFOID8gKi8KKwl4ID0gJkNPTlNUX1FOYU47CisKKyAgICAgIEZQVV9jb3B5X3RvX3JlZ2koeCwgVEFHX1NwZWNpYWwsIGRlc3RzdG5yKTsKKworICAgICAgaWYgKCAhc2lnbmFsbGluZyApCisJcmV0dXJuIFRBR19TcGVjaWFsOworCisgICAgICAvKiBlbnN1cmUgYSBRdWlldCBOYU4gKi8KKyAgICAgIGRlc3QtPnNpZ2ggfD0gMHg0MDAwMDAwMDsKKyAgICB9CisKKyAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCisgIHJldHVybiAoIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKSA/IEZQVV9FeGNlcHRpb24gOiAwKSB8IFRBR19TcGVjaWFsOworfQorCisKKy8qIEludmFsaWQgYXJpdGggb3BlcmF0aW9uIG9uIFZhbGlkIHJlZ2lzdGVycyAqLworLyogUmV0dXJucyA8IDAgaWYgdGhlIGV4Y2VwdGlvbiBpcyB1bm1hc2tlZCAqLworYXNtbGlua2FnZSBpbnQgYXJpdGhfaW52YWxpZChpbnQgZGVzdHN0bnIpCit7CisKKyAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworICAKKyAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKyAgICB7CisgICAgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisgICAgICBGUFVfY29weV90b19yZWdpKCZDT05TVF9RTmFOLCBUQUdfU3BlY2lhbCwgZGVzdHN0bnIpOworICAgIH0KKyAgCisgIHJldHVybiAoIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKSA/IEZQVV9FeGNlcHRpb24gOiAwKSB8IFRBR19WYWxpZDsKKworfQorCisKKy8qIERpdmlkZSBhIGZpbml0ZSBudW1iZXIgYnkgemVybyAqLworYXNtbGlua2FnZSBpbnQgRlBVX2RpdmlkZV9ieV96ZXJvKGludCBkZXN0c3RuciwgdV9jaGFyIHNpZ24pCit7CisgIEZQVV9SRUcgKmRlc3QgPSAmc3QoZGVzdHN0bnIpOworICBpbnQgdGFnID0gVEFHX1ZhbGlkOworCisgIGlmICggY29udHJvbF93b3JkICYgQ1dfWmVyb0RpdiApCisgICAgeworICAgICAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworICAgICAgRlBVX2NvcHlfdG9fcmVnaSgmQ09OU1RfSU5GLCBUQUdfU3BlY2lhbCwgZGVzdHN0bnIpOworICAgICAgc2V0c2lnbihkZXN0LCBzaWduKTsKKyAgICAgIHRhZyA9IFRBR19TcGVjaWFsOworICAgIH0KKyAKKyAgRVhDRVBUSU9OKEVYX1plcm9EaXYpOworCisgIHJldHVybiAoIShjb250cm9sX3dvcmQgJiBDV19aZXJvRGl2KSA/IEZQVV9FeGNlcHRpb24gOiAwKSB8IHRhZzsKKworfQorCisKKy8qIFRoaXMgbWF5IGJlIGNhbGxlZCBvZnRlbiwgc28ga2VlcCBpdCBsZWFuICovCitpbnQgc2V0X3ByZWNpc2lvbl9mbGFnKGludCBmbGFncykKK3sKKyAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19QcmVjaXNpb24gKQorICAgIHsKKyAgICAgIHBhcnRpYWxfc3RhdHVzICY9IH4oU1dfQzEgJiBmbGFncyk7CisgICAgICBwYXJ0aWFsX3N0YXR1cyB8PSBmbGFnczsgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBFWENFUFRJT04oZmxhZ3MpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisKKy8qIFRoaXMgbWF5IGJlIGNhbGxlZCBvZnRlbiwgc28ga2VlcCBpdCBsZWFuICovCithc21saW5rYWdlIHZvaWQgc2V0X3ByZWNpc2lvbl9mbGFnX3VwKHZvaWQpCit7CisgIGlmICggY29udHJvbF93b3JkICYgQ1dfUHJlY2lzaW9uICkKKyAgICBwYXJ0aWFsX3N0YXR1cyB8PSAoU1dfUHJlY2lzaW9uIHwgU1dfQzEpOyAgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKyAgZWxzZQorICAgIEVYQ0VQVElPTihFWF9QcmVjaXNpb24gfCBTV19DMSk7Cit9CisKKworLyogVGhpcyBtYXkgYmUgY2FsbGVkIG9mdGVuLCBzbyBrZWVwIGl0IGxlYW4gKi8KK2FzbWxpbmthZ2Ugdm9pZCBzZXRfcHJlY2lzaW9uX2ZsYWdfZG93bih2b2lkKQoreworICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX1ByZWNpc2lvbiApCisgICAgeyAgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKyAgICAgIHBhcnRpYWxfc3RhdHVzICY9IH5TV19DMTsKKyAgICAgIHBhcnRpYWxfc3RhdHVzIHw9IFNXX1ByZWNpc2lvbjsKKyAgICB9CisgIGVsc2UKKyAgICBFWENFUFRJT04oRVhfUHJlY2lzaW9uKTsKK30KKworCithc21saW5rYWdlIGludCBkZW5vcm1hbF9vcGVyYW5kKHZvaWQpCit7CisgIGlmICggY29udHJvbF93b3JkICYgQ1dfRGVub3JtYWwgKQorICAgIHsgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisgICAgICBwYXJ0aWFsX3N0YXR1cyB8PSBTV19EZW5vcm1fT3A7CisgICAgICByZXR1cm4gVEFHX1NwZWNpYWw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgRVhDRVBUSU9OKEVYX0Rlbm9ybWFsKTsKKyAgICAgIHJldHVybiBUQUdfU3BlY2lhbCB8IEZQVV9FeGNlcHRpb247CisgICAgfQorfQorCisKK2FzbWxpbmthZ2UgaW50IGFyaXRoX292ZXJmbG93KEZQVV9SRUcgKmRlc3QpCit7CisgIGludCB0YWcgPSBUQUdfVmFsaWQ7CisKKyAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19PdmVyZmxvdyApCisgICAgeworICAgICAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworLyogIyMjIyMjIFRoZSByZXNwb25zZSBoZXJlIGRlcGVuZHMgdXBvbiB0aGUgcm91bmRpbmcgbW9kZSAqLworICAgICAgcmVnX2NvcHkoJkNPTlNUX0lORiwgZGVzdCk7CisgICAgICB0YWcgPSBUQUdfU3BlY2lhbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBTdWJ0cmFjdCB0aGUgbWFnaWMgbnVtYmVyIGZyb20gdGhlIGV4cG9uZW50ICovCisgICAgICBhZGRleHBvbmVudChkZXN0LCAoLTMgKiAoMSA8PCAxMykpKTsKKyAgICB9CisKKyAgRVhDRVBUSU9OKEVYX092ZXJmbG93KTsKKyAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19PdmVyZmxvdyApCisgICAgeworICAgICAgLyogVGhlIG92ZXJmbG93IGV4Y2VwdGlvbiBpcyBtYXNrZWQuICovCisgICAgICAvKiBCeSBkZWZpbml0aW9uLCBwcmVjaXNpb24gaXMgbG9zdC4KKwkgVGhlIHJvdW5kdXAgYml0IChDMSkgaXMgYWxzbyBzZXQgYmVjYXVzZSB3ZSBoYXZlCisJICJyb3VuZGVkIiB1cHdhcmRzIHRvIEluZmluaXR5LiAqLworICAgICAgRVhDRVBUSU9OKEVYX1ByZWNpc2lvbiB8IFNXX0MxKTsKKyAgICAgIHJldHVybiB0YWc7CisgICAgfQorCisgIHJldHVybiB0YWc7CisKK30KKworCithc21saW5rYWdlIGludCBhcml0aF91bmRlcmZsb3coRlBVX1JFRyAqZGVzdCkKK3sKKyAgaW50IHRhZyA9IFRBR19WYWxpZDsKKworICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX1VuZGVyZmxvdyApCisgICAgeworICAgICAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworICAgICAgaWYgKCBleHBvbmVudDE2KGRlc3QpIDw9IEVYUF9VTkRFUiAtIDYzICkKKwl7CisJICByZWdfY29weSgmQ09OU1RfWiwgZGVzdCk7CisJICBwYXJ0aWFsX3N0YXR1cyAmPSB+U1dfQzE7ICAgICAgIC8qIFJvdW5kIGRvd24uICovCisJICB0YWcgPSBUQUdfWmVybzsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RkZXhwKGRlc3QpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBBZGQgdGhlIG1hZ2ljIG51bWJlciB0byB0aGUgZXhwb25lbnQuICovCisgICAgICBhZGRleHBvbmVudChkZXN0LCAoMyAqICgxIDw8IDEzKSkgKyBFWFRFTkRFRF9FYmlhcyk7CisgICAgfQorCisgIEVYQ0VQVElPTihFWF9VbmRlcmZsb3cpOworICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX1VuZGVyZmxvdyApCisgICAgeworICAgICAgLyogVGhlIHVuZGVyZmxvdyBleGNlcHRpb24gaXMgbWFza2VkLiAqLworICAgICAgRVhDRVBUSU9OKEVYX1ByZWNpc2lvbik7CisgICAgICByZXR1cm4gdGFnOworICAgIH0KKworICByZXR1cm4gdGFnOworCit9CisKKwordm9pZCBGUFVfc3RhY2tfb3ZlcmZsb3codm9pZCkKK3sKKworIGlmICggY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCApCisgICAgeworICAgICAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworICAgICAgdG9wLS07CisgICAgICBGUFVfY29weV90b19yZWcwKCZDT05TVF9RTmFOLCBUQUdfU3BlY2lhbCk7CisgICAgfQorCisgIEVYQ0VQVElPTihFWF9TdGFja092ZXIpOworCisgIHJldHVybjsKKworfQorCisKK3ZvaWQgRlBVX3N0YWNrX3VuZGVyZmxvdyh2b2lkKQoreworCisgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKyAgICB7CisgICAgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisgICAgICBGUFVfY29weV90b19yZWcwKCZDT05TVF9RTmFOLCBUQUdfU3BlY2lhbCk7CisgICAgfQorCisgIEVYQ0VQVElPTihFWF9TdGFja1VuZGVyKTsKKworICByZXR1cm47CisKK30KKworCit2b2lkIEZQVV9zdGFja191bmRlcmZsb3dfaShpbnQgaSkKK3sKKworIGlmICggY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCApCisgICAgeworICAgICAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworICAgICAgRlBVX2NvcHlfdG9fcmVnaSgmQ09OU1RfUU5hTiwgVEFHX1NwZWNpYWwsIGkpOworICAgIH0KKworICBFWENFUFRJT04oRVhfU3RhY2tVbmRlcik7CisKKyAgcmV0dXJuOworCit9CisKKwordm9pZCBGUFVfc3RhY2tfdW5kZXJmbG93X3BvcChpbnQgaSkKK3sKKworIGlmICggY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCApCisgICAgeworICAgICAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworICAgICAgRlBVX2NvcHlfdG9fcmVnaSgmQ09OU1RfUU5hTiwgVEFHX1NwZWNpYWwsIGkpOworICAgICAgRlBVX3BvcCgpOworICAgIH0KKworICBFWENFUFRJT04oRVhfU3RhY2tVbmRlcik7CisKKyAgcmV0dXJuOworCit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9leGNlcHRpb24uaCBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9leGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDYzZjIxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2V4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIGV4Y2VwdGlvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCAgIGJpbGxtQHZheGMuY2MubW9uYXNoLmVkdS5hdSAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfRVhDRVBUSU9OX0hfCisjZGVmaW5lIF9FWENFUFRJT05fSF8KKworCisjaWZkZWYgX19BU1NFTUJMWV9fCisjZGVmaW5lCUNvbnN0Xyh4KQkkIyN4CisjZWxzZQorI2RlZmluZQlDb25zdF8oeCkJeAorI2VuZGlmCisKKyNpZm5kZWYgU1dfQzEKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjZW5kaWYgLyogU1dfQzEgKi8KKworI2RlZmluZSBGUFVfQlVTWSAgICAgICAgQ29uc3RfKDB4ODAwMCkgICAvKiBGUFUgYnVzeSBiaXQgKDgwODcgY29tcGF0aWJpbGl0eSkgKi8KKyNkZWZpbmUgRVhfRXJyb3JTdW1tYXJ5IENvbnN0XygweDAwODApICAgLyogRXJyb3Igc3VtbWFyeSBzdGF0dXMgKi8KKy8qIFNwZWNpYWwgZXhjZXB0aW9uczogKi8KKyNkZWZpbmUJRVhfSU5URVJOQUwJQ29uc3RfKDB4ODAwMCkJLyogSW50ZXJuYWwgZXJyb3IgaW4gd20tRlBVLWVtdSAqLworI2RlZmluZSBFWF9TdGFja092ZXIJQ29uc3RfKDB4MDA0MXxTV19DMSkJLyogc3RhY2sgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRVhfU3RhY2tVbmRlcglDb25zdF8oMHgwMDQxKQkvKiBzdGFjayB1bmRlcmZsb3cgKi8KKy8qIEV4Y2VwdGlvbiBmbGFnczogKi8KKyNkZWZpbmUgRVhfUHJlY2lzaW9uCUNvbnN0XygweDAwMjApCS8qIGxvc3Mgb2YgcHJlY2lzaW9uICovCisjZGVmaW5lIEVYX1VuZGVyZmxvdwlDb25zdF8oMHgwMDEwKQkvKiB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgRVhfT3ZlcmZsb3cJQ29uc3RfKDB4MDAwOCkJLyogb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRVhfWmVyb0RpdglDb25zdF8oMHgwMDA0KQkvKiBkaXZpZGUgYnkgemVybyAqLworI2RlZmluZSBFWF9EZW5vcm1hbAlDb25zdF8oMHgwMDAyKQkvKiBkZW5vcm1hbGl6ZWQgb3BlcmFuZCAqLworI2RlZmluZSBFWF9JbnZhbGlkCUNvbnN0XygweDAwMDEpCS8qIGludmFsaWQgb3BlcmF0aW9uICovCisKKworI2RlZmluZSBQUkVDSVNJT05fTE9TVF9VUCAgICBDb25zdF8oKEVYX1ByZWNpc2lvbiB8IFNXX0MxKSkKKyNkZWZpbmUgUFJFQ0lTSU9OX0xPU1RfRE9XTiAgQ29uc3RfKEVYX1ByZWNpc2lvbikKKworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUJRVhDRVBUSU9OKHgpCXsgcHJpbnRrKCJleGNlcHRpb24gaW4gJXMgYXQgbGluZSAlZFxuIiwgXAorCV9fRklMRV9fLCBfX0xJTkVfXyk7IEZQVV9leGNlcHRpb24oeCk7IH0KKyNlbHNlCisjZGVmaW5lCUVYQ0VQVElPTih4KQlGUFVfZXhjZXB0aW9uKHgpCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLyAKKworI2VuZGlmIC8qIF9FWENFUFRJT05fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfYXJpdGguYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfYXJpdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTcyZGVjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9hcml0aC5jCkBAIC0wLDAgKzEsMTc0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBmcHVfYXJpdGguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb2RlIHRvIGltcGxlbWVudCB0aGUgRlBVIHJlZ2lzdGVyL3JlZ2lzdGVyIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjaW5jbHVkZSAiY29udHJvbF93LmgiCisjaW5jbHVkZSAic3RhdHVzX3cuaCIKKworCit2b2lkIGZhZGRfXyh2b2lkKQoreworICAvKiBmYWRkIHN0LHN0KGkpICovCisgIGludCBpID0gRlBVX3JtOworICBjbGVhcl9DMSgpOworICBGUFVfYWRkKCZzdChpKSwgRlBVX2dldHRhZ2koaSksIDAsIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmbXVsX18odm9pZCkKK3sKKyAgLyogZm11bCBzdCxzdChpKSAqLworICBpbnQgaSA9IEZQVV9ybTsKKyAgY2xlYXJfQzEoKTsKKyAgRlBVX211bCgmc3QoaSksIEZQVV9nZXR0YWdpKGkpLCAwLCBjb250cm9sX3dvcmQpOworfQorCisKKwordm9pZCBmc3ViX18odm9pZCkKK3sKKyAgLyogZnN1YiBzdCxzdChpKSAqLworICBjbGVhcl9DMSgpOworICBGUFVfc3ViKDAsIEZQVV9ybSwgY29udHJvbF93b3JkKTsKK30KKworCit2b2lkIGZzdWJyXyh2b2lkKQoreworICAvKiBmc3ViciBzdCxzdChpKSAqLworICBjbGVhcl9DMSgpOworICBGUFVfc3ViKFJFViwgRlBVX3JtLCBjb250cm9sX3dvcmQpOworfQorCisKK3ZvaWQgZmRpdl9fKHZvaWQpCit7CisgIC8qIGZkaXYgc3Qsc3QoaSkgKi8KKyAgY2xlYXJfQzEoKTsKKyAgRlBVX2RpdigwLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmZGl2cl8odm9pZCkKK3sKKyAgLyogZmRpdnIgc3Qsc3QoaSkgKi8KKyAgY2xlYXJfQzEoKTsKKyAgRlBVX2RpdihSRVYsIEZQVV9ybSwgY29udHJvbF93b3JkKTsKK30KKworCisKK3ZvaWQgZmFkZF9pKHZvaWQpCit7CisgIC8qIGZhZGQgc3QoaSksc3QgKi8KKyAgaW50IGkgPSBGUFVfcm07CisgIGNsZWFyX0MxKCk7CisgIEZQVV9hZGQoJnN0KGkpLCBGUFVfZ2V0dGFnaShpKSwgaSwgY29udHJvbF93b3JkKTsKK30KKworCit2b2lkIGZtdWxfaSh2b2lkKQoreworICAvKiBmbXVsIHN0KGkpLHN0ICovCisgIGNsZWFyX0MxKCk7CisgIEZQVV9tdWwoJnN0KDApLCBGUFVfZ2V0dGFnMCgpLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmc3Vicmkodm9pZCkKK3sKKyAgLyogZnN1YnIgc3QoaSksc3QgKi8KKyAgY2xlYXJfQzEoKTsKKyAgRlBVX3N1YihERVNUX1JNLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmc3ViX2kodm9pZCkKK3sKKyAgLyogZnN1YiBzdChpKSxzdCAqLworICBjbGVhcl9DMSgpOworICBGUFVfc3ViKFJFVnxERVNUX1JNLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmZGl2cmkodm9pZCkKK3sKKyAgLyogZmRpdnIgc3QoaSksc3QgKi8KKyAgY2xlYXJfQzEoKTsKKyAgRlBVX2RpdihERVNUX1JNLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKwordm9pZCBmZGl2X2kodm9pZCkKK3sKKyAgLyogZmRpdiBzdChpKSxzdCAqLworICBjbGVhcl9DMSgpOworICBGUFVfZGl2KFJFVnxERVNUX1JNLCBGUFVfcm0sIGNvbnRyb2xfd29yZCk7Cit9CisKKworCit2b2lkIGZhZGRwXyh2b2lkKQoreworICAvKiBmYWRkcCBzdChpKSxzdCAqLworICBpbnQgaSA9IEZQVV9ybTsKKyAgY2xlYXJfQzEoKTsKKyAgaWYgKCBGUFVfYWRkKCZzdChpKSwgRlBVX2dldHRhZ2koaSksIGksIGNvbnRyb2xfd29yZCkgPj0gMCApCisgICAgRlBVX3BvcCgpOworfQorCisKK3ZvaWQgZm11bHBfKHZvaWQpCit7CisgIC8qIGZtdWxwIHN0KGkpLHN0ICovCisgIGNsZWFyX0MxKCk7CisgIGlmICggRlBVX211bCgmc3QoMCksIEZQVV9nZXR0YWcwKCksIEZQVV9ybSwgY29udHJvbF93b3JkKSA+PSAwICkKKyAgICBGUFVfcG9wKCk7Cit9CisKKworCit2b2lkIGZzdWJycCh2b2lkKQoreworICAvKiBmc3VicnAgc3QoaSksc3QgKi8KKyAgY2xlYXJfQzEoKTsKKyAgaWYgKCBGUFVfc3ViKERFU1RfUk0sIEZQVV9ybSwgY29udHJvbF93b3JkKSA+PSAwICkKKyAgICBGUFVfcG9wKCk7Cit9CisKKwordm9pZCBmc3VicF8odm9pZCkKK3sKKyAgLyogZnN1YnAgc3QoaSksc3QgKi8KKyAgY2xlYXJfQzEoKTsKKyAgaWYgKCBGUFVfc3ViKFJFVnxERVNUX1JNLCBGUFVfcm0sIGNvbnRyb2xfd29yZCkgPj0gMCApCisgICAgRlBVX3BvcCgpOworfQorCisKK3ZvaWQgZmRpdnJwKHZvaWQpCit7CisgIC8qIGZkaXZycCBzdChpKSxzdCAqLworICBjbGVhcl9DMSgpOworICBpZiAoIEZQVV9kaXYoREVTVF9STSwgRlBVX3JtLCBjb250cm9sX3dvcmQpID49IDAgKQorICAgIEZQVV9wb3AoKTsKK30KKworCit2b2lkIGZkaXZwXyh2b2lkKQoreworICAvKiBmZGl2cCBzdChpKSxzdCAqLworICBjbGVhcl9DMSgpOworICBpZiAoIEZQVV9kaXYoUkVWfERFU1RfUk0sIEZQVV9ybSwgY29udHJvbF93b3JkKSA+PSAwICkKKyAgICBGUFVfcG9wKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X2FzbS5oIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmExMjQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9hc20uaApAQCAtMCwwICsxLDMyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBmcHVfYXNtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfRlBVX0FTTV9IXworI2RlZmluZSBfRlBVX0FTTV9IXworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorCisjZGVmaW5lCUVYQ0VQVElPTglGUFVfZXhjZXB0aW9uCisKKworI2RlZmluZSBQQVJBTTEJOCglZWJwKQorI2RlZmluZQlQQVJBTTIJMTIoJWVicCkKKyNkZWZpbmUJUEFSQU0zCTE2KCVlYnApCisjZGVmaW5lCVBBUkFNNAkyMCglZWJwKQorI2RlZmluZQlQQVJBTTUJMjQoJWVicCkKKyNkZWZpbmUJUEFSQU02CTI4KCVlYnApCisjZGVmaW5lCVBBUkFNNwkzMiglZWJwKQorCisjZGVmaW5lIFNJR0xfT0ZGU0VUIDAKKyNkZWZpbmUJRVhQKHgpCTgoeCkKKyNkZWZpbmUgU0lHKHgpCVNJR0xfT0ZGU0VUIyMoeCkKKyNkZWZpbmUJU0lHTCh4KQlTSUdMX09GRlNFVCMjKHgpCisjZGVmaW5lCVNJR0goeCkJNCh4KQorCisjZW5kaWYgLyogX0ZQVV9BU01fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfYXV4LmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X2F1eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwODg2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X2F1eC5jCkBAIC0wLDAgKzEsMjA0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBmcHVfYXV4LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb2RlIHRvIGltcGxlbWVudCBzb21lIG9mIHRoZSBGUFUgYXV4aWxpYXJ5IGluc3RydWN0aW9ucy4gICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjaW5jbHVkZSAic3RhdHVzX3cuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKworCitzdGF0aWMgdm9pZCBmbm9wKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIGZjbGV4KHZvaWQpCit7CisgIHBhcnRpYWxfc3RhdHVzICY9IH4oU1dfQmFja3dhcmR8U1dfU3VtbWFyeXxTV19TdGFja19GYXVsdHxTV19QcmVjaXNpb258CisJCSAgIFNXX1VuZGVyZmxvd3xTV19PdmVyZmxvd3xTV19aZXJvX0RpdnxTV19EZW5vcm1fT3B8CisJCSAgIFNXX0ludmFsaWQpOworICBub19pcF91cGRhdGUgPSAxOworfQorCisvKiBOZWVkcyB0byBiZSBleHRlcm5hbGx5IHZpc2libGUgKi8KK3ZvaWQgZmluaXQodm9pZCkKK3sKKyAgY29udHJvbF93b3JkID0gMHgwMzdmOworICBwYXJ0aWFsX3N0YXR1cyA9IDA7CisgIHRvcCA9IDA7ICAgICAgICAgICAgLyogV2UgZG9uJ3Qga2VlcCB0b3AgaW4gdGhlIHN0YXR1cyB3b3JkIGludGVybmFsbHkuICovCisgIGZwdV90YWdfd29yZCA9IDB4ZmZmZjsKKyAgLyogVGhlIGJlaGF2aW91ciBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IGRldGFpbGVkIGluCisgICAgIFNlY3Rpb24gMTUuMS42IG9mIHRoZSBJbnRlbCBtYW51YWwgKi8KKyAgb3BlcmFuZF9hZGRyZXNzLm9mZnNldCA9IDA7CisgIG9wZXJhbmRfYWRkcmVzcy5zZWxlY3RvciA9IDA7CisgIGluc3RydWN0aW9uX2FkZHJlc3Mub2Zmc2V0ID0gMDsKKyAgaW5zdHJ1Y3Rpb25fYWRkcmVzcy5zZWxlY3RvciA9IDA7CisgIGluc3RydWN0aW9uX2FkZHJlc3Mub3Bjb2RlID0gMDsKKyAgbm9faXBfdXBkYXRlID0gMTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSBub3BzIG9uIHRoZSBpMzg3Li4KKyAqLworI2RlZmluZSBmZW5pIGZub3AKKyNkZWZpbmUgZmRpc2kgZm5vcAorI2RlZmluZSBmc2V0cG0gZm5vcAorCitzdGF0aWMgRlVOQyBjb25zdCBmaW5pdF90YWJsZVtdID0geworICBmZW5pLCBmZGlzaSwgZmNsZXgsIGZpbml0LAorICBmc2V0cG0sIEZQVV9pbGxlZ2FsLCBGUFVfaWxsZWdhbCwgRlBVX2lsbGVnYWwKK307CisKK3ZvaWQgZmluaXRfKHZvaWQpCit7CisgIChmaW5pdF90YWJsZVtGUFVfcm1dKSgpOworfQorCisKK3N0YXRpYyB2b2lkIGZzdHN3X2F4KHZvaWQpCit7CisgICooc2hvcnQgKikgJkZQVV9FQVggPSBzdGF0dXNfd29yZCgpOworICBub19pcF91cGRhdGUgPSAxOworfQorCitzdGF0aWMgRlVOQyBjb25zdCBmc3Rzd190YWJsZVtdID0geworICBmc3Rzd19heCwgRlBVX2lsbGVnYWwsIEZQVV9pbGxlZ2FsLCBGUFVfaWxsZWdhbCwKKyAgRlBVX2lsbGVnYWwsIEZQVV9pbGxlZ2FsLCBGUFVfaWxsZWdhbCwgRlBVX2lsbGVnYWwKK307CisKK3ZvaWQgZnN0c3dfKHZvaWQpCit7CisgIChmc3Rzd190YWJsZVtGUFVfcm1dKSgpOworfQorCisKK3N0YXRpYyBGVU5DIGNvbnN0IGZwX25vcF90YWJsZVtdID0geworICBmbm9wLCBGUFVfaWxsZWdhbCwgRlBVX2lsbGVnYWwsIEZQVV9pbGxlZ2FsLAorICBGUFVfaWxsZWdhbCwgRlBVX2lsbGVnYWwsIEZQVV9pbGxlZ2FsLCBGUFVfaWxsZWdhbAorfTsKKwordm9pZCBmcF9ub3Aodm9pZCkKK3sKKyAgKGZwX25vcF90YWJsZVtGUFVfcm1dKSgpOworfQorCisKK3ZvaWQgZmxkX2lfKHZvaWQpCit7CisgIEZQVV9SRUcgKnN0X25ld19wdHI7CisgIGludCBpOworICB1X2NoYXIgdGFnOworCisgIGlmICggU1RBQ0tfT1ZFUkZMT1cgKQorICAgIHsgRlBVX3N0YWNrX292ZXJmbG93KCk7IHJldHVybjsgfQorCisgIC8qIGZsZCBzdChpKSAqLworICBpID0gRlBVX3JtOworICBpZiAoIE5PVF9FTVBUWShpKSApCisgICAgeworICAgICAgcmVnX2NvcHkoJnN0KGkpLCBzdF9uZXdfcHRyKTsKKyAgICAgIHRhZyA9IEZQVV9nZXR0YWdpKGkpOworICAgICAgcHVzaCgpOworICAgICAgRlBVX3NldHRhZzAodGFnKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorCXsKKwkgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKwkgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKwl9CisgICAgICBlbHNlCisJRVhDRVBUSU9OKEVYX1N0YWNrVW5kZXIpOworICAgIH0KKworfQorCisKK3ZvaWQgZnhjaF9pKHZvaWQpCit7CisgIC8qIGZ4Y2ggc3QoaSkgKi8KKyAgRlBVX1JFRyB0OworICBpbnQgaSA9IEZQVV9ybTsKKyAgRlBVX1JFRyAqc3QwX3B0ciA9ICZzdCgwKSwgKnN0aV9wdHIgPSAmc3QoaSk7CisgIGxvbmcgdGFnX3dvcmQgPSBmcHVfdGFnX3dvcmQ7CisgIGludCByZWduciA9IHRvcCAmIDcsIHJlZ25yaSA9ICgocmVnbnIgKyBpKSAmIDcpOworICB1X2NoYXIgc3QwX3RhZyA9ICh0YWdfd29yZCA+PiAocmVnbnIqMikpICYgMzsKKyAgdV9jaGFyIHN0aV90YWcgPSAodGFnX3dvcmQgPj4gKHJlZ25yaSoyKSkgJiAzOworCisgIGlmICggc3QwX3RhZyA9PSBUQUdfRW1wdHkgKQorICAgIHsKKyAgICAgIGlmICggc3RpX3RhZyA9PSBUQUdfRW1wdHkgKQorCXsKKwkgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKwkgIEZQVV9zdGFja191bmRlcmZsb3dfaShpKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorCXsKKwkgIC8qIE1hc2tlZCByZXNwb25zZSAqLworCSAgRlBVX2NvcHlfdG9fcmVnMChzdGlfcHRyLCBzdGlfdGFnKTsKKwl9CisgICAgICBGUFVfc3RhY2tfdW5kZXJmbG93X2koaSk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoIHN0aV90YWcgPT0gVEFHX0VtcHR5ICkKKyAgICB7CisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorCXsKKwkgIC8qIE1hc2tlZCByZXNwb25zZSAqLworCSAgRlBVX2NvcHlfdG9fcmVnaShzdDBfcHRyLCBzdDBfdGFnLCBpKTsKKwl9CisgICAgICBGUFVfc3RhY2tfdW5kZXJmbG93KCk7CisgICAgICByZXR1cm47CisgICAgfQorICBjbGVhcl9DMSgpOworCisgIHJlZ19jb3B5KHN0MF9wdHIsICZ0KTsKKyAgcmVnX2NvcHkoc3RpX3B0ciwgc3QwX3B0cik7CisgIHJlZ19jb3B5KCZ0LCBzdGlfcHRyKTsKKworICB0YWdfd29yZCAmPSB+KDMgPDwgKHJlZ25yKjIpKSAmIH4oMyA8PCAocmVnbnJpKjIpKTsKKyAgdGFnX3dvcmQgfD0gKHN0aV90YWcgPDwgKHJlZ25yKjIpKSB8IChzdDBfdGFnIDw8IChyZWducmkqMikpOworICBmcHVfdGFnX3dvcmQgPSB0YWdfd29yZDsKK30KKworCit2b2lkIGZmcmVlXyh2b2lkKQoreworICAvKiBmZnJlZSBzdChpKSAqLworICBGUFVfc2V0dGFnaShGUFVfcm0sIFRBR19FbXB0eSk7Cit9CisKKwordm9pZCBmZnJlZXAodm9pZCkKK3sKKyAgLyogZmZyZWUgc3QoaSkgKyBwb3AgLSB1bm9mZmljaWFsIGNvZGUgKi8KKyAgRlBVX3NldHRhZ2koRlBVX3JtLCBUQUdfRW1wdHkpOworICBGUFVfcG9wKCk7Cit9CisKKwordm9pZCBmc3RfaV8odm9pZCkKK3sKKyAgLyogZnN0IHN0KGkpICovCisgIEZQVV9jb3B5X3RvX3JlZ2koJnN0KDApLCBGUFVfZ2V0dGFnMCgpLCBGUFVfcm0pOworfQorCisKK3ZvaWQgZnN0cF9pKHZvaWQpCit7CisgIC8qIGZzdHAgc3QoaSkgKi8KKyAgRlBVX2NvcHlfdG9fcmVnaSgmc3QoMCksIEZQVV9nZXR0YWcwKCksIEZQVV9ybSk7CisgIEZQVV9wb3AoKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9lbXUuaCBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfZW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyYjIwYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfZW11LmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIGZwdV9lbXUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpZm5kZWYgX0ZQVV9FTVVfSF8KKyNkZWZpbmUgX0ZQVV9FTVVfSF8KKworLyoKKyAqIERlZmluZSBQRUNVTElBUl80ODYgdG8gZ2V0IGEgY2xvc2VyIGFwcHJveGltYXRpb24gdG8gODA0ODYgYmVoYXZpb3VyLAorICogcmF0aGVyIHRoYW4gYmVoYXZpb3VyIHdoaWNoIGFwcGVhcnMgdG8gYmUgY2xlYW5lci4KKyAqIFRoaXMgaXMgYSBtYXR0ZXIgb2Ygb3BpbmlvbjogZm9yIGFsbCBJIGtub3csIHRoZSA4MDQ4NiBtYXkgc2ltcGx5CisgKiBiZSBjb21wbHlpbmcgd2l0aCB0aGUgSUVFRSBzcGVjLiBNYXliZSBvbmUgZGF5IEknbGwgZ2V0IHRvIHNlZSB0aGUKKyAqIHNwZWMuLi4KKyAqLworI2RlZmluZSBQRUNVTElBUl80ODYKKworI2lmZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgImZwdV9hc20uaCIKKyNkZWZpbmUJQ29uc3QoeCkJJCMjeAorI2Vsc2UKKyNkZWZpbmUJQ29uc3QoeCkJeAorI2VuZGlmCisKKyNkZWZpbmUgRVhQX0JJQVMJQ29uc3QoMCkKKyNkZWZpbmUgRVhQX09WRVIJQ29uc3QoMHg0MDAwKSAgICAvKiBzbWFsbGVzdCBpbnZhbGlkIGxhcmdlIGV4cG9uZW50ICovCisjZGVmaW5lCUVYUF9VTkRFUglDb25zdCgtMHgzZmZmKSAgIC8qIGxhcmdlc3QgaW52YWxpZCBzbWFsbCBleHBvbmVudCAqLworI2RlZmluZSBFWFBfV0FZX1VOREVSICAgQ29uc3QoLTB4NjAwMCkgICAvKiBCZWxvdyB0aGUgc21hbGxlc3QgZGVub3JtYWwsIGJ1dAorCQkJCQkgICAgc3RpbGwgYSAxNiBiaXQgbnIuICovCisjZGVmaW5lIEVYUF9JbmZpbml0eSAgICBFWFBfT1ZFUgorI2RlZmluZSBFWFBfTmFOICAgICAgICAgRVhQX09WRVIKKworI2RlZmluZSBFWFRFTkRFRF9FYmlhcyBDb25zdCgweDNmZmYpCisjZGVmaW5lIEVYVEVOREVEX0VtaW4gKC0weDNmZmUpICAvKiBzbWFsbGVzdCB2YWxpZCBleHBvbmVudCAqLworCisjZGVmaW5lIFNJR05fUE9TCUNvbnN0KDApCisjZGVmaW5lIFNJR05fTkVHCUNvbnN0KDB4ODApCisKKyNkZWZpbmUgU0lHTl9Qb3NpdGl2ZQlDb25zdCgwKQorI2RlZmluZSBTSUdOX05lZ2F0aXZlCUNvbnN0KDB4ODAwMCkKKworCisvKiBLZWVwIHRoZSBvcmRlciBUQUdfVmFsaWQsIFRBR19aZXJvLCBUV19EZW5vcm1hbCAqLworLyogVGhlIGZvbGxvd2luZyBmb2xkIHRvIDIgKFNwZWNpYWwpIGluIHRoZSBUYWcgV29yZCAqLworI2RlZmluZSBUV19EZW5vcm1hbCAgICAgQ29uc3QoNCkgICAgICAgIC8qIERlLW5vcm1hbCAqLworI2RlZmluZSBUV19JbmZpbml0eQlDb25zdCg1KQkvKiArIG9yIC0gaW5maW5pdHkgKi8KKyNkZWZpbmUJVFdfTmFOCQlDb25zdCg2KQkvKiBOb3QgYSBOdW1iZXIgKi8KKyNkZWZpbmUJVFdfVW5zdXBwb3J0ZWQJQ29uc3QoNykJLyogTm90IHN1cHBvcnRlZCBieSBhbiA4MDQ4NiAqLworCisjZGVmaW5lIFRBR19WYWxpZAlDb25zdCgwKQkvKiB2YWxpZCAqLworI2RlZmluZSBUQUdfWmVybwlDb25zdCgxKQkvKiB6ZXJvICovCisjZGVmaW5lIFRBR19TcGVjaWFsCUNvbnN0KDIpCS8qIERlLW5vcm1hbCwgKyBvciAtIGluZmluaXR5LAorCQkJCQkgICBvciBOb3QgYSBOdW1iZXIgKi8KKyNkZWZpbmUgVEFHX0VtcHR5CUNvbnN0KDMpCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgTE9BREVEX0RBVEEJQ29uc3QoMTAxMDEpCS8qIFNwZWNpYWwgc3QoKSBudW1iZXIgdG8gaWRlbnRpZnkKKwkJCQkJICAgbG9hZGVkIGRhdGEgKG5vdCBvbiBzdGFjaykuICovCisKKy8qIEEgZmV3IGZsYWdzIChtdXN0IGJlID49IDB4MTApLiAqLworI2RlZmluZSBSRVYgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBERVNUX1JNICAgICAgICAgMHgyMAorI2RlZmluZSBMT0FERUQgICAgICAgICAgMHg0MAorCisjZGVmaW5lIEZQVV9FeGNlcHRpb24gICBDb25zdCgweDgwMDAwMDAwKSAgIC8qIEFkZGVkIHRvIHRhZyByZXR1cm5zLiAqLworCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisKKyNpbmNsdWRlIDxhc20vc2lnY29udGV4dC5oPiAgIC8qIGZvciBzdHJ1Y3QgX2Zwc3RhdGUgKi8KKyNpbmNsdWRlIDxhc20vbWF0aF9lbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKy8qCisjZGVmaW5lIFJFX0VOVFJBTlRfQ0hFQ0tJTkcKKyAqLworCisjaWZkZWYgUkVfRU5UUkFOVF9DSEVDS0lORworZXh0ZXJuIHVfY2hhciBlbXVsYXRpbmc7CisjICBkZWZpbmUgUkVfRU5UUkFOVF9DSEVDS19PRkYgZW11bGF0aW5nID0gMAorIyAgZGVmaW5lIFJFX0VOVFJBTlRfQ0hFQ0tfT04gZW11bGF0aW5nID0gMQorI2Vsc2UKKyMgIGRlZmluZSBSRV9FTlRSQU5UX0NIRUNLX09GRgorIyAgZGVmaW5lIFJFX0VOVFJBTlRfQ0hFQ0tfT04KKyNlbmRpZiAvKiBSRV9FTlRSQU5UX0NIRUNLSU5HICovCisKKyNkZWZpbmUgRldBSVRfT1BDT0RFIDB4OWIKKyNkZWZpbmUgT1BfU0laRV9QUkVGSVggMHg2NgorI2RlZmluZSBBRERSX1NJWkVfUFJFRklYIDB4NjcKKyNkZWZpbmUgUFJFRklYX0NTIDB4MmUKKyNkZWZpbmUgUFJFRklYX0RTIDB4M2UKKyNkZWZpbmUgUFJFRklYX0VTIDB4MjYKKyNkZWZpbmUgUFJFRklYX1NTIDB4MzYKKyNkZWZpbmUgUFJFRklYX0ZTIDB4NjQKKyNkZWZpbmUgUFJFRklYX0dTIDB4NjUKKyNkZWZpbmUgUFJFRklYX1JFUEUgMHhmMworI2RlZmluZSBQUkVGSVhfUkVQTkUgMHhmMgorI2RlZmluZSBQUkVGSVhfTE9DSyAweGYwCisjZGVmaW5lIFBSRUZJWF9DU18gMQorI2RlZmluZSBQUkVGSVhfRFNfIDIKKyNkZWZpbmUgUFJFRklYX0VTXyAzCisjZGVmaW5lIFBSRUZJWF9GU18gNAorI2RlZmluZSBQUkVGSVhfR1NfIDUKKyNkZWZpbmUgUFJFRklYX1NTXyA2CisjZGVmaW5lIFBSRUZJWF9ERUZBVUxUIDcKKworc3RydWN0IGFkZHJlc3MgeworICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworICB1bnNpZ25lZCBpbnQgc2VsZWN0b3I6MTY7CisgIHVuc2lnbmVkIGludCBvcGNvZGU6MTE7CisgIHVuc2lnbmVkIGludCBlbXB0eTo1OworfTsKK3N0cnVjdCBmcHVfX3JlZyB7CisgIHVuc2lnbmVkIHNpZ2w7CisgIHVuc2lnbmVkIHNpZ2g7CisgIHNob3J0IGV4cDsKK307CisKK3R5cGVkZWYgdm9pZCAoKkZVTkMpKHZvaWQpOwordHlwZWRlZiBzdHJ1Y3QgZnB1X19yZWcgRlBVX1JFRzsKK3R5cGVkZWYgdm9pZCAoKkZVTkNfU1QwKShGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZyk7Cit0eXBlZGVmIHN0cnVjdCB7IHVfY2hhciBhZGRyZXNzX3NpemUsIG9wZXJhbmRfc2l6ZSwgc2VnbWVudDsgfQorICAgICAgICBvdmVycmlkZXM7CisvKiBUaGlzIHN0cnVjdHVyZSBpcyAzMiBiaXRzOiAqLwordHlwZWRlZiBzdHJ1Y3QgeyBvdmVycmlkZXMgb3ZlcnJpZGU7CisJCSB1X2NoYXIgZGVmYXVsdF9tb2RlOyB9IGZwdV9hZGRyX21vZGVzOworLyogUFJPVEVDVEVEIGhhcyBhIHJlc3RyaWN0ZWQgbWVhbmluZyBpbiB0aGUgZW11bGF0b3I7IGl0IGlzIHVzZWQKKyAgIHRvIHNpZ25hbCB0aGF0IHRoZSBlbXVsYXRvciBuZWVkcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB0byBlbnN1cmUKKyAgIHRoYXQgcHJvdGVjdGlvbiBpcyByZXNwZWN0ZWQgaW4gYSBzZWdtZW50ZWQgbW9kZWwuICovCisjZGVmaW5lIFBST1RFQ1RFRCA0CisjZGVmaW5lIFNJWFRFRU4gICAxICAgICAgICAgLyogV2UgcmVseSB1cG9uIHRoaXMgYmVpbmcgMSAodHJ1ZSkgKi8KKyNkZWZpbmUgVk04NiAgICAgIFNJWFRFRU4KKyNkZWZpbmUgUE0xNiAgICAgIChTSVhURUVOIHwgUFJPVEVDVEVEKQorI2RlZmluZSBTRUczMiAgICAgUFJPVEVDVEVECitleHRlcm4gdV9jaGFyIGNvbnN0IGRhdGFfc2l6ZXNfMTZbMzJdOworCisjZGVmaW5lIHJlZ2lzdGVyX2Jhc2UgKCh1X2NoYXIgKikgcmVnaXN0ZXJzICkKKyNkZWZpbmUgZnB1X3JlZ2lzdGVyKHgpICAoICogKChGUFVfUkVHICopKCByZWdpc3Rlcl9iYXNlICsgMTAgKiAoeCAmIDcpICkpICkKKyNkZWZpbmUJc3QoeCkgICAgICAoICogKChGUFVfUkVHICopKCByZWdpc3Rlcl9iYXNlICsgMTAgKiAoKHRvcCt4KSAmIDcpICkpICkKKworI2RlZmluZQlTVEFDS19PVkVSRkxPVwkoRlBVX3N0YWNrb3ZlcmZsb3coJnN0X25ld19wdHIpKQorI2RlZmluZQlOT1RfRU1QVFkoaSkJKCFGUFVfZW1wdHlfaShpKSkKKworI2RlZmluZQlOT1RfRU1QVFlfU1QwCShzdDBfdGFnIF4gVEFHX0VtcHR5KQorCisjZGVmaW5lIHBvcHBvcCgpIHsgRlBVX3BvcCgpOyBGUFVfcG9wKCk7IH0KKworLyogcHVzaCgpIGRvZXMgbm90IGFmZmVjdCB0aGUgdGFncyAqLworI2RlZmluZSBwdXNoKCkJeyB0b3AtLTsgfQorCisjZGVmaW5lIHNpZ25ieXRlKGEpICgoKHVfY2hhciAqKShhKSlbOV0pCisjZGVmaW5lIGdldHNpZ24oYSkgKHNpZ25ieXRlKGEpICYgMHg4MCkKKyNkZWZpbmUgc2V0c2lnbihhLGIpIHsgaWYgKGIpIHNpZ25ieXRlKGEpIHw9IDB4ODA7IGVsc2Ugc2lnbmJ5dGUoYSkgJj0gMHg3ZjsgfQorI2RlZmluZSBjb3B5c2lnbihhLGIpIHsgaWYgKGdldHNpZ24oYSkpIHNpZ25ieXRlKGIpIHw9IDB4ODA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugc2lnbmJ5dGUoYikgJj0gMHg3ZjsgfQorI2RlZmluZSBjaGFuZ2VzaWduKGEpIHsgc2lnbmJ5dGUoYSkgXj0gMHg4MDsgfQorI2RlZmluZSBzZXRwb3NpdGl2ZShhKSB7IHNpZ25ieXRlKGEpICY9IDB4N2Y7IH0KKyNkZWZpbmUgc2V0bmVnYXRpdmUoYSkgeyBzaWduYnl0ZShhKSB8PSAweDgwOyB9CisjZGVmaW5lIHNpZ25wb3NpdGl2ZShhKSAoIChzaWduYnl0ZShhKSAmIDB4ODApID09IDAgKQorI2RlZmluZSBzaWdubmVnYXRpdmUoYSkgKHNpZ25ieXRlKGEpICYgMHg4MCkKKworc3RhdGljIGlubGluZSB2b2lkIHJlZ19jb3B5KEZQVV9SRUcgY29uc3QgKngsIEZQVV9SRUcgKnkpCit7CisgICooc2hvcnQgKikmKHktPmV4cCkgPSAqKGNvbnN0IHNob3J0ICopJih4LT5leHApOyAKKyAgKihsb25nIGxvbmcgKikmKHktPnNpZ2wpID0gKihjb25zdCBsb25nIGxvbmcgKikmKHgtPnNpZ2wpOworfQorCisjZGVmaW5lIGV4cG9uZW50KHgpICAoKCgqKHNob3J0ICopJigoeCktPmV4cCkpICYgMHg3ZmZmKSAtIEVYVEVOREVEX0ViaWFzKQorI2RlZmluZSBzZXRleHBvbmVudHBvcyh4LHkpIHsgKCooc2hvcnQgKikmKCh4KS0+ZXhwKSkgPSBcCisgICgoeSkgKyBFWFRFTkRFRF9FYmlhcykgJiAweDdmZmY7IH0KKyNkZWZpbmUgZXhwb25lbnQxNih4KSAgICAgICAgICgqKHNob3J0ICopJigoeCktPmV4cCkpCisjZGVmaW5lIHNldGV4cG9uZW50MTYoeCx5KSAgeyAoKihzaG9ydCAqKSYoKHgpLT5leHApKSA9ICh5KTsgfQorI2RlZmluZSBhZGRleHBvbmVudCh4LHkpICAgIHsgKCooc2hvcnQgKikmKCh4KS0+ZXhwKSkgKz0gKHkpOyB9CisjZGVmaW5lIHN0ZGV4cCh4KSAgICAgICAgICAgeyAoKihzaG9ydCAqKSYoKHgpLT5leHApKSArPSBFWFRFTkRFRF9FYmlhczsgfQorCisjZGVmaW5lIGlzZGVub3JtYWwocHRyKSAgIChleHBvbmVudChwdHIpID09IEVYUF9CSUFTK0VYUF9VTkRFUikKKworI2RlZmluZSBzaWduaWZpY2FuZCh4KSAoICgodW5zaWduZWQgbG9uZyBsb25nICopJigoeCktPnNpZ2wpKVswXSApCisKKworLyotLS0tLSBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgd3JpdHRlbiBpbiBhc3NlbWJsZXIgLS0tLS0qLworLyogZXh0ZXJuIHZvaWQgcmVnX21vdmUoRlBVX1JFRyAqYSwgRlBVX1JFRyAqYik7ICovCisKK2FzbWxpbmthZ2UgaW50IEZQVV9ub3JtYWxpemUoRlBVX1JFRyAqeCk7Cithc21saW5rYWdlIGludCBGUFVfbm9ybWFsaXplX251byhGUFVfUkVHICp4KTsKK2FzbWxpbmthZ2UgaW50IEZQVV91X3N1YihGUFVfUkVHIGNvbnN0ICphcmcxLCBGUFVfUkVHIGNvbnN0ICphcmcyLAorCQkJIEZQVV9SRUcgKmFuc3csIHVuc2lnbmVkIGludCBjb250cm9sX3csIHVfY2hhciBzaWduLAorCQkJIGludCBleHBhLCBpbnQgZXhwYik7Cithc21saW5rYWdlIGludCBGUFVfdV9tdWwoRlBVX1JFRyBjb25zdCAqYXJnMSwgRlBVX1JFRyBjb25zdCAqYXJnMiwKKwkJCSBGUFVfUkVHICphbnN3LCB1bnNpZ25lZCBpbnQgY29udHJvbF93LCB1X2NoYXIgc2lnbiwKKwkJCSBpbnQgZXhwb24pOworYXNtbGlua2FnZSBpbnQgRlBVX3VfZGl2KEZQVV9SRUcgY29uc3QgKmFyZzEsIEZQVV9SRUcgY29uc3QgKmFyZzIsCisJCQkgRlBVX1JFRyAqYW5zdywgdW5zaWduZWQgaW50IGNvbnRyb2xfdywgdV9jaGFyIHNpZ24pOworYXNtbGlua2FnZSBpbnQgRlBVX3VfYWRkKEZQVV9SRUcgY29uc3QgKmFyZzEsIEZQVV9SRUcgY29uc3QgKmFyZzIsCisJCQkgRlBVX1JFRyAqYW5zdywgdW5zaWduZWQgaW50IGNvbnRyb2xfdywgdV9jaGFyIHNpZ24sCisJCQkgaW50IGV4cGEsIGludCBleHBiKTsKK2FzbWxpbmthZ2UgaW50IHdtX3NxcnQoRlBVX1JFRyAqbiwgaW50IGR1bW15MSwgaW50IGR1bW15MiwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjb250cm9sX3csIHVfY2hhciBzaWduKTsKK2FzbWxpbmthZ2UgdW5zaWduZWQJRlBVX3Nocngodm9pZCAqbCwgdW5zaWduZWQgeCk7Cithc21saW5rYWdlIHVuc2lnbmVkCUZQVV9zaHJ4cyh2b2lkICp2LCB1bnNpZ25lZCB4KTsKK2FzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBGUFVfZGl2X3NtYWxsKHVuc2lnbmVkIGxvbmcgbG9uZyAqeCwgdW5zaWduZWQgbG9uZyB5KTsKK2FzbWxpbmthZ2UgaW50IEZQVV9yb3VuZChGUFVfUkVHICphcmcsIHVuc2lnbmVkIGludCBleHRlbnQsIGludCBkdW1teSwKKwkJCSB1bnNpZ25lZCBpbnQgY29udHJvbF93LCB1X2NoYXIgc2lnbik7CisKKyNpZm5kZWYgTUFLSU5HX1BST1RPCisjaW5jbHVkZSAiZnB1X3Byb3RvLmgiCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0ZQVV9FTVVfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfZW50cnkuYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfZW50cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTNmMTZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9lbnRyeS5jCkBAIC0wLDAgKzEsNzYwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBmcHVfZW50cnkuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBUaGUgZW50cnkgZnVuY3Rpb25zIGZvciB3bS1GUFUtZW11ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk2LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBTZWUgdGhlIGZpbGVzICJSRUFETUUiIGFuZCAiQ09QWUlORyIgZm9yIGZ1cnRoZXIgY29weXJpZ2h0IGFuZCB3YXJyYW50eSAgIHwKKyB8IGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgTm90ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBUaGUgZmlsZSBjb250YWlucyBjb2RlIHdoaWNoIGFjY2Vzc2VzIHVzZXIgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIEVtdWxhdG9yIHN0YXRpYyBkYXRhIG1heSBjaGFuZ2Ugd2hlbiB1c2VyIG1lbW9yeSBpcyBhY2Nlc3NlZCwgZHVlIHRvICAgfAorIHwgICAgb3RoZXIgcHJvY2Vzc2VzIHVzaW5nIHRoZSBlbXVsYXRvciB3aGlsZSBzd2FwcGluZyBpcyBpbiBwcm9ncmVzcy4gICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgbWF0aF9lbXVsYXRlKCksIHJlc3RvcmVfaTM4N19zb2Z0KCkgYW5kIHNhdmVfaTM4N19zb2Z0KCkgYXJlIHRoZSBvbmx5ICAgICB8CisgfCBlbnRyeSBwb2ludHMgZm9yIHdtLUZQVS1lbXUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZGVzYy5oPgorCisjaW5jbHVkZSAiZnB1X3N5c3RlbS5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKyNpbmNsdWRlICJzdGF0dXNfdy5oIgorCisjZGVmaW5lIF9fQkFEX18gRlBVX2lsbGVnYWwgICAvKiBJbGxlZ2FsIG9uIGFuIDgwNDg2LCBjYXVzZXMgU0lHSUxMICovCisKKyNpZm5kZWYgTk9fVU5ET0NfQ09ERSAgICAvKiBVbi1kb2N1bWVudGVkIEZQVSBvcC1jb2RlcyBzdXBwb3J0ZWQgYnkgZGVmYXVsdC4gKi8KKworLyogV0FSTklORzogVGhlc2UgY29kZXMgYXJlIG5vdCBkb2N1bWVudGVkIGJ5IEludGVsIGluIHRoZWlyIDgwNDg2IG1hbnVhbAorICAgYW5kIG1heSBub3Qgd29yayBvbiBGUFUgY2xvbmVzIG9yIGxhdGVyIEludGVsIEZQVXMuICovCisKKy8qIENoYW5nZXMgdG8gc3VwcG9ydCB0aGUgdW4tZG9jIGNvZGVzIHByb3ZpZGVkIGJ5IExpbnVzIFRvcnZhbGRzLiAqLworCisjZGVmaW5lIF9kOV9kOF8gZnN0cF9pICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMTkpICovCisjZGVmaW5lIF9kY19kMF8gZmNvbV9zdCAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMTQpICovCisjZGVmaW5lIF9kY19kOF8gZmNvbXBzdCAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMWMpICovCisjZGVmaW5lIF9kZF9jOF8gZnhjaF9pICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMGQpICovCisjZGVmaW5lIF9kZV9kMF8gZmNvbXBzdCAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMTYpICovCisjZGVmaW5lIF9kZl9jMF8gZmZyZWVwICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMDcpIGZmcmVlICsgcG9wICovCisjZGVmaW5lIF9kZl9jOF8gZnhjaF9pICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMGYpICovCisjZGVmaW5lIF9kZl9kMF8gZnN0cF9pICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMTcpICovCisjZGVmaW5lIF9kZl9kOF8gZnN0cF9pICAgIC8qIHVub2ZmaWNpYWwgY29kZSAoMWYpICovCisKK3N0YXRpYyBGVU5DIGNvbnN0IHN0X2luc3RyX3RhYmxlWzY0XSA9IHsKKyAgZmFkZF9fLCAgIGZsZF9pXywgICAgIF9fQkFEX18sIF9fQkFEX18sIGZhZGRfaSwgIGZmcmVlXywgIGZhZGRwXywgIF9kZl9jMF8sCisgIGZtdWxfXywgICBmeGNoX2ksICAgICBfX0JBRF9fLCBfX0JBRF9fLCBmbXVsX2ksICBfZGRfYzhfLCBmbXVscF8sICBfZGZfYzhfLAorICBmY29tX3N0LCAgZnBfbm9wLCAgICAgX19CQURfXywgX19CQURfXywgX2RjX2QwXywgZnN0X2lfLCAgX2RlX2QwXywgX2RmX2QwXywKKyAgZmNvbXBzdCwgIF9kOV9kOF8sICAgIF9fQkFEX18sIF9fQkFEX18sIF9kY19kOF8sIGZzdHBfaSwgIGZjb21wcCwgIF9kZl9kOF8sCisgIGZzdWJfXywgICBGUFVfZXRjLCAgICBfX0JBRF9fLCBmaW5pdF8sICBmc3VicmksICBmdWNvbV8sICBmc3VicnAsICBmc3Rzd18sCisgIGZzdWJyXywgICBmY29uc3QsICAgICBmdWNvbXBwLCBfX0JBRF9fLCBmc3ViX2ksICBmdWNvbXAsICBmc3VicF8sICBfX0JBRF9fLAorICBmZGl2X18sICAgRlBVX3RyaWdhLCAgX19CQURfXywgX19CQURfXywgZmRpdnJpLCAgX19CQURfXywgZmRpdnJwLCAgX19CQURfXywKKyAgZmRpdnJfLCAgIEZQVV90cmlnYiwgIF9fQkFEX18sIF9fQkFEX18sIGZkaXZfaSwgIF9fQkFEX18sIGZkaXZwXywgIF9fQkFEX18sCit9OworCisjZWxzZSAgICAgLyogU3VwcG9ydCBvbmx5IGRvY3VtZW50ZWQgRlBVIG9wLWNvZGVzICovCisKK3N0YXRpYyBGVU5DIGNvbnN0IHN0X2luc3RyX3RhYmxlWzY0XSA9IHsKKyAgZmFkZF9fLCAgIGZsZF9pXywgICAgIF9fQkFEX18sIF9fQkFEX18sIGZhZGRfaSwgIGZmcmVlXywgIGZhZGRwXywgIF9fQkFEX18sCisgIGZtdWxfXywgICBmeGNoX2ksICAgICBfX0JBRF9fLCBfX0JBRF9fLCBmbXVsX2ksICBfX0JBRF9fLCBmbXVscF8sICBfX0JBRF9fLAorICBmY29tX3N0LCAgZnBfbm9wLCAgICAgX19CQURfXywgX19CQURfXywgX19CQURfXywgZnN0X2lfLCAgX19CQURfXywgX19CQURfXywKKyAgZmNvbXBzdCwgIF9fQkFEX18sICAgIF9fQkFEX18sIF9fQkFEX18sIF9fQkFEX18sIGZzdHBfaSwgIGZjb21wcCwgIF9fQkFEX18sCisgIGZzdWJfXywgICBGUFVfZXRjLCAgICBfX0JBRF9fLCBmaW5pdF8sICBmc3VicmksICBmdWNvbV8sICBmc3VicnAsICBmc3Rzd18sCisgIGZzdWJyXywgICBmY29uc3QsICAgICBmdWNvbXBwLCBfX0JBRF9fLCBmc3ViX2ksICBmdWNvbXAsICBmc3VicF8sICBfX0JBRF9fLAorICBmZGl2X18sICAgRlBVX3RyaWdhLCAgX19CQURfXywgX19CQURfXywgZmRpdnJpLCAgX19CQURfXywgZmRpdnJwLCAgX19CQURfXywKKyAgZmRpdnJfLCAgIEZQVV90cmlnYiwgIF9fQkFEX18sIF9fQkFEX18sIGZkaXZfaSwgIF9fQkFEX18sIGZkaXZwXywgIF9fQkFEX18sCit9OworCisjZW5kaWYgLyogTk9fVU5ET0NfQ09ERSAqLworCisKKyNkZWZpbmUgX05PTkVfIDAgICAvKiBUYWtlIG5vIHNwZWNpYWwgYWN0aW9uICovCisjZGVmaW5lIF9SRUcwXyAxICAgLyogTmVlZCB0byBjaGVjayBmb3Igbm90IGVtcHR5IHN0KDApICovCisjZGVmaW5lIF9SRUdJXyAyICAgLyogTmVlZCB0byBjaGVjayBmb3Igbm90IGVtcHR5IHN0KDApIGFuZCBzdChybSkgKi8KKyNkZWZpbmUgX1JFR2lfIDAgICAvKiBVc2VzIHN0KHJtKSAqLworI2RlZmluZSBfUFVTSF8gMyAgIC8qIE5lZWQgdG8gY2hlY2sgZm9yIHNwYWNlIHRvIHB1c2ggb250byBzdGFjayAqLworI2RlZmluZSBfbnVsbF8gNCAgIC8qIEZ1bmN0aW9uIGlsbGVnYWwgb3Igbm90IGltcGxlbWVudGVkICovCisjZGVmaW5lIF9SRUdJaSA1ICAgLyogVXNlcyBzdCgwKSBhbmQgc3Qocm0pLCByZXN1bHQgdG8gc3Qocm0pICovCisjZGVmaW5lIF9SRUdJcCA2ICAgLyogVXNlcyBzdCgwKSBhbmQgc3Qocm0pLCByZXN1bHQgdG8gc3Qocm0pIHRoZW4gcG9wICovCisjZGVmaW5lIF9SRUdJYyAwICAgLyogQ29tcGFyZSBzdCgwKSBhbmQgc3Qocm0pICovCisjZGVmaW5lIF9SRUdJbiAwICAgLyogVXNlcyBzdCgwKSBhbmQgc3Qocm0pLCBidXQgaGFuZGxlIGNoZWNrcyBsYXRlciAqLworCisjaWZuZGVmIE5PX1VORE9DX0NPREUKKworLyogVW4tZG9jdW1lbnRlZCBGUFUgb3AtY29kZXMgc3VwcG9ydGVkIGJ5IGRlZmF1bHQuIChzZWUgYWJvdmUpICovCisKK3N0YXRpYyB1X2NoYXIgY29uc3QgdHlwZV90YWJsZVs2NF0gPSB7CisgIF9SRUdJXywgX05PTkVfLCBfbnVsbF8sIF9udWxsXywgX1JFR0lpLCBfUkVHaV8sIF9SRUdJcCwgX1JFR2lfLAorICBfUkVHSV8sIF9SRUdJbiwgX251bGxfLCBfbnVsbF8sIF9SRUdJaSwgX1JFR0lfLCBfUkVHSXAsIF9SRUdJXywKKyAgX1JFR0ljLCBfTk9ORV8sIF9udWxsXywgX251bGxfLCBfUkVHSWMsIF9SRUcwXywgX1JFR0ljLCBfUkVHMF8sCisgIF9SRUdJYywgX1JFRzBfLCBfbnVsbF8sIF9udWxsXywgX1JFR0ljLCBfUkVHMF8sIF9SRUdJYywgX1JFRzBfLAorICBfUkVHSV8sIF9OT05FXywgX251bGxfLCBfTk9ORV8sIF9SRUdJaSwgX1JFR0ljLCBfUkVHSXAsIF9OT05FXywKKyAgX1JFR0lfLCBfTk9ORV8sIF9SRUdJYywgX251bGxfLCBfUkVHSWksIF9SRUdJYywgX1JFR0lwLCBfbnVsbF8sCisgIF9SRUdJXywgX05PTkVfLCBfbnVsbF8sIF9udWxsXywgX1JFR0lpLCBfbnVsbF8sIF9SRUdJcCwgX251bGxfLAorICBfUkVHSV8sIF9OT05FXywgX251bGxfLCBfbnVsbF8sIF9SRUdJaSwgX251bGxfLCBfUkVHSXAsIF9udWxsXworfTsKKworI2Vsc2UgICAgIC8qIFN1cHBvcnQgb25seSBkb2N1bWVudGVkIEZQVSBvcC1jb2RlcyAqLworCitzdGF0aWMgdV9jaGFyIGNvbnN0IHR5cGVfdGFibGVbNjRdID0geworICBfUkVHSV8sIF9OT05FXywgX251bGxfLCBfbnVsbF8sIF9SRUdJaSwgX1JFR2lfLCBfUkVHSXAsIF9udWxsXywKKyAgX1JFR0lfLCBfUkVHSW4sIF9udWxsXywgX251bGxfLCBfUkVHSWksIF9udWxsXywgX1JFR0lwLCBfbnVsbF8sCisgIF9SRUdJYywgX05PTkVfLCBfbnVsbF8sIF9udWxsXywgX251bGxfLCBfUkVHMF8sIF9udWxsXywgX251bGxfLAorICBfUkVHSWMsIF9udWxsXywgX251bGxfLCBfbnVsbF8sIF9udWxsXywgX1JFRzBfLCBfUkVHSWMsIF9udWxsXywKKyAgX1JFR0lfLCBfTk9ORV8sIF9udWxsXywgX05PTkVfLCBfUkVHSWksIF9SRUdJYywgX1JFR0lwLCBfTk9ORV8sCisgIF9SRUdJXywgX05PTkVfLCBfUkVHSWMsIF9udWxsXywgX1JFR0lpLCBfUkVHSWMsIF9SRUdJcCwgX251bGxfLAorICBfUkVHSV8sIF9OT05FXywgX251bGxfLCBfbnVsbF8sIF9SRUdJaSwgX251bGxfLCBfUkVHSXAsIF9udWxsXywKKyAgX1JFR0lfLCBfTk9ORV8sIF9udWxsXywgX251bGxfLCBfUkVHSWksIF9udWxsXywgX1JFR0lwLCBfbnVsbF8KK307CisKKyNlbmRpZiAvKiBOT19VTkRPQ19DT0RFICovCisKKworI2lmZGVmIFJFX0VOVFJBTlRfQ0hFQ0tJTkcKK3VfY2hhciBlbXVsYXRpbmc9MDsKKyNlbmRpZiAvKiBSRV9FTlRSQU5UX0NIRUNLSU5HICovCisKK3N0YXRpYyBpbnQgdmFsaWRfcHJlZml4KHVfY2hhciAqQnl0ZSwgdV9jaGFyIF9fdXNlciAqKmZwdV9laXAsCisJCQlvdmVycmlkZXMgKm92ZXJyaWRlKTsKKworYXNtbGlua2FnZSB2b2lkIG1hdGhfZW11bGF0ZShsb25nIGFyZykKK3sKKyAgdV9jaGFyICBGUFVfbW9kcm0sIGJ5dGUxOworICB1bnNpZ25lZCBzaG9ydCBjb2RlOworICBmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzOworICBpbnQgdW5tYXNrZWQ7CisgIEZQVV9SRUcgbG9hZGVkX2RhdGE7CisgIEZQVV9SRUcgKnN0MF9wdHI7CisgIHVfY2hhcgkgIGxvYWRlZF90YWcsIHN0MF90YWc7CisgIHZvaWQgX191c2VyICpkYXRhX2FkZHJlc3M7CisgIHN0cnVjdCBhZGRyZXNzIGRhdGFfc2VsX29mZjsKKyAgc3RydWN0IGFkZHJlc3MgZW50cnlfc2VsX29mZjsKKyAgdW5zaWduZWQgbG9uZyBjb2RlX2Jhc2UgPSAwOworICB1bnNpZ25lZCBsb25nIGNvZGVfbGltaXQgPSAwOyAgLyogSW5pdGlhbGl6ZWQgdG8gc3RvcCBjb21waWxlciB3YXJuaW5ncyAqLworICBzdHJ1Y3QgZGVzY19zdHJ1Y3QgY29kZV9kZXNjcmlwdG9yOworCisjaWZkZWYgUkVfRU5UUkFOVF9DSEVDS0lORworICBpZiAoIGVtdWxhdGluZyApCisgICAgeworICAgICAgcHJpbnRrKCJFUlJPUjogd20tRlBVLWVtdSBpcyBub3QgUkUtRU5UUkFOVCFcbiIpOworICAgIH0KKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyNlbmRpZiAvKiBSRV9FTlRSQU5UX0NIRUNLSU5HICovCisKKyAgaWYgKCF1c2VkX21hdGgoKSkKKyAgICB7CisgICAgICBmaW5pdCgpOworICAgICAgc2V0X3VzZWRfbWF0aCgpOworICAgIH0KKworICBTRVRVUF9EQVRBX0FSRUEoYXJnKTsKKworICBGUFVfT1JJR19FSVAgPSBGUFVfRUlQOworCisgIGlmICggKEZQVV9FRkxBR1MgJiAweDAwMDIwMDAwKSAhPSAwICkKKyAgICB7CisgICAgICAvKiBWaXJ0dWFsIDgwODYgbW9kZSAqLworICAgICAgYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgPSBWTTg2OworICAgICAgRlBVX0VJUCArPSBjb2RlX2Jhc2UgPSBGUFVfQ1MgPDwgNDsKKyAgICAgIGNvZGVfbGltaXQgPSBjb2RlX2Jhc2UgKyAweGZmZmY7ICAvKiBBc3N1bWVzIGNvZGVfYmFzZSA8PSAweGZmZmYwMDAwICovCisgICAgfQorICBlbHNlIGlmICggRlBVX0NTID09IF9fVVNFUl9DUyAmJiBGUFVfRFMgPT0gX19VU0VSX0RTICkKKyAgICB7CisgICAgICBhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSA9IDA7CisgICAgfQorICBlbHNlIGlmICggRlBVX0NTID09IF9fS0VSTkVMX0NTICkKKyAgICB7CisgICAgICBwcmludGsoIm1hdGhfZW11bGF0ZTogJTA0eDolMDhseFxuIixGUFVfQ1MsRlBVX0VJUCk7CisgICAgICBwYW5pYygiTWF0aCBlbXVsYXRpb24gbmVlZGVkIGluIGtlcm5lbCIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKworICAgICAgaWYgKCAoRlBVX0NTICYgNCkgIT0gNCApICAgLyogTXVzdCBiZSBpbiB0aGUgTERUICovCisJeworCSAgLyogQ2FuIG9ubHkgaGFuZGxlIHNlZ21lbnRlZCBhZGRyZXNzaW5nIHZpYSB0aGUgTERUCisJICAgICBmb3Igbm93LCBhbmQgaXQgbXVzdCBiZSAxNiBiaXQgKi8KKwkgIHByaW50aygiRlBVIGVtdWxhdG9yOiBVbnN1cHBvcnRlZCBhZGRyZXNzaW5nIG1vZGVcbiIpOworCSAgbWF0aF9hYm9ydChGUFVfaW5mbywgU0lHSUxMKTsKKwl9CisKKyAgICAgIGNvZGVfZGVzY3JpcHRvciA9IExEVF9ERVNDUklQVE9SKEZQVV9DUyk7CisgICAgICBpZiAoIFNFR19EX1NJWkUoY29kZV9kZXNjcmlwdG9yKSApCisJeworCSAgLyogVGhlIGFib3ZlIHRlc3QgbWF5IGJlIHdyb25nLCB0aGUgYm9vayBpcyBub3QgY2xlYXIgKi8KKwkgIC8qIFNlZ21lbnRlZCAzMiBiaXQgcHJvdGVjdGVkIG1vZGUgKi8KKwkgIGFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlID0gU0VHMzI7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIDE2IGJpdCBwcm90ZWN0ZWQgbW9kZSAqLworCSAgYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgPSBQTTE2OworCX0KKyAgICAgIEZQVV9FSVAgKz0gY29kZV9iYXNlID0gU0VHX0JBU0VfQUREUihjb2RlX2Rlc2NyaXB0b3IpOworICAgICAgY29kZV9saW1pdCA9IGNvZGVfYmFzZQorCSsgKFNFR19MSU1JVChjb2RlX2Rlc2NyaXB0b3IpKzEpICogU0VHX0dSQU5VTEFSSVRZKGNvZGVfZGVzY3JpcHRvcikKKwkgIC0gMTsKKyAgICAgIGlmICggY29kZV9saW1pdCA8IGNvZGVfYmFzZSApIGNvZGVfbGltaXQgPSAweGZmZmZmZmZmOworICAgIH0KKworICBGUFVfbG9va2FoZWFkID0gMTsKKyAgaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpCisgICAgRlBVX2xvb2thaGVhZCA9IDA7CisKKyAgaWYgKCAhdmFsaWRfcHJlZml4KCZieXRlMSwgKHVfY2hhciBfX3VzZXIgKiopJkZQVV9FSVAsCisJCSAgICAgJmFkZHJfbW9kZXMub3ZlcnJpZGUpICkKKyAgICB7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgICAgIHByaW50aygiRlBVIGVtdWxhdG9yOiBVbmtub3duIHByZWZpeCBieXRlIDB4JTAyeCwgcHJvYmFibHkgZHVlIHRvXG4iCisJICAgICAiRlBVIGVtdWxhdG9yOiBzZWxmLW1vZGlmeWluZyBjb2RlISAoZW11bGF0aW9uIGltcG9zc2libGUpXG4iLAorCSAgICAgYnl0ZTEpOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDEyNik7CisgICAgICBtYXRoX2Fib3J0KEZQVV9pbmZvLFNJR0lMTCk7CisgICAgfQorCitkb19hbm90aGVyX0ZQVV9pbnN0cnVjdGlvbjoKKworICBub19pcF91cGRhdGUgPSAwOworCisgIEZQVV9FSVArKzsgIC8qIFdlIGhhdmUgZmV0Y2hlZCB0aGUgcHJlZml4IGFuZCBmaXJzdCBjb2RlIGJ5dGVzLiAqLworCisgIGlmICggYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgKQorICAgIHsKKyAgICAgIC8qIFRoaXMgY2hlY2tzIGZvciB0aGUgbWluaW11bSBpbnN0cnVjdGlvbiBieXRlcy4KKwkgV2UgYWxzbyBuZWVkIHRvIGNoZWNrIGFueSBleHRyYSAoYWRkcmVzcyBtb2RlKSBjb2RlIGFjY2Vzcy4gKi8KKyAgICAgIGlmICggRlBVX0VJUCA+IGNvZGVfbGltaXQgKQorCW1hdGhfYWJvcnQoRlBVX2luZm8sU0lHU0VHVik7CisgICAgfQorCisgIGlmICggKGJ5dGUxICYgMHhmOCkgIT0gMHhkOCApCisgICAgeworICAgICAgaWYgKCBieXRlMSA9PSBGV0FJVF9PUENPREUgKQorCXsKKwkgIGlmIChwYXJ0aWFsX3N0YXR1cyAmIFNXX1N1bW1hcnkpCisJICAgIGdvdG8gZG9fdGhlX0ZQVV9pbnRlcnJ1cHQ7CisJICBlbHNlCisJICAgIGdvdG8gRlBVX2Z3YWl0X2RvbmU7CisJfQorI2lmZGVmIFBBUkFOT0lECisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMjgpOworICAgICAgbWF0aF9hYm9ydChGUFVfaW5mbyxTSUdJTEwpOworI2VuZGlmIC8qIFBBUkFOT0lEICovCisgICAgfQorCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfY29kZV9hY2Nlc3Nfb2soMSk7CisgIEZQVV9nZXRfdXNlcihGUFVfbW9kcm0sICh1X2NoYXIgX191c2VyICopIEZQVV9FSVApOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworICBGUFVfRUlQKys7CisKKyAgaWYgKHBhcnRpYWxfc3RhdHVzICYgU1dfU3VtbWFyeSkKKyAgICB7CisgICAgICAvKiBJZ25vcmUgdGhlIGVycm9yIGZvciBub3cgaWYgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaXMgYSBuby13YWl0CisJIGNvbnRyb2wgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgIC8qIFRoZSA4MDQ4NiBtYW51YWwgY29udHJhZGljdHMgaXRzZWxmIG9uIHRoaXMgdG9waWMsCisJIGJ1dCBhIHJlYWwgODA0ODYgdXNlcyB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uczoKKwkgZm5pbml0LCBmbnN0ZW52LCBmbnNhdmUsIGZuc3RzdywgZm5zdGVudiwgZm5jbGV4LgorICAgICAgICovCisgICAgICBjb2RlID0gKEZQVV9tb2RybSA8PCA4KSB8IGJ5dGUxOworICAgICAgaWYgKCAhICggKCgoY29kZSAmIDB4ZjgwMykgPT0gMHhlMDAzKSB8fCAgICAvKiBmbmNsZXgsIGZuaW5pdCwgZm5zdHN3ICovCisJCSgoKGNvZGUgJiAweDMwMDMpID09IDB4MzAwMSkgJiYgICAvKiBmbnNhdmUsIGZuc3RjdywgZm5zdGVudiwKKwkJCQkJCSAgICAgZm5zdHN3ICovCisJCSAoKGNvZGUgJiAweGMwMDApICE9IDB4YzAwMCkpKSApICkKKwl7CisJICAvKgorCSAgICogIFdlIG5lZWQgdG8gc2ltdWxhdGUgdGhlIGFjdGlvbiBvZiB0aGUga2VybmVsIHRvIEZQVQorCSAgICogIGludGVycnVwdHMgaGVyZS4KKwkgICAqLworCWRvX3RoZV9GUFVfaW50ZXJydXB0OgorCisJICBGUFVfRUlQID0gRlBVX09SSUdfRUlQOwkvKiBQb2ludCB0byBjdXJyZW50IEZQVSBpbnN0cnVjdGlvbi4gKi8KKworCSAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisJICBjdXJyZW50LT50aHJlYWQudHJhcF9ubyA9IDE2OworCSAgY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOworCSAgc2VuZF9zaWcoU0lHRlBFLCBjdXJyZW50LCAxKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIGVudHJ5X3NlbF9vZmYub2Zmc2V0ID0gRlBVX09SSUdfRUlQOworICBlbnRyeV9zZWxfb2ZmLnNlbGVjdG9yID0gRlBVX0NTOworICBlbnRyeV9zZWxfb2ZmLm9wY29kZSA9IChieXRlMSA8PCA4KSB8IEZQVV9tb2RybTsKKworICBGUFVfcm0gPSBGUFVfbW9kcm0gJiA3OworCisgIGlmICggRlBVX21vZHJtIDwgMDMwMCApCisgICAgeworICAgICAgLyogQWxsIG9mIHRoZXNlIGluc3RydWN0aW9ucyB1c2UgdGhlIG1vZC9ybSBieXRlIHRvIGdldCBhIGRhdGEgYWRkcmVzcyAqLworCisgICAgICBpZiAoIChhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSAmIFNJWFRFRU4pCisJICBeIChhZGRyX21vZGVzLm92ZXJyaWRlLmFkZHJlc3Nfc2l6ZSA9PSBBRERSX1NJWkVfUFJFRklYKSApCisJZGF0YV9hZGRyZXNzID0gRlBVX2dldF9hZGRyZXNzXzE2KEZQVV9tb2RybSwgJkZQVV9FSVAsICZkYXRhX3NlbF9vZmYsCisJCQkJCSAgYWRkcl9tb2Rlcyk7CisgICAgICBlbHNlCisJZGF0YV9hZGRyZXNzID0gRlBVX2dldF9hZGRyZXNzKEZQVV9tb2RybSwgJkZQVV9FSVAsICZkYXRhX3NlbF9vZmYsCisJCQkJICAgICAgIGFkZHJfbW9kZXMpOworCisgICAgICBpZiAoIGFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlICkKKwl7CisJICBpZiAoIEZQVV9FSVAtMSA+IGNvZGVfbGltaXQgKQorCSAgICBtYXRoX2Fib3J0KEZQVV9pbmZvLFNJR1NFR1YpOworCX0KKworICAgICAgaWYgKCAhKGJ5dGUxICYgMSkgKQorCXsKKwkgIHVuc2lnbmVkIHNob3J0IHN0YXR1czEgPSBwYXJ0aWFsX3N0YXR1czsKKworCSAgc3QwX3B0ciA9ICZzdCgwKTsKKwkgIHN0MF90YWcgPSBGUFVfZ2V0dGFnMCgpOworCisJICAvKiBTdGFjayB1bmRlcmZsb3cgaGFzIHByaW9yaXR5ICovCisJICBpZiAoIE5PVF9FTVBUWV9TVDAgKQorCSAgICB7CisJICAgICAgaWYgKCBhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSAmIFBST1RFQ1RFRCApCisJCXsKKwkJICAvKiBUaGlzIHRhYmxlIHdvcmtzIGZvciAxNiBhbmQgMzIgYml0IHByb3RlY3RlZCBtb2RlICovCisJCSAgaWYgKCBhY2Nlc3NfbGltaXQgPCBkYXRhX3NpemVzXzE2WyhieXRlMSA+PiAxKSAmIDNdICkKKwkJICAgIG1hdGhfYWJvcnQoRlBVX2luZm8sU0lHU0VHVik7CisJCX0KKworCSAgICAgIHVubWFza2VkID0gMDsgIC8qIERvIHRoaXMgaGVyZSB0byBzdG9wIGNvbXBpbGVyIHdhcm5pbmdzLiAqLworCSAgICAgIHN3aXRjaCAoIChieXRlMSA+PiAxKSAmIDMgKQorCQl7CisJCWNhc2UgMDoKKwkJICB1bm1hc2tlZCA9IEZQVV9sb2FkX3NpbmdsZSgoZmxvYXQgX191c2VyICopZGF0YV9hZGRyZXNzLAorCQkJCQkgICAgICZsb2FkZWRfZGF0YSk7CisJCSAgbG9hZGVkX3RhZyA9IHVubWFza2VkICYgMHhmZjsKKwkJICB1bm1hc2tlZCAmPSB+MHhmZjsKKwkJICBicmVhazsKKwkJY2FzZSAxOgorCQkgIGxvYWRlZF90YWcgPSBGUFVfbG9hZF9pbnQzMigobG9uZyBfX3VzZXIgKilkYXRhX2FkZHJlc3MsICZsb2FkZWRfZGF0YSk7CisJCSAgYnJlYWs7CisJCWNhc2UgMjoKKwkJICB1bm1hc2tlZCA9IEZQVV9sb2FkX2RvdWJsZSgoZG91YmxlIF9fdXNlciAqKWRhdGFfYWRkcmVzcywKKwkJCQkJICAgICAmbG9hZGVkX2RhdGEpOworCQkgIGxvYWRlZF90YWcgPSB1bm1hc2tlZCAmIDB4ZmY7CisJCSAgdW5tYXNrZWQgJj0gfjB4ZmY7CisJCSAgYnJlYWs7CisJCWNhc2UgMzoKKwkJZGVmYXVsdDogIC8qIFVzZWQgaGVyZSB0byBzdXBwcmVzcyBnY2Mgd2FybmluZ3MuICovCisJCSAgbG9hZGVkX3RhZyA9IEZQVV9sb2FkX2ludDE2KChzaG9ydCBfX3VzZXIgKilkYXRhX2FkZHJlc3MsICZsb2FkZWRfZGF0YSk7CisJCSAgYnJlYWs7CisJCX0KKworCSAgICAgIC8qIE5vIG1vcmUgYWNjZXNzIHRvIHVzZXIgbWVtb3J5LCBpdCBpcyBzYWZlCisJCSB0byB1c2Ugc3RhdGljIGRhdGEgbm93ICovCisKKwkgICAgICAvKiBOYU4gb3BlcmFuZHMgaGF2ZSB0aGUgbmV4dCBwcmlvcml0eS4gKi8KKwkgICAgICAvKiBXZSBoYXZlIHRvIGRlbGF5IGxvb2tpbmcgYXQgc3QoMCkgdW50aWwgYWZ0ZXIKKwkJIGxvYWRpbmcgdGhlIGRhdGEsIGJlY2F1c2UgdGhhdCBkYXRhIG1pZ2h0IGNvbnRhaW4gYW4gU05hTiAqLworCSAgICAgIGlmICggKChzdDBfdGFnID09IFRBR19TcGVjaWFsKSAmJiBpc05hTihzdDBfcHRyKSkgfHwKKwkJICAoKGxvYWRlZF90YWcgPT0gVEFHX1NwZWNpYWwpICYmIGlzTmFOKCZsb2FkZWRfZGF0YSkpICkKKwkJeworCQkgIC8qIFJlc3RvcmUgdGhlIHN0YXR1cyB3b3JkOyB3ZSBtaWdodCBoYXZlIGxvYWRlZCBhCisJCSAgICAgZGVub3JtYWwuICovCisJCSAgcGFydGlhbF9zdGF0dXMgPSBzdGF0dXMxOworCQkgIGlmICggKEZQVV9tb2RybSAmIDB4MzApID09IDB4MTAgKQorCQkgICAgeworCQkgICAgICAvKiBmY29tIG9yIGZjb21wICovCisJCSAgICAgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKwkJICAgICAgc2V0Y2MoU1dfQzMgfCBTV19DMiB8IFNXX0MwKTsKKwkJICAgICAgaWYgKCAoRlBVX21vZHJtICYgMHgwOCkgJiYgKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpICkKKwkJCUZQVV9wb3AoKTsgICAgICAgICAgICAgLyogZmNvbXAsIG1hc2tlZCwgc28gd2UgcG9wLiAqLworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgaWYgKCBsb2FkZWRfdGFnID09IFRBR19TcGVjaWFsICkKKwkJCWxvYWRlZF90YWcgPSBGUFVfU3BlY2lhbCgmbG9hZGVkX2RhdGEpOworI2lmZGVmIFBFQ1VMSUFSXzQ4NgorCQkgICAgICAvKiBUaGlzIGlzIG5vdCByZWFsbHkgbmVlZGVkLCBidXQgZ2l2ZXMgYmVoYXZpb3VyCisJCQkgaWRlbnRpY2FsIHRvIGFuIDgwNDg2ICovCisJCSAgICAgIGlmICggKEZQVV9tb2RybSAmIDB4MjgpID09IDB4MjAgKQorCQkJLyogZmRpdiBvciBmc3ViICovCisJCQlyZWFsXzJvcF9OYU4oJmxvYWRlZF9kYXRhLCBsb2FkZWRfdGFnLCAwLCAmbG9hZGVkX2RhdGEpOworCQkgICAgICBlbHNlCisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovIAorCQkJLyogZmFkZCwgZmRpdnIsIGZtdWwsIG9yIGZzdWJyICovCisJCQlyZWFsXzJvcF9OYU4oJmxvYWRlZF9kYXRhLCBsb2FkZWRfdGFnLCAwLCBzdDBfcHRyKTsKKwkJICAgIH0KKwkJICBnb3RvIHJlZ19tZW1faW5zdHJfZG9uZTsKKwkJfQorCisJICAgICAgaWYgKCB1bm1hc2tlZCAmJiAhKChGUFVfbW9kcm0gJiAweDMwKSA9PSAweDEwKSApCisJCXsKKwkJICAvKiBJcyBub3QgYSBjb21wYXJpc29uIGluc3RydWN0aW9uLiAqLworCQkgIGlmICggKEZQVV9tb2RybSAmIDB4MzgpID09IDB4MzggKQorCQkgICAgeworCQkgICAgICAvKiBmZGl2ciAqLworCQkgICAgICBpZiAoIChzdDBfdGFnID09IFRBR19aZXJvKSAmJgorCQkJICAgKChsb2FkZWRfdGFnID09IFRBR19WYWxpZCkKKwkJCSAgICB8fCAobG9hZGVkX3RhZyA9PSBUQUdfU3BlY2lhbAorCQkJCSYmIGlzZGVub3JtYWwoJmxvYWRlZF9kYXRhKSkpICkKKwkJCXsKKwkJCSAgaWYgKCBGUFVfZGl2aWRlX2J5X3plcm8oMCwgZ2V0c2lnbigmbG9hZGVkX2RhdGEpKQorCQkJICAgICAgIDwgMCApCisJCQkgICAgeworCQkJICAgICAgLyogV2UgdXNlIHRoZSBmYWN0IGhlcmUgdGhhdCB0aGUgdW5tYXNrZWQKKwkJCQkgZXhjZXB0aW9uIGluIHRoZSBsb2FkZWQgZGF0YSB3YXMgZm9yIGEKKwkJCQkgZGVub3JtYWwgb3BlcmFuZCAqLworCQkJICAgICAgLyogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGRlbm9ybWFsIG9wIGJpdCAqLworCQkJICAgICAgcGFydGlhbF9zdGF0dXMgJj0gflNXX0Rlbm9ybV9PcDsKKwkJCSAgICAgIHBhcnRpYWxfc3RhdHVzIHw9IHN0YXR1czEgJiBTV19EZW5vcm1fT3A7CisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgc2V0c2lnbihzdDBfcHRyLCBnZXRzaWduKCZsb2FkZWRfZGF0YSkpOworCQkJfQorCQkgICAgfQorCQkgIGdvdG8gcmVnX21lbV9pbnN0cl9kb25lOworCQl9CisKKwkgICAgICBzd2l0Y2ggKCAoRlBVX21vZHJtID4+IDMpICYgNyApCisJCXsKKwkJY2FzZSAwOiAgICAgICAgIC8qIGZhZGQgKi8KKwkJICBjbGVhcl9DMSgpOworCQkgIEZQVV9hZGQoJmxvYWRlZF9kYXRhLCBsb2FkZWRfdGFnLCAwLCBjb250cm9sX3dvcmQpOworCQkgIGJyZWFrOworCQljYXNlIDE6ICAgICAgICAgLyogZm11bCAqLworCQkgIGNsZWFyX0MxKCk7CisJCSAgRlBVX211bCgmbG9hZGVkX2RhdGEsIGxvYWRlZF90YWcsIDAsIGNvbnRyb2xfd29yZCk7CisJCSAgYnJlYWs7CisJCWNhc2UgMjogICAgICAgICAvKiBmY29tICovCisJCSAgRlBVX2NvbXBhcmVfc3RfZGF0YSgmbG9hZGVkX2RhdGEsIGxvYWRlZF90YWcpOworCQkgIGJyZWFrOworCQljYXNlIDM6ICAgICAgICAgLyogZmNvbXAgKi8KKwkJICBpZiAoICFGUFVfY29tcGFyZV9zdF9kYXRhKCZsb2FkZWRfZGF0YSwgbG9hZGVkX3RhZykKKwkJICAgICAgICYmICF1bm1hc2tlZCApCisJCSAgICBGUFVfcG9wKCk7CisJCSAgYnJlYWs7CisJCWNhc2UgNDogICAgICAgICAvKiBmc3ViICovCisJCSAgY2xlYXJfQzEoKTsKKwkJICBGUFVfc3ViKExPQURFRHxsb2FkZWRfdGFnLCAoaW50KSZsb2FkZWRfZGF0YSwgY29udHJvbF93b3JkKTsKKwkJICBicmVhazsKKwkJY2FzZSA1OiAgICAgICAgIC8qIGZzdWJyICovCisJCSAgY2xlYXJfQzEoKTsKKwkJICBGUFVfc3ViKFJFVnxMT0FERUR8bG9hZGVkX3RhZywgKGludCkmbG9hZGVkX2RhdGEsIGNvbnRyb2xfd29yZCk7CisJCSAgYnJlYWs7CisJCWNhc2UgNjogICAgICAgICAvKiBmZGl2ICovCisJCSAgY2xlYXJfQzEoKTsKKwkJICBGUFVfZGl2KExPQURFRHxsb2FkZWRfdGFnLCAoaW50KSZsb2FkZWRfZGF0YSwgY29udHJvbF93b3JkKTsKKwkJICBicmVhazsKKwkJY2FzZSA3OiAgICAgICAgIC8qIGZkaXZyICovCisJCSAgY2xlYXJfQzEoKTsKKwkJICBpZiAoIHN0MF90YWcgPT0gVEFHX1plcm8gKQorCQkgICAgcGFydGlhbF9zdGF0dXMgPSBzdGF0dXMxOyAgLyogVW5kbyBhbnkgZGVub3JtIHRhZywKKwkJCQkJCSAgemVyby1kaXZpZGUgaGFzIHByaW9yaXR5LiAqLworCQkgIEZQVV9kaXYoUkVWfExPQURFRHxsb2FkZWRfdGFnLCAoaW50KSZsb2FkZWRfZGF0YSwgY29udHJvbF93b3JkKTsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoIChGUFVfbW9kcm0gJiAweDMwKSA9PSAweDEwICkKKwkJeworCQkgIC8qIFRoZSBpbnN0cnVjdGlvbiBpcyBmY29tIG9yIGZjb21wICovCisJCSAgRVhDRVBUSU9OKEVYX1N0YWNrVW5kZXIpOworCQkgIHNldGNjKFNXX0MzIHwgU1dfQzIgfCBTV19DMCk7CisJCSAgaWYgKCAoRlBVX21vZHJtICYgMHgwOCkgJiYgKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpICkKKwkJICAgIEZQVV9wb3AoKTsgICAgICAgICAgICAgLyogZmNvbXAgKi8KKwkJfQorCSAgICAgIGVsc2UKKwkJRlBVX3N0YWNrX3VuZGVyZmxvdygpOworCSAgICB9CisJcmVnX21lbV9pbnN0cl9kb25lOgorCSAgb3BlcmFuZF9hZGRyZXNzID0gZGF0YV9zZWxfb2ZmOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpZiAoICEobm9faXBfdXBkYXRlID0KKwkJIEZQVV9sb2FkX3N0b3JlKCgoRlBVX21vZHJtICYgMHgzOCkgfCAoYnl0ZTEgJiA2KSkgPj4gMSwKKwkJCQlhZGRyX21vZGVzLCBkYXRhX2FkZHJlc3MpKSApCisJICAgIHsKKwkgICAgICBvcGVyYW5kX2FkZHJlc3MgPSBkYXRhX3NlbF9vZmY7CisJICAgIH0KKwl9CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb25lIG9mIHRoZXNlIGluc3RydWN0aW9ucyBhY2Nlc3MgdXNlciBtZW1vcnkgKi8KKyAgICAgIHVfY2hhciBpbnN0cl9pbmRleCA9IChGUFVfbW9kcm0gJiAweDM4KSB8IChieXRlMSAmIDcpOworCisjaWZkZWYgUEVDVUxJQVJfNDg2CisgICAgICAvKiBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIHVuZGVmaW5lZCwgYnV0IGEgcmVhbCA4MDQ4NiBzZWVtcworCSB0byBkbyB0aGlzOiAqLworICAgICAgb3BlcmFuZF9hZGRyZXNzLm9mZnNldCA9IDA7CisgICAgICBvcGVyYW5kX2FkZHJlc3Muc2VsZWN0b3IgPSBGUFVfRFM7CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisKKyAgICAgIHN0MF9wdHIgPSAmc3QoMCk7CisgICAgICBzdDBfdGFnID0gRlBVX2dldHRhZzAoKTsKKyAgICAgIHN3aXRjaCAoIHR5cGVfdGFibGVbKGludCkgaW5zdHJfaW5kZXhdICkKKwl7CisJY2FzZSBfTk9ORV86ICAgLyogYWxzbyBfUkVHSWM6IF9SRUdJbiAqLworCSAgYnJlYWs7CisJY2FzZSBfUkVHMF86CisJICBpZiAoICFOT1RfRU1QVFlfU1QwICkKKwkgICAgeworCSAgICAgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKwkgICAgICBnb3RvIEZQVV9pbnN0cnVjdGlvbl9kb25lOworCSAgICB9CisJICBicmVhazsKKwljYXNlIF9SRUdJaToKKwkgIGlmICggIU5PVF9FTVBUWV9TVDAgfHwgIU5PVF9FTVBUWShGUFVfcm0pICkKKwkgICAgeworCSAgICAgIEZQVV9zdGFja191bmRlcmZsb3dfaShGUFVfcm0pOworCSAgICAgIGdvdG8gRlBVX2luc3RydWN0aW9uX2RvbmU7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgX1JFR0lwOgorCSAgaWYgKCAhTk9UX0VNUFRZX1NUMCB8fCAhTk9UX0VNUFRZKEZQVV9ybSkgKQorCSAgICB7CisJICAgICAgRlBVX3N0YWNrX3VuZGVyZmxvd19wb3AoRlBVX3JtKTsKKwkgICAgICBnb3RvIEZQVV9pbnN0cnVjdGlvbl9kb25lOworCSAgICB9CisJICBicmVhazsKKwljYXNlIF9SRUdJXzoKKwkgIGlmICggIU5PVF9FTVBUWV9TVDAgfHwgIU5PVF9FTVBUWShGUFVfcm0pICkKKwkgICAgeworCSAgICAgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKwkgICAgICBnb3RvIEZQVV9pbnN0cnVjdGlvbl9kb25lOworCSAgICB9CisJICBicmVhazsKKwljYXNlIF9QVVNIXzogICAgIC8qIE9ubHkgdXNlZCBieSB0aGUgZmxkIHN0KGkpIGluc3RydWN0aW9uICovCisJICBicmVhazsKKwljYXNlIF9udWxsXzoKKwkgIEZQVV9pbGxlZ2FsKCk7CisJICBnb3RvIEZQVV9pbnN0cnVjdGlvbl9kb25lOworCWRlZmF1bHQ6CisJICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMTEpOworCSAgZ290byBGUFVfaW5zdHJ1Y3Rpb25fZG9uZTsKKwl9CisgICAgICAoKnN0X2luc3RyX3RhYmxlWyhpbnQpIGluc3RyX2luZGV4XSkoKTsKKworRlBVX2luc3RydWN0aW9uX2RvbmU6CisgICAgICA7CisgICAgfQorCisgIGlmICggISBub19pcF91cGRhdGUgKQorICAgIGluc3RydWN0aW9uX2FkZHJlc3MgPSBlbnRyeV9zZWxfb2ZmOworCitGUFVfZndhaXRfZG9uZToKKworI2lmZGVmIERFQlVHCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfcHJpbnRhbGwoKTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyNlbmRpZiAvKiBERUJVRyAqLworCisgIGlmIChGUFVfbG9va2FoZWFkICYmICFuZWVkX3Jlc2NoZWQoKSkKKyAgICB7CisgICAgICBGUFVfT1JJR19FSVAgPSBGUFVfRUlQIC0gY29kZV9iYXNlOworICAgICAgaWYgKCB2YWxpZF9wcmVmaXgoJmJ5dGUxLCAodV9jaGFyIF9fdXNlciAqKikmRlBVX0VJUCwKKwkJCSZhZGRyX21vZGVzLm92ZXJyaWRlKSApCisJZ290byBkb19hbm90aGVyX0ZQVV9pbnN0cnVjdGlvbjsKKyAgICB9CisKKyAgaWYgKCBhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSApCisgICAgRlBVX0VJUCAtPSBjb2RlX2Jhc2U7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7Cit9CisKKworLyogU3VwcG9ydCBmb3IgcHJlZml4IGJ5dGVzIGlzIG5vdCB5ZXQgY29tcGxldGUuIFRvIHByb3Blcmx5IGhhbmRsZQorICAgYWxsIHByZWZpeCBieXRlcywgZnVydGhlciBjaGFuZ2VzIGFyZSBuZWVkZWQgaW4gdGhlIGVtdWxhdG9yIGNvZGUKKyAgIHdoaWNoIGFjY2Vzc2VzIHVzZXIgYWRkcmVzcyBzcGFjZS4gQWNjZXNzIHRvIHNlcGFyYXRlIHNlZ21lbnRzIGlzCisgICBpbXBvcnRhbnQgZm9yIG1zZG9zIGVtdWxhdGlvbi4gKi8KK3N0YXRpYyBpbnQgdmFsaWRfcHJlZml4KHVfY2hhciAqQnl0ZSwgdV9jaGFyIF9fdXNlciAqKmZwdV9laXAsCisJCQlvdmVycmlkZXMgKm92ZXJyaWRlKQoreworICB1X2NoYXIgYnl0ZTsKKyAgdV9jaGFyIF9fdXNlciAqaXAgPSAqZnB1X2VpcDsKKworICAqb3ZlcnJpZGUgPSAob3ZlcnJpZGVzKSB7IDAsIDAsIFBSRUZJWF9ERUZBVUxUIH07ICAgICAgIC8qIGRlZmF1bHRzICovCisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9jb2RlX2FjY2Vzc19vaygxKTsKKyAgRlBVX2dldF91c2VyKGJ5dGUsIGlwKTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICB3aGlsZSAoIDEgKQorICAgIHsKKyAgICAgIHN3aXRjaCAoIGJ5dGUgKQorCXsKKwljYXNlIEFERFJfU0laRV9QUkVGSVg6CisJICBvdmVycmlkZS0+YWRkcmVzc19zaXplID0gQUREUl9TSVpFX1BSRUZJWDsKKwkgIGdvdG8gZG9fbmV4dF9ieXRlOworCisJY2FzZSBPUF9TSVpFX1BSRUZJWDoKKwkgIG92ZXJyaWRlLT5vcGVyYW5kX3NpemUgPSBPUF9TSVpFX1BSRUZJWDsKKwkgIGdvdG8gZG9fbmV4dF9ieXRlOworCisJY2FzZSBQUkVGSVhfQ1M6CisJICBvdmVycmlkZS0+c2VnbWVudCA9IFBSRUZJWF9DU187CisJICBnb3RvIGRvX25leHRfYnl0ZTsKKwljYXNlIFBSRUZJWF9FUzoKKwkgIG92ZXJyaWRlLT5zZWdtZW50ID0gUFJFRklYX0VTXzsKKwkgIGdvdG8gZG9fbmV4dF9ieXRlOworCWNhc2UgUFJFRklYX1NTOgorCSAgb3ZlcnJpZGUtPnNlZ21lbnQgPSBQUkVGSVhfU1NfOworCSAgZ290byBkb19uZXh0X2J5dGU7CisJY2FzZSBQUkVGSVhfRlM6CisJICBvdmVycmlkZS0+c2VnbWVudCA9IFBSRUZJWF9GU187CisJICBnb3RvIGRvX25leHRfYnl0ZTsKKwljYXNlIFBSRUZJWF9HUzoKKwkgIG92ZXJyaWRlLT5zZWdtZW50ID0gUFJFRklYX0dTXzsKKwkgIGdvdG8gZG9fbmV4dF9ieXRlOworCWNhc2UgUFJFRklYX0RTOgorCSAgb3ZlcnJpZGUtPnNlZ21lbnQgPSBQUkVGSVhfRFNfOworCSAgZ290byBkb19uZXh0X2J5dGU7CisKKy8qIGxvY2sgaXMgbm90IGEgdmFsaWQgcHJlZml4IGZvciBGUFUgaW5zdHJ1Y3Rpb25zLAorICAgbGV0IHRoZSBjcHUgaGFuZGxlIGl0IHRvIGdlbmVyYXRlIGEgU0lHSUxMLiAqLworLyoJY2FzZSBQUkVGSVhfTE9DSzogKi8KKworCSAgLyogcmVwLi4gcHJlZml4ZXMgaGF2ZSBubyBtZWFuaW5nIGZvciBGUFUgaW5zdHJ1Y3Rpb25zICovCisJY2FzZSBQUkVGSVhfUkVQRToKKwljYXNlIFBSRUZJWF9SRVBORToKKworCWRvX25leHRfYnl0ZToKKwkgIGlwKys7CisJICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKwkgIEZQVV9jb2RlX2FjY2Vzc19vaygxKTsKKwkgIEZQVV9nZXRfdXNlcihieXRlLCBpcCk7CisJICBSRV9FTlRSQU5UX0NIRUNLX09OOworCSAgYnJlYWs7CisJY2FzZSBGV0FJVF9PUENPREU6CisJICAqQnl0ZSA9IGJ5dGU7CisJICByZXR1cm4gMTsKKwlkZWZhdWx0OgorCSAgaWYgKCAoYnl0ZSAmIDB4ZjgpID09IDB4ZDggKQorCSAgICB7CisJICAgICAgKkJ5dGUgPSBieXRlOworCSAgICAgICpmcHVfZWlwID0gaXA7CisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIE5vdCBhIHZhbGlkIHNlcXVlbmNlIG9mIHByZWZpeCBieXRlcyBmb2xsb3dlZCBieQorCQkgYW4gRlBVIGluc3RydWN0aW9uLiAqLworCSAgICAgICpCeXRlID0gYnl0ZTsgIC8qIE5lZWRlZCBmb3IgZXJyb3IgbWVzc2FnZS4gKi8KKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKwordm9pZCBtYXRoX2Fib3J0KHN0cnVjdCBpbmZvICogaW5mbywgdW5zaWduZWQgaW50IHNpZ25hbCkKK3sKKwlGUFVfRUlQID0gRlBVX09SSUdfRUlQOworCWN1cnJlbnQtPnRocmVhZC50cmFwX25vID0gMTY7CisJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOworCXNlbmRfc2lnKHNpZ25hbCxjdXJyZW50LDEpOworCVJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworCV9fYXNtX18oIm1vdmwgJTAsJSVlc3AgOyByZXQiOiA6ImciICgoKGxvbmcpIGluZm8pLTQpKTsKKyNpZmRlZiBQQVJBTk9JRAorICAgICAgcHJpbnRrKCJFUlJPUjogd20tRlBVLWVtdSBtYXRoX2Fib3J0IGZhaWxlZCFcbiIpOworI2VuZGlmIC8qIFBBUkFOT0lEICovCit9CisKKworCisjZGVmaW5lIFMzODcgKChzdHJ1Y3QgaTM4N19zb2Z0X3N0cnVjdCAqKXMzODcpCisjZGVmaW5lIHNzdGF0dXNfd29yZCgpIFwKKyAgKChTMzg3LT5zd2QgJiB+U1dfVG9wICYgMHhmZmZmKSB8ICgoUzM4Ny0+ZnRvcCA8PCBTV19Ub3BfU2hpZnQpICYgU1dfVG9wKSkKKworaW50IHJlc3RvcmVfaTM4N19zb2Z0KHZvaWQgKnMzODcsIHN0cnVjdCBfZnBzdGF0ZSBfX3VzZXIgKmJ1ZikKK3sKKyAgdV9jaGFyIF9fdXNlciAqZCA9ICh1X2NoYXIgX191c2VyICopYnVmOworICBpbnQgb2Zmc2V0LCBvdGhlciwgaSwgdGFncywgcmVnbnIsIHRhZywgbmV3dG9wOworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELCBkLCA3KjQgKyA4KjEwKTsKKyAgaWYgKF9fY29weV9mcm9tX3VzZXIoJlMzODctPmN3ZCwgZCwgNyo0KSkKKyAgICByZXR1cm4gLTE7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgZCArPSA3KjQ7CisKKyAgUzM4Ny0+ZnRvcCA9IChTMzg3LT5zd2QgPj4gU1dfVG9wX1NoaWZ0KSAmIDc7CisgIG9mZnNldCA9IChTMzg3LT5mdG9wICYgNykgKiAxMDsKKyAgb3RoZXIgPSA4MCAtIG9mZnNldDsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgLyogQ29weSBhbGwgcmVnaXN0ZXJzIGluIHN0YWNrIG9yZGVyLiAqLworICBpZiAoX19jb3B5X2Zyb21fdXNlcigoKHVfY2hhciAqKSZTMzg3LT5zdF9zcGFjZSkrb2Zmc2V0LCBkLCBvdGhlcikpCisgICAgcmV0dXJuIC0xOworICBpZiAoIG9mZnNldCApCisgICAgaWYgKF9fY29weV9mcm9tX3VzZXIoKHVfY2hhciAqKSZTMzg3LT5zdF9zcGFjZSwgZCtvdGhlciwgb2Zmc2V0KSkKKyAgICAgIHJldHVybiAtMTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICAvKiBUaGUgdGFncyBtYXkgbmVlZCB0byBiZSBjb3JyZWN0ZWQgbm93LiAqLworICB0YWdzID0gUzM4Ny0+dHdkOworICBuZXd0b3AgPSBTMzg3LT5mdG9wOworICBmb3IgKCBpID0gMDsgaSA8IDg7IGkrKyApCisgICAgeworICAgICAgcmVnbnIgPSAoaStuZXd0b3ApICYgNzsKKyAgICAgIGlmICggKCh0YWdzID4+ICgocmVnbnIgJiA3KSoyKSkgJiAzKSAhPSBUQUdfRW1wdHkgKQorCXsKKwkgIC8qIFRoZSBsb2FkZWQgZGF0YSBvdmVyLXJpZGVzIGFsbCBvdGhlciBjYXNlcy4gKi8KKwkgIHRhZyA9IEZQVV90YWdvZigoRlBVX1JFRyAqKSgodV9jaGFyICopUzM4Ny0+c3Rfc3BhY2UgKyAxMCpyZWducikpOworCSAgdGFncyAmPSB+KDMgPDwgKHJlZ25yKjIpKTsKKwkgIHRhZ3MgfD0gKHRhZyAmIDMpIDw8IChyZWducioyKTsKKwl9CisgICAgfQorICBTMzg3LT50d2QgPSB0YWdzOworCisgIHJldHVybiAwOworfQorCisKK2ludCBzYXZlX2kzODdfc29mdCh2b2lkICpzMzg3LCBzdHJ1Y3QgX2Zwc3RhdGUgX191c2VyICogYnVmKQoreworICB1X2NoYXIgX191c2VyICpkID0gKHVfY2hhciBfX3VzZXIgKilidWY7CisgIGludCBvZmZzZXQgPSAoUzM4Ny0+ZnRvcCAmIDcpICogMTAsIG90aGVyID0gODAgLSBvZmZzZXQ7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkLCA3KjQgKyA4KjEwKTsKKyNpZmRlZiBQRUNVTElBUl80ODYKKyAgUzM4Ny0+Y3dkICY9IH4weGUwODA7CisgIC8qIEFuIDgwNDg2IHNldHMgbmVhcmx5IGFsbCBvZiB0aGUgcmVzZXJ2ZWQgYml0cyB0byAxLiAqLworICBTMzg3LT5jd2QgfD0gMHhmZmZmMDA0MDsKKyAgUzM4Ny0+c3dkID0gc3N0YXR1c193b3JkKCkgfCAweGZmZmYwMDAwOworICBTMzg3LT50d2QgfD0gMHhmZmZmMDAwMDsKKyAgUzM4Ny0+ZmNzICY9IH4weGY4MDAwMDAwOworICBTMzg3LT5mb3MgfD0gMHhmZmZmMDAwMDsKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKyAgX19jb3B5X3RvX3VzZXIoZCwgJlMzODctPmN3ZCwgNyo0KTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICBkICs9IDcqNDsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgLyogQ29weSBhbGwgcmVnaXN0ZXJzIGluIHN0YWNrIG9yZGVyLiAqLworICBpZiAoX19jb3B5X3RvX3VzZXIoZCwgKCh1X2NoYXIgKikmUzM4Ny0+c3Rfc3BhY2UpK29mZnNldCwgb3RoZXIpKQorICAgIHJldHVybiAtMTsKKyAgaWYgKCBvZmZzZXQgKQorICAgIGlmIChfX2NvcHlfdG9fdXNlcihkK290aGVyLCAodV9jaGFyICopJlMzODctPnN0X3NwYWNlLCBvZmZzZXQpKQorICAgICAgcmV0dXJuIC0xCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X2V0Yy5jIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9ldGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2I1ZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9ldGMuYwpAQCAtMCwwICsxLDE0MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgZnB1X2V0Yy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgSW1wbGVtZW50IGEgZmV3IEZQVSBpbnN0cnVjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgInN0YXR1c193LmgiCisjaW5jbHVkZSAicmVnX2NvbnN0YW50LmgiCisKKworc3RhdGljIHZvaWQgZmNocyhGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwdGFnKQoreworICBpZiAoIHN0MHRhZyBeIFRBR19FbXB0eSApCisgICAgeworICAgICAgc2lnbmJ5dGUoc3QwX3B0cikgXj0gU0lHTl9ORUc7CisgICAgICBjbGVhcl9DMSgpOworICAgIH0KKyAgZWxzZQorICAgIEZQVV9zdGFja191bmRlcmZsb3coKTsKK30KKworCitzdGF0aWMgdm9pZCBmYWJzKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDB0YWcpCit7CisgIGlmICggc3QwdGFnIF4gVEFHX0VtcHR5ICkKKyAgICB7CisgICAgICBzZXRwb3NpdGl2ZShzdDBfcHRyKTsKKyAgICAgIGNsZWFyX0MxKCk7CisgICAgfQorICBlbHNlCisgICAgRlBVX3N0YWNrX3VuZGVyZmxvdygpOworfQorCisKK3N0YXRpYyB2b2lkIGZ0c3RfKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDB0YWcpCit7CisgIHN3aXRjaCAoc3QwdGFnKQorICAgIHsKKyAgICBjYXNlIFRBR19aZXJvOgorICAgICAgc2V0Y2MoU1dfQzMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQUdfVmFsaWQ6CisgICAgICBpZiAoZ2V0c2lnbihzdDBfcHRyKSA9PSBTSUdOX1BPUykKKyAgICAgICAgc2V0Y2MoMCk7CisgICAgICBlbHNlCisgICAgICAgIHNldGNjKFNXX0MwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFHX1NwZWNpYWw6CisgICAgICBzd2l0Y2ggKCBGUFVfU3BlY2lhbChzdDBfcHRyKSApCisJeworCWNhc2UgVFdfRGVub3JtYWw6CisJICBpZiAoZ2V0c2lnbihzdDBfcHRyKSA9PSBTSUdOX1BPUykKKwkgICAgc2V0Y2MoMCk7CisJICBlbHNlCisJICAgIHNldGNjKFNXX0MwKTsKKwkgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJICAgIHsKKyNpZmRlZiBQRUNVTElBUl80ODYKKwkgICAgICAvKiBUaGlzIGlzIHdlaXJkISAqLworCSAgICAgIGlmIChnZXRzaWduKHN0MF9wdHIpID09IFNJR05fUE9TKQorCQlzZXRjYyhTV19DMyk7CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBicmVhazsKKwljYXNlIFRXX05hTjoKKwkgIHNldGNjKFNXX0MwfFNXX0MyfFNXX0MzKTsgICAvKiBPcGVyYW5kIGlzIG5vdCBjb21wYXJhYmxlICovIAorCSAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCSAgYnJlYWs7CisJY2FzZSBUV19JbmZpbml0eToKKwkgIGlmIChnZXRzaWduKHN0MF9wdHIpID09IFNJR05fUE9TKQorCSAgICBzZXRjYygwKTsKKwkgIGVsc2UKKwkgICAgc2V0Y2MoU1dfQzApOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHNldGNjKFNXX0MwfFNXX0MyfFNXX0MzKTsgICAvKiBPcGVyYW5kIGlzIG5vdCBjb21wYXJhYmxlICovIAorCSAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTQpOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBUQUdfRW1wdHk6CisgICAgICBzZXRjYyhTV19DMHxTV19DMnxTV19DMyk7CisgICAgICBFWENFUFRJT04oRVhfU3RhY2tVbmRlcik7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgZnhhbShGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwdGFnKQoreworICBpbnQgYyA9IDA7CisgIHN3aXRjaCAoc3QwdGFnKQorICAgIHsKKyAgICBjYXNlIFRBR19FbXB0eToKKyAgICAgIGMgPSBTV19DM3xTV19DMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFHX1plcm86CisgICAgICBjID0gU1dfQzM7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRBR19WYWxpZDoKKyAgICAgIGMgPSBTV19DMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFHX1NwZWNpYWw6CisgICAgICBzd2l0Y2ggKCBGUFVfU3BlY2lhbChzdDBfcHRyKSApCisJeworCWNhc2UgVFdfRGVub3JtYWw6CisJICBjID0gU1dfQzJ8U1dfQzM7ICAvKiBEZW5vcm1hbCAqLworCSAgYnJlYWs7CisJY2FzZSBUV19OYU46CisJICAvKiBXZSBhbHNvIHVzZSBOYU4gZm9yIHVuc3VwcG9ydGVkIHR5cGVzLiAqLworCSAgaWYgKCAoc3QwX3B0ci0+c2lnaCAmIDB4ODAwMDAwMDApICYmIChleHBvbmVudChzdDBfcHRyKSA9PSBFWFBfT1ZFUikgKQorCSAgICBjID0gU1dfQzA7CisJICBicmVhazsKKwljYXNlIFRXX0luZmluaXR5OgorCSAgYyA9IFNXX0MyfFNXX0MwOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgaWYgKCBnZXRzaWduKHN0MF9wdHIpID09IFNJR05fTkVHICkKKyAgICBjIHw9IFNXX0MxOworICBzZXRjYyhjKTsKK30KKworCitzdGF0aWMgRlVOQ19TVDAgY29uc3QgZnBfZXRjX3RhYmxlW10gPSB7CisgIGZjaHMsIGZhYnMsIChGVU5DX1NUMClGUFVfaWxsZWdhbCwgKEZVTkNfU1QwKUZQVV9pbGxlZ2FsLAorICBmdHN0XywgZnhhbSwgKEZVTkNfU1QwKUZQVV9pbGxlZ2FsLCAoRlVOQ19TVDApRlBVX2lsbGVnYWwKK307CisKK3ZvaWQgRlBVX2V0Yyh2b2lkKQoreworICAoZnBfZXRjX3RhYmxlW0ZQVV9ybV0pKCZzdCgwKSwgRlBVX2dldHRhZzAoKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3Byb3RvLmggYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhOGE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfcHJvdG8uaApAQCAtMCwwICsxLDE0MCBAQAorI2lmbmRlZiBfRlBVX1BST1RPX0gKKyNkZWZpbmUgX0ZQVV9QUk9UT19ICisKKy8qIGVycm9ycy5jICovCitleHRlcm4gdm9pZCBGUFVfaWxsZWdhbCh2b2lkKTsKK2V4dGVybiB2b2lkIEZQVV9wcmludGFsbCh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBGUFVfZXhjZXB0aW9uKGludCBuKTsKK2V4dGVybiBpbnQgcmVhbF8xb3BfTmFOKEZQVV9SRUcgKmEpOworZXh0ZXJuIGludCByZWFsXzJvcF9OYU4oRlBVX1JFRyBjb25zdCAqYiwgdV9jaGFyIHRhZ2IsIGludCBkZXN0c3RuciwKKwkJCUZQVV9SRUcgY29uc3QgKmRlZmF1bHROYU4pOworYXNtbGlua2FnZSBpbnQgYXJpdGhfaW52YWxpZChpbnQgZGVzdHN0bnIpOworYXNtbGlua2FnZSBpbnQgRlBVX2RpdmlkZV9ieV96ZXJvKGludCBkZXN0c3RuciwgdV9jaGFyIHNpZ24pOworZXh0ZXJuIGludCBzZXRfcHJlY2lzaW9uX2ZsYWcoaW50IGZsYWdzKTsKK2FzbWxpbmthZ2Ugdm9pZCBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAodm9pZCk7Cithc21saW5rYWdlIHZvaWQgc2V0X3ByZWNpc2lvbl9mbGFnX2Rvd24odm9pZCk7Cithc21saW5rYWdlIGludCBkZW5vcm1hbF9vcGVyYW5kKHZvaWQpOworYXNtbGlua2FnZSBpbnQgYXJpdGhfb3ZlcmZsb3coRlBVX1JFRyAqZGVzdCk7Cithc21saW5rYWdlIGludCBhcml0aF91bmRlcmZsb3coRlBVX1JFRyAqZGVzdCk7CitleHRlcm4gdm9pZCBGUFVfc3RhY2tfb3ZlcmZsb3codm9pZCk7CitleHRlcm4gdm9pZCBGUFVfc3RhY2tfdW5kZXJmbG93KHZvaWQpOworZXh0ZXJuIHZvaWQgRlBVX3N0YWNrX3VuZGVyZmxvd19pKGludCBpKTsKK2V4dGVybiB2b2lkIEZQVV9zdGFja191bmRlcmZsb3dfcG9wKGludCBpKTsKKy8qIGZwdV9hcml0aC5jICovCitleHRlcm4gdm9pZCBmYWRkX18odm9pZCk7CitleHRlcm4gdm9pZCBmbXVsX18odm9pZCk7CitleHRlcm4gdm9pZCBmc3ViX18odm9pZCk7CitleHRlcm4gdm9pZCBmc3Vicl8odm9pZCk7CitleHRlcm4gdm9pZCBmZGl2X18odm9pZCk7CitleHRlcm4gdm9pZCBmZGl2cl8odm9pZCk7CitleHRlcm4gdm9pZCBmYWRkX2kodm9pZCk7CitleHRlcm4gdm9pZCBmbXVsX2kodm9pZCk7CitleHRlcm4gdm9pZCBmc3Vicmkodm9pZCk7CitleHRlcm4gdm9pZCBmc3ViX2kodm9pZCk7CitleHRlcm4gdm9pZCBmZGl2cmkodm9pZCk7CitleHRlcm4gdm9pZCBmZGl2X2kodm9pZCk7CitleHRlcm4gdm9pZCBmYWRkcF8odm9pZCk7CitleHRlcm4gdm9pZCBmbXVscF8odm9pZCk7CitleHRlcm4gdm9pZCBmc3VicnAodm9pZCk7CitleHRlcm4gdm9pZCBmc3VicF8odm9pZCk7CitleHRlcm4gdm9pZCBmZGl2cnAodm9pZCk7CitleHRlcm4gdm9pZCBmZGl2cF8odm9pZCk7CisvKiBmcHVfYXV4LmMgKi8KK2V4dGVybiB2b2lkIGZpbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgZmluaXRfKHZvaWQpOworZXh0ZXJuIHZvaWQgZnN0c3dfKHZvaWQpOworZXh0ZXJuIHZvaWQgZnBfbm9wKHZvaWQpOworZXh0ZXJuIHZvaWQgZmxkX2lfKHZvaWQpOworZXh0ZXJuIHZvaWQgZnhjaF9pKHZvaWQpOworZXh0ZXJuIHZvaWQgZmZyZWVfKHZvaWQpOworZXh0ZXJuIHZvaWQgZmZyZWVwKHZvaWQpOworZXh0ZXJuIHZvaWQgZnN0X2lfKHZvaWQpOworZXh0ZXJuIHZvaWQgZnN0cF9pKHZvaWQpOworLyogZnB1X2VudHJ5LmMgKi8KK2FzbWxpbmthZ2UgZXh0ZXJuIHZvaWQgbWF0aF9lbXVsYXRlKGxvbmcgYXJnKTsKK2V4dGVybiB2b2lkIG1hdGhfYWJvcnQoc3RydWN0IGluZm8gKmluZm8sIHVuc2lnbmVkIGludCBzaWduYWwpOworLyogZnB1X2V0Yy5jICovCitleHRlcm4gdm9pZCBGUFVfZXRjKHZvaWQpOworLyogZnB1X3RhZ3MuYyAqLworZXh0ZXJuIGludCBGUFVfZ2V0dGFnMCh2b2lkKTsKK2V4dGVybiBpbnQgRlBVX2dldHRhZ2koaW50IHN0bnIpOworZXh0ZXJuIGludCBGUFVfZ2V0dGFnKGludCByZWducik7CitleHRlcm4gdm9pZCBGUFVfc2V0dGFnMChpbnQgdGFnKTsKK2V4dGVybiB2b2lkIEZQVV9zZXR0YWdpKGludCBzdG5yLCBpbnQgdGFnKTsKK2V4dGVybiB2b2lkIEZQVV9zZXR0YWcoaW50IHJlZ25yLCBpbnQgdGFnKTsKK2V4dGVybiBpbnQgRlBVX1NwZWNpYWwoRlBVX1JFRyBjb25zdCAqcHRyKTsKK2V4dGVybiBpbnQgaXNOYU4oRlBVX1JFRyBjb25zdCAqcHRyKTsKK2V4dGVybiB2b2lkIEZQVV9wb3Aodm9pZCk7CitleHRlcm4gaW50IEZQVV9lbXB0eV9pKGludCBzdG5yKTsKK2V4dGVybiBpbnQgRlBVX3N0YWNrb3ZlcmZsb3coRlBVX1JFRyAqKnN0X25ld19wdHIpOworZXh0ZXJuIHZvaWQgRlBVX2NvcHlfdG9fcmVnaShGUFVfUkVHIGNvbnN0ICpyLCB1X2NoYXIgdGFnLCBpbnQgc3Rucik7CitleHRlcm4gdm9pZCBGUFVfY29weV90b19yZWcxKEZQVV9SRUcgY29uc3QgKnIsIHVfY2hhciB0YWcpOworZXh0ZXJuIHZvaWQgRlBVX2NvcHlfdG9fcmVnMChGUFVfUkVHIGNvbnN0ICpyLCB1X2NoYXIgdGFnKTsKKy8qIGZwdV90cmlnLmMgKi8KK2V4dGVybiB2b2lkIEZQVV90cmlnYSh2b2lkKTsKK2V4dGVybiB2b2lkIEZQVV90cmlnYih2b2lkKTsKKy8qIGdldF9hZGRyZXNzLmMgKi8KK2V4dGVybiB2b2lkIF9fdXNlciAqRlBVX2dldF9hZGRyZXNzKHVfY2hhciBGUFVfbW9kcm0sIHVuc2lnbmVkIGxvbmcgKmZwdV9laXAsCisJCQkgc3RydWN0IGFkZHJlc3MgKmFkZHIsIGZwdV9hZGRyX21vZGVzIGFkZHJfbW9kZXMpOworZXh0ZXJuIHZvaWQgX191c2VyICpGUFVfZ2V0X2FkZHJlc3NfMTYodV9jaGFyIEZQVV9tb2RybSwgdW5zaWduZWQgbG9uZyAqZnB1X2VpcCwKKwkJCSAgICBzdHJ1Y3QgYWRkcmVzcyAqYWRkciwgZnB1X2FkZHJfbW9kZXMgYWRkcl9tb2Rlcyk7CisvKiBsb2FkX3N0b3JlLmMgKi8KK2V4dGVybiBpbnQgRlBVX2xvYWRfc3RvcmUodV9jaGFyIHR5cGUsIGZwdV9hZGRyX21vZGVzIGFkZHJfbW9kZXMsCisJCQkgICAgdm9pZCBfX3VzZXIgKmRhdGFfYWRkcmVzcyk7CisvKiBwb2x5XzJ4bTEuYyAqLworZXh0ZXJuIGludCBwb2x5XzJ4bTEodV9jaGFyIHNpZ24sIEZQVV9SRUcgKmFyZywgRlBVX1JFRyAqcmVzdWx0KTsKKy8qIHBvbHlfYXRhbi5jICovCitleHRlcm4gdm9pZCBwb2x5X2F0YW4oRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsIEZQVV9SRUcgKnN0MV9wdHIsCisJCSAgICAgIHVfY2hhciBzdDFfdGFnKTsKKy8qIHBvbHlfbDIuYyAqLworZXh0ZXJuIHZvaWQgcG9seV9sMihGUFVfUkVHICpzdDBfcHRyLCBGUFVfUkVHICpzdDFfcHRyLCB1X2NoYXIgc3QxX3NpZ24pOworZXh0ZXJuIGludCBwb2x5X2wycDEodV9jaGFyIHMwLCB1X2NoYXIgczEsIEZQVV9SRUcgKnIwLCBGUFVfUkVHICpyMSwKKwkJICAgICBGUFVfUkVHICpkKTsKKy8qIHBvbHlfc2luLmMgKi8KK2V4dGVybiB2b2lkIHBvbHlfc2luZShGUFVfUkVHICpzdDBfcHRyKTsKK2V4dGVybiB2b2lkIHBvbHlfY29zKEZQVV9SRUcgKnN0MF9wdHIpOworLyogcG9seV90YW4uYyAqLworZXh0ZXJuIHZvaWQgcG9seV90YW4oRlBVX1JFRyAqc3QwX3B0cik7CisvKiByZWdfYWRkX3N1Yi5jICovCitleHRlcm4gaW50IEZQVV9hZGQoRlBVX1JFRyBjb25zdCAqYiwgdV9jaGFyIHRhZ2IsIGludCBkZXN0cm5yLCBpbnQgY29udHJvbF93KTsKK2V4dGVybiBpbnQgRlBVX3N1YihpbnQgZmxhZ3MsIGludCBybSwgaW50IGNvbnRyb2xfdyk7CisvKiByZWdfY29tcGFyZS5jICovCitleHRlcm4gaW50IEZQVV9jb21wYXJlX3N0X2RhdGEoRlBVX1JFRyBjb25zdCAqbG9hZGVkX2RhdGEsIHVfY2hhciBsb2FkZWRfdGFnKTsKK2V4dGVybiB2b2lkIGZjb21fc3Qodm9pZCk7CitleHRlcm4gdm9pZCBmY29tcHN0KHZvaWQpOworZXh0ZXJuIHZvaWQgZmNvbXBwKHZvaWQpOworZXh0ZXJuIHZvaWQgZnVjb21fKHZvaWQpOworZXh0ZXJuIHZvaWQgZnVjb21wKHZvaWQpOworZXh0ZXJuIHZvaWQgZnVjb21wcCh2b2lkKTsKKy8qIHJlZ19jb25zdGFudC5jICovCitleHRlcm4gdm9pZCBmY29uc3Qodm9pZCk7CisvKiByZWdfbGRfc3RyLmMgKi8KK2V4dGVybiBpbnQgRlBVX2xvYWRfZXh0ZW5kZWQobG9uZyBkb3VibGUgX191c2VyICpzLCBpbnQgc3Rucik7CitleHRlcm4gaW50IEZQVV9sb2FkX2RvdWJsZShkb3VibGUgX191c2VyICpkZmxvYXQsIEZQVV9SRUcgKmxvYWRlZF9kYXRhKTsKK2V4dGVybiBpbnQgRlBVX2xvYWRfc2luZ2xlKGZsb2F0IF9fdXNlciAqc2luZ2xlLCBGUFVfUkVHICpsb2FkZWRfZGF0YSk7CitleHRlcm4gaW50IEZQVV9sb2FkX2ludDY0KGxvbmcgbG9uZyBfX3VzZXIgKl9zKTsKK2V4dGVybiBpbnQgRlBVX2xvYWRfaW50MzIobG9uZyBfX3VzZXIgKl9zLCBGUFVfUkVHICpsb2FkZWRfZGF0YSk7CitleHRlcm4gaW50IEZQVV9sb2FkX2ludDE2KHNob3J0IF9fdXNlciAqX3MsIEZQVV9SRUcgKmxvYWRlZF9kYXRhKTsKK2V4dGVybiBpbnQgRlBVX2xvYWRfYmNkKHVfY2hhciBfX3VzZXIgKnMpOworZXh0ZXJuIGludCBGUFVfc3RvcmVfZXh0ZW5kZWQoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsCisJCQkgICAgICBsb25nIGRvdWJsZSBfX3VzZXIgKmQpOworZXh0ZXJuIGludCBGUFVfc3RvcmVfZG91YmxlKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCBkb3VibGUgX191c2VyICpkZmxvYXQpOworZXh0ZXJuIGludCBGUFVfc3RvcmVfc2luZ2xlKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCBmbG9hdCBfX3VzZXIgKnNpbmdsZSk7CitleHRlcm4gaW50IEZQVV9zdG9yZV9pbnQ2NChGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZywgbG9uZyBsb25nIF9fdXNlciAqZCk7CitleHRlcm4gaW50IEZQVV9zdG9yZV9pbnQzMihGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZywgbG9uZyBfX3VzZXIgKmQpOworZXh0ZXJuIGludCBGUFVfc3RvcmVfaW50MTYoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsIHNob3J0IF9fdXNlciAqZCk7CitleHRlcm4gaW50IEZQVV9zdG9yZV9iY2QoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsIHVfY2hhciBfX3VzZXIgKmQpOworZXh0ZXJuIGludCBGUFVfcm91bmRfdG9faW50KEZQVV9SRUcgKnIsIHVfY2hhciB0YWcpOworZXh0ZXJuIHVfY2hhciBfX3VzZXIgKmZsZGVudihmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzLCB1X2NoYXIgX191c2VyICpzKTsKK2V4dGVybiB2b2lkIGZyc3RvcihmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzLCB1X2NoYXIgX191c2VyICpkYXRhX2FkZHJlc3MpOworZXh0ZXJuIHVfY2hhciBfX3VzZXIgKmZzdGVudihmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzLCB1X2NoYXIgX191c2VyICpkKTsKK2V4dGVybiB2b2lkIGZzYXZlKGZwdV9hZGRyX21vZGVzIGFkZHJfbW9kZXMsIHVfY2hhciBfX3VzZXIgKmRhdGFfYWRkcmVzcyk7CitleHRlcm4gaW50IEZQVV90YWdvZihGUFVfUkVHICpwdHIpOworLyogcmVnX211bC5jICovCitleHRlcm4gaW50IEZQVV9tdWwoRlBVX1JFRyBjb25zdCAqYiwgdV9jaGFyIHRhZ2IsIGludCBkZXN0c3RuciwgaW50IGNvbnRyb2xfdyk7CisKK2V4dGVybiBpbnQgRlBVX2RpdihpbnQgZmxhZ3MsIGludCByZWdybSwgaW50IGNvbnRyb2xfdyk7CisvKiByZWdfY29udmVydC5jICovCitleHRlcm4gaW50IEZQVV90b19leHAxNihGUFVfUkVHIGNvbnN0ICphLCBGUFVfUkVHICp4KTsKKyNlbmRpZiAvKiBfRlBVX1BST1RPX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV9zeXN0ZW0uaCBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyNjM0MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfc3lzdGVtLmgKQEAgLTAsMCArMSw4OSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgZnB1X3N5c3RlbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTQsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgICBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX0ZQVV9TWVNURU1fSAorI2RlZmluZSBfRlBVX1NZU1RFTV9ICisKKy8qIHN5c3RlbSBkZXBlbmRlbnQgZGVmaW5pdGlvbnMgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworLyogVGhpcyBzZXRzIHRoZSBwb2ludGVyIEZQVV9pbmZvIHRvIHBvaW50IHRvIHRoZSBhcmd1bWVudCBwYXJ0CisgICBvZiB0aGUgc3RhY2sgZnJhbWUgb2YgbWF0aF9lbXVsYXRlKCkgKi8KKyNkZWZpbmUgU0VUVVBfREFUQV9BUkVBKGFyZykJRlBVX2luZm8gPSAoc3RydWN0IGluZm8gKikgJmFyZworCisvKiBzIGlzIGFsd2F5cyBmcm9tIGEgY3B1IHJlZ2lzdGVyLCBhbmQgdGhlIGNwdSBkb2VzIGJvdW5kcyBjaGVja2luZworICogZHVyaW5nIHJlZ2lzdGVyIGxvYWQgLS0+IG5vIGZ1cnRoZXIgYm91bmRzIGNoZWNrcyBuZWVkZWQgKi8KKyNkZWZpbmUgTERUX0RFU0NSSVBUT1IocykJKCgoc3RydWN0IGRlc2Nfc3RydWN0ICopY3VycmVudC0+bW0tPmNvbnRleHQubGR0KVsocykgPj4gM10pCisjZGVmaW5lIFNFR19EX1NJWkUoeCkJCSgoeCkuYiAmICgzIDw8IDIxKSkKKyNkZWZpbmUgU0VHX0dfQklUKHgpCQkoKHgpLmIgJiAoMSA8PCAyMykpCisjZGVmaW5lIFNFR19HUkFOVUxBUklUWSh4KQkoKCh4KS5iICYgKDEgPDwgMjMpKSA/IDQwOTYgOiAxKQorI2RlZmluZSBTRUdfMjg2X01PREUoeCkJCSgoeCkuYiAmICggMHhmZjAwMDAwMCB8IDB4ZjAwMDAgfCAoMSA8PCAyMykpKQorI2RlZmluZSBTRUdfQkFTRV9BRERSKHMpCSgoKHMpLmIgJiAweGZmMDAwMDAwKSBcCisJCQkJIHwgKCgocykuYiAmIDB4ZmYpIDw8IDE2KSB8ICgocykuYSA+PiAxNikpCisjZGVmaW5lIFNFR19MSU1JVChzKQkJKCgocykuYiAmIDB4ZmYwMDAwKSB8ICgocykuYSAmIDB4ZmZmZikpCisjZGVmaW5lIFNFR19FWEVDVVRFX09OTFkocykJKCgocykuYiAmICgoMSA8PCAxMSkgfCAoMSA8PCA5KSkpID09ICgxIDw8IDExKSkKKyNkZWZpbmUgU0VHX1dSSVRFX1BFUk0ocykJKCgocykuYiAmICgoMSA8PCAxMSkgfCAoMSA8PCA5KSkpID09ICgxIDw8IDkpKQorI2RlZmluZSBTRUdfRVhQQU5EX0RPV04ocykJKCgocykuYiAmICgoMSA8PCAxMSkgfCAoMSA8PCAxMCkpKSBcCisJCQkJID09ICgxIDw8IDEwKSkKKworI2RlZmluZSBJMzg3CQkJKGN1cnJlbnQtPnRocmVhZC5pMzg3KQorI2RlZmluZSBGUFVfaW5mbwkJKEkzODcuc29mdC5pbmZvKQorCisjZGVmaW5lIEZQVV9DUwkJCSgqKHVuc2lnbmVkIHNob3J0ICopICYoRlBVX2luZm8tPl9fX2NzKSkKKyNkZWZpbmUgRlBVX1NTCQkJKCoodW5zaWduZWQgc2hvcnQgKikgJihGUFVfaW5mby0+X19fc3MpKQorI2RlZmluZSBGUFVfRFMJCQkoKih1bnNpZ25lZCBzaG9ydCAqKSAmKEZQVV9pbmZvLT5fX19kcykpCisjZGVmaW5lIEZQVV9FQVgJCQkoRlBVX2luZm8tPl9fX2VheCkKKyNkZWZpbmUgRlBVX0VGTEFHUwkJKEZQVV9pbmZvLT5fX19lZmxhZ3MpCisjZGVmaW5lIEZQVV9FSVAJCQkoRlBVX2luZm8tPl9fX2VpcCkKKyNkZWZpbmUgRlBVX09SSUdfRUlQCQkoRlBVX2luZm8tPl9fX29yaWdfZWlwKQorCisjZGVmaW5lIEZQVV9sb29rYWhlYWQgICAgICAgICAgIChJMzg3LnNvZnQubG9va2FoZWFkKQorCisvKiBueiBpZiBpcF9vZmZzZXQgYW5kIGNzX3NlbGVjdG9yIGFyZSBub3QgdG8gYmUgc2V0IGZvciB0aGUgY3VycmVudAorICAgaW5zdHJ1Y3Rpb24uICovCisjZGVmaW5lIG5vX2lwX3VwZGF0ZQkJKCoodV9jaGFyICopJihJMzg3LnNvZnQubm9fdXBkYXRlKSkKKyNkZWZpbmUgRlBVX3JtCQkJKCoodV9jaGFyICopJihJMzg3LnNvZnQucm0pKQorCisvKiBOdW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB3aGljaCBjYW4gYmUgbGVnYWxseSBhY2Nlc3NlZCBieSB0aGUgY3VycmVudAorICAgaW5zdHJ1Y3Rpb24uIFRoaXMgb25seSBuZWVkcyB0byBob2xkIGEgbnVtYmVyIDw9IDEwOCwgc28gYSBieXRlIHdpbGwgZG8uICovCisjZGVmaW5lIGFjY2Vzc19saW1pdAkJKCoodV9jaGFyICopJihJMzg3LnNvZnQuYWxpbWl0KSkKKworI2RlZmluZSBwYXJ0aWFsX3N0YXR1cwkJKEkzODcuc29mdC5zd2QpCisjZGVmaW5lIGNvbnRyb2xfd29yZAkJKEkzODcuc29mdC5jd2QpCisjZGVmaW5lIGZwdV90YWdfd29yZAkJKEkzODcuc29mdC50d2QpCisjZGVmaW5lIHJlZ2lzdGVycwkJKEkzODcuc29mdC5zdF9zcGFjZSkKKyNkZWZpbmUgdG9wCQkJKEkzODcuc29mdC5mdG9wKQorCisjZGVmaW5lIGluc3RydWN0aW9uX2FkZHJlc3MJKCooc3RydWN0IGFkZHJlc3MgKikmSTM4Ny5zb2Z0LmZpcCkKKyNkZWZpbmUgb3BlcmFuZF9hZGRyZXNzCQkoKihzdHJ1Y3QgYWRkcmVzcyAqKSZJMzg3LnNvZnQuZm9vKQorCisjZGVmaW5lIEZQVV9hY2Nlc3Nfb2soeCx5LHopCWlmICggIWFjY2Vzc19vayh4LHkseikgKSBcCisJCQkJbWF0aF9hYm9ydChGUFVfaW5mbyxTSUdTRUdWKQorCisjdW5kZWYgRlBVX0lHTk9SRV9DT0RFX1NFR1YKKyNpZmRlZiBGUFVfSUdOT1JFX0NPREVfU0VHVgorLyogYWNjZXNzX29rKCkgaXMgdmVyeSBleHBlbnNpdmUsIGFuZCBjYXVzZXMgdGhlIGVtdWxhdG9yIHRvIHJ1bgorICAgYWJvdXQgMjAlIHNsb3dlciBpZiBhcHBsaWVkIHRvIHRoZSBjb2RlLiBBbnl3YXksIGVycm9ycyBkdWUgdG8gYmFkCisgICBjb2RlIGFkZHJlc3NlcyBzaG91bGQgYmUgbXVjaCByYXJlciB0aGFuIGVycm9ycyBkdWUgdG8gYmFkIGRhdGEKKyAgIGFkZHJlc3Nlcy4gKi8KKyNkZWZpbmUJRlBVX2NvZGVfYWNjZXNzX29rKHopCisjZWxzZQorLyogQSBzaW1wbGVyIHRlc3QgdGhhbiBhY2Nlc3Nfb2soKSBjYW4gcHJvYmFibHkgYmUgZG9uZSBmb3IKKyAgIEZQVV9jb2RlX2FjY2Vzc19vaygpIGJlY2F1c2UgdGhlIG9ubHkgcG9zc2libGUgZXJyb3IgaXMgdG8gc3RlcAorICAgcGFzdCB0aGUgdXBwZXIgYm91bmRhcnkgb2YgYSBsZWdhbCBjb2RlIGFyZWEuICovCisjZGVmaW5lCUZQVV9jb2RlX2FjY2Vzc19vayh6KSBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELCh2b2lkIF9fdXNlciAqKUZQVV9FSVAseikKKyNlbmRpZgorCisjZGVmaW5lIEZQVV9nZXRfdXNlcih4LHkpICAgICAgIGdldF91c2VyKCh4KSwoeSkpCisjZGVmaW5lIEZQVV9wdXRfdXNlcih4LHkpICAgICAgIHB1dF91c2VyKCh4KSwoeSkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV90YWdzLmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3RhZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQzNmZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L2ZwdV90YWdzLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIGZwdV90YWdzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBTZXQgRlBVIHJlZ2lzdGVyIHRhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCBBdXN0cmFsaWEgfAorIHwgICAgICAgICAgICAgICAgICBFLW1haWwgICBiaWxsbUBqYWNvYmkubWF0aHMubW9uYXNoLmVkdS5hdSAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKworCit2b2lkIEZQVV9wb3Aodm9pZCkKK3sKKyAgZnB1X3RhZ193b3JkIHw9IDMgPDwgKCh0b3AgJiA3KSoyKTsKKyAgdG9wKys7Cit9CisKKworaW50IEZQVV9nZXR0YWcwKHZvaWQpCit7CisgIHJldHVybiAoZnB1X3RhZ193b3JkID4+ICgodG9wICYgNykqMikpICYgMzsKK30KKworCitpbnQgRlBVX2dldHRhZ2koaW50IHN0bnIpCit7CisgIHJldHVybiAoZnB1X3RhZ193b3JkID4+ICgoKHRvcCtzdG5yKSAmIDcpKjIpKSAmIDM7Cit9CisKKworaW50IEZQVV9nZXR0YWcoaW50IHJlZ25yKQoreworICByZXR1cm4gKGZwdV90YWdfd29yZCA+PiAoKHJlZ25yICYgNykqMikpICYgMzsKK30KKworCit2b2lkIEZQVV9zZXR0YWcwKGludCB0YWcpCit7CisgIGludCByZWduciA9IHRvcDsKKyAgcmVnbnIgJj0gNzsKKyAgZnB1X3RhZ193b3JkICY9IH4oMyA8PCAocmVnbnIqMikpOworICBmcHVfdGFnX3dvcmQgfD0gKHRhZyAmIDMpIDw8IChyZWducioyKTsKK30KKworCit2b2lkIEZQVV9zZXR0YWdpKGludCBzdG5yLCBpbnQgdGFnKQoreworICBpbnQgcmVnbnIgPSBzdG5yK3RvcDsKKyAgcmVnbnIgJj0gNzsKKyAgZnB1X3RhZ193b3JkICY9IH4oMyA8PCAocmVnbnIqMikpOworICBmcHVfdGFnX3dvcmQgfD0gKHRhZyAmIDMpIDw8IChyZWducioyKTsKK30KKworCit2b2lkIEZQVV9zZXR0YWcoaW50IHJlZ25yLCBpbnQgdGFnKQoreworICByZWduciAmPSA3OworICBmcHVfdGFnX3dvcmQgJj0gfigzIDw8IChyZWducioyKSk7CisgIGZwdV90YWdfd29yZCB8PSAodGFnICYgMykgPDwgKHJlZ25yKjIpOworfQorCisKK2ludCBGUFVfU3BlY2lhbChGUFVfUkVHIGNvbnN0ICpwdHIpCit7CisgIGludCBleHAgPSBleHBvbmVudChwdHIpOworCisgIGlmICggZXhwID09IEVYUF9CSUFTK0VYUF9VTkRFUiApCisgICAgcmV0dXJuIFRXX0Rlbm9ybWFsOworICBlbHNlIGlmICggZXhwICE9IEVYUF9CSUFTK0VYUF9PVkVSICkKKyAgICByZXR1cm4gVFdfTmFOOworICBlbHNlIGlmICggKHB0ci0+c2lnaCA9PSAweDgwMDAwMDAwKSAmJiAocHRyLT5zaWdsID09IDApICkKKyAgICByZXR1cm4gVFdfSW5maW5pdHk7CisgIHJldHVybiBUV19OYU47Cit9CisKKworaW50IGlzTmFOKEZQVV9SRUcgY29uc3QgKnB0cikKK3sKKyAgcmV0dXJuICggKGV4cG9uZW50KHB0cikgPT0gRVhQX0JJQVMrRVhQX09WRVIpCisJICAgJiYgISgocHRyLT5zaWdoID09IDB4ODAwMDAwMDApICYmIChwdHItPnNpZ2wgPT0gMCkpICk7Cit9CisKKworaW50IEZQVV9lbXB0eV9pKGludCBzdG5yKQoreworICBpbnQgcmVnbnIgPSAodG9wK3N0bnIpICYgNzsKKworICByZXR1cm4gKChmcHVfdGFnX3dvcmQgPj4gKHJlZ25yKjIpKSAmIDMpID09IFRBR19FbXB0eTsKK30KKworCitpbnQgRlBVX3N0YWNrb3ZlcmZsb3coRlBVX1JFRyAqKnN0X25ld19wdHIpCit7CisgICpzdF9uZXdfcHRyID0gJnN0KC0xKTsKKworICByZXR1cm4gKChmcHVfdGFnX3dvcmQgPj4gKCgodG9wIC0gMSkgJiA3KSoyKSkgJiAzKSAhPSBUQUdfRW1wdHk7Cit9CisKKwordm9pZCBGUFVfY29weV90b19yZWdpKEZQVV9SRUcgY29uc3QgKnIsIHVfY2hhciB0YWcsIGludCBzdG5yKQoreworICByZWdfY29weShyLCAmc3Qoc3RucikpOworICBGUFVfc2V0dGFnaShzdG5yLCB0YWcpOworfQorCit2b2lkIEZQVV9jb3B5X3RvX3JlZzEoRlBVX1JFRyBjb25zdCAqciwgdV9jaGFyIHRhZykKK3sKKyAgcmVnX2NvcHkociwgJnN0KDEpKTsKKyAgRlBVX3NldHRhZ2koMSwgdGFnKTsKK30KKwordm9pZCBGUFVfY29weV90b19yZWcwKEZQVV9SRUcgY29uc3QgKnIsIHVfY2hhciB0YWcpCit7CisgIGludCByZWduciA9IHRvcDsKKyAgcmVnbnIgJj0gNzsKKworICByZWdfY29weShyLCAmc3QoMCkpOworCisgIGZwdV90YWdfd29yZCAmPSB+KDMgPDwgKHJlZ25yKjIpKTsKKyAgZnB1X3RhZ193b3JkIHw9ICh0YWcgJiAzKSA8PCAocmVnbnIqMik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3RyaWcuYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9mcHVfdHJpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwM2NiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvZnB1X3RyaWcuYwpAQCAtMCwwICsxLDE4NDUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIGZwdV90cmlnLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IEltcGxlbWVudGF0aW9uIG9mIHRoZSBGUFUgInRyYW5zY2VuZGVudGFsIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk0LDE5OTcsMTk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCAgIGJpbGxtQG1lbGJwYy5vcmcuYXUgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZnB1X3N5c3RlbS5oIgorI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJzdGF0dXNfdy5oIgorI2luY2x1ZGUgImNvbnRyb2xfdy5oIgorI2luY2x1ZGUgInJlZ19jb25zdGFudC5oIgkKKworc3RhdGljIHZvaWQgcmVtX2tlcm5lbCh1bnNpZ25lZCBsb25nIGxvbmcgc3QwLCB1bnNpZ25lZCBsb25nIGxvbmcgKnksCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3QxLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHEsIGludCBuKTsKKworI2RlZmluZSBCRVRURVJfVEhBTl80ODYKKworI2RlZmluZSBGQ09TICA0CisKKy8qIFVzZWQgb25seSBieSBmcHRhbiwgZnNpbiwgZmNvcywgYW5kIGZzaW5jb3MuICovCisvKiBUaGlzIHJvdXRpbmUgcHJvZHVjZXMgdmVyeSBhY2N1cmF0ZSByZXN1bHRzLCBzaW1pbGFyIHRvCisgICB1c2luZyBhIHZhbHVlIG9mIHBpIHdpdGggbW9yZSB0aGFuIDEyOCBiaXRzIHByZWNpc2lvbi4gKi8KKy8qIExpbWl0ZWQgbWVhc3VyZW1lbnRzIHNob3cgbm8gcmVzdWx0cyB3b3JzZSB0aGFuIDY0IGJpdCBwcmVjaXNpb24KKyAgIGV4Y2VwdCBmb3IgdGhlIHJlc3VsdHMgZm9yIGFyZ3VtZW50cyBjbG9zZSB0byAyXjYzLCB3aGVyZSB0aGUKKyAgIHByZWNpc2lvbiBvZiB0aGUgcmVzdWx0IHNvbWV0aW1lcyBkZWdyYWRlcyB0byBhYm91dCA2My45IGJpdHMgKi8KK3N0YXRpYyBpbnQgdHJpZ19hcmcoRlBVX1JFRyAqc3QwX3B0ciwgaW50IGV2ZW4pCit7CisgIEZQVV9SRUcgdG1wOworICB1X2NoYXIgdG1wdGFnOworICB1bnNpZ25lZCBsb25nIGxvbmcgcTsKKyAgaW50IG9sZF9jdyA9IGNvbnRyb2xfd29yZCwgc2F2ZWRfc3RhdHVzID0gcGFydGlhbF9zdGF0dXM7CisgIGludCB0YWcsIHN0MF90YWcgPSBUQUdfVmFsaWQ7CisKKyAgaWYgKCBleHBvbmVudChzdDBfcHRyKSA+PSA2MyApCisgICAgeworICAgICAgcGFydGlhbF9zdGF0dXMgfD0gU1dfQzI7ICAgICAvKiBSZWR1Y3Rpb24gaW5jb21wbGV0ZS4gKi8KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgY29udHJvbF93b3JkICY9IH5DV19SQzsKKyAgY29udHJvbF93b3JkIHw9IFJDX0NIT1A7CisKKyAgc2V0cG9zaXRpdmUoc3QwX3B0cik7CisgIHRhZyA9IEZQVV91X2RpdihzdDBfcHRyLCAmQ09OU1RfUEkyLCAmdG1wLCBQUl82NF9CSVRTIHwgUkNfQ0hPUCB8IDB4M2YsCisJCSAgU0lHTl9QT1MpOworCisgIEZQVV9yb3VuZF90b19pbnQoJnRtcCwgdGFnKTsgIC8qIEZvcnR1bmF0ZWx5LCB0aGlzIGNhbid0IG92ZXJmbG93CisJCQkJICAgdG8gMl42NCAqLworICBxID0gc2lnbmlmaWNhbmQoJnRtcCk7CisgIGlmICggcSApCisgICAgeworICAgICAgcmVtX2tlcm5lbChzaWduaWZpY2FuZChzdDBfcHRyKSwKKwkJICZzaWduaWZpY2FuZCgmdG1wKSwKKwkJIHNpZ25pZmljYW5kKCZDT05TVF9QSTIpLAorCQkgcSwgZXhwb25lbnQoc3QwX3B0cikgLSBleHBvbmVudCgmQ09OU1RfUEkyKSk7CisgICAgICBzZXRleHBvbmVudDE2KCZ0bXAsIGV4cG9uZW50KCZDT05TVF9QSTIpKTsKKyAgICAgIHN0MF90YWcgPSBGUFVfbm9ybWFsaXplKCZ0bXApOworICAgICAgRlBVX2NvcHlfdG9fcmVnMCgmdG1wLCBzdDBfdGFnKTsKKyAgICB9CisKKyAgaWYgKCAoZXZlbiAmJiAhKHEgJiAxKSkgfHwgKCFldmVuICYmIChxICYgMSkpICkKKyAgICB7CisgICAgICBzdDBfdGFnID0gRlBVX3N1YihSRVZ8TE9BREVEfFRBR19WYWxpZCwgKGludCkmQ09OU1RfUEkyLCBGVUxMX1BSRUNJU0lPTik7CisKKyNpZmRlZiBCRVRURVJfVEhBTl80ODYKKyAgICAgIC8qIFNvIGZhciwgdGhlIHJlc3VsdHMgYXJlIGV4YWN0IGJ1dCBiYXNlZCB1cG9uIGEgNjQgYml0CisJIHByZWNpc2lvbiBhcHByb3hpbWF0aW9uIHRvIHBpLzIuIFRoZSB0ZWNobmlxdWUgdXNlZAorCSBub3cgaXMgZXF1aXZhbGVudCB0byB1c2luZyBhbiBhcHByb3hpbWF0aW9uIHRvIHBpLzIgd2hpY2gKKwkgaXMgYWNjdXJhdGUgdG8gYWJvdXQgMTI4IGJpdHMuICovCisgICAgICBpZiAoIChleHBvbmVudChzdDBfcHRyKSA8PSBleHBvbmVudCgmQ09OU1RfUEkyZXh0cmEpICsgNjQpIHx8IChxID4gMSkgKQorCXsKKwkgIC8qIFRoaXMgY29kZSBnaXZlcyB0aGUgZWZmZWN0IG9mIGhhdmluZyBwaS8yIHRvIGJldHRlciB0aGFuCisJICAgICAxMjggYml0cyBwcmVjaXNpb24uICovCisKKwkgIHNpZ25pZmljYW5kKCZ0bXApID0gcSArIDE7CisJICBzZXRleHBvbmVudDE2KCZ0bXAsIDYzKTsKKwkgIEZQVV9ub3JtYWxpemUoJnRtcCk7CisJICB0bXB0YWcgPQorCSAgICBGUFVfdV9tdWwoJkNPTlNUX1BJMmV4dHJhLCAmdG1wLCAmdG1wLCBGVUxMX1BSRUNJU0lPTiwgU0lHTl9QT1MsCisJCSAgICAgIGV4cG9uZW50KCZDT05TVF9QSTJleHRyYSkgKyBleHBvbmVudCgmdG1wKSk7CisJICBzZXRzaWduKCZ0bXAsIGdldHNpZ24oJkNPTlNUX1BJMmV4dHJhKSk7CisJICBzdDBfdGFnID0gRlBVX2FkZCgmdG1wLCB0bXB0YWcsIDAsIEZVTExfUFJFQ0lTSU9OKTsKKwkgIGlmICggc2lnbm5lZ2F0aXZlKHN0MF9wdHIpICkKKwkgICAgeworCSAgICAgIC8qIENPTlNUX1BJMmV4dHJhIGlzIG5lZ2F0aXZlLCBzbyB0aGUgcmVzdWx0IG9mIHRoZSBhZGRpdGlvbgorCQkgY2FuIGJlIG5lZ2F0aXZlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGFyZ3VtZW50IGlzIGFjdHVhbGx5CisJCSBpbiBhIGRpZmZlcmVudCBxdWFkcmFudC4gVGhlIGNvcnJlY3Rpb24gaXMgYWx3YXlzIDwgcGkvMiwKKwkJIHNvIGl0IGNhbid0IG92ZXJmbG93IGludG8geWV0IGFub3RoZXIgcXVhZHJhbnQuICovCisJICAgICAgc2V0cG9zaXRpdmUoc3QwX3B0cik7CisJICAgICAgcSsrOworCSAgICB9CisJfQorI2VuZGlmIC8qIEJFVFRFUl9USEFOXzQ4NiAqLworICAgIH0KKyNpZmRlZiBCRVRURVJfVEhBTl80ODYKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFNvIGZhciwgdGhlIHJlc3VsdHMgYXJlIGV4YWN0IGJ1dCBiYXNlZCB1cG9uIGEgNjQgYml0CisJIHByZWNpc2lvbiBhcHByb3hpbWF0aW9uIHRvIHBpLzIuIFRoZSB0ZWNobmlxdWUgdXNlZAorCSBub3cgaXMgZXF1aXZhbGVudCB0byB1c2luZyBhbiBhcHByb3hpbWF0aW9uIHRvIHBpLzIgd2hpY2gKKwkgaXMgYWNjdXJhdGUgdG8gYWJvdXQgMTI4IGJpdHMuICovCisgICAgICBpZiAoICgocSA+IDApICYmIChleHBvbmVudChzdDBfcHRyKSA8PSBleHBvbmVudCgmQ09OU1RfUEkyZXh0cmEpICsgNjQpKQorCSAgIHx8IChxID4gMSkgKQorCXsKKwkgIC8qIFRoaXMgY29kZSBnaXZlcyB0aGUgZWZmZWN0IG9mIGhhdmluZyBwLzIgdG8gYmV0dGVyIHRoYW4KKwkgICAgIDEyOCBiaXRzIHByZWNpc2lvbi4gKi8KKworCSAgc2lnbmlmaWNhbmQoJnRtcCkgPSBxOworCSAgc2V0ZXhwb25lbnQxNigmdG1wLCA2Myk7CisJICBGUFVfbm9ybWFsaXplKCZ0bXApOyAgICAgICAgIC8qIFRoaXMgbXVzdCByZXR1cm4gVEFHX1ZhbGlkICovCisJICB0bXB0YWcgPSBGUFVfdV9tdWwoJkNPTlNUX1BJMmV4dHJhLCAmdG1wLCAmdG1wLCBGVUxMX1BSRUNJU0lPTiwKKwkJCSAgICAgU0lHTl9QT1MsCisJCQkgICAgIGV4cG9uZW50KCZDT05TVF9QSTJleHRyYSkgKyBleHBvbmVudCgmdG1wKSk7CisJICBzZXRzaWduKCZ0bXAsIGdldHNpZ24oJkNPTlNUX1BJMmV4dHJhKSk7CisJICBzdDBfdGFnID0gRlBVX3N1YihMT0FERUR8KHRtcHRhZyAmIDB4MGYpLCAoaW50KSZ0bXAsCisJCQkgICAgRlVMTF9QUkVDSVNJT04pOworCSAgaWYgKCAoZXhwb25lbnQoc3QwX3B0cikgPT0gZXhwb25lbnQoJkNPTlNUX1BJMikpICYmCisJICAgICAgKChzdDBfcHRyLT5zaWdoID4gQ09OU1RfUEkyLnNpZ2gpCisJICAgICAgIHx8ICgoc3QwX3B0ci0+c2lnaCA9PSBDT05TVF9QSTIuc2lnaCkKKwkJICAgJiYgKHN0MF9wdHItPnNpZ2wgPiBDT05TVF9QSTIuc2lnbCkpKSApCisJICAgIHsKKwkgICAgICAvKiBDT05TVF9QSTJleHRyYSBpcyBuZWdhdGl2ZSwgc28gdGhlIHJlc3VsdCBvZiB0aGUKKwkJIHN1YnRyYWN0aW9uIGNhbiBiZSBsYXJnZXIgdGhhbiBwaS8yLiBUaGlzIG1lYW5zCisJCSB0aGF0IHRoZSBhcmd1bWVudCBpcyBhY3R1YWxseSBpbiBhIGRpZmZlcmVudCBxdWFkcmFudC4KKwkJIFRoZSBjb3JyZWN0aW9uIGlzIGFsd2F5cyA8IHBpLzIsIHNvIGl0IGNhbid0IG92ZXJmbG93CisJCSBpbnRvIHlldCBhbm90aGVyIHF1YWRyYW50LiAqLworCSAgICAgIHN0MF90YWcgPSBGUFVfc3ViKFJFVnxMT0FERUR8VEFHX1ZhbGlkLCAoaW50KSZDT05TVF9QSTIsCisJCQkJRlVMTF9QUkVDSVNJT04pOworCSAgICAgIHErKzsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYgLyogQkVUVEVSX1RIQU5fNDg2ICovCisKKyAgRlBVX3NldHRhZzAoc3QwX3RhZyk7CisgIGNvbnRyb2xfd29yZCA9IG9sZF9jdzsKKyAgcGFydGlhbF9zdGF0dXMgPSBzYXZlZF9zdGF0dXMgJiB+U1dfQzI7ICAgICAvKiBSZWR1Y3Rpb24gY29tcGxldGUuICovCisKKyAgcmV0dXJuIChxICYgMykgfCBldmVuOworfQorCisKKy8qIENvbnZlcnQgYSBsb25nIHRvIHJlZ2lzdGVyICovCitzdGF0aWMgdm9pZCBjb252ZXJ0X2wycmVnKGxvbmcgY29uc3QgKmFyZywgaW50IGRlc3RzdG5yKQoreworICBpbnQgdGFnOworICBsb25nIG51bSA9ICphcmc7CisgIHVfY2hhciBzaWduOworICBGUFVfUkVHICpkZXN0ID0gJnN0KGRlc3RzdG5yKTsKKworICBpZiAobnVtID09IDApCisgICAgeworICAgICAgRlBVX2NvcHlfdG9fcmVnaSgmQ09OU1RfWiwgVEFHX1plcm8sIGRlc3RzdG5yKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKG51bSA+IDApCisgICAgeyBzaWduID0gU0lHTl9QT1M7IH0KKyAgZWxzZQorICAgIHsgbnVtID0gLW51bTsgc2lnbiA9IFNJR05fTkVHOyB9CisKKyAgZGVzdC0+c2lnaCA9IG51bTsKKyAgZGVzdC0+c2lnbCA9IDA7CisgIHNldGV4cG9uZW50MTYoZGVzdCwgMzEpOworICB0YWcgPSBGUFVfbm9ybWFsaXplKGRlc3QpOworICBGUFVfc2V0dGFnaShkZXN0c3RuciwgdGFnKTsKKyAgc2V0c2lnbihkZXN0LCBzaWduKTsKKyAgcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIHNpbmdsZV9hcmdfZXJyb3IoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcpCit7CisgIGlmICggc3QwX3RhZyA9PSBUQUdfRW1wdHkgKQorICAgIEZQVV9zdGFja191bmRlcmZsb3coKTsgIC8qIFB1dHMgYSBRTmFOIGluIHN0KDApICovCisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRXX05hTiApCisgICAgcmVhbF8xb3BfTmFOKHN0MF9wdHIpOyAgICAgICAvKiByZXR1cm4gd2l0aCBhIE5hTiBpbiBzdCgwKSAqLworI2lmZGVmIFBBUkFOT0lECisgIGVsc2UKKyAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgwMTEyKTsKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworfQorCisKK3N0YXRpYyB2b2lkIHNpbmdsZV9hcmdfMl9lcnJvcihGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZykKK3sKKyAgaW50IGlzTmFOOworCisgIHN3aXRjaCAoIHN0MF90YWcgKQorICAgIHsKKyAgICBjYXNlIFRXX05hTjoKKyAgICAgIGlzTmFOID0gKGV4cG9uZW50KHN0MF9wdHIpID09IEVYUF9PVkVSKSAmJiAoc3QwX3B0ci0+c2lnaCAmIDB4ODAwMDAwMDApOworICAgICAgaWYgKCBpc05hTiAmJiAhKHN0MF9wdHItPnNpZ2ggJiAweDQwMDAwMDAwKSApICAgLyogU2lnbmFsaW5nID8gKi8KKwl7CisJICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisJICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorCSAgICB7CisJICAgICAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworCSAgICAgIC8qIENvbnZlcnQgdG8gYSBRTmFOICovCisJICAgICAgc3QwX3B0ci0+c2lnaCB8PSAweDQwMDAwMDAwOworCSAgICAgIHB1c2goKTsKKwkgICAgICBGUFVfY29weV90b19yZWcwKHN0MF9wdHIsIFRBR19TcGVjaWFsKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKCBpc05hTiApCisJeworCSAgLyogQSBRTmFOICovCisJICBwdXNoKCk7CisJICBGUFVfY29weV90b19yZWcwKHN0MF9wdHIsIFRBR19TcGVjaWFsKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogcHNldWRvTmFOIG9yIG90aGVyIHVuc3VwcG9ydGVkICovCisJICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisJICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorCSAgICB7CisJICAgICAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworCSAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUX1FOYU4sIFRBR19TcGVjaWFsKTsKKwkgICAgICBwdXNoKCk7CisJICAgICAgRlBVX2NvcHlfdG9fcmVnMCgmQ09OU1RfUU5hTiwgVEFHX1NwZWNpYWwpOworCSAgICB9CisJfQorICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiByZXR1cm4gd2l0aCBhIE5hTiBpbiBzdCgwKSAqLworI2lmZGVmIFBBUkFOT0lECisgICAgZGVmYXVsdDoKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDAxMTIpOworI2VuZGlmIC8qIFBBUkFOT0lEICovCisgICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgZjJ4bTEoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHRhZykKK3sKKyAgRlBVX1JFRyBhOworCisgIGNsZWFyX0MxKCk7CisKKyAgaWYgKCB0YWcgPT0gVEFHX1ZhbGlkICkKKyAgICB7CisgICAgICAvKiBGb3IgYW4gODA0ODYgRlBVLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiB0aGUgYXJnIGlzID49IDEuMCAqLworICAgICAgaWYgKCBleHBvbmVudChzdDBfcHRyKSA8IDAgKQorCXsKKwlkZW5vcm1hbF9hcmc6CisKKwkgIEZQVV90b19leHAxNihzdDBfcHRyLCAmYSk7CisKKwkgIC8qIHBvbHlfMnhtMSh4KSByZXF1aXJlcyAwIDwgc3QoMCkgPCAxLiAqLworCSAgcG9seV8yeG0xKGdldHNpZ24oc3QwX3B0ciksICZhLCBzdDBfcHRyKTsKKwl9CisgICAgICBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAoKTsgICAvKiA4MDQ4NiBhcHBlYXJzIHRvIGFsd2F5cyBkbyB0aGlzICovCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICggdGFnID09IFRBR19aZXJvICkKKyAgICByZXR1cm47CisKKyAgaWYgKCB0YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHRhZyA9IEZQVV9TcGVjaWFsKHN0MF9wdHIpOworCisgIHN3aXRjaCAoIHRhZyApCisgICAgeworICAgIGNhc2UgVFdfRGVub3JtYWw6CisgICAgICBpZiAoIGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCXJldHVybjsKKyAgICAgIGdvdG8gZGVub3JtYWxfYXJnOworICAgIGNhc2UgVFdfSW5maW5pdHk6CisgICAgICBpZiAoIHNpZ25uZWdhdGl2ZShzdDBfcHRyKSApCisJeworCSAgLyogLWluZmluaXR5IGdpdmVzIC0xIChwMTYtMTApICovCisJICBGUFVfY29weV90b19yZWcwKCZDT05TVF8xLCBUQUdfVmFsaWQpOworCSAgc2V0bmVnYXRpdmUoc3QwX3B0cik7CisJfQorICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICBzaW5nbGVfYXJnX2Vycm9yKHN0MF9wdHIsIHRhZyk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGZwdGFuKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnKQoreworICBGUFVfUkVHICpzdF9uZXdfcHRyOworICBpbnQgcTsKKyAgdV9jaGFyIGFyZ19zaWduID0gZ2V0c2lnbihzdDBfcHRyKTsKKworICAvKiBTdGFjayB1bmRlcmZsb3cgaGFzIGhpZ2hlciBwcmlvcml0eSAqLworICBpZiAoIHN0MF90YWcgPT0gVEFHX0VtcHR5ICkKKyAgICB7CisgICAgICBGUFVfc3RhY2tfdW5kZXJmbG93KCk7ICAvKiBQdXRzIGEgUU5hTiBpbiBzdCgwKSAqLworICAgICAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKwl7CisJICBzdF9uZXdfcHRyID0gJnN0KC0xKTsKKwkgIHB1c2goKTsKKwkgIEZQVV9zdGFja191bmRlcmZsb3coKTsgIC8qIFB1dHMgYSBRTmFOIGluIHRoZSBuZXcgc3QoMCkgKi8KKwl9CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICggU1RBQ0tfT1ZFUkZMT1cgKQorICAgIHsgRlBVX3N0YWNrX292ZXJmbG93KCk7IHJldHVybjsgfQorCisgIGlmICggc3QwX3RhZyA9PSBUQUdfVmFsaWQgKQorICAgIHsKKyAgICAgIGlmICggZXhwb25lbnQoc3QwX3B0cikgPiAtNDAgKQorCXsKKwkgIGlmICggKHEgPSB0cmlnX2FyZyhzdDBfcHRyLCAwKSkgPT0gLTEgKQorCSAgICB7CisJICAgICAgLyogT3BlcmFuZCBpcyBvdXQgb2YgcmFuZ2UgKi8KKwkgICAgICByZXR1cm47CisJICAgIH0KKworCSAgcG9seV90YW4oc3QwX3B0cik7CisJICBzZXRzaWduKHN0MF9wdHIsIChxICYgMSkgXiAoYXJnX3NpZ24gIT0gMCkpOworCSAgc2V0X3ByZWNpc2lvbl9mbGFnX3VwKCk7ICAvKiBXZSBkbyBub3QgcmVhbGx5IGtub3cgaWYgdXAgb3IgZG93biAqLworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBGb3IgYSBzbWFsbCBhcmcsIHRoZSByZXN1bHQgPT0gdGhlIGFyZ3VtZW50ICovCisJICAvKiBVbmRlcmZsb3cgbWF5IGhhcHBlbiAqLworCisJZGVub3JtYWxfYXJnOgorCisJICBGUFVfdG9fZXhwMTYoc3QwX3B0ciwgc3QwX3B0cik7CisgICAgICAKKwkgIHN0MF90YWcgPSBGUFVfcm91bmQoc3QwX3B0ciwgMSwgMCwgRlVMTF9QUkVDSVNJT04sIGFyZ19zaWduKTsKKwkgIEZQVV9zZXR0YWcwKHN0MF90YWcpOworCX0KKyAgICAgIHB1c2goKTsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUXzEsIFRBR19WYWxpZCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICggc3QwX3RhZyA9PSBUQUdfWmVybyApCisgICAgeworICAgICAgcHVzaCgpOworICAgICAgRlBVX2NvcHlfdG9fcmVnMCgmQ09OU1RfMSwgVEFHX1ZhbGlkKTsKKyAgICAgIHNldGNjKDApOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIHN0MF90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHN0MF90YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKworICBpZiAoIHN0MF90YWcgPT0gVFdfRGVub3JtYWwgKQorICAgIHsKKyAgICAgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJcmV0dXJuOworCisgICAgICBnb3RvIGRlbm9ybWFsX2FyZzsKKyAgICB9CisKKyAgaWYgKCBzdDBfdGFnID09IFRXX0luZmluaXR5ICkKKyAgICB7CisgICAgICAvKiBUaGUgODA0ODYgdHJlYXRzIGluZmluaXR5IGFzIGFuIGludmFsaWQgb3BlcmFuZCAqLworICAgICAgaWYgKCBhcml0aF9pbnZhbGlkKDApID49IDAgKQorCXsKKwkgIHN0X25ld19wdHIgPSAmc3QoLTEpOworCSAgcHVzaCgpOworCSAgYXJpdGhfaW52YWxpZCgwKTsKKwl9CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNpbmdsZV9hcmdfMl9lcnJvcihzdDBfcHRyLCBzdDBfdGFnKTsKK30KKworCitzdGF0aWMgdm9pZCBmeHRyYWN0KEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnKQoreworICBGUFVfUkVHICpzdF9uZXdfcHRyOworICB1X2NoYXIgc2lnbjsKKyAgcmVnaXN0ZXIgRlBVX1JFRyAqc3QxX3B0ciA9IHN0MF9wdHI7ICAvKiBhbnRpY2lwYXRlICovCisKKyAgaWYgKCBTVEFDS19PVkVSRkxPVyApCisgICAgeyAgRlBVX3N0YWNrX292ZXJmbG93KCk7IHJldHVybjsgfQorCisgIGNsZWFyX0MxKCk7CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19WYWxpZCApCisgICAgeworICAgICAgbG9uZyBlOworCisgICAgICBwdXNoKCk7CisgICAgICBzaWduID0gZ2V0c2lnbihzdDFfcHRyKTsKKyAgICAgIHJlZ19jb3B5KHN0MV9wdHIsIHN0X25ld19wdHIpOworICAgICAgc2V0ZXhwb25lbnQxNihzdF9uZXdfcHRyLCBleHBvbmVudChzdF9uZXdfcHRyKSk7CisKKyAgICBkZW5vcm1hbF9hcmc6CisKKyAgICAgIGUgPSBleHBvbmVudDE2KHN0X25ld19wdHIpOworICAgICAgY29udmVydF9sMnJlZygmZSwgMSk7CisgICAgICBzZXRleHBvbmVudHBvcyhzdF9uZXdfcHRyLCAwKTsKKyAgICAgIHNldHNpZ24oc3RfbmV3X3B0ciwgc2lnbik7CisgICAgICBGUFVfc2V0dGFnMChUQUdfVmFsaWQpOyAgICAgICAvKiBOZWVkZWQgaWYgYXJnIHdhcyBhIGRlbm9ybWFsICovCisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUQUdfWmVybyApCisgICAgeworICAgICAgc2lnbiA9IGdldHNpZ24oc3QwX3B0cik7CisKKyAgICAgIGlmICggRlBVX2RpdmlkZV9ieV96ZXJvKDAsIFNJR05fTkVHKSA8IDAgKQorCXJldHVybjsKKworICAgICAgcHVzaCgpOworICAgICAgRlBVX2NvcHlfdG9fcmVnMCgmQ09OU1RfWiwgVEFHX1plcm8pOworICAgICAgc2V0c2lnbihzdF9uZXdfcHRyLCBzaWduKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisKKyAgaWYgKCBzdDBfdGFnID09IFRXX0Rlbm9ybWFsICkKKyAgICB7CisgICAgICBpZiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJcmV0dXJuOworCisgICAgICBwdXNoKCk7CisgICAgICBzaWduID0gZ2V0c2lnbihzdDFfcHRyKTsKKyAgICAgIEZQVV90b19leHAxNihzdDFfcHRyLCBzdF9uZXdfcHRyKTsKKyAgICAgIGdvdG8gZGVub3JtYWxfYXJnOworICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVFdfSW5maW5pdHkgKQorICAgIHsKKyAgICAgIHNpZ24gPSBnZXRzaWduKHN0MF9wdHIpOworICAgICAgc2V0cG9zaXRpdmUoc3QwX3B0cik7CisgICAgICBwdXNoKCk7CisgICAgICBGUFVfY29weV90b19yZWcwKCZDT05TVF9JTkYsIFRBR19TcGVjaWFsKTsKKyAgICAgIHNldHNpZ24oc3RfbmV3X3B0ciwgc2lnbik7CisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUV19OYU4gKQorICAgIHsKKyAgICAgIGlmICggcmVhbF8xb3BfTmFOKHN0MF9wdHIpIDwgMCApCisJcmV0dXJuOworCisgICAgICBwdXNoKCk7CisgICAgICBGUFVfY29weV90b19yZWcwKHN0MF9wdHIsIFRBR19TcGVjaWFsKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRBR19FbXB0eSApCisgICAgeworICAgICAgLyogSXMgdGhpcyB0aGUgY29ycmVjdCBiZWhhdmlvdXI/ICovCisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIEVYX0ludmFsaWQgKQorCXsKKwkgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKwkgIHB1c2goKTsKKwkgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKwl9CisgICAgICBlbHNlCisJRVhDRVBUSU9OKEVYX1N0YWNrVW5kZXIpOworICAgIH0KKyNpZmRlZiBQQVJBTk9JRAorICBlbHNlCisgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMIHwgMHgxMTkpOworI2VuZGlmIC8qIFBBUkFOT0lEICovCit9CisKKworc3RhdGljIHZvaWQgZmRlY3N0cCh2b2lkKQoreworICBjbGVhcl9DMSgpOworICB0b3AtLTsKK30KKworc3RhdGljIHZvaWQgZmluY3N0cCh2b2lkKQoreworICBjbGVhcl9DMSgpOworICB0b3ArKzsKK30KKworCitzdGF0aWMgdm9pZCBmc3FydF8oRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcpCit7CisgIGludCBleHBvbjsKKworICBjbGVhcl9DMSgpOworCisgIGlmICggc3QwX3RhZyA9PSBUQUdfVmFsaWQgKQorICAgIHsKKyAgICAgIHVfY2hhciB0YWc7CisgICAgICAKKyAgICAgIGlmIChzaWdubmVnYXRpdmUoc3QwX3B0cikpCisJeworCSAgYXJpdGhfaW52YWxpZCgwKTsgIC8qIHNxcnQobmVnYXRpdmUpIGlzIGludmFsaWQgKi8KKwkgIHJldHVybjsKKwl9CisKKyAgICAgIC8qIG1ha2Ugc3QoMCkgaW4gIFsxLjAgLi4gNC4wKSAqLworICAgICAgZXhwb24gPSBleHBvbmVudChzdDBfcHRyKTsKKworICAgIGRlbm9ybWFsX2FyZzoKKworICAgICAgc2V0ZXhwb25lbnQxNihzdDBfcHRyLCAoZXhwb24gJiAxKSk7CisKKyAgICAgIC8qIERvIHRoZSBjb21wdXRhdGlvbiwgdGhlIHNpZ24gb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHBvc2l0aXZlLiAqLworICAgICAgdGFnID0gd21fc3FydChzdDBfcHRyLCAwLCAwLCBjb250cm9sX3dvcmQsIFNJR05fUE9TKTsKKyAgICAgIGFkZGV4cG9uZW50KHN0MF9wdHIsIGV4cG9uID4+IDEpOworICAgICAgRlBVX3NldHRhZzAodGFnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19aZXJvICkKKyAgICByZXR1cm47CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisKKyAgaWYgKCBzdDBfdGFnID09IFRXX0luZmluaXR5ICkKKyAgICB7CisgICAgICBpZiAoIHNpZ25uZWdhdGl2ZShzdDBfcHRyKSApCisJYXJpdGhfaW52YWxpZCgwKTsgIC8qIHNxcnQoLUluZmluaXR5KSBpcyBpbnZhbGlkICovCisgICAgICByZXR1cm47CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUV19EZW5vcm1hbCApCisgICAgeworICAgICAgaWYgKHNpZ25uZWdhdGl2ZShzdDBfcHRyKSkKKwl7CisJICBhcml0aF9pbnZhbGlkKDApOyAgLyogc3FydChuZWdhdGl2ZSkgaXMgaW52YWxpZCAqLworCSAgcmV0dXJuOworCX0KKworICAgICAgaWYgKCBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwICkKKwlyZXR1cm47CisKKyAgICAgIEZQVV90b19leHAxNihzdDBfcHRyLCBzdDBfcHRyKTsKKworICAgICAgZXhwb24gPSBleHBvbmVudDE2KHN0MF9wdHIpOworCisgICAgICBnb3RvIGRlbm9ybWFsX2FyZzsKKyAgICB9CisKKyAgc2luZ2xlX2FyZ19lcnJvcihzdDBfcHRyLCBzdDBfdGFnKTsKKworfQorCisKK3N0YXRpYyB2b2lkIGZybmRpbnRfKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnKQoreworICBpbnQgZmxhZ3MsIHRhZzsKKworICBpZiAoIHN0MF90YWcgPT0gVEFHX1ZhbGlkICkKKyAgICB7CisgICAgICB1X2NoYXIgc2lnbjsKKworICAgIGRlbm9ybWFsX2FyZzoKKworICAgICAgc2lnbiA9IGdldHNpZ24oc3QwX3B0cik7CisKKyAgICAgIGlmIChleHBvbmVudChzdDBfcHRyKSA+IDYzKQorCXJldHVybjsKKworICAgICAgaWYgKCBzdDBfdGFnID09IFRXX0Rlbm9ybWFsICkKKwl7CisJICBpZiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJICAgIHJldHVybjsKKwl9CisKKyAgICAgIC8qIEZvcnR1bmF0ZWx5LCB0aGlzIGNhbid0IG92ZXJmbG93IHRvIDJeNjQgKi8KKyAgICAgIGlmICggKGZsYWdzID0gRlBVX3JvdW5kX3RvX2ludChzdDBfcHRyLCBzdDBfdGFnKSkgKQorCXNldF9wcmVjaXNpb25fZmxhZyhmbGFncyk7CisKKyAgICAgIHNldGV4cG9uZW50MTYoc3QwX3B0ciwgNjMpOworICAgICAgdGFnID0gRlBVX25vcm1hbGl6ZShzdDBfcHRyKTsKKyAgICAgIHNldHNpZ24oc3QwX3B0ciwgc2lnbik7CisgICAgICBGUFVfc2V0dGFnMCh0YWcpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIHN0MF90YWcgPT0gVEFHX1plcm8gKQorICAgIHJldHVybjsKKworICBpZiAoIHN0MF90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHN0MF90YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKworICBpZiAoIHN0MF90YWcgPT0gVFdfRGVub3JtYWwgKQorICAgIGdvdG8gZGVub3JtYWxfYXJnOworICBlbHNlIGlmICggc3QwX3RhZyA9PSBUV19JbmZpbml0eSApCisgICAgcmV0dXJuOworICBlbHNlCisgICAgc2luZ2xlX2FyZ19lcnJvcihzdDBfcHRyLCBzdDBfdGFnKTsKK30KKworCitzdGF0aWMgaW50IGZzaW4oRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHRhZykKK3sKKyAgdV9jaGFyIGFyZ19zaWduID0gZ2V0c2lnbihzdDBfcHRyKTsKKworICBpZiAoIHRhZyA9PSBUQUdfVmFsaWQgKQorICAgIHsKKyAgICAgIGludCBxOworCisgICAgICBpZiAoIGV4cG9uZW50KHN0MF9wdHIpID4gLTQwICkKKwl7CisJICBpZiAoIChxID0gdHJpZ19hcmcoc3QwX3B0ciwgMCkpID09IC0xICkKKwkgICAgeworCSAgICAgIC8qIE9wZXJhbmQgaXMgb3V0IG9mIHJhbmdlICovCisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKworCSAgcG9seV9zaW5lKHN0MF9wdHIpOworCSAgCisJICBpZiAocSAmIDIpCisJICAgIGNoYW5nZXNpZ24oc3QwX3B0cik7CisKKwkgIHNldHNpZ24oc3QwX3B0ciwgZ2V0c2lnbihzdDBfcHRyKSBeIGFyZ19zaWduKTsKKworCSAgLyogV2UgZG8gbm90IHJlYWxseSBrbm93IGlmIHVwIG9yIGRvd24gKi8KKwkgIHNldF9wcmVjaXNpb25fZmxhZ191cCgpOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIEZvciBhIHNtYWxsIGFyZywgdGhlIHJlc3VsdCA9PSB0aGUgYXJndW1lbnQgKi8KKwkgIHNldF9wcmVjaXNpb25fZmxhZ191cCgpOyAgLyogTXVzdCBiZSB1cC4gKi8KKwkgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgaWYgKCB0YWcgPT0gVEFHX1plcm8gKQorICAgIHsKKyAgICAgIHNldGNjKDApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmICggdGFnID09IFRBR19TcGVjaWFsICkKKyAgICB0YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKworICBpZiAoIHRhZyA9PSBUV19EZW5vcm1hbCApCisgICAgeworICAgICAgaWYgKCBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwICkKKwlyZXR1cm4gMTsKKworICAgICAgLyogRm9yIGEgc21hbGwgYXJnLCB0aGUgcmVzdWx0ID09IHRoZSBhcmd1bWVudCAqLworICAgICAgLyogVW5kZXJmbG93IG1heSBoYXBwZW4gKi8KKyAgICAgIEZQVV90b19leHAxNihzdDBfcHRyLCBzdDBfcHRyKTsKKyAgICAgIAorICAgICAgdGFnID0gRlBVX3JvdW5kKHN0MF9wdHIsIDEsIDAsIEZVTExfUFJFQ0lTSU9OLCBhcmdfc2lnbik7CisKKyAgICAgIEZQVV9zZXR0YWcwKHRhZyk7CisKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZSBpZiAoIHRhZyA9PSBUV19JbmZpbml0eSApCisgICAgeworICAgICAgLyogVGhlIDgwNDg2IHRyZWF0cyBpbmZpbml0eSBhcyBhbiBpbnZhbGlkIG9wZXJhbmQgKi8KKyAgICAgIGFyaXRoX2ludmFsaWQoMCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzaW5nbGVfYXJnX2Vycm9yKHN0MF9wdHIsIHRhZyk7CisgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKworc3RhdGljIGludCBmX2NvcyhGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgdGFnKQoreworICB1X2NoYXIgc3QwX3NpZ247CisKKyAgc3QwX3NpZ24gPSBnZXRzaWduKHN0MF9wdHIpOworCisgIGlmICggdGFnID09IFRBR19WYWxpZCApCisgICAgeworICAgICAgaW50IHE7CisKKyAgICAgIGlmICggZXhwb25lbnQoc3QwX3B0cikgPiAtNDAgKQorCXsKKwkgIGlmICggKGV4cG9uZW50KHN0MF9wdHIpIDwgMCkKKwkgICAgICB8fCAoKGV4cG9uZW50KHN0MF9wdHIpID09IDApCisJCSAgJiYgKHNpZ25pZmljYW5kKHN0MF9wdHIpIDw9IDB4YzkwZmRhYTIyMTY4YzIzNExMKSkgKQorCSAgICB7CisJICAgICAgcG9seV9jb3Moc3QwX3B0cik7CisKKwkgICAgICAvKiBXZSBkbyBub3QgcmVhbGx5IGtub3cgaWYgdXAgb3IgZG93biAqLworCSAgICAgIHNldF9wcmVjaXNpb25fZmxhZ19kb3duKCk7CisJICAKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgZWxzZSBpZiAoIChxID0gdHJpZ19hcmcoc3QwX3B0ciwgRkNPUykpICE9IC0xICkKKwkgICAgeworCSAgICAgIHBvbHlfc2luZShzdDBfcHRyKTsKKworCSAgICAgIGlmICgocSsxKSAmIDIpCisJCWNoYW5nZXNpZ24oc3QwX3B0cik7CisKKwkgICAgICAvKiBXZSBkbyBub3QgcmVhbGx5IGtub3cgaWYgdXAgb3IgZG93biAqLworCSAgICAgIHNldF9wcmVjaXNpb25fZmxhZ19kb3duKCk7CisJICAKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogT3BlcmFuZCBpcyBvdXQgb2YgcmFuZ2UgKi8KKwkgICAgICByZXR1cm4gMTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJZGVub3JtYWxfYXJnOgorCisJICBzZXRjYygwKTsKKwkgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUXzEsIFRBR19WYWxpZCk7CisjaWZkZWYgUEVDVUxJQVJfNDg2CisJICBzZXRfcHJlY2lzaW9uX2ZsYWdfZG93bigpOyAgLyogODA0ODYgYXBwZWFycyB0byBkbyB0aGlzLiAqLworI2Vsc2UKKwkgIHNldF9wcmVjaXNpb25fZmxhZ191cCgpOyAgLyogTXVzdCBiZSB1cC4gKi8KKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKwkgIHJldHVybiAwOworCX0KKyAgICB9CisgIGVsc2UgaWYgKCB0YWcgPT0gVEFHX1plcm8gKQorICAgIHsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUXzEsIFRBR19WYWxpZCk7CisgICAgICBzZXRjYygwKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBpZiAoIHRhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisKKyAgaWYgKCB0YWcgPT0gVFdfRGVub3JtYWwgKQorICAgIHsKKyAgICAgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJcmV0dXJuIDE7CisKKyAgICAgIGdvdG8gZGVub3JtYWxfYXJnOworICAgIH0KKyAgZWxzZSBpZiAoIHRhZyA9PSBUV19JbmZpbml0eSApCisgICAgeworICAgICAgLyogVGhlIDgwNDg2IHRyZWF0cyBpbmZpbml0eSBhcyBhbiBpbnZhbGlkIG9wZXJhbmQgKi8KKyAgICAgIGFyaXRoX2ludmFsaWQoMCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzaW5nbGVfYXJnX2Vycm9yKHN0MF9wdHIsIHRhZyk7ICAvKiByZXF1aXJlcyBzdDBfcHRyID09ICZzdCgwKSAqLworICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGZjb3MoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcpCit7CisgIGZfY29zKHN0MF9wdHIsIHN0MF90YWcpOworfQorCisKK3N0YXRpYyB2b2lkIGZzaW5jb3MoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcpCit7CisgIEZQVV9SRUcgKnN0X25ld19wdHI7CisgIEZQVV9SRUcgYXJnOworICB1X2NoYXIgdGFnOworCisgIC8qIFN0YWNrIHVuZGVyZmxvdyBoYXMgaGlnaGVyIHByaW9yaXR5ICovCisgIGlmICggc3QwX3RhZyA9PSBUQUdfRW1wdHkgKQorICAgIHsKKyAgICAgIEZQVV9zdGFja191bmRlcmZsb3coKTsgIC8qIFB1dHMgYSBRTmFOIGluIHN0KDApICovCisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorCXsKKwkgIHN0X25ld19wdHIgPSAmc3QoLTEpOworCSAgcHVzaCgpOworCSAgRlBVX3N0YWNrX3VuZGVyZmxvdygpOyAgLyogUHV0cyBhIFFOYU4gaW4gdGhlIG5ldyBzdCgwKSAqLworCX0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCBTVEFDS19PVkVSRkxPVyApCisgICAgeyBGUFVfc3RhY2tfb3ZlcmZsb3coKTsgcmV0dXJuOyB9CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICB0YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKyAgZWxzZQorICAgIHRhZyA9IHN0MF90YWc7CisKKyAgaWYgKCB0YWcgPT0gVFdfTmFOICkKKyAgICB7CisgICAgICBzaW5nbGVfYXJnXzJfZXJyb3Ioc3QwX3B0ciwgVFdfTmFOKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKCB0YWcgPT0gVFdfSW5maW5pdHkgKQorICAgIHsKKyAgICAgIC8qIFRoZSA4MDQ4NiB0cmVhdHMgaW5maW5pdHkgYXMgYW4gaW52YWxpZCBvcGVyYW5kICovCisgICAgICBpZiAoIGFyaXRoX2ludmFsaWQoMCkgPj0gMCApCisJeworCSAgLyogTWFza2VkIHJlc3BvbnNlICovCisJICBwdXNoKCk7CisJICBhcml0aF9pbnZhbGlkKDApOworCX0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcmVnX2NvcHkoc3QwX3B0ciwgJmFyZyk7CisgIGlmICggIWZzaW4oc3QwX3B0ciwgc3QwX3RhZykgKQorICAgIHsKKyAgICAgIHB1c2goKTsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJmFyZywgc3QwX3RhZyk7CisgICAgICBmX2Nvcygmc3QoMCksIHN0MF90YWcpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIEFuIGVycm9yLCBzbyByZXN0b3JlIHN0KDApICovCisgICAgICBGUFVfY29weV90b19yZWcwKCZhcmcsIHN0MF90YWcpOworICAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBUaGUgZm9sbG93aW5nIGFsbCByZXF1aXJlIHR3byBhcmd1bWVudHM6IHN0KDApIGFuZCBzdCgxKSAqLworCisvKiBBIGxlYW4sIG1lYW4ga2VybmVsIGZvciB0aGUgZnByZW0gaW5zdHJ1Y3Rpb25zLiBUaGlzIHJlbGllcyB1cG9uCisgICB0aGUgZGl2aXNpb24gYW5kIHJvdW5kaW5nIHRvIGFuIGludGVnZXIgaW4gZG9fZnByZW0gZ2l2aW5nIGFuCisgICBleGFjdCByZXN1bHQuIEJlY2F1c2Ugb2YgdGhpcywgcmVtX2tlcm5lbCgpIG5lZWRzIHRvIGRlYWwgb25seSB3aXRoCisgICB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNjQgYml0cywgdGhlIG1vcmUgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUKKyAgIHJlc3VsdCBtdXN0IGJlIHplcm8uCisgKi8KK3N0YXRpYyB2b2lkIHJlbV9rZXJuZWwodW5zaWduZWQgbG9uZyBsb25nIHN0MCwgdW5zaWduZWQgbG9uZyBsb25nICp5LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0MSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBxLCBpbnQgbikKK3sKKyAgaW50IGR1bW15OworICB1bnNpZ25lZCBsb25nIGxvbmcgeDsKKworICB4ID0gc3QwIDw8IG47CisKKyAgLyogRG8gdGhlIHJlcXVpcmVkIG11bHRpcGxpY2F0aW9uIGFuZCBzdWJ0cmFjdGlvbiBpbiB0aGUgb25lIG9wZXJhdGlvbiAqLworCisgIC8qIGxzdyB4IC09IGxzdyBzdDEgKiBsc3cgcSAqLworICBhc20gdm9sYXRpbGUgKCJtdWxsICU0OyBzdWJsICUlZWF4LCUwOyBzYmJsICUlZWR4LCUxIgorCQk6Ij1tIiAoKCh1bnNpZ25lZCAqKSZ4KVswXSksICI9bSIgKCgodW5zaWduZWQgKikmeClbMV0pLAorCQkiPWEiIChkdW1teSkKKwkJOiIyIiAoKCh1bnNpZ25lZCAqKSZzdDEpWzBdKSwgIm0iICgoKHVuc2lnbmVkICopJnEpWzBdKQorCQk6IiVkeCIpOworICAvKiBtc3cgeCAtPSBtc3cgc3QxICogbHN3IHEgKi8KKyAgYXNtIHZvbGF0aWxlICgibXVsbCAlMzsgc3VibCAlJWVheCwlMCIKKwkJOiI9bSIgKCgodW5zaWduZWQgKikmeClbMV0pLCAiPWEiIChkdW1teSkKKwkJOiIxIiAoKCh1bnNpZ25lZCAqKSZzdDEpWzFdKSwgIm0iICgoKHVuc2lnbmVkICopJnEpWzBdKQorCQk6IiVkeCIpOworICAvKiBtc3cgeCAtPSBsc3cgc3QxICogbXN3IHEgKi8KKyAgYXNtIHZvbGF0aWxlICgibXVsbCAlMzsgc3VibCAlJWVheCwlMCIKKwkJOiI9bSIgKCgodW5zaWduZWQgKikmeClbMV0pLCAiPWEiIChkdW1teSkKKwkJOiIxIiAoKCh1bnNpZ25lZCAqKSZzdDEpWzBdKSwgIm0iICgoKHVuc2lnbmVkICopJnEpWzFdKQorCQk6IiVkeCIpOworCisgICp5ID0geDsKK30KKworCisvKiBSZW1haW5kZXIgb2Ygc3QoMCkgLyBzdCgxKSAqLworLyogVGhpcyByb3V0aW5lIHByb2R1Y2VzIGV4YWN0IHJlc3VsdHMsIGkuZS4gdGhlcmUgaXMgbmV2ZXIgYW55CisgICByb3VuZGluZyBvciB0cnVuY2F0aW9uLCBldGMgb2YgdGhlIHJlc3VsdC4gKi8KK3N0YXRpYyB2b2lkIGRvX2ZwcmVtKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCBpbnQgcm91bmQpCit7CisgIEZQVV9SRUcgKnN0MV9wdHIgPSAmc3QoMSk7CisgIHVfY2hhciBzdDFfdGFnID0gRlBVX2dldHRhZ2koMSk7CisKKyAgaWYgKCAhKChzdDBfdGFnIF4gVEFHX1ZhbGlkKSB8IChzdDFfdGFnIF4gVEFHX1ZhbGlkKSkgKQorICAgIHsKKyAgICAgIEZQVV9SRUcgdG1wLCBzdDAsIHN0MTsKKyAgICAgIHVfY2hhciBzdDBfc2lnbiwgc3QxX3NpZ247CisgICAgICB1X2NoYXIgdG1wdGFnOworICAgICAgaW50IHRhZzsKKyAgICAgIGludCBvbGRfY3c7CisgICAgICBpbnQgZXhwZGlmOworICAgICAgbG9uZyBsb25nIHE7CisgICAgICB1bnNpZ25lZCBzaG9ydCBzYXZlZF9zdGF0dXM7CisgICAgICBpbnQgY2M7CisKKyAgICBmcHJlbV92YWxpZDoKKyAgICAgIC8qIENvbnZlcnQgcmVnaXN0ZXJzIGZvciBpbnRlcm5hbCB1c2UuICovCisgICAgICBzdDBfc2lnbiA9IEZQVV90b19leHAxNihzdDBfcHRyLCAmc3QwKTsKKyAgICAgIHN0MV9zaWduID0gRlBVX3RvX2V4cDE2KHN0MV9wdHIsICZzdDEpOworICAgICAgZXhwZGlmID0gZXhwb25lbnQxNigmc3QwKSAtIGV4cG9uZW50MTYoJnN0MSk7CisKKyAgICAgIG9sZF9jdyA9IGNvbnRyb2xfd29yZDsKKyAgICAgIGNjID0gMDsKKworICAgICAgLyogV2Ugd2FudCB0aGUgc3RhdHVzIGZvbGxvd2luZyB0aGUgZGVub3JtIHRlc3RzLCBidXQgZG9uJ3Qgd2FudAorCSB0aGUgc3RhdHVzIGNoYW5nZWQgYnkgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9ucy4gKi8KKyAgICAgIHNhdmVkX3N0YXR1cyA9IHBhcnRpYWxfc3RhdHVzOworICAgICAgY29udHJvbF93b3JkICY9IH5DV19SQzsKKyAgICAgIGNvbnRyb2xfd29yZCB8PSBSQ19DSE9QOworCisgICAgICBpZiAoIGV4cGRpZiA8IDY0ICkKKwl7CisJICAvKiBUaGlzIHNob3VsZCBiZSB0aGUgbW9zdCBjb21tb24gY2FzZSAqLworCisJICBpZiAoIGV4cGRpZiA+IC0yICkKKwkgICAgeworCSAgICAgIHVfY2hhciBzaWduID0gc3QwX3NpZ24gXiBzdDFfc2lnbjsKKwkgICAgICB0YWcgPSBGUFVfdV9kaXYoJnN0MCwgJnN0MSwgJnRtcCwKKwkJCSAgICAgIFBSXzY0X0JJVFMgfCBSQ19DSE9QIHwgMHgzZiwKKwkJCSAgICAgIHNpZ24pOworCSAgICAgIHNldHNpZ24oJnRtcCwgc2lnbik7CisKKwkgICAgICBpZiAoIGV4cG9uZW50KCZ0bXApID49IDAgKQorCQl7CisJCSAgRlBVX3JvdW5kX3RvX2ludCgmdG1wLCB0YWcpOyAgLyogRm9ydHVuYXRlbHksIHRoaXMgY2FuJ3QKKwkJCQkJCSAgIG92ZXJmbG93IHRvIDJeNjQgKi8KKwkJICBxID0gc2lnbmlmaWNhbmQoJnRtcCk7CisKKwkJICByZW1fa2VybmVsKHNpZ25pZmljYW5kKCZzdDApLAorCQkJICAgICAmc2lnbmlmaWNhbmQoJnRtcCksCisJCQkgICAgIHNpZ25pZmljYW5kKCZzdDEpLAorCQkJICAgICBxLCBleHBkaWYpOworCisJCSAgc2V0ZXhwb25lbnQxNigmdG1wLCBleHBvbmVudDE2KCZzdDEpKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHJlZ19jb3B5KCZzdDAsICZ0bXApOworCQkgIHEgPSAwOworCQl9CisKKwkgICAgICBpZiAoIChyb3VuZCA9PSBSQ19STkQpICYmICh0bXAuc2lnaCAmIDB4YzAwMDAwMDApICkKKwkJeworCQkgIC8qIFdlIG1heSBuZWVkIHRvIHN1YnRyYWN0IHN0KDEpIG9uY2UgbW9yZSwKKwkJICAgICB0byBnZXQgYSByZXN1bHQgPD0gMS8yIG9mIHN0KDEpLiAqLworCQkgIHVuc2lnbmVkIGxvbmcgbG9uZyB4OworCQkgIGV4cGRpZiA9IGV4cG9uZW50MTYoJnN0MSkgLSBleHBvbmVudDE2KCZ0bXApOworCQkgIGlmICggZXhwZGlmIDw9IDEgKQorCQkgICAgeworCQkgICAgICBpZiAoIGV4cGRpZiA9PSAwICkKKwkJCXggPSBzaWduaWZpY2FuZCgmc3QxKSAtIHNpZ25pZmljYW5kKCZ0bXApOworCQkgICAgICBlbHNlIC8qIGV4cGRpZiBpcyAxICovCisJCQl4ID0gKHNpZ25pZmljYW5kKCZzdDEpIDw8IDEpIC0gc2lnbmlmaWNhbmQoJnRtcCk7CisJCSAgICAgIGlmICggKHggPCBzaWduaWZpY2FuZCgmdG1wKSkgfHwKKwkJCSAgLyogb3IgZXF1aS1kaXN0YW50IChmcm9tIDAgJiBzdCgxKSkgYW5kIHEgaXMgb2RkICovCisJCQkgICgoeCA9PSBzaWduaWZpY2FuZCgmdG1wKSkgJiYgKHEgJiAxKSApICkKKwkJCXsKKwkJCSAgc3QwX3NpZ24gPSAhIHN0MF9zaWduOworCQkJICBzaWduaWZpY2FuZCgmdG1wKSA9IHg7CisJCQkgIHErKzsKKwkJCX0KKwkJICAgIH0KKwkJfQorCisJICAgICAgaWYgKHEgJiA0KSBjYyB8PSBTV19DMDsKKwkgICAgICBpZiAocSAmIDIpIGNjIHw9IFNXX0MzOworCSAgICAgIGlmIChxICYgMSkgY2MgfD0gU1dfQzE7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnRyb2xfd29yZCA9IG9sZF9jdzsKKwkgICAgICBzZXRjYygwKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVGhlcmUgaXMgYSBsYXJnZSBleHBvbmVudCBkaWZmZXJlbmNlICggPj0gNjQgKSAqLworCSAgLyogVG8gbWFrZSBtdWNoIHNlbnNlLCB0aGUgY29kZSBpbiB0aGlzIHNlY3Rpb24gc2hvdWxkCisJICAgICBiZSBkb25lIGF0IGhpZ2ggcHJlY2lzaW9uLiAqLworCSAgaW50IGV4cF8xLCBOOworCSAgdV9jaGFyIHNpZ247CisKKwkgIC8qIHByZXZlbnQgb3ZlcmZsb3cgaGVyZSAqLworCSAgLyogTiBpcyAnYSBudW1iZXIgYmV0d2VlbiAzMiBhbmQgNjMnIChwMjYtMTEzKSAqLworCSAgcmVnX2NvcHkoJnN0MCwgJnRtcCk7CisJICB0bXB0YWcgPSBzdDBfdGFnOworCSAgTiA9IChleHBkaWYgJiAweDAwMDAwMDFmKSArIDMyOyAgLyogVGhpcyBjaG9pY2UgZ2l2ZXMgcmVzdWx0cworCQkJCQkgICAgICBpZGVudGljYWwgdG8gYW4gQU1EIDQ4NiAqLworCSAgc2V0ZXhwb25lbnQxNigmdG1wLCBOKTsKKwkgIGV4cF8xID0gZXhwb25lbnQxNigmc3QxKTsKKwkgIHNldGV4cG9uZW50MTYoJnN0MSwgMCk7CisJICBleHBkaWYgLT0gTjsKKworCSAgc2lnbiA9IGdldHNpZ24oJnRtcCkgXiBzdDFfc2lnbjsKKwkgIHRhZyA9IEZQVV91X2RpdigmdG1wLCAmc3QxLCAmdG1wLCBQUl82NF9CSVRTIHwgUkNfQ0hPUCB8IDB4M2YsCisJCQkgIHNpZ24pOworCSAgc2V0c2lnbigmdG1wLCBzaWduKTsKKworCSAgRlBVX3JvdW5kX3RvX2ludCgmdG1wLCB0YWcpOyAgLyogRm9ydHVuYXRlbHksIHRoaXMgY2FuJ3QKKwkJCQkJICAgb3ZlcmZsb3cgdG8gMl42NCAqLworCisJICByZW1fa2VybmVsKHNpZ25pZmljYW5kKCZzdDApLAorCQkgICAgICZzaWduaWZpY2FuZCgmdG1wKSwKKwkJICAgICBzaWduaWZpY2FuZCgmc3QxKSwKKwkJICAgICBzaWduaWZpY2FuZCgmdG1wKSwKKwkJICAgICBleHBvbmVudCgmdG1wKQorCQkgICAgICk7IAorCSAgc2V0ZXhwb25lbnQxNigmdG1wLCBleHBfMSArIGV4cGRpZik7CisKKwkgIC8qIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgb3BlcmF0aW9uIHRvIGJlIGNvbXBsZXRlIGhlcmUuCisJICAgICBXaGF0IGRvZXMgdGhlIElFRUUgc3RhbmRhcmQgc2F5PyBUaGUgSW50ZWwgODA0ODYgbWFudWFsCisJICAgICBpbXBsaWVzIHRoYXQgdGhlIG9wZXJhdGlvbiB3aWxsIG5ldmVyIGJlIGNvbXBsZXRlZCBhdCB0aGlzCisJICAgICBwb2ludCwgYW5kIHRoZSBiZWhhdmlvdXIgb2YgYSByZWFsIDgwNDg2IGNvbmZpcm1zIHRoaXMuCisJICAgKi8KKwkgIGlmICggISh0bXAuc2lnaCB8IHRtcC5zaWdsKSApCisJICAgIHsKKwkgICAgICAvKiBUaGUgcmVzdWx0IGlzIHplcm8gKi8KKwkgICAgICBjb250cm9sX3dvcmQgPSBvbGRfY3c7CisJICAgICAgcGFydGlhbF9zdGF0dXMgPSBzYXZlZF9zdGF0dXM7CisJICAgICAgRlBVX2NvcHlfdG9fcmVnMCgmQ09OU1RfWiwgVEFHX1plcm8pOworCSAgICAgIHNldHNpZ24oJnN0MCwgc3QwX3NpZ24pOworI2lmZGVmIFBFQ1VMSUFSXzQ4NgorCSAgICAgIHNldGNjKFNXX0MyKTsKKyNlbHNlCisJICAgICAgc2V0Y2MoMCk7CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBjYyA9IFNXX0MyOworCX0KKworICAgICAgY29udHJvbF93b3JkID0gb2xkX2N3OworICAgICAgcGFydGlhbF9zdGF0dXMgPSBzYXZlZF9zdGF0dXM7CisgICAgICB0YWcgPSBGUFVfbm9ybWFsaXplX251bygmdG1wKTsKKyAgICAgIHJlZ19jb3B5KCZ0bXAsIHN0MF9wdHIpOworCisgICAgICAvKiBUaGUgb25seSBjb25kaXRpb24gdG8gYmUgbG9va2VkIGZvciBpcyB1bmRlcmZsb3csCisJIGFuZCBpdCBjYW4gb2NjdXIgaGVyZSBvbmx5IGlmIHVuZGVyZmxvdyBpcyB1bm1hc2tlZC4gKi8KKyAgICAgIGlmICggKGV4cG9uZW50MTYoJnRtcCkgPD0gRVhQX1VOREVSKSAmJiAodGFnICE9IFRBR19aZXJvKQorCSAgJiYgIShjb250cm9sX3dvcmQgJiBDV19VbmRlcmZsb3cpICkKKwl7CisJICBzZXRjYyhjYyk7CisJICB0YWcgPSBhcml0aF91bmRlcmZsb3coc3QwX3B0cik7CisJICBzZXRzaWduKHN0MF9wdHIsIHN0MF9zaWduKTsKKwkgIEZQVV9zZXR0YWcwKHRhZyk7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoIChleHBvbmVudDE2KCZ0bXApID4gRVhQX1VOREVSKSB8fCAodGFnID09IFRBR19aZXJvKSApCisJeworCSAgc3RkZXhwKHN0MF9wdHIpOworCSAgc2V0c2lnbihzdDBfcHRyLCBzdDBfc2lnbik7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHRhZyA9IEZQVV9yb3VuZChzdDBfcHRyLCAwLCAwLCBGVUxMX1BSRUNJU0lPTiwgc3QwX3NpZ24pOworCX0KKyAgICAgIEZQVV9zZXR0YWcwKHRhZyk7CisgICAgICBzZXRjYyhjYyk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisgIGlmICggc3QxX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgc3QxX3RhZyA9IEZQVV9TcGVjaWFsKHN0MV9wdHIpOworCisgIGlmICggKChzdDBfdGFnID09IFRBR19WYWxpZCkgJiYgKHN0MV90YWcgPT0gVFdfRGVub3JtYWwpKQorCSAgICB8fCAoKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChzdDFfdGFnID09IFRBR19WYWxpZCkpCisJICAgIHx8ICgoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKHN0MV90YWcgPT0gVFdfRGVub3JtYWwpKSApCisgICAgeworICAgICAgaWYgKCBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwICkKKwlyZXR1cm47CisgICAgICBnb3RvIGZwcmVtX3ZhbGlkOworICAgIH0KKyAgZWxzZSBpZiAoIChzdDBfdGFnID09IFRBR19FbXB0eSkgfHwgKHN0MV90YWcgPT0gVEFHX0VtcHR5KSApCisgICAgeworICAgICAgRlBVX3N0YWNrX3VuZGVyZmxvdygpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVEFHX1plcm8gKQorICAgIHsKKyAgICAgIGlmICggc3QxX3RhZyA9PSBUQUdfVmFsaWQgKQorCXsKKwkgIHNldGNjKDApOyByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoIHN0MV90YWcgPT0gVFdfRGVub3JtYWwgKQorCXsKKwkgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJICAgIHJldHVybjsKKwkgIHNldGNjKDApOyByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoIHN0MV90YWcgPT0gVEFHX1plcm8gKQorCXsgYXJpdGhfaW52YWxpZCgwKTsgcmV0dXJuOyB9IC8qIGZwcmVtKD8sMCkgYWx3YXlzIGludmFsaWQgKi8KKyAgICAgIGVsc2UgaWYgKCBzdDFfdGFnID09IFRXX0luZmluaXR5ICkKKwl7IHNldGNjKDApOyByZXR1cm47IH0KKyAgICB9CisgIGVsc2UgaWYgKCAoc3QwX3RhZyA9PSBUQUdfVmFsaWQpIHx8IChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSApCisgICAgeworICAgICAgaWYgKCBzdDFfdGFnID09IFRBR19aZXJvICkKKwl7CisJICBhcml0aF9pbnZhbGlkKDApOyAvKiBmcHJlbShWYWxpZCxaZXJvKSBpcyBpbnZhbGlkICovCisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoIHN0MV90YWcgIT0gVFdfTmFOICkKKwl7CisJICBpZiAoICgoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgfHwgKHN0MV90YWcgPT0gVFdfRGVub3JtYWwpKQorCSAgICAgICAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCSAgICByZXR1cm47CisKKwkgIGlmICggc3QxX3RhZyA9PSBUV19JbmZpbml0eSApCisJICAgIHsKKwkgICAgICAvKiBmcHJlbShWYWxpZCxJbmZpbml0eSkgaXMgby5rLiAqLworCSAgICAgIHNldGNjKDApOyByZXR1cm47CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUV19JbmZpbml0eSApCisgICAgeworICAgICAgaWYgKCBzdDFfdGFnICE9IFRXX05hTiApCisJeworCSAgYXJpdGhfaW52YWxpZCgwKTsgLyogZnByZW0oSW5maW5pdHksPykgaXMgaW52YWxpZCAqLworCSAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgLyogT25lIG9mIHRoZSByZWdpc3RlcnMgbXVzdCBjb250YWluIGEgTmFOIGlmIHdlIGdvdCBoZXJlLiAqLworCisjaWZkZWYgUEFSQU5PSUQKKyAgaWYgKCAoc3QwX3RhZyAhPSBUV19OYU4pICYmIChzdDFfdGFnICE9IFRXX05hTikgKQorICAgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMIHwgMHgxMTgpOworI2VuZGlmIC8qIFBBUkFOT0lEICovCisKKyAgcmVhbF8yb3BfTmFOKHN0MV9wdHIsIHN0MV90YWcsIDAsIHN0MV9wdHIpOworCit9CisKKworLyogU1QoMSkgPC0gU1QoMSkgKiBsb2cgU1Q7ICBwb3AgU1QgKi8KK3N0YXRpYyB2b2lkIGZ5bDJ4KEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnKQoreworICBGUFVfUkVHICpzdDFfcHRyID0gJnN0KDEpLCBleHBvbmVudDsKKyAgdV9jaGFyIHN0MV90YWcgPSBGUFVfZ2V0dGFnaSgxKTsKKyAgdV9jaGFyIHNpZ247CisgIGludCBlLCB0YWc7CisKKyAgY2xlYXJfQzEoKTsKKworICBpZiAoIChzdDBfdGFnID09IFRBR19WYWxpZCkgJiYgKHN0MV90YWcgPT0gVEFHX1ZhbGlkKSApCisgICAgeworICAgIGJvdGhfdmFsaWQ6CisgICAgICAvKiBCb3RoIHJlZ3MgYXJlIFZhbGlkIG9yIERlbm9ybWFsICovCisgICAgICBpZiAoIHNpZ25wb3NpdGl2ZShzdDBfcHRyKSApCisJeworCSAgaWYgKCBzdDBfdGFnID09IFRXX0Rlbm9ybWFsICkKKwkgICAgRlBVX3RvX2V4cDE2KHN0MF9wdHIsIHN0MF9wdHIpOworCSAgZWxzZQorCSAgICAvKiBDb252ZXJ0IHN0KDApIGZvciBpbnRlcm5hbCB1c2UuICovCisJICAgIHNldGV4cG9uZW50MTYoc3QwX3B0ciwgZXhwb25lbnQoc3QwX3B0cikpOworCisJICBpZiAoIChzdDBfcHRyLT5zaWdoID09IDB4ODAwMDAwMDApICYmIChzdDBfcHRyLT5zaWdsID09IDApICkKKwkgICAgeworCSAgICAgIC8qIFNwZWNpYWwgY2FzZS4gVGhlIHJlc3VsdCBjYW4gYmUgcHJlY2lzZS4gKi8KKwkgICAgICB1X2NoYXIgZXNpZ247CisJICAgICAgZSA9IGV4cG9uZW50MTYoc3QwX3B0cik7CisJICAgICAgaWYgKCBlID49IDAgKQorCQl7CisJCSAgZXhwb25lbnQuc2lnaCA9IGU7CisJCSAgZXNpZ24gPSBTSUdOX1BPUzsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGV4cG9uZW50LnNpZ2ggPSAtZTsKKwkJICBlc2lnbiA9IFNJR05fTkVHOworCQl9CisJICAgICAgZXhwb25lbnQuc2lnbCA9IDA7CisJICAgICAgc2V0ZXhwb25lbnQxNigmZXhwb25lbnQsIDMxKTsKKwkgICAgICB0YWcgPSBGUFVfbm9ybWFsaXplX251bygmZXhwb25lbnQpOworCSAgICAgIHN0ZGV4cCgmZXhwb25lbnQpOworCSAgICAgIHNldHNpZ24oJmV4cG9uZW50LCBlc2lnbik7CisJICAgICAgdGFnID0gRlBVX211bCgmZXhwb25lbnQsIHRhZywgMSwgRlVMTF9QUkVDSVNJT04pOworCSAgICAgIGlmICggdGFnID49IDAgKQorCQlGUFVfc2V0dGFnaSgxLCB0YWcpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBUaGUgdXN1YWwgY2FzZSAqLworCSAgICAgIHNpZ24gPSBnZXRzaWduKHN0MV9wdHIpOworCSAgICAgIGlmICggc3QxX3RhZyA9PSBUV19EZW5vcm1hbCApCisJCUZQVV90b19leHAxNihzdDFfcHRyLCBzdDFfcHRyKTsKKwkgICAgICBlbHNlCisJCS8qIENvbnZlcnQgc3QoMSkgZm9yIGludGVybmFsIHVzZS4gKi8KKwkJc2V0ZXhwb25lbnQxNihzdDFfcHRyLCBleHBvbmVudChzdDFfcHRyKSk7CisJICAgICAgcG9seV9sMihzdDBfcHRyLCBzdDFfcHRyLCBzaWduKTsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBuZWdhdGl2ZSAqLworCSAgaWYgKCBhcml0aF9pbnZhbGlkKDEpIDwgMCApCisJICAgIHJldHVybjsKKwl9CisKKyAgICAgIEZQVV9wb3AoKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIHN0MF90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHN0MF90YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKyAgaWYgKCBzdDFfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDFfdGFnID0gRlBVX1NwZWNpYWwoc3QxX3B0cik7CisKKyAgaWYgKCAoc3QwX3RhZyA9PSBUQUdfRW1wdHkpIHx8IChzdDFfdGFnID09IFRBR19FbXB0eSkgKQorICAgIHsKKyAgICAgIEZQVV9zdGFja191bmRlcmZsb3dfcG9wKDEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoIChzdDBfdGFnIDw9IFRXX0Rlbm9ybWFsKSAmJiAoc3QxX3RhZyA8PSBUV19EZW5vcm1hbCkgKQorICAgIHsKKyAgICAgIGlmICggc3QwX3RhZyA9PSBUQUdfWmVybyApCisJeworCSAgaWYgKCBzdDFfdGFnID09IFRBR19aZXJvICkKKwkgICAgeworCSAgICAgIC8qIEJvdGggYXJncyB6ZXJvIGlzIGludmFsaWQgKi8KKwkgICAgICBpZiAoIGFyaXRoX2ludmFsaWQoMSkgPCAwICkKKwkJcmV0dXJuOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB1X2NoYXIgc2lnbjsKKwkgICAgICBzaWduID0gZ2V0c2lnbihzdDFfcHRyKV5TSUdOX05FRzsKKwkgICAgICBpZiAoIEZQVV9kaXZpZGVfYnlfemVybygxLCBzaWduKSA8IDAgKQorCQlyZXR1cm47CisKKwkgICAgICBzZXRzaWduKHN0MV9wdHIsIHNpZ24pOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoIHN0MV90YWcgPT0gVEFHX1plcm8gKQorCXsKKwkgIC8qIHN0KDEpIGNvbnRhaW5zIHplcm8sIHN0KDApIHZhbGlkIDw+IDAgKi8KKwkgIC8qIFplcm8gaXMgdGhlIHZhbGlkIGFuc3dlciAqLworCSAgc2lnbiA9IGdldHNpZ24oc3QxX3B0cik7CisJICAKKwkgIGlmICggc2lnbm5lZ2F0aXZlKHN0MF9wdHIpICkKKwkgICAgeworCSAgICAgIC8qIGxvZyhuZWdhdGl2ZSkgKi8KKwkgICAgICBpZiAoIGFyaXRoX2ludmFsaWQoMSkgPCAwICkKKwkJcmV0dXJuOworCSAgICB9CisJICBlbHNlIGlmICggKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJICAgIHJldHVybjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICggZXhwb25lbnQoc3QwX3B0cikgPCAwICkKKwkJc2lnbiBePSBTSUdOX05FRzsKKworCSAgICAgIEZQVV9jb3B5X3RvX3JlZzEoJkNPTlNUX1osIFRBR19aZXJvKTsKKwkgICAgICBzZXRzaWduKHN0MV9wdHIsIHNpZ24pOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIE9uZSBvciBib3RoIG9wZXJhbmRzIGFyZSBkZW5vcm1hbHMuICovCisJICBpZiAoIGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCSAgICByZXR1cm47CisJICBnb3RvIGJvdGhfdmFsaWQ7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoIChzdDBfdGFnID09IFRXX05hTikgfHwgKHN0MV90YWcgPT0gVFdfTmFOKSApCisgICAgeworICAgICAgaWYgKCByZWFsXzJvcF9OYU4oc3QwX3B0ciwgc3QwX3RhZywgMSwgc3QwX3B0cikgPCAwICkKKwlyZXR1cm47CisgICAgfQorICAvKiBPbmUgb3IgYm90aCBhcmcgbXVzdCBiZSBhbiBpbmZpbml0eSAqLworICBlbHNlIGlmICggc3QwX3RhZyA9PSBUV19JbmZpbml0eSApCisgICAgeworICAgICAgaWYgKCAoc2lnbm5lZ2F0aXZlKHN0MF9wdHIpKSB8fCAoc3QxX3RhZyA9PSBUQUdfWmVybykgKQorCXsKKwkgIC8qIGxvZygtaW5maW5pdHkpIG9yIDAqbG9nKGluZmluaXR5KSAqLworCSAgaWYgKCBhcml0aF9pbnZhbGlkKDEpIDwgMCApCisJICAgIHJldHVybjsKKwl9CisgICAgICBlbHNlCisJeworCSAgdV9jaGFyIHNpZ24gPSBnZXRzaWduKHN0MV9wdHIpOworCisJICBpZiAoIChzdDFfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCSAgICByZXR1cm47CisKKwkgIEZQVV9jb3B5X3RvX3JlZzEoJkNPTlNUX0lORiwgVEFHX1NwZWNpYWwpOworCSAgc2V0c2lnbihzdDFfcHRyLCBzaWduKTsKKwl9CisgICAgfQorICAvKiBzdCgxKSBtdXN0IGJlIGluZmluaXR5IGhlcmUgKi8KKyAgZWxzZSBpZiAoICgoc3QwX3RhZyA9PSBUQUdfVmFsaWQpIHx8IChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSkKKwkgICAgJiYgKCBzaWducG9zaXRpdmUoc3QwX3B0cikgKSApCisgICAgeworICAgICAgaWYgKCBleHBvbmVudChzdDBfcHRyKSA+PSAwICkKKwl7CisJICBpZiAoIChleHBvbmVudChzdDBfcHRyKSA9PSAwKSAmJgorCSAgICAgIChzdDBfcHRyLT5zaWdoID09IDB4ODAwMDAwMDApICYmCisJICAgICAgKHN0MF9wdHItPnNpZ2wgPT0gMCkgKQorCSAgICB7CisJICAgICAgLyogc3QoMCkgaG9sZHMgMS4wICovCisJICAgICAgLyogaW5maW5pdHkqbG9nKDEpICovCisJICAgICAgaWYgKCBhcml0aF9pbnZhbGlkKDEpIDwgMCApCisJCXJldHVybjsKKwkgICAgfQorCSAgLyogZWxzZSBzdCgwKSBpcyBwb3NpdGl2ZSBhbmQgPiAxLjAgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogc3QoMCkgaXMgcG9zaXRpdmUgYW5kIDwgMS4wICovCisKKwkgIGlmICggKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJICAgIHJldHVybjsKKworCSAgY2hhbmdlc2lnbihzdDFfcHRyKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogc3QoMCkgbXVzdCBiZSB6ZXJvIG9yIG5lZ2F0aXZlICovCisgICAgICBpZiAoIHN0MF90YWcgPT0gVEFHX1plcm8gKQorCXsKKwkgIC8qIFRoaXMgc2hvdWxkIGJlIGludmFsaWQsIGJ1dCBhIHJlYWwgODA0ODYgaXMgaGFwcHkgd2l0aCBpdC4gKi8KKworI2lmbmRlZiBQRUNVTElBUl80ODYKKwkgIHNpZ24gPSBnZXRzaWduKHN0MV9wdHIpOworCSAgaWYgKCBGUFVfZGl2aWRlX2J5X3plcm8oMSwgc2lnbikgPCAwICkKKwkgICAgcmV0dXJuOworI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLworCisJICBjaGFuZ2VzaWduKHN0MV9wdHIpOworCX0KKyAgICAgIGVsc2UgaWYgKCBhcml0aF9pbnZhbGlkKDEpIDwgMCApCSAgLyogbG9nKG5lZ2F0aXZlKSAqLworCXJldHVybjsKKyAgICB9CisKKyAgRlBVX3BvcCgpOworfQorCisKK3N0YXRpYyB2b2lkIGZwYXRhbihGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZykKK3sKKyAgRlBVX1JFRyAqc3QxX3B0ciA9ICZzdCgxKTsKKyAgdV9jaGFyIHN0MV90YWcgPSBGUFVfZ2V0dGFnaSgxKTsKKyAgaW50IHRhZzsKKworICBjbGVhcl9DMSgpOworICBpZiAoICEoKHN0MF90YWcgXiBUQUdfVmFsaWQpIHwgKHN0MV90YWcgXiBUQUdfVmFsaWQpKSApCisgICAgeworICAgIHZhbGlkX2F0YW46CisKKyAgICAgIHBvbHlfYXRhbihzdDBfcHRyLCBzdDBfdGFnLCBzdDFfcHRyLCBzdDFfdGFnKTsKKworICAgICAgRlBVX3BvcCgpOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmICggc3QwX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgc3QwX3RhZyA9IEZQVV9TcGVjaWFsKHN0MF9wdHIpOworICBpZiAoIHN0MV90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHN0MV90YWcgPSBGUFVfU3BlY2lhbChzdDFfcHRyKTsKKworICBpZiAoICgoc3QwX3RhZyA9PSBUQUdfVmFsaWQpICYmIChzdDFfdGFnID09IFRXX0Rlbm9ybWFsKSkKKwkgICAgfHwgKChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoc3QxX3RhZyA9PSBUQUdfVmFsaWQpKQorCSAgICB8fCAoKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChzdDFfdGFnID09IFRXX0Rlbm9ybWFsKSkgKQorICAgIHsKKyAgICAgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJcmV0dXJuOworCisgICAgICBnb3RvIHZhbGlkX2F0YW47CisgICAgfQorICBlbHNlIGlmICggKHN0MF90YWcgPT0gVEFHX0VtcHR5KSB8fCAoc3QxX3RhZyA9PSBUQUdfRW1wdHkpICkKKyAgICB7CisgICAgICBGUFVfc3RhY2tfdW5kZXJmbG93X3BvcCgxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UgaWYgKCAoc3QwX3RhZyA9PSBUV19OYU4pIHx8IChzdDFfdGFnID09IFRXX05hTikgKQorICAgIHsKKyAgICAgIGlmICggcmVhbF8yb3BfTmFOKHN0MF9wdHIsIHN0MF90YWcsIDEsIHN0MF9wdHIpID49IDAgKQorCSAgRlBVX3BvcCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoIChzdDBfdGFnID09IFRXX0luZmluaXR5KSB8fCAoc3QxX3RhZyA9PSBUV19JbmZpbml0eSkgKQorICAgIHsKKyAgICAgIHVfY2hhciBzaWduID0gZ2V0c2lnbihzdDFfcHRyKTsKKyAgICAgIGlmICggc3QwX3RhZyA9PSBUV19JbmZpbml0eSApCisJeworCSAgaWYgKCBzdDFfdGFnID09IFRXX0luZmluaXR5ICkKKwkgICAgeworCSAgICAgIGlmICggc2lnbnBvc2l0aXZlKHN0MF9wdHIpICkKKwkJeworCQkgIEZQVV9jb3B5X3RvX3JlZzEoJkNPTlNUX1BJNCwgVEFHX1ZhbGlkKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHNldHBvc2l0aXZlKHN0MV9wdHIpOworCQkgIHRhZyA9IEZQVV91X2FkZCgmQ09OU1RfUEk0LCAmQ09OU1RfUEkyLCBzdDFfcHRyLAorCQkJCSAgRlVMTF9QUkVDSVNJT04sIFNJR05fUE9TLAorCQkJCSAgZXhwb25lbnQoJkNPTlNUX1BJNCksIGV4cG9uZW50KCZDT05TVF9QSTIpKTsKKwkJICBpZiAoIHRhZyA+PSAwICkKKwkJICAgIEZQVV9zZXR0YWdpKDEsIHRhZyk7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKCAoc3QxX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwkJcmV0dXJuOworCisJICAgICAgaWYgKCBzaWducG9zaXRpdmUoc3QwX3B0cikgKQorCQl7CisJCSAgRlBVX2NvcHlfdG9fcmVnMSgmQ09OU1RfWiwgVEFHX1plcm8pOworCQkgIHNldHNpZ24oc3QxX3B0ciwgc2lnbik7ICAgLyogQW4gODA0ODYgcHJlc2VydmVzIHRoZSBzaWduICovCisJCSAgRlBVX3BvcCgpOworCQkgIHJldHVybjsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIEZQVV9jb3B5X3RvX3JlZzEoJkNPTlNUX1BJLCBUQUdfVmFsaWQpOworCQl9CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyogc3QoMSkgaXMgaW5maW5pdHksIHN0KDApIG5vdCBpbmZpbml0eSAqLworCSAgaWYgKCAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwkgICAgcmV0dXJuOworCisJICBGUFVfY29weV90b19yZWcxKCZDT05TVF9QSTIsIFRBR19WYWxpZCk7CisJfQorICAgICAgc2V0c2lnbihzdDFfcHRyLCBzaWduKTsKKyAgICB9CisgIGVsc2UgaWYgKCBzdDFfdGFnID09IFRBR19aZXJvICkKKyAgICB7CisgICAgICAvKiBzdCgwKSBtdXN0IGJlIHZhbGlkIG9yIHplcm8gKi8KKyAgICAgIHVfY2hhciBzaWduID0gZ2V0c2lnbihzdDFfcHRyKTsKKworICAgICAgaWYgKCAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwlyZXR1cm47CisKKyAgICAgIGlmICggc2lnbnBvc2l0aXZlKHN0MF9wdHIpICkKKwl7CisJICAvKiBBbiA4MDQ4NiBwcmVzZXJ2ZXMgdGhlIHNpZ24gKi8KKwkgIEZQVV9wb3AoKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIEZQVV9jb3B5X3RvX3JlZzEoJkNPTlNUX1BJLCBUQUdfVmFsaWQpOworICAgICAgc2V0c2lnbihzdDFfcHRyLCBzaWduKTsKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRBR19aZXJvICkKKyAgICB7CisgICAgICAvKiBzdCgxKSBtdXN0IGJlIFRBR19WYWxpZCBoZXJlICovCisgICAgICB1X2NoYXIgc2lnbiA9IGdldHNpZ24oc3QxX3B0cik7CisKKyAgICAgIGlmICggKHN0MV90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJcmV0dXJuOworCisgICAgICBGUFVfY29weV90b19yZWcxKCZDT05TVF9QSTIsIFRBR19WYWxpZCk7CisgICAgICBzZXRzaWduKHN0MV9wdHIsIHNpZ24pOworICAgIH0KKyNpZmRlZiBQQVJBTk9JRAorICBlbHNlCisgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMIHwgMHgxMjUpOworI2VuZGlmIC8qIFBBUkFOT0lEICovCisKKyAgRlBVX3BvcCgpOworICBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAoKTsgIC8qIFdlIGRvIG5vdCByZWFsbHkga25vdyBpZiB1cCBvciBkb3duICovCit9CisKKworc3RhdGljIHZvaWQgZnByZW0oRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcpCit7CisgIGRvX2ZwcmVtKHN0MF9wdHIsIHN0MF90YWcsIFJDX0NIT1ApOworfQorCisKK3N0YXRpYyB2b2lkIGZwcmVtMShGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZykKK3sKKyAgZG9fZnByZW0oc3QwX3B0ciwgc3QwX3RhZywgUkNfUk5EKTsKK30KKworCitzdGF0aWMgdm9pZCBmeWwyeHAxKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnKQoreworICB1X2NoYXIgc2lnbiwgc2lnbjE7CisgIEZQVV9SRUcgKnN0MV9wdHIgPSAmc3QoMSksIGEsIGI7CisgIHVfY2hhciBzdDFfdGFnID0gRlBVX2dldHRhZ2koMSk7CisKKyAgY2xlYXJfQzEoKTsKKyAgaWYgKCAhKChzdDBfdGFnIF4gVEFHX1ZhbGlkKSB8IChzdDFfdGFnIF4gVEFHX1ZhbGlkKSkgKQorICAgIHsKKyAgICB2YWxpZF95bDJ4cDE6CisKKyAgICAgIHNpZ24gPSBnZXRzaWduKHN0MF9wdHIpOworICAgICAgc2lnbjEgPSBnZXRzaWduKHN0MV9wdHIpOworCisgICAgICBGUFVfdG9fZXhwMTYoc3QwX3B0ciwgJmEpOworICAgICAgRlBVX3RvX2V4cDE2KHN0MV9wdHIsICZiKTsKKworICAgICAgaWYgKCBwb2x5X2wycDEoc2lnbiwgc2lnbjEsICZhLCAmYiwgc3QxX3B0cikgKQorCXJldHVybjsKKworICAgICAgRlBVX3BvcCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoIHN0MF90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHN0MF90YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKyAgaWYgKCBzdDFfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDFfdGFnID0gRlBVX1NwZWNpYWwoc3QxX3B0cik7CisKKyAgaWYgKCAoKHN0MF90YWcgPT0gVEFHX1ZhbGlkKSAmJiAoc3QxX3RhZyA9PSBUV19EZW5vcm1hbCkpCisJICAgIHx8ICgoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKHN0MV90YWcgPT0gVEFHX1ZhbGlkKSkKKwkgICAgfHwgKChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoc3QxX3RhZyA9PSBUV19EZW5vcm1hbCkpICkKKyAgICB7CisgICAgICBpZiAoIGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCXJldHVybjsKKworICAgICAgZ290byB2YWxpZF95bDJ4cDE7CisgICAgfQorICBlbHNlIGlmICggKHN0MF90YWcgPT0gVEFHX0VtcHR5KSB8IChzdDFfdGFnID09IFRBR19FbXB0eSkgKQorICAgIHsKKyAgICAgIEZQVV9zdGFja191bmRlcmZsb3dfcG9wKDEpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVEFHX1plcm8gKQorICAgIHsKKyAgICAgIHN3aXRjaCAoIHN0MV90YWcgKQorCXsKKwljYXNlIFRXX0Rlbm9ybWFsOgorCSAgaWYgKCBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwICkKKwkgICAgcmV0dXJuOworCisJY2FzZSBUQUdfWmVybzoKKwljYXNlIFRBR19WYWxpZDoKKwkgIHNldHNpZ24oc3QwX3B0ciwgZ2V0c2lnbihzdDBfcHRyKSBeIGdldHNpZ24oc3QxX3B0cikpOworCSAgRlBVX2NvcHlfdG9fcmVnMShzdDBfcHRyLCBzdDBfdGFnKTsKKwkgIGJyZWFrOworCisJY2FzZSBUV19JbmZpbml0eToKKwkgIC8qIEluZmluaXR5KmxvZygxKSAqLworCSAgaWYgKCBhcml0aF9pbnZhbGlkKDEpIDwgMCApCisJICAgIHJldHVybjsKKwkgIGJyZWFrOworCisJY2FzZSBUV19OYU46CisJICBpZiAoIHJlYWxfMm9wX05hTihzdDBfcHRyLCBzdDBfdGFnLCAxLCBzdDBfcHRyKSA8IDAgKQorCSAgICByZXR1cm47CisJICBicmVhazsKKworCWRlZmF1bHQ6CisjaWZkZWYgUEFSQU5PSUQKKwkgIEVYQ0VQVElPTihFWF9JTlRFUk5BTCB8IDB4MTE2KTsKKwkgIHJldHVybjsKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgZWxzZSBpZiAoIChzdDBfdGFnID09IFRBR19WYWxpZCkgfHwgKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICkKKyAgICB7CisgICAgICBzd2l0Y2ggKCBzdDFfdGFnICkKKwl7CisJY2FzZSBUQUdfWmVybzoKKwkgIGlmICggc2lnbm5lZ2F0aXZlKHN0MF9wdHIpICkKKwkgICAgeworCSAgICAgIGlmICggZXhwb25lbnQoc3QwX3B0cikgPj0gMCApCisJCXsKKwkJICAvKiBzdCgwKSBob2xkcyA8PSAtMS4wICovCisjaWZkZWYgUEVDVUxJQVJfNDg2ICAgLyogU3R1cGlkIDgwNDg2IGRvZXNuJ3Qgd29ycnkgYWJvdXQgbG9nKG5lZ2F0aXZlKS4gKi8KKwkJICBjaGFuZ2VzaWduKHN0MV9wdHIpOworI2Vsc2UKKwkJICBpZiAoIGFyaXRoX2ludmFsaWQoMSkgPCAwICkKKwkJICAgIHJldHVybjsKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKwkJfQorCSAgICAgIGVsc2UgaWYgKCAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwkJcmV0dXJuOworCSAgICAgIGVsc2UKKwkJY2hhbmdlc2lnbihzdDFfcHRyKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoIChzdDBfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCSAgICByZXR1cm47CisJICBicmVhazsKKworCWNhc2UgVFdfSW5maW5pdHk6CisJICBpZiAoIHNpZ25uZWdhdGl2ZShzdDBfcHRyKSApCisJICAgIHsKKwkgICAgICBpZiAoIChleHBvbmVudChzdDBfcHRyKSA+PSAwKSAmJgorCQkgICEoKHN0MF9wdHItPnNpZ2ggPT0gMHg4MDAwMDAwMCkgJiYKKwkJICAgIChzdDBfcHRyLT5zaWdsID09IDApKSApCisJCXsKKwkJICAvKiBzdCgwKSBob2xkcyA8IC0xLjAgKi8KKyNpZmRlZiBQRUNVTElBUl80ODYgICAvKiBTdHVwaWQgODA0ODYgZG9lc24ndCB3b3JyeSBhYm91dCBsb2cobmVnYXRpdmUpLiAqLworCQkgIGNoYW5nZXNpZ24oc3QxX3B0cik7CisjZWxzZQorCQkgIGlmICggYXJpdGhfaW52YWxpZCgxKSA8IDAgKSByZXR1cm47CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisJCX0KKwkgICAgICBlbHNlIGlmICggKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJCXJldHVybjsKKwkgICAgICBlbHNlCisJCWNoYW5nZXNpZ24oc3QxX3B0cik7CisJICAgIH0KKwkgIGVsc2UgaWYgKCAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwkgICAgcmV0dXJuOworCSAgYnJlYWs7CisKKwljYXNlIFRXX05hTjoKKwkgIGlmICggcmVhbF8yb3BfTmFOKHN0MF9wdHIsIHN0MF90YWcsIDEsIHN0MF9wdHIpIDwgMCApCisJICAgIHJldHVybjsKKwl9CisKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRXX05hTiApCisgICAgeworICAgICAgaWYgKCByZWFsXzJvcF9OYU4oc3QwX3B0ciwgc3QwX3RhZywgMSwgc3QwX3B0cikgPCAwICkKKwlyZXR1cm47CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUV19JbmZpbml0eSApCisgICAgeworICAgICAgaWYgKCBzdDFfdGFnID09IFRXX05hTiApCisJeworCSAgaWYgKCByZWFsXzJvcF9OYU4oc3QwX3B0ciwgc3QwX3RhZywgMSwgc3QwX3B0cikgPCAwICkKKwkgICAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKCBzaWdubmVnYXRpdmUoc3QwX3B0cikgKQorCXsKKyNpZm5kZWYgUEVDVUxJQVJfNDg2CisJICAvKiBUaGlzIHNob3VsZCBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuIGRlbm9ybWFscywgYnV0Li4uICovCisJICBpZiAoIGFyaXRoX2ludmFsaWQoMSkgPCAwICkgIC8qIGxvZygtaW5maW5pdHkpICovCisJICAgIHJldHVybjsKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKwkgIGlmICggKHN0MV90YWcgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJICAgIHJldHVybjsKKyNpZmRlZiBQRUNVTElBUl80ODYKKwkgIC8qIERlbm9ybWFsIG9wZXJhbmRzIGFjdHVhbGx5IGdldCBoaWdoZXIgcHJpb3JpdHkgKi8KKwkgIGlmICggYXJpdGhfaW52YWxpZCgxKSA8IDAgKSAgLyogbG9nKC1pbmZpbml0eSkgKi8KKwkgICAgcmV0dXJuOworI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLworCX0KKyAgICAgIGVsc2UgaWYgKCBzdDFfdGFnID09IFRBR19aZXJvICkKKwl7CisJICAvKiBsb2coaW5maW5pdHkpICovCisJICBpZiAoIGFyaXRoX2ludmFsaWQoMSkgPCAwICkKKwkgICAgcmV0dXJuOworCX0KKwkKKyAgICAgIC8qIHN0KDEpIG11c3QgYmUgdmFsaWQgaGVyZS4gKi8KKworICAgICAgZWxzZSBpZiAoIChzdDFfdGFnID09IFRXX0Rlbm9ybWFsKSAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCXJldHVybjsKKworICAgICAgLyogVGhlIE1hbnVhbCBzYXlzIHRoYXQgbG9nKEluZmluaXR5KSBpcyBpbnZhbGlkLCBidXQgYSByZWFsCisJIDgwNDg2IHNlbnNpYmx5IHNheXMgdGhhdCBpdCBpcyBvLmsuICovCisgICAgICBlbHNlCisJeworCSAgdV9jaGFyIHNpZ24gPSBnZXRzaWduKHN0MV9wdHIpOworCSAgRlBVX2NvcHlfdG9fcmVnMSgmQ09OU1RfSU5GLCBUQUdfU3BlY2lhbCk7CisJICBzZXRzaWduKHN0MV9wdHIsIHNpZ24pOworCX0KKyAgICB9CisjaWZkZWYgUEFSQU5PSUQKKyAgZWxzZQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTCB8IDB4MTE3KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworICBGUFVfcG9wKCk7CisgIHJldHVybjsKKworfQorCisKK3N0YXRpYyB2b2lkIGZzY2FsZShGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZykKK3sKKyAgRlBVX1JFRyAqc3QxX3B0ciA9ICZzdCgxKTsKKyAgdV9jaGFyIHN0MV90YWcgPSBGUFVfZ2V0dGFnaSgxKTsKKyAgaW50IG9sZF9jdyA9IGNvbnRyb2xfd29yZDsKKyAgdV9jaGFyIHNpZ24gPSBnZXRzaWduKHN0MF9wdHIpOworCisgIGNsZWFyX0MxKCk7CisgIGlmICggISgoc3QwX3RhZyBeIFRBR19WYWxpZCkgfCAoc3QxX3RhZyBeIFRBR19WYWxpZCkpICkKKyAgICB7CisgICAgICBsb25nIHNjYWxlOworICAgICAgRlBVX1JFRyB0bXA7CisKKyAgICAgIC8qIENvbnZlcnQgcmVnaXN0ZXIgZm9yIGludGVybmFsIHVzZS4gKi8KKyAgICAgIHNldGV4cG9uZW50MTYoc3QwX3B0ciwgZXhwb25lbnQoc3QwX3B0cikpOworCisgICAgdmFsaWRfc2NhbGU6CisKKyAgICAgIGlmICggZXhwb25lbnQoc3QxX3B0cikgPiAzMCApCisJeworCSAgLyogMl4zMSBpcyBmYXIgdG9vIGxhcmdlLCB3b3VsZCByZXF1aXJlIDJeKDJeMzApIG9yIDJeKC0yXjMwKSAqLworCisJICBpZiAoIHNpZ25wb3NpdGl2ZShzdDFfcHRyKSApCisJICAgIHsKKwkgICAgICBFWENFUFRJT04oRVhfT3ZlcmZsb3cpOworCSAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUX0lORiwgVEFHX1NwZWNpYWwpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBFWENFUFRJT04oRVhfVW5kZXJmbG93KTsKKwkgICAgICBGUFVfY29weV90b19yZWcwKCZDT05TVF9aLCBUQUdfWmVybyk7CisJICAgIH0KKwkgIHNldHNpZ24oc3QwX3B0ciwgc2lnbik7CisJICByZXR1cm47CisJfQorCisgICAgICBjb250cm9sX3dvcmQgJj0gfkNXX1JDOworICAgICAgY29udHJvbF93b3JkIHw9IFJDX0NIT1A7CisgICAgICByZWdfY29weShzdDFfcHRyLCAmdG1wKTsKKyAgICAgIEZQVV9yb3VuZF90b19pbnQoJnRtcCwgc3QxX3RhZyk7ICAgICAgLyogVGhpcyBjYW4gbmV2ZXIgb3ZlcmZsb3cgaGVyZSAqLworICAgICAgY29udHJvbF93b3JkID0gb2xkX2N3OworICAgICAgc2NhbGUgPSBzaWdubmVnYXRpdmUoc3QxX3B0cikgPyAtdG1wLnNpZ2wgOiB0bXAuc2lnbDsKKyAgICAgIHNjYWxlICs9IGV4cG9uZW50MTYoc3QwX3B0cik7CisKKyAgICAgIHNldGV4cG9uZW50MTYoc3QwX3B0ciwgc2NhbGUpOworCisgICAgICAvKiBVc2UgRlBVX3JvdW5kKCkgdG8gcHJvcGVybHkgZGV0ZWN0IHVuZGVyL292ZXJmbG93IGV0YyAqLworICAgICAgRlBVX3JvdW5kKHN0MF9wdHIsIDAsIDAsIGNvbnRyb2xfd29yZCwgc2lnbik7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisgIGlmICggc3QxX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgc3QxX3RhZyA9IEZQVV9TcGVjaWFsKHN0MV9wdHIpOworCisgIGlmICggKHN0MF90YWcgPT0gVEFHX1ZhbGlkKSB8fCAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgKQorICAgIHsKKyAgICAgIHN3aXRjaCAoIHN0MV90YWcgKQorCXsKKwljYXNlIFRBR19WYWxpZDoKKwkgIC8qIHN0KDApIG11c3QgYmUgYSBkZW5vcm1hbCAqLworCSAgaWYgKCAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwkgICAgcmV0dXJuOworCisJICBGUFVfdG9fZXhwMTYoc3QwX3B0ciwgc3QwX3B0cik7ICAvKiBXaWxsIG5vdCBiZSBsZWZ0IG9uIHN0YWNrICovCisJICBnb3RvIHZhbGlkX3NjYWxlOworCisJY2FzZSBUQUdfWmVybzoKKwkgIGlmICggc3QwX3RhZyA9PSBUV19EZW5vcm1hbCApCisJICAgIGRlbm9ybWFsX29wZXJhbmQoKTsKKwkgIHJldHVybjsKKworCWNhc2UgVFdfRGVub3JtYWw6CisJICBkZW5vcm1hbF9vcGVyYW5kKCk7CisJICByZXR1cm47CisKKwljYXNlIFRXX0luZmluaXR5OgorCSAgaWYgKCAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgJiYgKGRlbm9ybWFsX29wZXJhbmQoKSA8IDApICkKKwkgICAgcmV0dXJuOworCisJICBpZiAoIHNpZ25wb3NpdGl2ZShzdDFfcHRyKSApCisJICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUX0lORiwgVEFHX1NwZWNpYWwpOworCSAgZWxzZQorCSAgICBGUFVfY29weV90b19yZWcwKCZDT05TVF9aLCBUQUdfWmVybyk7CisJICBzZXRzaWduKHN0MF9wdHIsIHNpZ24pOworCSAgcmV0dXJuOworCisJY2FzZSBUV19OYU46CisJICByZWFsXzJvcF9OYU4oc3QxX3B0ciwgc3QxX3RhZywgMCwgc3QwX3B0cik7CisJICByZXR1cm47CisJfQorICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVEFHX1plcm8gKQorICAgIHsKKyAgICAgIHN3aXRjaCAoIHN0MV90YWcgKQorCXsKKwljYXNlIFRBR19WYWxpZDoKKwljYXNlIFRBR19aZXJvOgorCSAgcmV0dXJuOworCisJY2FzZSBUV19EZW5vcm1hbDoKKwkgIGRlbm9ybWFsX29wZXJhbmQoKTsKKwkgIHJldHVybjsKKworCWNhc2UgVFdfSW5maW5pdHk6CisJICBpZiAoIHNpZ25wb3NpdGl2ZShzdDFfcHRyKSApCisJICAgIGFyaXRoX2ludmFsaWQoMCk7IC8qIFplcm8gc2NhbGVkIGJ5ICtJbmZpbml0eSAqLworCSAgcmV0dXJuOworCisJY2FzZSBUV19OYU46CisJICByZWFsXzJvcF9OYU4oc3QxX3B0ciwgc3QxX3RhZywgMCwgc3QwX3B0cik7CisJICByZXR1cm47CisJfQorICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVFdfSW5maW5pdHkgKQorICAgIHsKKyAgICAgIHN3aXRjaCAoIHN0MV90YWcgKQorCXsKKwljYXNlIFRBR19WYWxpZDoKKwljYXNlIFRBR19aZXJvOgorCSAgcmV0dXJuOworCisJY2FzZSBUV19EZW5vcm1hbDoKKwkgIGRlbm9ybWFsX29wZXJhbmQoKTsKKwkgIHJldHVybjsKKworCWNhc2UgVFdfSW5maW5pdHk6CisJICBpZiAoIHNpZ25uZWdhdGl2ZShzdDFfcHRyKSApCisJICAgIGFyaXRoX2ludmFsaWQoMCk7IC8qIEluZmluaXR5IHNjYWxlZCBieSAtSW5maW5pdHkgKi8KKwkgIHJldHVybjsKKworCWNhc2UgVFdfTmFOOgorCSAgcmVhbF8yb3BfTmFOKHN0MV9wdHIsIHN0MV90YWcsIDAsIHN0MF9wdHIpOworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRXX05hTiApCisgICAgeworICAgICAgaWYgKCBzdDFfdGFnICE9IFRBR19FbXB0eSApCisJeyByZWFsXzJvcF9OYU4oc3QxX3B0ciwgc3QxX3RhZywgMCwgc3QwX3B0cik7IHJldHVybjsgfQorICAgIH0KKworI2lmZGVmIFBBUkFOT0lECisgIGlmICggISgoc3QwX3RhZyA9PSBUQUdfRW1wdHkpIHx8IChzdDFfdGFnID09IFRBR19FbXB0eSkpICkKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUwgfCAweDExNSk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgLyogQXQgbGVhc3Qgb25lIG9mIHN0KDApLCBzdCgxKSBtdXN0IGJlIGVtcHR5ICovCisgIEZQVV9zdGFja191bmRlcmZsb3coKTsKKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIEZVTkNfU1QwIGNvbnN0IHRyaWdfdGFibGVfYVtdID0geworICBmMnhtMSwgZnlsMngsIGZwdGFuLCBmcGF0YW4sCisgIGZ4dHJhY3QsIGZwcmVtMSwgKEZVTkNfU1QwKWZkZWNzdHAsIChGVU5DX1NUMClmaW5jc3RwCit9OworCit2b2lkIEZQVV90cmlnYSh2b2lkKQoreworICAodHJpZ190YWJsZV9hW0ZQVV9ybV0pKCZzdCgwKSwgRlBVX2dldHRhZzAoKSk7Cit9CisKKworc3RhdGljIEZVTkNfU1QwIGNvbnN0IHRyaWdfdGFibGVfYltdID0KKyAgeworICAgIGZwcmVtLCBmeWwyeHAxLCBmc3FydF8sIGZzaW5jb3MsIGZybmRpbnRfLCBmc2NhbGUsIChGVU5DX1NUMClmc2luLCBmY29zCisgIH07CisKK3ZvaWQgRlBVX3RyaWdiKHZvaWQpCit7CisgICh0cmlnX3RhYmxlX2JbRlBVX3JtXSkoJnN0KDApLCBGUFVfZ2V0dGFnMCgpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9nZXRfYWRkcmVzcy5jIGIvYXJjaC9pMzg2L21hdGgtZW11L2dldF9hZGRyZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExNzU3MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9nZXRfYWRkcmVzcy5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBnZXRfYWRkcmVzcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBHZXQgdGhlIGVmZmVjdGl2ZSBhZGRyZXNzIGZyb20gYW4gRlBVIGluc3RydWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgICBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCBOb3RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIFRoZSBmaWxlIGNvbnRhaW5zIGNvZGUgd2hpY2ggYWNjZXNzZXMgdXNlciBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgRW11bGF0b3Igc3RhdGljIGRhdGEgbWF5IGNoYW5nZSB3aGVuIHVzZXIgbWVtb3J5IGlzIGFjY2Vzc2VkLCBkdWUgdG8gICB8CisgfCAgICBvdGhlciBwcm9jZXNzZXMgdXNpbmcgdGhlIGVtdWxhdG9yIHdoaWxlIHN3YXBwaW5nIGlzIGluIHByb2dyZXNzLiAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisKKyNpbmNsdWRlICJmcHVfc3lzdGVtLmgiCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorCisKKyNkZWZpbmUgRlBVX1dSSVRFX0JJVCAweDEwCisKK3N0YXRpYyBpbnQgcmVnX29mZnNldFtdID0geworCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX2VheCksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fZWN4KSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19lZHgpLAorCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX2VieCksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fZXNwKSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19lYnApLAorCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX2VzaSksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fZWRpKQorfTsKKworI2RlZmluZSBSRUdfKHgpICgqKGxvbmcgKikocmVnX29mZnNldFsoeCldKyh1X2NoYXIgKikgRlBVX2luZm8pKQorCitzdGF0aWMgaW50IHJlZ19vZmZzZXRfdm04NltdID0geworCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX2NzKSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX192bTg2X2RzKSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX192bTg2X2VzKSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX192bTg2X2ZzKSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX192bTg2X2dzKSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19zcyksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fdm04Nl9kcykKKyAgICAgIH07CisKKyNkZWZpbmUgVk04Nl9SRUdfKHgpICgqKHVuc2lnbmVkIHNob3J0ICopIFwKKwkJICAgICAgKHJlZ19vZmZzZXRfdm04NlsoKHVuc2lnbmVkKXgpXSsodV9jaGFyICopIEZQVV9pbmZvKSkKKworLyogVGhlc2UgYXJlIGR1bW15LCBmcyBhbmQgZ3MgYXJlIG5vdCBzYXZlZCBvbiB0aGUgc3RhY2suICovCisjZGVmaW5lIF9fX0ZTIF9fX2RzCisjZGVmaW5lIF9fX0dTIF9fX2RzCisKK3N0YXRpYyBpbnQgcmVnX29mZnNldF9wbVtdID0geworCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX2NzKSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19kcyksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fZXMpLAorCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX0ZTKSwKKwlvZmZzZXRvZihzdHJ1Y3QgaW5mbyxfX19HUyksCisJb2Zmc2V0b2Yoc3RydWN0IGluZm8sX19fc3MpLAorCW9mZnNldG9mKHN0cnVjdCBpbmZvLF9fX2RzKQorICAgICAgfTsKKworI2RlZmluZSBQTV9SRUdfKHgpICgqKHVuc2lnbmVkIHNob3J0ICopIFwKKwkJICAgICAgKHJlZ19vZmZzZXRfcG1bKCh1bnNpZ25lZCl4KV0rKHVfY2hhciAqKSBGUFVfaW5mbykpCisKKworLyogRGVjb2RlIHRoZSBTSUIgYnl0ZS4gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIG1vZCAhPSAwICovCitzdGF0aWMgaW50IHNpYihpbnQgbW9kLCB1bnNpZ25lZCBsb25nICpmcHVfZWlwKQoreworICB1X2NoYXIgc3MsaW5kZXgsYmFzZTsKKyAgbG9uZyBvZmZzZXQ7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9jb2RlX2FjY2Vzc19vaygxKTsKKyAgRlBVX2dldF91c2VyKGJhc2UsICh1X2NoYXIgX191c2VyICopICgqZnB1X2VpcCkpOyAgIC8qIFRoZSBTSUIgYnl0ZSAqLworICBSRV9FTlRSQU5UX0NIRUNLX09OOworICAoKmZwdV9laXApKys7CisgIHNzID0gYmFzZSA+PiA2OworICBpbmRleCA9IChiYXNlID4+IDMpICYgNzsKKyAgYmFzZSAmPSA3OworCisgIGlmICgobW9kID09IDApICYmIChiYXNlID09IDUpKQorICAgIG9mZnNldCA9IDA7ICAgICAgICAgICAgICAvKiBObyBiYXNlIHJlZ2lzdGVyICovCisgIGVsc2UKKyAgICBvZmZzZXQgPSBSRUdfKGJhc2UpOworCisgIGlmIChpbmRleCA9PSA0KQorICAgIHsKKyAgICAgIC8qIE5vIGluZGV4IHJlZ2lzdGVyICovCisgICAgICAvKiBBIG5vbi16ZXJvIHNzIGlzIGlsbGVnYWwgKi8KKyAgICAgIGlmICggc3MgKQorCUVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBvZmZzZXQgKz0gKFJFR18oaW5kZXgpKSA8PCBzczsKKyAgICB9CisKKyAgaWYgKG1vZCA9PSAxKQorICAgIHsKKyAgICAgIC8qIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQgKi8KKyAgICAgIGxvbmcgZGlzcGxhY2VtZW50OworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgICAgICBGUFVfY29kZV9hY2Nlc3Nfb2soMSk7CisgICAgICBGUFVfZ2V0X3VzZXIoZGlzcGxhY2VtZW50LCAoc2lnbmVkIGNoYXIgX191c2VyICopICgqZnB1X2VpcCkpOworICAgICAgb2Zmc2V0ICs9IGRpc3BsYWNlbWVudDsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisgICAgICAoKmZwdV9laXApKys7CisgICAgfQorICBlbHNlIGlmIChtb2QgPT0gMiB8fCBiYXNlID09IDUpIC8qIFRoZSBzZWNvbmQgY29uZGl0aW9uIGFsc28gaGFzIG1vZD09MCAqLworICAgIHsKKyAgICAgIC8qIDMyIGJpdCBkaXNwbGFjZW1lbnQgKi8KKyAgICAgIGxvbmcgZGlzcGxhY2VtZW50OworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgICAgICBGUFVfY29kZV9hY2Nlc3Nfb2soNCk7CisgICAgICBGUFVfZ2V0X3VzZXIoZGlzcGxhY2VtZW50LCAobG9uZyBfX3VzZXIgKikgKCpmcHVfZWlwKSk7CisgICAgICBvZmZzZXQgKz0gZGlzcGxhY2VtZW50OworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgICAgICgqZnB1X2VpcCkgKz0gNDsKKyAgICB9CisKKyAgcmV0dXJuIG9mZnNldDsKK30KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2bTg2X3NlZ21lbnQodV9jaGFyIHNlZ21lbnQsCisJCQkJICBzdHJ1Y3QgYWRkcmVzcyAqYWRkcikKK3sKKyAgc2VnbWVudC0tOworI2lmZGVmIFBBUkFOT0lECisgIGlmICggc2VnbWVudCA+IFBSRUZJWF9TU18gKQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDEzMCk7CisgICAgICBtYXRoX2Fib3J0KEZQVV9pbmZvLFNJR1NFR1YpOworICAgIH0KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworICBhZGRyLT5zZWxlY3RvciA9IFZNODZfUkVHXyhzZWdtZW50KTsKKyAgcmV0dXJuICh1bnNpZ25lZCBsb25nKVZNODZfUkVHXyhzZWdtZW50KSA8PCA0OworfQorCisKKy8qIFRoaXMgc2hvdWxkIHdvcmsgZm9yIDE2IGFuZCAzMiBiaXQgcHJvdGVjdGVkIG1vZGUuICovCitzdGF0aWMgbG9uZyBwbV9hZGRyZXNzKHVfY2hhciBGUFVfbW9kcm0sIHVfY2hhciBzZWdtZW50LAorCQkgICAgICAgc3RydWN0IGFkZHJlc3MgKmFkZHIsIGxvbmcgb2Zmc2V0KQoreyAKKyAgc3RydWN0IGRlc2Nfc3RydWN0IGRlc2NyaXB0b3I7CisgIHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyZXNzLCBsaW1pdCwgYWRkcmVzcywgc2VnX3RvcDsKKyAgdW5zaWduZWQgc2hvcnQgc2VsZWN0b3I7CisKKyAgc2VnbWVudC0tOworCisjaWZkZWYgUEFSQU5PSUQKKyAgLyogc2VnbWVudCBpcyB1bnNpZ25lZCwgc28gdGhpcyBhbHNvIGRldGVjdHMgaWYgc2VnbWVudCB3YXMgMDogKi8KKyAgaWYgKCBzZWdtZW50ID4gUFJFRklYX1NTXyApCisgICAgeworICAgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTMyKTsKKyAgICAgIG1hdGhfYWJvcnQoRlBVX2luZm8sU0lHU0VHVik7CisgICAgfQorI2VuZGlmIC8qIFBBUkFOT0lEICovCisKKyAgc3dpdGNoICggc2VnbWVudCApCisgICAgeworICAgICAgLyogZnMgYW5kIGdzIGFyZW4ndCB1c2VkIGJ5IHRoZSBrZXJuZWwsIHNvIHRoZXkgc3RpbGwgaGF2ZSB0aGVpcgorCSB1c2VyLXNwYWNlIHZhbHVlcy4gKi8KKyAgICBjYXNlIFBSRUZJWF9GU18tMToKKyAgICAgIC8qIFRoZSBjYXN0IGlzIG5lZWRlZCBoZXJlIHRvIGdldCBnY2MgMi44LjAgdG8gdXNlIGEgMTYgYml0IHJlZ2lzdGVyCisJIGluIHRoZSBhc3NlbWJsZXIgc3RhdGVtZW50LiAqLworCisgICAgICBfX2FzbV9fKCJtb3YgJSVmcywlMCI6Ij1yIiAoc2VsZWN0b3IpKTsKKyAgICAgIGFkZHItPnNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBSRUZJWF9HU18tMToKKyAgICAgIC8qIFRoZSBjYXN0IGlzIG5lZWRlZCBoZXJlIHRvIGdldCBnY2MgMi44LjAgdG8gdXNlIGEgMTYgYml0IHJlZ2lzdGVyCisJIGluIHRoZSBhc3NlbWJsZXIgc3RhdGVtZW50LiAqLworICAgICAgX19hc21fXygibW92ICUlZ3MsJTAiOiI9ciIgKHNlbGVjdG9yKSk7CisgICAgICBhZGRyLT5zZWxlY3RvciA9IHNlbGVjdG9yOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFkZHItPnNlbGVjdG9yID0gUE1fUkVHXyhzZWdtZW50KTsKKyAgICB9CisKKyAgZGVzY3JpcHRvciA9IExEVF9ERVNDUklQVE9SKFBNX1JFR18oc2VnbWVudCkpOworICBiYXNlX2FkZHJlc3MgPSBTRUdfQkFTRV9BRERSKGRlc2NyaXB0b3IpOworICBhZGRyZXNzID0gYmFzZV9hZGRyZXNzICsgb2Zmc2V0OworICBsaW1pdCA9IGJhc2VfYWRkcmVzcworCSsgKFNFR19MSU1JVChkZXNjcmlwdG9yKSsxKSAqIFNFR19HUkFOVUxBUklUWShkZXNjcmlwdG9yKSAtIDE7CisgIGlmICggbGltaXQgPCBiYXNlX2FkZHJlc3MgKSBsaW1pdCA9IDB4ZmZmZmZmZmY7CisKKyAgaWYgKCBTRUdfRVhQQU5EX0RPV04oZGVzY3JpcHRvcikgKQorICAgIHsKKyAgICAgIGlmICggU0VHX0dfQklUKGRlc2NyaXB0b3IpICkKKwlzZWdfdG9wID0gMHhmZmZmZmZmZjsKKyAgICAgIGVsc2UKKwl7CisJICBzZWdfdG9wID0gYmFzZV9hZGRyZXNzICsgKDEgPDwgMjApOworCSAgaWYgKCBzZWdfdG9wIDwgYmFzZV9hZGRyZXNzICkgc2VnX3RvcCA9IDB4ZmZmZmZmZmY7CisJfQorICAgICAgYWNjZXNzX2xpbWl0ID0KKwkoYWRkcmVzcyA8PSBsaW1pdCkgfHwgKGFkZHJlc3MgPj0gc2VnX3RvcCkgPyAwIDoKKwkgICgoc2VnX3RvcC1hZGRyZXNzKSA+PSAyNTUgPyAyNTUgOiBzZWdfdG9wLWFkZHJlc3MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFjY2Vzc19saW1pdCA9CisJKGFkZHJlc3MgPiBsaW1pdCkgfHwgKGFkZHJlc3MgPCBiYXNlX2FkZHJlc3MpID8gMCA6CisJICAoKGxpbWl0LWFkZHJlc3MpID49IDI1NCA/IDI1NSA6IGxpbWl0LWFkZHJlc3MrMSk7CisgICAgfQorICBpZiAoIFNFR19FWEVDVVRFX09OTFkoZGVzY3JpcHRvcikgfHwKKyAgICAgICghU0VHX1dSSVRFX1BFUk0oZGVzY3JpcHRvcikgJiYgKEZQVV9tb2RybSAmIEZQVV9XUklURV9CSVQpKSApCisgICAgeworICAgICAgYWNjZXNzX2xpbWl0ID0gMDsKKyAgICB9CisgIHJldHVybiBhZGRyZXNzOworfQorCisKKy8qCisgICAgICAgTU9EIFIvTSBieXRlOiAgTU9EID09IDMgaGFzIGEgc3BlY2lhbCB1c2UgZm9yIHRoZSBGUFUKKyAgICAgICAgICAgICAgICAgICAgICBTSUIgYnl0ZSB1c2VkIGlmZiBSL00gPSAxMDBiCisKKyAgICAgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMAorICAgICAgIC4uLi4uICAgLi4uLi4uLi4uICAgLi4uLi4uLi4uCisgICAgICAgIE1PRCAgICBPUENPREUoMikgICAgIFIvTQorCisKKyAgICAgICBTSUIgYnl0ZQorCisgICAgICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKKyAgICAgICAuLi4uLiAgIC4uLi4uLi4uLiAgIC4uLi4uLi4uLgorICAgICAgICBTUyAgICAgIElOREVYICAgICAgICBCQVNFCisKKyovCisKK3ZvaWQgX191c2VyICpGUFVfZ2V0X2FkZHJlc3ModV9jaGFyIEZQVV9tb2RybSwgdW5zaWduZWQgbG9uZyAqZnB1X2VpcCwKKwkJICBzdHJ1Y3QgYWRkcmVzcyAqYWRkciwKKwkJICBmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzKQoreworICB1X2NoYXIgbW9kOworICB1bnNpZ25lZCBybSA9IEZQVV9tb2RybSAmIDc7CisgIGxvbmcgKmNwdV9yZWdfcHRyOworICBpbnQgYWRkcmVzcyA9IDA7ICAgICAvKiBJbml0aWFsaXplZCBqdXN0IHRvIHN0b3AgY29tcGlsZXIgd2FybmluZ3MuICovCisKKyAgLyogTWVtb3J5IGFjY2Vzc2VkIHZpYSB0aGUgY3Mgc2VsZWN0b3IgaXMgd3JpdGUgcHJvdGVjdGVkCisgICAgIGluIGBub24tc2VnbWVudGVkJyAzMiBiaXQgcHJvdGVjdGVkIG1vZGUuICovCisgIGlmICggIWFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlICYmIChGUFVfbW9kcm0gJiBGUFVfV1JJVEVfQklUKQorICAgICAgJiYgKGFkZHJfbW9kZXMub3ZlcnJpZGUuc2VnbWVudCA9PSBQUkVGSVhfQ1NfKSApCisgICAgeworICAgICAgbWF0aF9hYm9ydChGUFVfaW5mbyxTSUdTRUdWKTsKKyAgICB9CisKKyAgYWRkci0+c2VsZWN0b3IgPSBGUFVfRFM7ICAgLyogRGVmYXVsdCwgZm9yIDMyIGJpdCBub24tc2VnbWVudGVkIG1vZGUuICovCisKKyAgbW9kID0gKEZQVV9tb2RybSA+PiA2KSAmIDM7CisKKyAgaWYgKHJtID09IDQgJiYgbW9kICE9IDMpCisgICAgeworICAgICAgYWRkcmVzcyA9IHNpYihtb2QsIGZwdV9laXApOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGNwdV9yZWdfcHRyID0gJiBSRUdfKHJtKTsKKyAgICAgIHN3aXRjaCAobW9kKQorCXsKKwljYXNlIDA6CisJICBpZiAocm0gPT0gNSkKKwkgICAgeworCSAgICAgIC8qIFNwZWNpYWwgY2FzZTogZGlzcDMyICovCisJICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisJICAgICAgRlBVX2NvZGVfYWNjZXNzX29rKDQpOworCSAgICAgIEZQVV9nZXRfdXNlcihhZGRyZXNzLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgKCpmcHVfZWlwKSk7CisJICAgICAgKCpmcHVfZWlwKSArPSA0OworCSAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisJICAgICAgYWRkci0+b2Zmc2V0ID0gYWRkcmVzczsKKwkgICAgICByZXR1cm4gKHZvaWQgX191c2VyICopIGFkZHJlc3M7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFkZHJlc3MgPSAqY3B1X3JlZ19wdHI7ICAvKiBKdXN0IHJldHVybiB0aGUgY29udGVudHMKKwkJCQkJICBvZiB0aGUgY3B1IHJlZ2lzdGVyICovCisJICAgICAgYWRkci0+b2Zmc2V0ID0gYWRkcmVzczsKKwkgICAgICByZXR1cm4gKHZvaWQgX191c2VyICopIGFkZHJlc3M7CisJICAgIH0KKwljYXNlIDE6CisJICAvKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50ICovCisJICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKwkgIEZQVV9jb2RlX2FjY2Vzc19vaygxKTsKKwkgIEZQVV9nZXRfdXNlcihhZGRyZXNzLCAoc2lnbmVkIGNoYXIgX191c2VyICopICgqZnB1X2VpcCkpOworCSAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKwkgICgqZnB1X2VpcCkrKzsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIC8qIDMyIGJpdCBkaXNwbGFjZW1lbnQgKi8KKwkgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworCSAgRlBVX2NvZGVfYWNjZXNzX29rKDQpOworCSAgRlBVX2dldF91c2VyKGFkZHJlc3MsIChsb25nIF9fdXNlciAqKSAoKmZwdV9laXApKTsKKwkgICgqZnB1X2VpcCkgKz0gNDsKKwkgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisJICBicmVhazsKKwljYXNlIDM6CisJICAvKiBOb3QgbGVnYWwgZm9yIHRoZSBGUFUgKi8KKwkgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKwl9CisgICAgICBhZGRyZXNzICs9ICpjcHVfcmVnX3B0cjsKKyAgICB9CisKKyAgYWRkci0+b2Zmc2V0ID0gYWRkcmVzczsKKworICBzd2l0Y2ggKCBhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSApCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVk04NjoKKyAgICAgIGFkZHJlc3MgKz0gdm04Nl9zZWdtZW50KGFkZHJfbW9kZXMub3ZlcnJpZGUuc2VnbWVudCwgYWRkcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBNMTY6CisgICAgY2FzZSBTRUczMjoKKyAgICAgIGFkZHJlc3MgPSBwbV9hZGRyZXNzKEZQVV9tb2RybSwgYWRkcl9tb2Rlcy5vdmVycmlkZS5zZWdtZW50LAorCQkJICAgYWRkciwgYWRkcmVzcyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTMzKTsKKyAgICB9CisKKyAgcmV0dXJuICh2b2lkIF9fdXNlciAqKWFkZHJlc3M7Cit9CisKKwordm9pZCBfX3VzZXIgKkZQVV9nZXRfYWRkcmVzc18xNih1X2NoYXIgRlBVX21vZHJtLCB1bnNpZ25lZCBsb25nICpmcHVfZWlwLAorCQkgICAgIHN0cnVjdCBhZGRyZXNzICphZGRyLAorCQkgICAgIGZwdV9hZGRyX21vZGVzIGFkZHJfbW9kZXMpCit7CisgIHVfY2hhciBtb2Q7CisgIHVuc2lnbmVkIHJtID0gRlBVX21vZHJtICYgNzsKKyAgaW50IGFkZHJlc3MgPSAwOyAgICAgLyogRGVmYXVsdCB1c2VkIGZvciBtb2QgPT0gMCAqLworCisgIC8qIE1lbW9yeSBhY2Nlc3NlZCB2aWEgdGhlIGNzIHNlbGVjdG9yIGlzIHdyaXRlIHByb3RlY3RlZAorICAgICBpbiBgbm9uLXNlZ21lbnRlZCcgMzIgYml0IHByb3RlY3RlZCBtb2RlLiAqLworICBpZiAoICFhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSAmJiAoRlBVX21vZHJtICYgRlBVX1dSSVRFX0JJVCkKKyAgICAgICYmIChhZGRyX21vZGVzLm92ZXJyaWRlLnNlZ21lbnQgPT0gUFJFRklYX0NTXykgKQorICAgIHsKKyAgICAgIG1hdGhfYWJvcnQoRlBVX2luZm8sU0lHU0VHVik7CisgICAgfQorCisgIGFkZHItPnNlbGVjdG9yID0gRlBVX0RTOyAgIC8qIERlZmF1bHQsIGZvciAzMiBiaXQgbm9uLXNlZ21lbnRlZCBtb2RlLiAqLworCisgIG1vZCA9IChGUFVfbW9kcm0gPj4gNikgJiAzOworCisgIHN3aXRjaCAobW9kKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBpZiAocm0gPT0gNikKKwl7CisJICAvKiBTcGVjaWFsIGNhc2U6IGRpc3AxNiAqLworCSAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisJICBGUFVfY29kZV9hY2Nlc3Nfb2soMik7CisJICBGUFVfZ2V0X3VzZXIoYWRkcmVzcywgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoKmZwdV9laXApKTsKKwkgICgqZnB1X2VpcCkgKz0gMjsKKwkgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisJICBnb3RvIGFkZF9zZWdtZW50OworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIC8qIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQgKi8KKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2NvZGVfYWNjZXNzX29rKDEpOworICAgICAgRlBVX2dldF91c2VyKGFkZHJlc3MsIChzaWduZWQgY2hhciBfX3VzZXIgKikgKCpmcHVfZWlwKSk7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09OOworICAgICAgKCpmcHVfZWlwKSsrOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgLyogMTYgYml0IGRpc3BsYWNlbWVudCAqLworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgICAgICBGUFVfY29kZV9hY2Nlc3Nfb2soMik7CisgICAgICBGUFVfZ2V0X3VzZXIoYWRkcmVzcywgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoKmZwdV9laXApKTsKKyAgICAgICgqZnB1X2VpcCkgKz0gMjsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAvKiBOb3QgbGVnYWwgZm9yIHRoZSBGUFUgKi8KKyAgICAgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgc3dpdGNoICggcm0gKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBhZGRyZXNzICs9IEZQVV9pbmZvLT5fX19lYnggKyBGUFVfaW5mby0+X19fZXNpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgYWRkcmVzcyArPSBGUFVfaW5mby0+X19fZWJ4ICsgRlBVX2luZm8tPl9fX2VkaTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGFkZHJlc3MgKz0gRlBVX2luZm8tPl9fX2VicCArIEZQVV9pbmZvLT5fX19lc2k7CisgICAgICBpZiAoIGFkZHJfbW9kZXMub3ZlcnJpZGUuc2VnbWVudCA9PSBQUkVGSVhfREVGQVVMVCApCisJYWRkcl9tb2Rlcy5vdmVycmlkZS5zZWdtZW50ID0gUFJFRklYX1NTXzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIGFkZHJlc3MgKz0gRlBVX2luZm8tPl9fX2VicCArIEZQVV9pbmZvLT5fX19lZGk7CisgICAgICBpZiAoIGFkZHJfbW9kZXMub3ZlcnJpZGUuc2VnbWVudCA9PSBQUkVGSVhfREVGQVVMVCApCisJYWRkcl9tb2Rlcy5vdmVycmlkZS5zZWdtZW50ID0gUFJFRklYX1NTXzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGFkZHJlc3MgKz0gRlBVX2luZm8tPl9fX2VzaTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgIGFkZHJlc3MgKz0gRlBVX2luZm8tPl9fX2VkaTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIGFkZHJlc3MgKz0gRlBVX2luZm8tPl9fX2VicDsKKyAgICAgIGlmICggYWRkcl9tb2Rlcy5vdmVycmlkZS5zZWdtZW50ID09IFBSRUZJWF9ERUZBVUxUICkKKwlhZGRyX21vZGVzLm92ZXJyaWRlLnNlZ21lbnQgPSBQUkVGSVhfU1NfOworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgYWRkcmVzcyArPSBGUFVfaW5mby0+X19fZWJ4OworICAgICAgYnJlYWs7CisgICAgfQorCisgYWRkX3NlZ21lbnQ6CisgIGFkZHJlc3MgJj0gMHhmZmZmOworCisgIGFkZHItPm9mZnNldCA9IGFkZHJlc3M7CisKKyAgc3dpdGNoICggYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBicmVhazsKKyAgICBjYXNlIFZNODY6CisgICAgICBhZGRyZXNzICs9IHZtODZfc2VnbWVudChhZGRyX21vZGVzLm92ZXJyaWRlLnNlZ21lbnQsIGFkZHIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQTTE2OgorICAgIGNhc2UgU0VHMzI6CisgICAgICBhZGRyZXNzID0gcG1fYWRkcmVzcyhGUFVfbW9kcm0sIGFkZHJfbW9kZXMub3ZlcnJpZGUuc2VnbWVudCwKKwkJCSAgIGFkZHIsIGFkZHJlc3MpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDEzMSk7CisgICAgfQorCisgIHJldHVybiAodm9pZCBfX3VzZXIgKilhZGRyZXNzIDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9sb2FkX3N0b3JlLmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvbG9hZF9zdG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MzE0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvbG9hZF9zdG9yZS5jCkBAIC0wLDAgKzEsMjcwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBsb2FkX3N0b3JlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBUaGlzIGZpbGUgY29udGFpbnMgbW9zdCBvZiB0aGUgY29kZSB0byBpbnRlcnByZXQgdGhlIEZQVSBpbnN0cnVjdGlvbnMgICAgIHwKKyB8IHdoaWNoIGxvYWQgYW5kIHN0b3JlIGZyb20gdXNlciBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk0LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCAgIGJpbGxtQHN1YnVyYmlhLm5ldCAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8IE5vdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgVGhlIGZpbGUgY29udGFpbnMgY29kZSB3aGljaCBhY2Nlc3NlcyB1c2VyIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBFbXVsYXRvciBzdGF0aWMgZGF0YSBtYXkgY2hhbmdlIHdoZW4gdXNlciBtZW1vcnkgaXMgYWNjZXNzZWQsIGR1ZSB0byAgIHwKKyB8ICAgIG90aGVyIHByb2Nlc3NlcyB1c2luZyB0aGUgZW11bGF0b3Igd2hpbGUgc3dhcHBpbmcgaXMgaW4gcHJvZ3Jlc3MuICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjaW5jbHVkZSAic3RhdHVzX3cuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKworCisjZGVmaW5lIF9OT05FXyAwICAgLyogc3QwX3B0ciBldGMgbm90IG5lZWRlZCAqLworI2RlZmluZSBfUkVHMF8gMSAgIC8qIFdpbGwgYmUgc3RvcmluZyBzdCgwKSAqLworI2RlZmluZSBfUFVTSF8gMyAgIC8qIE5lZWQgdG8gY2hlY2sgZm9yIHNwYWNlIHRvIHB1c2ggb250byBzdGFjayAqLworI2RlZmluZSBfbnVsbF8gNCAgIC8qIEZ1bmN0aW9uIGlsbGVnYWwgb3Igbm90IGltcGxlbWVudGVkICovCisKKyNkZWZpbmUgcG9wXzAoKQl7IEZQVV9zZXR0YWcwKFRBR19FbXB0eSk7IHRvcCsrOyB9CisKKworc3RhdGljIHVfY2hhciBjb25zdCB0eXBlX3RhYmxlWzMyXSA9IHsKKyAgX1BVU0hfLCBfUFVTSF8sIF9QVVNIXywgX1BVU0hfLAorICBfbnVsbF8sIF9udWxsXywgX251bGxfLCBfbnVsbF8sCisgIF9SRUcwXywgX1JFRzBfLCBfUkVHMF8sIF9SRUcwXywKKyAgX1JFRzBfLCBfUkVHMF8sIF9SRUcwXywgX1JFRzBfLAorICBfTk9ORV8sIF9udWxsXywgX05PTkVfLCBfUFVTSF8sCisgIF9OT05FXywgX1BVU0hfLCBfbnVsbF8sIF9QVVNIXywKKyAgX05PTkVfLCBfbnVsbF8sIF9OT05FXywgX1JFRzBfLAorICBfTk9ORV8sIF9SRUcwXywgX05PTkVfLCBfUkVHMF8KKyAgfTsKKwordV9jaGFyIGNvbnN0IGRhdGFfc2l6ZXNfMTZbMzJdID0geworICA0LCAgNCwgIDgsICAyLCAgMCwgIDAsICAwLCAgMCwKKyAgNCwgIDQsICA4LCAgMiwgIDQsICA0LCAgOCwgIDIsCisgIDE0LCAwLCA5NCwgMTAsICAyLCAxMCwgIDAsICA4LCAgCisgIDE0LCAwLCA5NCwgMTAsICAyLCAxMCwgIDIsICA4Cit9OworCitzdGF0aWMgdV9jaGFyIGNvbnN0IGRhdGFfc2l6ZXNfMzJbMzJdID0geworICA0LCAgNCwgIDgsICAyLCAgMCwgIDAsICAwLCAgMCwKKyAgNCwgIDQsICA4LCAgMiwgIDQsICA0LCAgOCwgIDIsCisgIDI4LCAwLDEwOCwgMTAsICAyLCAxMCwgIDAsICA4LCAgCisgIDI4LCAwLDEwOCwgMTAsICAyLCAxMCwgIDIsICA4Cit9OworCitpbnQgRlBVX2xvYWRfc3RvcmUodV9jaGFyIHR5cGUsIGZwdV9hZGRyX21vZGVzIGFkZHJfbW9kZXMsCisJCSAgICAgdm9pZCBfX3VzZXIgKmRhdGFfYWRkcmVzcykKK3sKKyAgRlBVX1JFRyBsb2FkZWRfZGF0YTsKKyAgRlBVX1JFRyAqc3QwX3B0cjsKKyAgdV9jaGFyIHN0MF90YWcgPSBUQUdfRW1wdHk7ICAvKiBUaGlzIGlzIGp1c3QgdG8gc3RvcCBhIGdjYyB3YXJuaW5nLiAqLworICB1X2NoYXIgbG9hZGVkX3RhZzsKKworICBzdDBfcHRyID0gTlVMTDsgICAgLyogSW5pdGlhbGl6ZWQganVzdCB0byBzdG9wIGNvbXBpbGVyIHdhcm5pbmdzLiAqLworCisgIGlmICggYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgJiBQUk9URUNURUQgKQorICAgIHsKKyAgICAgIGlmICggYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgPT0gU0VHMzIgKQorCXsKKwkgIGlmICggYWNjZXNzX2xpbWl0IDwgZGF0YV9zaXplc18zMlt0eXBlXSApCisJICAgIG1hdGhfYWJvcnQoRlBVX2luZm8sU0lHU0VHVik7CisJfQorICAgICAgZWxzZSBpZiAoIGFkZHJfbW9kZXMuZGVmYXVsdF9tb2RlID09IFBNMTYgKQorCXsKKwkgIGlmICggYWNjZXNzX2xpbWl0IDwgZGF0YV9zaXplc18xNlt0eXBlXSApCisJICAgIG1hdGhfYWJvcnQoRlBVX2luZm8sU0lHU0VHVik7CisJfQorI2lmZGVmIFBBUkFOT0lECisgICAgICBlbHNlCisJRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTQwKTsKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworICAgIH0KKworICBzd2l0Y2ggKCB0eXBlX3RhYmxlW3R5cGVdICkKKyAgICB7CisgICAgY2FzZSBfTk9ORV86CisgICAgICBicmVhazsKKyAgICBjYXNlIF9SRUcwXzoKKyAgICAgIHN0MF9wdHIgPSAmc3QoMCk7ICAgICAgIC8qIFNvbWUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIHBvcCBhZnRlcgorCQkJCSBzdG9yaW5nICovCisgICAgICBzdDBfdGFnID0gRlBVX2dldHRhZzAoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgX1BVU0hfOgorICAgICAgeworCWlmICggRlBVX2dldHRhZ2koLTEpICE9IFRBR19FbXB0eSApCisJICB7IEZQVV9zdGFja19vdmVyZmxvdygpOyByZXR1cm4gMDsgfQorCXRvcC0tOworCXN0MF9wdHIgPSAmc3QoMCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIF9udWxsXzoKKyAgICAgIEZQVV9pbGxlZ2FsKCk7CisgICAgICByZXR1cm4gMDsKKyNpZmRlZiBQQVJBTk9JRAorICAgIGRlZmF1bHQ6CisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxNDEpOworICAgICAgcmV0dXJuIDA7CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKyAgICB9CisKKyAgc3dpdGNoICggdHlwZSApCisgICAgeworICAgIGNhc2UgMDAwOiAgICAgICAvKiBmbGQgbTMycmVhbCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIGxvYWRlZF90YWcgPSBGUFVfbG9hZF9zaW5nbGUoKGZsb2F0IF9fdXNlciAqKWRhdGFfYWRkcmVzcywgJmxvYWRlZF9kYXRhKTsKKyAgICAgIGlmICggKGxvYWRlZF90YWcgPT0gVEFHX1NwZWNpYWwpCisJICAgJiYgaXNOYU4oJmxvYWRlZF9kYXRhKQorCSAgICYmIChyZWFsXzFvcF9OYU4oJmxvYWRlZF9kYXRhKSA8IDApICkKKwl7CisJICB0b3ArKzsKKwkgIGJyZWFrOworCX0KKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJmxvYWRlZF9kYXRhLCBsb2FkZWRfdGFnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDAxOiAgICAgIC8qIGZpbGQgbTMyaW50ICovCisgICAgICBjbGVhcl9DMSgpOworICAgICAgbG9hZGVkX3RhZyA9IEZQVV9sb2FkX2ludDMyKChsb25nIF9fdXNlciAqKWRhdGFfYWRkcmVzcywgJmxvYWRlZF9kYXRhKTsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJmxvYWRlZF9kYXRhLCBsb2FkZWRfdGFnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDAyOiAgICAgIC8qIGZsZCBtNjRyZWFsICovCisgICAgICBjbGVhcl9DMSgpOworICAgICAgbG9hZGVkX3RhZyA9IEZQVV9sb2FkX2RvdWJsZSgoZG91YmxlIF9fdXNlciAqKWRhdGFfYWRkcmVzcywgJmxvYWRlZF9kYXRhKTsKKyAgICAgIGlmICggKGxvYWRlZF90YWcgPT0gVEFHX1NwZWNpYWwpCisJICAgJiYgaXNOYU4oJmxvYWRlZF9kYXRhKQorCSAgICYmIChyZWFsXzFvcF9OYU4oJmxvYWRlZF9kYXRhKSA8IDApICkKKwl7CisJICB0b3ArKzsKKwkgIGJyZWFrOworCX0KKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJmxvYWRlZF9kYXRhLCBsb2FkZWRfdGFnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDAzOiAgICAgIC8qIGZpbGQgbTE2aW50ICovCisgICAgICBjbGVhcl9DMSgpOworICAgICAgbG9hZGVkX3RhZyA9IEZQVV9sb2FkX2ludDE2KChzaG9ydCBfX3VzZXIgKilkYXRhX2FkZHJlc3MsICZsb2FkZWRfZGF0YSk7CisgICAgICBGUFVfY29weV90b19yZWcwKCZsb2FkZWRfZGF0YSwgbG9hZGVkX3RhZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDAxMDogICAgICAvKiBmc3QgbTMycmVhbCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIEZQVV9zdG9yZV9zaW5nbGUoc3QwX3B0ciwgc3QwX3RhZywgKGZsb2F0IF9fdXNlciAqKWRhdGFfYWRkcmVzcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDAxMTogICAgICAvKiBmaXN0IG0zMmludCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIEZQVV9zdG9yZV9pbnQzMihzdDBfcHRyLCBzdDBfdGFnLCAobG9uZyBfX3VzZXIgKilkYXRhX2FkZHJlc3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAwMTI6ICAgICAvKiBmc3QgbTY0cmVhbCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIEZQVV9zdG9yZV9kb3VibGUoc3QwX3B0ciwgc3QwX3RhZywgKGRvdWJsZSBfX3VzZXIgKilkYXRhX2FkZHJlc3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAwMTM6ICAgICAvKiBmaXN0IG0xNmludCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIEZQVV9zdG9yZV9pbnQxNihzdDBfcHRyLCBzdDBfdGFnLCAoc2hvcnQgX191c2VyICopZGF0YV9hZGRyZXNzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDE0OiAgICAgLyogZnN0cCBtMzJyZWFsICovCisgICAgICBjbGVhcl9DMSgpOworICAgICAgaWYgKCBGUFVfc3RvcmVfc2luZ2xlKHN0MF9wdHIsIHN0MF90YWcsIChmbG9hdCBfX3VzZXIgKilkYXRhX2FkZHJlc3MpICkKKwlwb3BfMCgpOyAgLyogcG9wIG9ubHkgaWYgdGhlIG51bWJlciB3YXMgYWN0dWFsbHkgc3RvcmVkCisJCSAgICAgKHNlZSB0aGUgODA0ODYgbWFudWFsIHAxNi0yOCkgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDE1OiAgICAgLyogZmlzdHAgbTMyaW50ICovCisgICAgICBjbGVhcl9DMSgpOworICAgICAgaWYgKCBGUFVfc3RvcmVfaW50MzIoc3QwX3B0ciwgc3QwX3RhZywgKGxvbmcgX191c2VyICopZGF0YV9hZGRyZXNzKSApCisJcG9wXzAoKTsgIC8qIHBvcCBvbmx5IGlmIHRoZSBudW1iZXIgd2FzIGFjdHVhbGx5IHN0b3JlZAorCQkgICAgIChzZWUgdGhlIDgwNDg2IG1hbnVhbCBwMTYtMjgpICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDAxNjogICAgIC8qIGZzdHAgbTY0cmVhbCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIGlmICggRlBVX3N0b3JlX2RvdWJsZShzdDBfcHRyLCBzdDBfdGFnLCAoZG91YmxlIF9fdXNlciAqKWRhdGFfYWRkcmVzcykgKQorCXBvcF8wKCk7ICAvKiBwb3Agb25seSBpZiB0aGUgbnVtYmVyIHdhcyBhY3R1YWxseSBzdG9yZWQKKwkJICAgICAoc2VlIHRoZSA4MDQ4NiBtYW51YWwgcDE2LTI4KSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAwMTc6ICAgICAvKiBmaXN0cCBtMTZpbnQgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBpZiAoIEZQVV9zdG9yZV9pbnQxNihzdDBfcHRyLCBzdDBfdGFnLCAoc2hvcnQgX191c2VyICopZGF0YV9hZGRyZXNzKSApCisJcG9wXzAoKTsgIC8qIHBvcCBvbmx5IGlmIHRoZSBudW1iZXIgd2FzIGFjdHVhbGx5IHN0b3JlZAorCQkgICAgIChzZWUgdGhlIDgwNDg2IG1hbnVhbCBwMTYtMjgpICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDAyMDogICAgIC8qIGZsZGVudiAgbTE0LzI4Ynl0ZSAqLworICAgICAgZmxkZW52KGFkZHJfbW9kZXMsICh1X2NoYXIgX191c2VyICopZGF0YV9hZGRyZXNzKTsKKyAgICAgIC8qIEVuc3VyZSB0aGF0IHRoZSB2YWx1ZXMganVzdCBsb2FkZWQgYXJlIG5vdCBjaGFuZ2VkIGJ5CisJIGZpeC11cCBvcGVyYXRpb25zLiAqLworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAwMjI6ICAgICAvKiBmcnN0b3IgbTk0LzEwOGJ5dGUgKi8KKyAgICAgIGZyc3RvcihhZGRyX21vZGVzLCAodV9jaGFyIF9fdXNlciAqKWRhdGFfYWRkcmVzcyk7CisgICAgICAvKiBFbnN1cmUgdGhhdCB0aGUgdmFsdWVzIGp1c3QgbG9hZGVkIGFyZSBub3QgY2hhbmdlZCBieQorCSBmaXgtdXAgb3BlcmF0aW9ucy4gKi8KKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgMDIzOiAgICAgLyogZmJsZCBtODBkZWMgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBsb2FkZWRfdGFnID0gRlBVX2xvYWRfYmNkKCh1X2NoYXIgX191c2VyICopZGF0YV9hZGRyZXNzKTsKKyAgICAgIEZQVV9zZXR0YWcwKGxvYWRlZF90YWcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAwMjQ6ICAgICAvKiBmbGRjdyAqLworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgICAgICBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELCBkYXRhX2FkZHJlc3MsIDIpOworICAgICAgRlBVX2dldF91c2VyKGNvbnRyb2xfd29yZCwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBkYXRhX2FkZHJlc3MpOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgICAgIGlmICggcGFydGlhbF9zdGF0dXMgJiB+Y29udHJvbF93b3JkICYgQ1dfRXhjZXB0aW9ucyApCisJcGFydGlhbF9zdGF0dXMgfD0gKFNXX1N1bW1hcnkgfCBTV19CYWNrd2FyZCk7CisgICAgICBlbHNlCisJcGFydGlhbF9zdGF0dXMgJj0gfihTV19TdW1tYXJ5IHwgU1dfQmFja3dhcmQpOworI2lmZGVmIFBFQ1VMSUFSXzQ4NgorICAgICAgY29udHJvbF93b3JkIHw9IDB4NDA7ICAvKiBBbiA4MDQ4NiBhcHBlYXJzIHRvIGFsd2F5cyBzZXQgdGhpcyBiaXQgKi8KKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgMDI1OiAgICAgIC8qIGZsZCBtODByZWFsICovCisgICAgICBjbGVhcl9DMSgpOworICAgICAgbG9hZGVkX3RhZyA9IEZQVV9sb2FkX2V4dGVuZGVkKChsb25nIGRvdWJsZSBfX3VzZXIgKilkYXRhX2FkZHJlc3MsIDApOworICAgICAgRlBVX3NldHRhZzAobG9hZGVkX3RhZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDAyNzogICAgICAvKiBmaWxkIG02NGludCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIGxvYWRlZF90YWcgPSBGUFVfbG9hZF9pbnQ2NCgobG9uZyBsb25nIF9fdXNlciAqKWRhdGFfYWRkcmVzcyk7CisgICAgICBGUFVfc2V0dGFnMChsb2FkZWRfdGFnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMDMwOiAgICAgLyogZnN0ZW52ICBtMTQvMjhieXRlICovCisgICAgICBmc3RlbnYoYWRkcl9tb2RlcywgKHVfY2hhciBfX3VzZXIgKilkYXRhX2FkZHJlc3MpOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAwMzI6ICAgICAgLyogZnNhdmUgKi8KKyAgICAgIGZzYXZlKGFkZHJfbW9kZXMsICh1X2NoYXIgX191c2VyICopZGF0YV9hZGRyZXNzKTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgMDMzOiAgICAgIC8qIGZic3RwIG04MGRlYyAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIGlmICggRlBVX3N0b3JlX2JjZChzdDBfcHRyLCBzdDBfdGFnLCAodV9jaGFyIF9fdXNlciAqKWRhdGFfYWRkcmVzcykgKQorCXBvcF8wKCk7ICAvKiBwb3Agb25seSBpZiB0aGUgbnVtYmVyIHdhcyBhY3R1YWxseSBzdG9yZWQKKwkJICAgICAoc2VlIHRoZSA4MDQ4NiBtYW51YWwgcDE2LTI4KSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAwMzQ6ICAgICAgLyogZnN0Y3cgbTE2aW50ICovCisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgICAgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLGRhdGFfYWRkcmVzcywyKTsKKyAgICAgIEZQVV9wdXRfdXNlcihjb250cm9sX3dvcmQsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgZGF0YV9hZGRyZXNzKTsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIDAzNTogICAgICAvKiBmc3RwIG04MHJlYWwgKi8KKyAgICAgIGNsZWFyX0MxKCk7CisgICAgICBpZiAoIEZQVV9zdG9yZV9leHRlbmRlZChzdDBfcHRyLCBzdDBfdGFnLCAobG9uZyBkb3VibGUgX191c2VyICopZGF0YV9hZGRyZXNzKSApCisJcG9wXzAoKTsgIC8qIHBvcCBvbmx5IGlmIHRoZSBudW1iZXIgd2FzIGFjdHVhbGx5IHN0b3JlZAorCQkgICAgIChzZWUgdGhlIDgwNDg2IG1hbnVhbCBwMTYtMjgpICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDAzNjogICAgICAvKiBmc3RzdyBtMmJ5dGUgKi8KKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2FjY2Vzc19vayhWRVJJRllfV1JJVEUsZGF0YV9hZGRyZXNzLDIpOworICAgICAgRlBVX3B1dF91c2VyKHN0YXR1c193b3JkKCksKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBkYXRhX2FkZHJlc3MpOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgMDM3OiAgICAgIC8qIGZpc3RwIG02NGludCAqLworICAgICAgY2xlYXJfQzEoKTsKKyAgICAgIGlmICggRlBVX3N0b3JlX2ludDY0KHN0MF9wdHIsIHN0MF90YWcsIChsb25nIGxvbmcgX191c2VyICopZGF0YV9hZGRyZXNzKSApCisJcG9wXzAoKTsgIC8qIHBvcCBvbmx5IGlmIHRoZSBudW1iZXIgd2FzIGFjdHVhbGx5IHN0b3JlZAorCQkgICAgIChzZWUgdGhlIDgwNDg2IG1hbnVhbCBwMTYtMjgpICovCisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L211bF9Yc2lnLlMgYi9hcmNoL2kzODYvbWF0aC1lbXUvbXVsX1hzaWcuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc3ODVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L211bF9Yc2lnLlMKQEAgLTAsMCArMSwxNzYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIG11bF9Yc2lnLlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IE11bHRpcGx5IGEgMTIgYnl0ZSBmaXhlZCBwb2ludCBudW1iZXIgYnkgYW5vdGhlciBmaXhlZCBwb2ludCBudW1iZXIuICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5NCwxOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCBiaWxsbUBqYWNvYmkubWF0aHMubW9uYXNoLmVkdS5hdSB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENhbGwgZnJvbSBDIGFzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICB2b2lkIG11bDMyX1hzaWcoWHNpZyAqeCwgdW5zaWduZWQgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgdm9pZCBtdWw2NF9Yc2lnKFhzaWcgKngsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYikgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIHZvaWQgbXVsX1hzaWdfWHNpZyhYc2lnICp4LCB1bnNpZ25lZCAqYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgVGhlIHJlc3VsdCBpcyBuZWl0aGVyIHJvdW5kZWQgbm9yIG5vcm1hbGl6ZWQsIGFuZCB0aGUgbHMgYml0IG9yIHNvIG1heSAgICB8CisgfCBiZSB3cm9uZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS5maWxlCSJtdWxfWHNpZy5TIgorCisKKyNpbmNsdWRlICJmcHVfZW11LmgiCisKKy50ZXh0CitFTlRSWShtdWwzMl9Yc2lnKQorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXN1YmwgJDE2LCVlc3AKKwlwdXNobCAlZXNpCisKKwltb3ZsIFBBUkFNMSwlZXNpCisJbW92bCBQQVJBTTIsJWVjeAorCisJeG9yICVlYXgsJWVheAorCW1vdmwgJWVheCwtNCglZWJwKQorCW1vdmwgJWVheCwtOCglZWJwKQorCisJbW92bCAoJWVzaSksJWVheCAgICAgICAgLyogbHNsIG9mIFhzaWcgKi8KKwltdWxsICVlY3gJCS8qIG1zbCBvZiBiICovCisJbW92bCAlZWR4LC0xMiglZWJwKQorCisJbW92bCA0KCVlc2kpLCVlYXgJLyogbWlkbCBvZiBYc2lnICovCisJbXVsbCAlZWN4CQkvKiBtc2wgb2YgYiAqLworCWFkZGwgJWVheCwtMTIoJWVicCkKKwlhZGNsICVlZHgsLTgoJWVicCkKKwlhZGNsICQwLC00KCVlYnApCisKKwltb3ZsIDgoJWVzaSksJWVheAkvKiBtc2wgb2YgWHNpZyAqLworCW11bGwgJWVjeAkJLyogbXNsIG9mIGIgKi8KKwlhZGRsICVlYXgsLTgoJWVicCkKKwlhZGNsICVlZHgsLTQoJWVicCkKKworCW1vdmwgLTEyKCVlYnApLCVlYXgKKwltb3ZsICVlYXgsKCVlc2kpCisJbW92bCAtOCglZWJwKSwlZWF4CisJbW92bCAlZWF4LDQoJWVzaSkKKwltb3ZsIC00KCVlYnApLCVlYXgKKwltb3ZsICVlYXgsOCglZXNpKQorCisJcG9wbCAlZXNpCisJbGVhdmUKKwlyZXQKKworCitFTlRSWShtdWw2NF9Yc2lnKQorCXB1c2hsICVlYnAKKwltb3ZsICVlc3AsJWVicAorCXN1YmwgJDE2LCVlc3AKKwlwdXNobCAlZXNpCisKKwltb3ZsIFBBUkFNMSwlZXNpCisJbW92bCBQQVJBTTIsJWVjeAorCisJeG9yICVlYXgsJWVheAorCW1vdmwgJWVheCwtNCglZWJwKQorCW1vdmwgJWVheCwtOCglZWJwKQorCisJbW92bCAoJWVzaSksJWVheCAgICAgICAgLyogbHNsIG9mIFhzaWcgKi8KKwltdWxsIDQoJWVjeCkJCS8qIG1zbCBvZiBiICovCisJbW92bCAlZWR4LC0xMiglZWJwKQorCisJbW92bCA0KCVlc2kpLCVlYXgJLyogbWlkbCBvZiBYc2lnICovCisJbXVsbCAoJWVjeCkJCS8qIGxzbCBvZiBiICovCisJYWRkbCAlZWR4LC0xMiglZWJwKQorCWFkY2wgJDAsLTgoJWVicCkKKwlhZGNsICQwLC00KCVlYnApCisKKwltb3ZsIDQoJWVzaSksJWVheAkvKiBtaWRsIG9mIFhzaWcgKi8KKwltdWxsIDQoJWVjeCkJCS8qIG1zbCBvZiBiICovCisJYWRkbCAlZWF4LC0xMiglZWJwKQorCWFkY2wgJWVkeCwtOCglZWJwKQorCWFkY2wgJDAsLTQoJWVicCkKKworCW1vdmwgOCglZXNpKSwlZWF4CS8qIG1zbCBvZiBYc2lnICovCisJbXVsbCAoJWVjeCkJCS8qIGxzbCBvZiBiICovCisJYWRkbCAlZWF4LC0xMiglZWJwKQorCWFkY2wgJWVkeCwtOCglZWJwKQorCWFkY2wgJDAsLTQoJWVicCkKKworCW1vdmwgOCglZXNpKSwlZWF4CS8qIG1zbCBvZiBYc2lnICovCisJbXVsbCA0KCVlY3gpCQkvKiBtc2wgb2YgYiAqLworCWFkZGwgJWVheCwtOCglZWJwKQorCWFkY2wgJWVkeCwtNCglZWJwKQorCisJbW92bCAtMTIoJWVicCksJWVheAorCW1vdmwgJWVheCwoJWVzaSkKKwltb3ZsIC04KCVlYnApLCVlYXgKKwltb3ZsICVlYXgsNCglZXNpKQorCW1vdmwgLTQoJWVicCksJWVheAorCW1vdmwgJWVheCw4KCVlc2kpCisKKwlwb3BsICVlc2kKKwlsZWF2ZQorCXJldAorCisKKworRU5UUlkobXVsX1hzaWdfWHNpZykKKwlwdXNobCAlZWJwCisJbW92bCAlZXNwLCVlYnAKKwlzdWJsICQxNiwlZXNwCisJcHVzaGwgJWVzaQorCisJbW92bCBQQVJBTTEsJWVzaQorCW1vdmwgUEFSQU0yLCVlY3gKKworCXhvciAlZWF4LCVlYXgKKwltb3ZsICVlYXgsLTQoJWVicCkKKwltb3ZsICVlYXgsLTgoJWVicCkKKworCW1vdmwgKCVlc2kpLCVlYXggICAgICAgIC8qIGxzbCBvZiBYc2lnICovCisJbXVsbCA4KCVlY3gpCQkvKiBtc2wgb2YgYiAqLworCW1vdmwgJWVkeCwtMTIoJWVicCkKKworCW1vdmwgNCglZXNpKSwlZWF4CS8qIG1pZGwgb2YgWHNpZyAqLworCW11bGwgNCglZWN4KQkJLyogbWlkbCBvZiBiICovCisJYWRkbCAlZWR4LC0xMiglZWJwKQorCWFkY2wgJDAsLTgoJWVicCkKKwlhZGNsICQwLC00KCVlYnApCisKKwltb3ZsIDgoJWVzaSksJWVheAkvKiBtc2wgb2YgWHNpZyAqLworCW11bGwgKCVlY3gpCQkvKiBsc2wgb2YgYiAqLworCWFkZGwgJWVkeCwtMTIoJWVicCkKKwlhZGNsICQwLC04KCVlYnApCisJYWRjbCAkMCwtNCglZWJwKQorCisJbW92bCA0KCVlc2kpLCVlYXgJLyogbWlkbCBvZiBYc2lnICovCisJbXVsbCA4KCVlY3gpCQkvKiBtc2wgb2YgYiAqLworCWFkZGwgJWVheCwtMTIoJWVicCkKKwlhZGNsICVlZHgsLTgoJWVicCkKKwlhZGNsICQwLC00KCVlYnApCisKKwltb3ZsIDgoJWVzaSksJWVheAkvKiBtc2wgb2YgWHNpZyAqLworCW11bGwgNCglZWN4KQkJLyogbWlkbCBvZiBiICovCisJYWRkbCAlZWF4LC0xMiglZWJwKQorCWFkY2wgJWVkeCwtOCglZWJwKQorCWFkY2wgJDAsLTQoJWVicCkKKworCW1vdmwgOCglZXNpKSwlZWF4CS8qIG1zbCBvZiBYc2lnICovCisJbXVsbCA4KCVlY3gpCQkvKiBtc2wgb2YgYiAqLworCWFkZGwgJWVheCwtOCglZWJwKQorCWFkY2wgJWVkeCwtNCglZWJwKQorCisJbW92bCAtMTIoJWVicCksJWVkeAorCW1vdmwgJWVkeCwoJWVzaSkKKwltb3ZsIC04KCVlYnApLCVlZHgKKwltb3ZsICVlZHgsNCglZXNpKQorCW1vdmwgLTQoJWVicCksJWVkeAorCW1vdmwgJWVkeCw4KCVlc2kpCisKKwlwb3BsICVlc2kKKwlsZWF2ZQorCXJldAorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcG9seS5oIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI3OTgxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHkuaApAQCAtMCwwICsxLDEyMSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcG9seS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIEhlYWRlciBmaWxlIGZvciB0aGUgRlBVLWVtdSBwb2x5Ki5jIHNvdXJjZSBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5NCwxOTk5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsICAgYmlsbG1AbWVsYnBjLm9yZy5hdSAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgRGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBmb3IgZnVuY3Rpb25zIG9wZXJhdGluZyBvbiBYc2lnICgxMi1ieXRlICAgICB8CisgfCBleHRlbmRlZC1zaWduaWZpY2FuZCkgcXVhbnRpdGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIF9QT0xZX0gKKyNkZWZpbmUgX1BPTFlfSAorCisvKiBUaGlzIDEyLWJ5dGUgc3RydWN0dXJlIGlzIHVzZWQgdG8gaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgY29tcHV0YXRpb24KKyAgIG9mIHRyYW5zY2VuZGVudGFsIGZ1bmN0aW9ucy4KKyAgIEludGVuZGVkIHRvIGJlIHVzZWQgdG8gZ2V0IHJlc3VsdHMgYmV0dGVyIHRoYW4gOC1ieXRlIGNvbXB1dGF0aW9uCisgICBhbGxvd3MuIDktYnl0ZSB3b3VsZCBwcm9iYWJseSBiZSBzdWZmaWNpZW50LgorICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgbG9uZyBsc3c7CisgIHVuc2lnbmVkIGxvbmcgbWlkdzsKKyAgdW5zaWduZWQgbG9uZyBtc3c7Cit9IFhzaWc7CisKK2FzbWxpbmthZ2Ugdm9pZCBtdWw2NCh1bnNpZ25lZCBsb25nIGxvbmcgY29uc3QgKmEsIHVuc2lnbmVkIGxvbmcgbG9uZyBjb25zdCAqYiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nICpyZXN1bHQpOworYXNtbGlua2FnZSB2b2lkIHBvbHlub21pYWxfWHNpZyhYc2lnICosIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqeCwKKwkJCQljb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgdGVybXNbXSwgY29uc3QgaW50IG4pOworCithc21saW5rYWdlIHZvaWQgbXVsMzJfWHNpZyhYc2lnICosIGNvbnN0IHVuc2lnbmVkIGxvbmcgbXVsdCk7Cithc21saW5rYWdlIHZvaWQgbXVsNjRfWHNpZyhYc2lnICosIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAqbXVsdCk7Cithc21saW5rYWdlIHZvaWQgbXVsX1hzaWdfWHNpZyhYc2lnICpkZXN0LCBjb25zdCBYc2lnICptdWx0KTsKKworYXNtbGlua2FnZSB2b2lkIHNocl9Yc2lnKFhzaWcgKiwgY29uc3QgaW50IG4pOworYXNtbGlua2FnZSBpbnQgcm91bmRfWHNpZyhYc2lnICopOworYXNtbGlua2FnZSBpbnQgbm9ybV9Yc2lnKFhzaWcgKik7Cithc21saW5rYWdlIHZvaWQgZGl2X1hzaWcoWHNpZyAqeDEsIGNvbnN0IFhzaWcgKngyLCBjb25zdCBYc2lnICpkZXN0KTsKKworLyogTWFjcm8gdG8gZXh0cmFjdCB0aGUgbW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIGZyb20gYSBsb25nIGxvbmcgKi8KKyNkZWZpbmUgTExfTVNXKHgpICAgICAoKCh1bnNpZ25lZCBsb25nICopJngpWzFdKQorCisvKiBNYWNybyB0byBpbml0aWFsaXplIGFuIFhzaWcgc3RydWN0ICovCisjZGVmaW5lIE1LX1hTSUcoYSxiLGMpICAgICB7IGMsIGIsIGEgfQorCisvKiBNYWNybyB0byBhY2Nlc3MgdGhlIDggbXMgYnl0ZXMgb2YgYW4gWHNpZyBhcyBhIGxvbmcgbG9uZyAqLworI2RlZmluZSBYU0lHX0xMKHgpICAgICAgICAgKCoodW5zaWduZWQgbG9uZyBsb25nICopJngubWlkdykKKworCisvKgorICAgTmVlZCB0byBydW4gZ2NjIHdpdGggb3B0aW1pemF0aW9ucyBvbiB0byBnZXQgdGhlc2UgdG8KKyAgIGFjdHVhbGx5IGJlIGluLWxpbmUuCisgICAqLworCisvKiBNdWx0aXBseSB0d28gZml4ZWQtcG9pbnQgMzIgYml0IG51bWJlcnMsIHByb2R1Y2luZyBhIDMyIGJpdCByZXN1bHQuCisgICBUaGUgYW5zd2VyIGlzIHRoZSBtcyB3b3JkIG9mIHRoZSBwcm9kdWN0LiAqLworLyogU29tZSB2ZXJzaW9ucyBvZiBnY2MgbWFrZSBpdCBkaWZmaWN1bHQgdG8gc3RvcCBlYXggZnJvbSBiZWluZyBjbG9iYmVyZWQuCisgICBNZXJlbHkgc3BlY2lmeWluZyB0aGF0IGl0IGlzIHVzZWQgZG9lc24ndCB3b3JrLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtdWxfMzJfMzIoY29uc3QgdW5zaWduZWQgbG9uZyBhcmcxLAorCQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgYXJnMikKK3sKKyAgaW50IHJldHZhbDsKKyAgYXNtIHZvbGF0aWxlICgibXVsbCAlMjsgbW92bCAlJWVkeCwlJWVheCIgXAorCQk6Ij1hIiAocmV0dmFsKSBcCisJCToiMCIgKGFyZzEpLCAiZyIgKGFyZzIpIFwKKwkJOiJkeCIpOworICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qIEFkZCB0aGUgMTIgYnl0ZSBYc2lnIHgyIHRvIFhzaWcgZGVzdCwgd2l0aCBubyBjaGVja3MgZm9yIG92ZXJmbG93LiAqLworc3RhdGljIGlubGluZSB2b2lkIGFkZF9Yc2lnX1hzaWcoWHNpZyAqZGVzdCwgY29uc3QgWHNpZyAqeDIpCit7CisgIGFzbSB2b2xhdGlsZSAoIm1vdmwgJTEsJSVlZGk7IG1vdmwgJTIsJSVlc2k7XG4iCisgICAgICAgICAgICAgICAgIm1vdmwgKCUlZXNpKSwlJWVheDsgYWRkbCAlJWVheCwoJSVlZGkpO1xuIgorICAgICAgICAgICAgICAgICJtb3ZsIDQoJSVlc2kpLCUlZWF4OyBhZGNsICUlZWF4LDQoJSVlZGkpO1xuIgorICAgICAgICAgICAgICAgICJtb3ZsIDgoJSVlc2kpLCUlZWF4OyBhZGNsICUlZWF4LDgoJSVlZGkpO1xuIgorICAgICAgICAgICAgICAgICA6Ij1nIiAoKmRlc3QpOiJnIiAoZGVzdCksICJnIiAoeDIpCisgICAgICAgICAgICAgICAgIDoiYXgiLCJzaSIsImRpIik7Cit9CisKKworLyogQWRkIHRoZSAxMiBieXRlIFhzaWcgeDIgdG8gWHNpZyBkZXN0LCBhZGp1c3QgZXhwIGlmIG92ZXJmbG93IG9jY3Vycy4gKi8KKy8qIE5vdGU6IHRoZSBjb25zdHJhaW50cyBpbiB0aGUgYXNtIHN0YXRlbWVudCBkaWRuJ3QgYWx3YXlzIHdvcmsgcHJvcGVybHkKKyAgIHdpdGggZ2NjIDIuNS44LiAgQ2hhbmdpbmcgZnJvbSB1c2luZyBlZGkgdG8gdXNpbmcgZWN4IGdvdCBhcm91bmQgdGhlCisgICBwcm9ibGVtLCBidXQga2VlcCBmaW5nZXJzIGNyb3NzZWQhICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX3R3b19Yc2lnKFhzaWcgKmRlc3QsIGNvbnN0IFhzaWcgKngyLCBsb25nIGludCAqZXhwKQoreworICBhc20gdm9sYXRpbGUgKCJtb3ZsICUyLCUlZWN4OyBtb3ZsICUzLCUlZXNpO1xuIgorICAgICAgICAgICAgICAgICJtb3ZsICglJWVzaSksJSVlYXg7IGFkZGwgJSVlYXgsKCUlZWN4KTtcbiIKKyAgICAgICAgICAgICAgICAibW92bCA0KCUlZXNpKSwlJWVheDsgYWRjbCAlJWVheCw0KCUlZWN4KTtcbiIKKyAgICAgICAgICAgICAgICAibW92bCA4KCUlZXNpKSwlJWVheDsgYWRjbCAlJWVheCw4KCUlZWN4KTtcbiIKKyAgICAgICAgICAgICAgICAiam5jIDBmO1xuIgorCQkicmNybCA4KCUlZWN4KTsgcmNybCA0KCUlZWN4KTsgcmNybCAoJSVlY3gpXG4iCisgICAgICAgICAgICAgICAgIm1vdmwgJTQsJSVlY3g7IGluY2wgKCUlZWN4KVxuIgorICAgICAgICAgICAgICAgICJtb3ZsICQxLCUlZWF4OyBqbXAgMWY7XG4iCisgICAgICAgICAgICAgICAgIjA6IHhvcmwgJSVlYXgsJSVlYXg7XG4iCisgICAgICAgICAgICAgICAgIjE6XG4iCisJCToiPWciICgqZXhwKSwgIj1nIiAoKmRlc3QpCisJCToiZyIgKGRlc3QpLCAiZyIgKHgyKSwgImciIChleHApCisJCToiY3giLCJzaSIsImF4Iik7Cit9CisKKworLyogTmVnYXRlIChzdWJ0cmFjdCBmcm9tIDEuMCkgdGhlIDEyIGJ5dGUgWHNpZyAqLworLyogVGhpcyBpcyBmYXN0ZXIgaW4gYSBsb29wIG9uIG15IDM4NiB0aGFuIHVzaW5nIHRoZSAibmVnIiBpbnN0cnVjdGlvbi4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuZWdhdGVfWHNpZyhYc2lnICp4KQoreworICBhc20gdm9sYXRpbGUoIm1vdmwgJTEsJSVlc2k7XG4iCisgICAgICAgICAgICAgICAieG9ybCAlJWVjeCwlJWVjeDtcbiIKKyAgICAgICAgICAgICAgICJtb3ZsICUlZWN4LCUlZWF4OyBzdWJsICglJWVzaSksJSVlYXg7IG1vdmwgJSVlYXgsKCUlZXNpKTtcbiIKKyAgICAgICAgICAgICAgICJtb3ZsICUlZWN4LCUlZWF4OyBzYmJsIDQoJSVlc2kpLCUlZWF4OyBtb3ZsICUlZWF4LDQoJSVlc2kpO1xuIgorICAgICAgICAgICAgICAgIm1vdmwgJSVlY3gsJSVlYXg7IHNiYmwgOCglJWVzaSksJSVlYXg7IG1vdmwgJSVlYXgsOCglJWVzaSk7XG4iCisgICAgICAgICAgICAgICA6Ij1nIiAoKngpOiJnIiAoeCk6InNpIiwiYXgiLCJjeCIpOworfQorCisjZW5kaWYgLyogX1BPTFlfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfMnhtMS5jIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfMnhtMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NjZhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcG9seV8yeG0xLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHBvbHlfMnhtMS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IEZ1bmN0aW9uIHRvIGNvbXB1dGUgMl54LTEgYnkgYSBwb2x5bm9taWFsIGFwcHJveGltYXRpb24uICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk0LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCBBdXN0cmFsaWEgfAorIHwgICAgICAgICAgICAgICAgICBFLW1haWwgICBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAicmVnX2NvbnN0YW50LmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKyNpbmNsdWRlICJwb2x5LmgiCisKKworI2RlZmluZQlISVBPV0VSCTExCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIGx0ZXJtc1tISVBPV0VSXSA9Cit7CisgIDB4MDAwMDAwMDAwMDAwMDAwMExMLCAgLyogVGhpcyB0ZXJtIGRvbmUgc2VwYXJhdGVseSBhcyAxMiBieXRlcyAqLworICAweGY1ZmRlZmZjMTYyYzc1NDNMTCwKKyAgMHgxYzZiMDhkNzA0YTBiZmE2TEwsCisgIDB4MDI3NjU1NmRmNzQ5Y2MyMUxMLAorICAweDAwMmJiMGZmY2YxNGY2YjhMTCwKKyAgMHgwMDAyODYxMjI1ZWY3NTFjTEwsCisgIDB4MDAwMDFmZmNiZmNkNTQyMkxMLAorICAweDAwMDAwMTYyYzAwNWQ1ZjFMTCwKKyAgMHgwMDAwMDAwZGE5NmNjYjFiTEwsCisgIDB4MDAwMDAwMDA3OGQxYjg5N0xMLAorICAweDAwMDAwMDAwMDQyMmIwMjlMTAorfTsKKworc3RhdGljIGNvbnN0IFhzaWcgaGl0ZXJtID0gTUtfWFNJRygweGIxNzIxN2Y3LCAweGQxY2Y3OWFiLCAweGM4YTM5MTk0KTsKKworLyogRm91ciBzbGljZXM6IDAuMCA6IDAuMjUgOiAwLjUwIDogMC43NSA6IDEuMCwKKyAgIFRoZXNlIG51bWJlcnMgYXJlIDJeKDEvNCksIDJeKDEvMiksIGFuZCAyXigzLzQpCisgKi8KK3N0YXRpYyBjb25zdCBYc2lnIHNoaWZ0dGVybTAgPSBNS19YU0lHKDAsIDAsIDApOworc3RhdGljIGNvbnN0IFhzaWcgc2hpZnR0ZXJtMSA9IE1LX1hTSUcoMHg5ODM3ZjA1MSwgMHg4ZGI4YTk2ZiwgMHg0NmFkMjMxOCk7CitzdGF0aWMgY29uc3QgWHNpZyBzaGlmdHRlcm0yID0gTUtfWFNJRygweGI1MDRmMzMzLCAweGY5ZGU2NDg0LCAweDU5N2Q4OWIzKTsKK3N0YXRpYyBjb25zdCBYc2lnIHNoaWZ0dGVybTMgPSBNS19YU0lHKDB4ZDc0NGZjY2EsIDB4ZDY5ZDZhZjQsIDB4MzlhNjhiYjkpOworCitzdGF0aWMgY29uc3QgWHNpZyAqc2hpZnR0ZXJtW10gPSB7ICZzaGlmdHRlcm0wLCAmc2hpZnR0ZXJtMSwKKwkJCQkgICAgICZzaGlmdHRlcm0yLCAmc2hpZnR0ZXJtMyB9OworCisKKy8qLS0tIHBvbHlfMnhtMSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgUmVxdWlyZXMgc3QoMCkgd2hpY2ggaXMgVEFHX1ZhbGlkIGFuZCA8IDEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQJcG9seV8yeG0xKHVfY2hhciBzaWduLCBGUFVfUkVHICphcmcsIEZQVV9SRUcgKnJlc3VsdCkKK3sKKyAgbG9uZyBpbnQgICAgICAgICAgICAgIGV4cG9uZW50LCBzaGlmdDsKKyAgdW5zaWduZWQgbG9uZyBsb25nICAgIFhsbDsKKyAgWHNpZyAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yLCBEZW5vbSwgYXJnU2lnbmlmOworICB1X2NoYXIgICAgICAgICAgICAgICAgdGFnOworCisgIGV4cG9uZW50ID0gZXhwb25lbnQxNihhcmcpOworCisjaWZkZWYgUEFSQU5PSUQKKyAgaWYgKCBleHBvbmVudCA+PSAwICkgICAgCS8qIERvbid0IHdhbnQgYSB8bnVtYmVyfCA+PSAxLjAgKi8KKyAgICB7CisgICAgICAvKiBOdW1iZXIgbmVnYXRpdmUsIHRvbyBsYXJnZSwgb3Igbm90IFZhbGlkLiAqLworICAgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTI3KTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisgIGFyZ1NpZ25pZi5sc3cgPSAwOworICBYU0lHX0xMKGFyZ1NpZ25pZikgPSBYbGwgPSBzaWduaWZpY2FuZChhcmcpOworCisgIGlmICggZXhwb25lbnQgPT0gLTEgKQorICAgIHsKKyAgICAgIHNoaWZ0ID0gKGFyZ1NpZ25pZi5tc3cgJiAweDQwMDAwMDAwKSA/IDMgOiAyOworICAgICAgLyogc3VidHJhY3QgMC41IG9yIDAuNzUgKi8KKyAgICAgIGV4cG9uZW50IC09IDI7CisgICAgICBYU0lHX0xMKGFyZ1NpZ25pZikgPDw9IDI7CisgICAgICBYbGwgPDw9IDI7CisgICAgfQorICBlbHNlIGlmICggZXhwb25lbnQgPT0gLTIgKQorICAgIHsKKyAgICAgIHNoaWZ0ID0gMTsKKyAgICAgIC8qIHN1YnRyYWN0IDAuMjUgKi8KKyAgICAgIGV4cG9uZW50LS07CisgICAgICBYU0lHX0xMKGFyZ1NpZ25pZikgPDw9IDE7CisgICAgICBYbGwgPDw9IDE7CisgICAgfQorICBlbHNlCisgICAgc2hpZnQgPSAwOworCisgIGlmICggZXhwb25lbnQgPCAtMiApCisgICAgeworICAgICAgLyogU2hpZnQgdGhlIGFyZ3VtZW50IHJpZ2h0IGJ5IHRoZSByZXF1aXJlZCBwbGFjZXMuICovCisgICAgICBpZiAoIEZQVV9zaHJ4KCZYbGwsIC0yLWV4cG9uZW50KSA+PSAweDgwMDAwMDAwVSApCisJWGxsKys7CS8qIHJvdW5kIHVwICovCisgICAgfQorCisgIGFjY3VtdWxhdG9yLmxzdyA9IGFjY3VtdWxhdG9yLm1pZHcgPSBhY2N1bXVsYXRvci5tc3cgPSAwOworICBwb2x5bm9taWFsX1hzaWcoJmFjY3VtdWxhdG9yLCAmWGxsLCBsdGVybXMsIEhJUE9XRVItMSk7CisgIG11bF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmYXJnU2lnbmlmKTsKKyAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCAzKTsKKworICBtdWxfWHNpZ19Yc2lnKCZhcmdTaWduaWYsICZoaXRlcm0pOyAgIC8qIFRoZSBsZWFkaW5nIHRlcm0gKi8KKyAgYWRkX3R3b19Yc2lnKCZhY2N1bXVsYXRvciwgJmFyZ1NpZ25pZiwgJmV4cG9uZW50KTsKKworICBpZiAoIHNoaWZ0ICkKKyAgICB7CisgICAgICAvKiBUaGUgYXJndW1lbnQgaXMgbGFyZ2UsIHVzZSB0aGUgaWRlbnRpdHk6CisJIGYoeCthKSA9IGYoYSkgKiAoZih4KSArIDEpIC0gMTsKKwkgKi8KKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgLSBleHBvbmVudCk7CisgICAgICBhY2N1bXVsYXRvci5tc3cgfD0gMHg4MDAwMDAwMDsgICAgICAvKiBhZGQgMS4wICovCisgICAgICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgc2hpZnR0ZXJtW3NoaWZ0XSk7CisgICAgICBhY2N1bXVsYXRvci5tc3cgJj0gMHgzZmZmZmZmZjsgICAgICAvKiBzdWJ0cmFjdCAxLjAgKi8KKyAgICAgIGV4cG9uZW50ID0gMTsKKyAgICB9CisKKyAgaWYgKCBzaWduICE9IFNJR05fUE9TICkKKyAgICB7CisgICAgICAvKiBUaGUgYXJndW1lbnQgaXMgbmVnYXRpdmUsIHVzZSB0aGUgaWRlbnRpdHk6CisJICAgICBmKC14KSA9IC1mKHgpIC8gKDEgKyBmKHgpKQorCSAqLworICAgICAgRGVub20ubHN3ID0gYWNjdW11bGF0b3IubHN3OworICAgICAgWFNJR19MTChEZW5vbSkgPSBYU0lHX0xMKGFjY3VtdWxhdG9yKTsKKyAgICAgIGlmICggZXhwb25lbnQgPCAwICkKKwlzaHJfWHNpZygmRGVub20sIC0gZXhwb25lbnQpOworICAgICAgZWxzZSBpZiAoIGV4cG9uZW50ID4gMCApCisJeworCSAgLyogZXhwb25lbnQgbXVzdCBiZSAxIGhlcmUgKi8KKwkgIFhTSUdfTEwoRGVub20pIDw8PSAxOworCSAgaWYgKCBEZW5vbS5sc3cgJiAweDgwMDAwMDAwICkKKwkgICAgWFNJR19MTChEZW5vbSkgfD0gMTsKKwkgIChEZW5vbS5sc3cpIDw8PSAxOworCX0KKyAgICAgIERlbm9tLm1zdyB8PSAweDgwMDAwMDAwOyAgICAgIC8qIGFkZCAxLjAgKi8KKyAgICAgIGRpdl9Yc2lnKCZhY2N1bXVsYXRvciwgJkRlbm9tLCAmYWNjdW11bGF0b3IpOworICAgIH0KKworICAvKiBDb252ZXJ0IHRvIDY0IGJpdCBzaWduZWQtY29tcGF0aWJsZSAqLworICBleHBvbmVudCArPSByb3VuZF9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgcmVzdWx0ID0gJnN0KDApOworICBzaWduaWZpY2FuZChyZXN1bHQpID0gWFNJR19MTChhY2N1bXVsYXRvcik7CisgIHNldGV4cG9uZW50MTYocmVzdWx0LCBleHBvbmVudCk7CisKKyAgdGFnID0gRlBVX3JvdW5kKHJlc3VsdCwgMSwgMCwgRlVMTF9QUkVDSVNJT04sIHNpZ24pOworCisgIHNldHNpZ24ocmVzdWx0LCBzaWduKTsKKyAgRlBVX3NldHRhZzAodGFnKTsKKworICByZXR1cm4gMDsKKworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfYXRhbi5jIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfYXRhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjcwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcG9seV9hdGFuLmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHBvbHlfYXRhbi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvbXB1dGUgdGhlIGFyY3RhbiBvZiBhIEZQVV9SRUcsIHVzaW5nIGEgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uLiAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk0LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCBBdXN0cmFsaWEgfAorIHwgICAgICAgICAgICAgICAgICBFLW1haWwgICBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAicmVnX2NvbnN0YW50LmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJzdGF0dXNfdy5oIgorI2luY2x1ZGUgImNvbnRyb2xfdy5oIgorI2luY2x1ZGUgInBvbHkuaCIKKworCisjZGVmaW5lCUhJUE9XRVJvbgk2CS8qIG9kZCBwb2x5LCBuZWdhdGl2ZSB0ZXJtcyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBvZGRuZWd0ZXJtc1tISVBPV0VSb25dID0KK3sKKyAgMHgwMDAwMDAwMDAwMDAwMDAwTEwsIC8qIER1bW15IChub3QgZm9yIC0gMS4wKSAqLworICAweDAxNTMyODQzN2Y3NTY0NjdMTCwKKyAgMHgwMDA1ZGRhMjdiNzNkZWM2TEwsCisgIDB4MDAwMDIyNmJmMmJmYjkxYUxMLAorICAweDAwMDAwMGNjYzQzOWM1ZjdMTCwKKyAgMHgwMDAwMDAwMzU1NDM4NDA3TEwKK30gOworCisjZGVmaW5lCUhJUE9XRVJvcAk2CS8qIG9kZCBwb2x5LCBwb3NpdGl2ZSB0ZXJtcyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBvZGRwbHRlcm1zW0hJUE9XRVJvcF0gPQoreworLyogIDB4YWFhYWFhYWFhYWFhYWFhYkxMLCAgdHJhbnNmZXJyZWQgdG8gZml4ZWRwdGVybVtdICovCisgIDB4MGRiNTVhNzE4NzVjOWFjMkxMLAorICAweDAwMjlmY2UyZDY3ODgwYjBMTCwKKyAgMHgwMDAwZGZkMzkwOGI0NTk2TEwsCisgIDB4MDAwMDA1NTBmZDYxZGFiNExMLAorICAweDAwMDAwMDFjOTQyMmIzZjlMTCwKKyAgMHgwMDAwMDAwMDNlMzMwMWUxTEwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgZGVub210ZXJtID0gMHhlYmQ5Yjg0MmM1YzUzYTBlTEw7CisKK3N0YXRpYyBjb25zdCBYc2lnIGZpeGVkcHRlcm0gPSBNS19YU0lHKDB4YWFhYWFhYWEsIDB4YWFhYWFhYWEsIDB4YWFhYWFhYWEpOworCitzdGF0aWMgY29uc3QgWHNpZyBwaV9zaWduaWYgPSBNS19YU0lHKDB4YzkwZmRhYTIsIDB4MjE2OGMyMzQsIDB4YzRjNjYyOGIpOworCisKKy8qLS0tIHBvbHlfYXRhbigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCXBvbHlfYXRhbihGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZywKKwkJICBGUFVfUkVHICpzdDFfcHRyLCB1X2NoYXIgc3QxX3RhZykKK3sKKyAgdV9jaGFyCXRyYW5zZm9ybWVkLCBpbnZlcnRlZCwKKyAgICAgICAgICAgICAgICBzaWduMSwgc2lnbjI7CisgIGludCAgICAgICAgICAgZXhwb25lbnQ7CisgIGxvbmcgaW50ICAgCWR1bW15X2V4cDsKKyAgWHNpZyAgICAgICAgICBhY2N1bXVsYXRvciwgTnVtZXIsIERlbm9tLCBhY2N1bXVsYXRvcmUsIGFyZ1NpZ25pZiwKKyAgICAgICAgICAgICAgICBhcmdTcSwgYXJnU3FTcTsKKyAgdV9jaGFyICAgICAgICB0YWc7CisgIAorICBzaWduMSA9IGdldHNpZ24oc3QwX3B0cik7CisgIHNpZ24yID0gZ2V0c2lnbihzdDFfcHRyKTsKKyAgaWYgKCBzdDBfdGFnID09IFRBR19WYWxpZCApCisgICAgeworICAgICAgZXhwb25lbnQgPSBleHBvbmVudChzdDBfcHRyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGlzIGdpdmVzIG5vbi1jb21wYXRpYmxlIHN0YWNrIGNvbnRlbnRzLi4uICovCisgICAgICBGUFVfdG9fZXhwMTYoc3QwX3B0ciwgc3QwX3B0cik7CisgICAgICBleHBvbmVudCA9IGV4cG9uZW50MTYoc3QwX3B0cik7CisgICAgfQorICBpZiAoIHN0MV90YWcgPT0gVEFHX1ZhbGlkICkKKyAgICB7CisgICAgICBleHBvbmVudCAtPSBleHBvbmVudChzdDFfcHRyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGlzIGdpdmVzIG5vbi1jb21wYXRpYmxlIHN0YWNrIGNvbnRlbnRzLi4uICovCisgICAgICBGUFVfdG9fZXhwMTYoc3QxX3B0ciwgc3QxX3B0cik7CisgICAgICBleHBvbmVudCAtPSBleHBvbmVudDE2KHN0MV9wdHIpOworICAgIH0KKworICBpZiAoIChleHBvbmVudCA8IDApIHx8ICgoZXhwb25lbnQgPT0gMCkgJiYKKwkJCSAgKChzdDBfcHRyLT5zaWdoIDwgc3QxX3B0ci0+c2lnaCkgfHwKKwkJCSAgICgoc3QwX3B0ci0+c2lnaCA9PSBzdDFfcHRyLT5zaWdoKSAmJgorCQkJICAgIChzdDBfcHRyLT5zaWdsIDwgc3QxX3B0ci0+c2lnbCkpKSApICkKKyAgICB7CisgICAgICBpbnZlcnRlZCA9IDE7CisgICAgICBOdW1lci5sc3cgPSBEZW5vbS5sc3cgPSAwOworICAgICAgWFNJR19MTChOdW1lcikgPSBzaWduaWZpY2FuZChzdDBfcHRyKTsKKyAgICAgIFhTSUdfTEwoRGVub20pID0gc2lnbmlmaWNhbmQoc3QxX3B0cik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW52ZXJ0ZWQgPSAwOworICAgICAgZXhwb25lbnQgPSAtZXhwb25lbnQ7CisgICAgICBOdW1lci5sc3cgPSBEZW5vbS5sc3cgPSAwOworICAgICAgWFNJR19MTChOdW1lcikgPSBzaWduaWZpY2FuZChzdDFfcHRyKTsKKyAgICAgIFhTSUdfTEwoRGVub20pID0gc2lnbmlmaWNhbmQoc3QwX3B0cik7CisgICAgIH0KKyAgZGl2X1hzaWcoJk51bWVyLCAmRGVub20sICZhcmdTaWduaWYpOworICBleHBvbmVudCArPSBub3JtX1hzaWcoJmFyZ1NpZ25pZik7CisKKyAgaWYgKCAoZXhwb25lbnQgPj0gLTEpCisgICAgICB8fCAoKGV4cG9uZW50ID09IC0yKSAmJiAoYXJnU2lnbmlmLm1zdyA+IDB4ZDQxM2NjZDApKSApCisgICAgeworICAgICAgLyogVGhlIGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiBzcXJ0KDIpLTEgKD0wLjQxNDIxMzU2Mi4uLikgKi8KKyAgICAgIC8qIENvbnZlcnQgdGhlIGFyZ3VtZW50IGJ5IGFuIGlkZW50aXR5IGZvciBhdGFuICovCisgICAgICB0cmFuc2Zvcm1lZCA9IDE7CisKKyAgICAgIGlmICggZXhwb25lbnQgPj0gMCApCisJeworI2lmZGVmIFBBUkFOT0lECisJICBpZiAoICEoIChleHBvbmVudCA9PSAwKSAmJiAKKwkJIChhcmdTaWduaWYubHN3ID09IDApICYmIChhcmdTaWduaWYubWlkdyA9PSAwKSAmJgorCQkgKGFyZ1NpZ25pZi5tc3cgPT0gMHg4MDAwMDAwMCkgKSApCisJICAgIHsKKwkgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMDQpOyAgLyogVGhlcmUgbXVzdCBiZSBhIGxvZ2ljIGVycm9yICovCisJICAgICAgcmV0dXJuOworCSAgICB9CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKwkgIGFyZ1NpZ25pZi5tc3cgPSAwOyAgIC8qIE1ha2UgdGhlIHRyYW5zZm9ybWVkIGFyZyAtPiAwLjAgKi8KKwl9CisgICAgICBlbHNlCisJeworCSAgTnVtZXIubHN3ID0gRGVub20ubHN3ID0gYXJnU2lnbmlmLmxzdzsKKwkgIFhTSUdfTEwoTnVtZXIpID0gWFNJR19MTChEZW5vbSkgPSBYU0lHX0xMKGFyZ1NpZ25pZik7CisKKwkgIGlmICggZXhwb25lbnQgPCAtMSApCisJICAgIHNocl9Yc2lnKCZOdW1lciwgLTEtZXhwb25lbnQpOworCSAgbmVnYXRlX1hzaWcoJk51bWVyKTsKKyAgICAgIAorCSAgc2hyX1hzaWcoJkRlbm9tLCAtZXhwb25lbnQpOworCSAgRGVub20ubXN3IHw9IDB4ODAwMDAwMDA7CisgICAgICAKKwkgIGRpdl9Yc2lnKCZOdW1lciwgJkRlbm9tLCAmYXJnU2lnbmlmKTsKKworCSAgZXhwb25lbnQgPSAtMSArIG5vcm1fWHNpZygmYXJnU2lnbmlmKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdHJhbnNmb3JtZWQgPSAwOworICAgIH0KKworICBhcmdTcS5sc3cgPSBhcmdTaWduaWYubHN3OyBhcmdTcS5taWR3ID0gYXJnU2lnbmlmLm1pZHc7CisgIGFyZ1NxLm1zdyA9IGFyZ1NpZ25pZi5tc3c7CisgIG11bF9Yc2lnX1hzaWcoJmFyZ1NxLCAmYXJnU3EpOworICAKKyAgYXJnU3FTcS5sc3cgPSBhcmdTcS5sc3c7IGFyZ1NxU3EubWlkdyA9IGFyZ1NxLm1pZHc7IGFyZ1NxU3EubXN3ID0gYXJnU3EubXN3OworICBtdWxfWHNpZ19Yc2lnKCZhcmdTcVNxLCAmYXJnU3FTcSk7CisKKyAgYWNjdW11bGF0b3JlLmxzdyA9IGFyZ1NxLmxzdzsKKyAgWFNJR19MTChhY2N1bXVsYXRvcmUpID0gWFNJR19MTChhcmdTcSk7CisKKyAgc2hyX1hzaWcoJmFyZ1NxLCAyKigtMS1leHBvbmVudC0xKSk7CisgIHNocl9Yc2lnKCZhcmdTcVNxLCA0KigtMS1leHBvbmVudC0xKSk7CisKKyAgLyogTm93IGhhdmUgYXJnU3EgZXRjIHdpdGggYmluYXJ5IHBvaW50IGF0IHRoZSBsZWZ0CisgICAgIC4xeHh4eHh4eHggKi8KKworICAvKiBEbyB0aGUgYmFzaWMgZml4ZWQgcG9pbnQgcG9seW5vbWlhbCBldmFsdWF0aW9uICovCisgIGFjY3VtdWxhdG9yLm1zdyA9IGFjY3VtdWxhdG9yLm1pZHcgPSBhY2N1bXVsYXRvci5sc3cgPSAwOworICBwb2x5bm9taWFsX1hzaWcoJmFjY3VtdWxhdG9yLCAmWFNJR19MTChhcmdTcVNxKSwKKwkJICAgb2RkcGx0ZXJtcywgSElQT1dFUm9wLTEpOworICBtdWw2NF9Yc2lnKCZhY2N1bXVsYXRvciwgJlhTSUdfTEwoYXJnU3EpKTsKKyAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKyAgcG9seW5vbWlhbF9Yc2lnKCZhY2N1bXVsYXRvciwgJlhTSUdfTEwoYXJnU3FTcSksIG9kZG5lZ3Rlcm1zLCBISVBPV0VSb24tMSk7CisgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisgIGFkZF90d29fWHNpZygmYWNjdW11bGF0b3IsICZmaXhlZHB0ZXJtLCAmZHVtbXlfZXhwKTsKKworICBtdWw2NF9Yc2lnKCZhY2N1bXVsYXRvcmUsICZkZW5vbXRlcm0pOworICBzaHJfWHNpZygmYWNjdW11bGF0b3JlLCAxICsgMiooLTEtZXhwb25lbnQpKTsKKyAgYWNjdW11bGF0b3JlLm1zdyB8PSAweDgwMDAwMDAwOworCisgIGRpdl9Yc2lnKCZhY2N1bXVsYXRvciwgJmFjY3VtdWxhdG9yZSwgJmFjY3VtdWxhdG9yKTsKKworICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmFyZ1NpZ25pZik7CisgIG11bF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmYXJnU3EpOworCisgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgMyk7CisgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisgIGFkZF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmYXJnU2lnbmlmKTsKKworICBpZiAoIHRyYW5zZm9ybWVkICkKKyAgICB7CisgICAgICAvKiBjb21wdXRlIHBpLzQgLSBhY2N1bXVsYXRvciAqLworICAgICAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCAtMS1leHBvbmVudCk7CisgICAgICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3IpOworICAgICAgYWRkX1hzaWdfWHNpZygmYWNjdW11bGF0b3IsICZwaV9zaWduaWYpOworICAgICAgZXhwb25lbnQgPSAtMTsKKyAgICB9CisKKyAgaWYgKCBpbnZlcnRlZCApCisgICAgeworICAgICAgLyogY29tcHV0ZSBwaS8yIC0gYWNjdW11bGF0b3IgKi8KKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgLWV4cG9uZW50KTsKKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisgICAgICBhZGRfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJnBpX3NpZ25pZik7CisgICAgICBleHBvbmVudCA9IDA7CisgICAgfQorCisgIGlmICggc2lnbjEgKQorICAgIHsKKyAgICAgIC8qIGNvbXB1dGUgcGkgLSBhY2N1bXVsYXRvciAqLworICAgICAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCAxIC0gZXhwb25lbnQpOworICAgICAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKyAgICAgIGFkZF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmcGlfc2lnbmlmKTsKKyAgICAgIGV4cG9uZW50ID0gMTsKKyAgICB9CisKKyAgZXhwb25lbnQgKz0gcm91bmRfWHNpZygmYWNjdW11bGF0b3IpOworCisgIHNpZ25pZmljYW5kKHN0MV9wdHIpID0gWFNJR19MTChhY2N1bXVsYXRvcik7CisgIHNldGV4cG9uZW50MTYoc3QxX3B0ciwgZXhwb25lbnQpOworCisgIHRhZyA9IEZQVV9yb3VuZChzdDFfcHRyLCAxLCAwLCBGVUxMX1BSRUNJU0lPTiwgc2lnbjIpOworICBGUFVfc2V0dGFnaSgxLCB0YWcpOworCisgIHNldF9wcmVjaXNpb25fZmxhZ191cCgpOyAgLyogV2UgZG8gbm90IHJlYWxseSBrbm93IGlmIHVwIG9yIGRvd24sCisJCQkgICAgICAgdXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQuICovCisKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5X2wyLmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvcG9seV9sMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDBlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcG9seV9sMi5jCkBAIC0wLDAgKzEsMjcyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBwb2x5X2wyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb21wdXRlIHRoZSBiYXNlIDIgbG9nIG9mIGEgRlBVX1JFRywgdXNpbmcgYSBwb2x5bm9taWFsIGFwcHJveGltYXRpb24uICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAicmVnX2NvbnN0YW50LmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKyNpbmNsdWRlICJwb2x5LmgiCisKKworc3RhdGljIHZvaWQgbG9nMl9rZXJuZWwoRlBVX1JFRyBjb25zdCAqYXJnLCB1X2NoYXIgYXJnc2lnbiwKKwkJCVhzaWcgKmFjY3VtX3Jlc3VsdCwgbG9uZyBpbnQgKmV4cG9uKTsKKworCisvKi0tLSBwb2x5X2wyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICAgQmFzZSAyIGxvZ2FyaXRobSBieSBhIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAlwb2x5X2wyKEZQVV9SRUcgKnN0MF9wdHIsIEZQVV9SRUcgKnN0MV9wdHIsIHVfY2hhciBzdDFfc2lnbikKK3sKKyAgbG9uZyBpbnQJICAgICAgIGV4cG9uZW50LCBleHBvbiwgZXhwb25fZXhwb247CisgIFhzaWcgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yLCBleHBvbl9hY2N1bSwgeWFjY3VtOworICB1X2NoYXIJCSAgICAgICBzaWduLCBhcmdzaWduOworICBGUFVfUkVHICAgICAgICAgICAgICB4OworICBpbnQgICAgICAgICAgICAgICAgICB0YWc7CisKKyAgZXhwb25lbnQgPSBleHBvbmVudDE2KHN0MF9wdHIpOworCisgIC8qIEZyb20gc3QwX3B0ciwgbWFrZSBhIG51bWJlciA+IHNxcnQoMikvMiBhbmQgPCBzcXJ0KDIpICovCisgIGlmICggc3QwX3B0ci0+c2lnaCA+ICh1bnNpZ25lZCkweGI1MDRmMzM0ICkKKyAgICB7CisgICAgICAvKiBUcmVhdCBhcyAgc3FydCgyKS8yIDwgc3QwX3B0ciA8IDEgKi8KKyAgICAgIHNpZ25pZmljYW5kKCZ4KSA9IC0gc2lnbmlmaWNhbmQoc3QwX3B0cik7CisgICAgICBzZXRleHBvbmVudDE2KCZ4LCAtMSk7CisgICAgICBleHBvbmVudCsrOworICAgICAgYXJnc2lnbiA9IFNJR05fTkVHOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRyZWF0IGFzICAxIDw9IHN0MF9wdHIgPCBzcXJ0KDIpICovCisgICAgICB4LnNpZ2ggPSBzdDBfcHRyLT5zaWdoIC0gMHg4MDAwMDAwMDsKKyAgICAgIHguc2lnbCA9IHN0MF9wdHItPnNpZ2w7CisgICAgICBzZXRleHBvbmVudDE2KCZ4LCAwKTsKKyAgICAgIGFyZ3NpZ24gPSBTSUdOX1BPUzsKKyAgICB9CisgIHRhZyA9IEZQVV9ub3JtYWxpemVfbnVvKCZ4KTsKKworICBpZiAoIHRhZyA9PSBUQUdfWmVybyApCisgICAgeworICAgICAgZXhwb24gPSAwOworICAgICAgYWNjdW11bGF0b3IubXN3ID0gYWNjdW11bGF0b3IubWlkdyA9IGFjY3VtdWxhdG9yLmxzdyA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbG9nMl9rZXJuZWwoJngsIGFyZ3NpZ24sICZhY2N1bXVsYXRvciwgJmV4cG9uKTsKKyAgICB9CisKKyAgaWYgKCBleHBvbmVudCA8IDAgKQorICAgIHsKKyAgICAgIHNpZ24gPSBTSUdOX05FRzsKKyAgICAgIGV4cG9uZW50ID0gLWV4cG9uZW50OworICAgIH0KKyAgZWxzZQorICAgIHNpZ24gPSBTSUdOX1BPUzsKKyAgZXhwb25fYWNjdW0ubXN3ID0gZXhwb25lbnQ7IGV4cG9uX2FjY3VtLm1pZHcgPSBleHBvbl9hY2N1bS5sc3cgPSAwOworICBpZiAoIGV4cG9uZW50ICkKKyAgICB7CisgICAgICBleHBvbl9leHBvbiA9IDMxICsgbm9ybV9Yc2lnKCZleHBvbl9hY2N1bSk7CisgICAgICBzaHJfWHNpZygmYWNjdW11bGF0b3IsIGV4cG9uX2V4cG9uIC0gZXhwb24pOworCisgICAgICBpZiAoIHNpZ24gXiBhcmdzaWduICkKKwluZWdhdGVfWHNpZygmYWNjdW11bGF0b3IpOworICAgICAgYWRkX1hzaWdfWHNpZygmYWNjdW11bGF0b3IsICZleHBvbl9hY2N1bSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZXhwb25fZXhwb24gPSBleHBvbjsKKyAgICAgIHNpZ24gPSBhcmdzaWduOworICAgIH0KKworICB5YWNjdW0ubHN3ID0gMDsgWFNJR19MTCh5YWNjdW0pID0gc2lnbmlmaWNhbmQoc3QxX3B0cik7CisgIG11bF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmeWFjY3VtKTsKKworICBleHBvbl9leHBvbiArPSByb3VuZF9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgaWYgKCBhY2N1bXVsYXRvci5tc3cgPT0gMCApCisgICAgeworICAgICAgRlBVX2NvcHlfdG9fcmVnMSgmQ09OU1RfWiwgVEFHX1plcm8pOworICAgICAgcmV0dXJuOworICAgIH0KKworICBzaWduaWZpY2FuZChzdDFfcHRyKSA9IFhTSUdfTEwoYWNjdW11bGF0b3IpOworICBzZXRleHBvbmVudDE2KHN0MV9wdHIsIGV4cG9uX2V4cG9uICsgZXhwb25lbnQxNihzdDFfcHRyKSArIDEpOworCisgIHRhZyA9IEZQVV9yb3VuZChzdDFfcHRyLCAxLCAwLCBGVUxMX1BSRUNJU0lPTiwgc2lnbiBeIHN0MV9zaWduKTsKKyAgRlBVX3NldHRhZ2koMSwgdGFnKTsKKworICBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAoKTsgIC8qIDgwNDg2IGFwcGVhcnMgdG8gYWx3YXlzIGRvIHRoaXMgKi8KKworICByZXR1cm47CisKK30KKworCisvKi0tLSBwb2x5X2wycDEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICAgQmFzZSAyIGxvZ2FyaXRobSBieSBhIHBvbHlub21pYWwgYXBwcm94aW1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBsb2cyKHgrMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQJcG9seV9sMnAxKHVfY2hhciBzaWduMCwgdV9jaGFyIHNpZ24xLAorCQkgIEZQVV9SRUcgKnN0MF9wdHIsIEZQVV9SRUcgKnN0MV9wdHIsIEZQVV9SRUcgKmRlc3QpCit7CisgIHVfY2hhciAgICAgICAgICAgICAJdGFnOworICBsb25nIGludCAgICAgICAgCWV4cG9uZW50OworICBYc2lnICAgICAgICAgICAgICAJYWNjdW11bGF0b3IsIHlhY2N1bTsKKworICBpZiAoIGV4cG9uZW50MTYoc3QwX3B0cikgPCAwICkKKyAgICB7CisgICAgICBsb2cyX2tlcm5lbChzdDBfcHRyLCBzaWduMCwgJmFjY3VtdWxhdG9yLCAmZXhwb25lbnQpOworCisgICAgICB5YWNjdW0ubHN3ID0gMDsKKyAgICAgIFhTSUdfTEwoeWFjY3VtKSA9IHNpZ25pZmljYW5kKHN0MV9wdHIpOworICAgICAgbXVsX1hzaWdfWHNpZygmYWNjdW11bGF0b3IsICZ5YWNjdW0pOworCisgICAgICBleHBvbmVudCArPSByb3VuZF9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIGV4cG9uZW50ICs9IGV4cG9uZW50MTYoc3QxX3B0cikgKyAxOworICAgICAgaWYgKCBleHBvbmVudCA8IEVYUF9XQVlfVU5ERVIgKSBleHBvbmVudCA9IEVYUF9XQVlfVU5ERVI7CisKKyAgICAgIHNpZ25pZmljYW5kKGRlc3QpID0gWFNJR19MTChhY2N1bXVsYXRvcik7CisgICAgICBzZXRleHBvbmVudDE2KGRlc3QsIGV4cG9uZW50KTsKKworICAgICAgdGFnID0gRlBVX3JvdW5kKGRlc3QsIDEsIDAsIEZVTExfUFJFQ0lTSU9OLCBzaWduMCBeIHNpZ24xKTsKKyAgICAgIEZQVV9zZXR0YWdpKDEsIHRhZyk7CisKKyAgICAgIGlmICggdGFnID09IFRBR19WYWxpZCApCisJc2V0X3ByZWNpc2lvbl9mbGFnX3VwKCk7ICAgLyogODA0ODYgYXBwZWFycyB0byBhbHdheXMgZG8gdGhpcyAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRoZSBtYWduaXR1ZGUgb2Ygc3QwX3B0ciBpcyBmYXIgdG9vIGxhcmdlLiAqLworCisgICAgICBpZiAoIHNpZ24wICE9IFNJR05fUE9TICkKKwl7CisJICAvKiBUcnlpbmcgdG8gZ2V0IHRoZSBsb2cgb2YgYSBuZWdhdGl2ZSBudW1iZXIuICovCisjaWZkZWYgUEVDVUxJQVJfNDg2ICAgLyogU3R1cGlkIDgwNDg2IGRvZXNuJ3Qgd29ycnkgYWJvdXQgbG9nKG5lZ2F0aXZlKS4gKi8KKwkgIGNoYW5nZXNpZ24oc3QxX3B0cik7CisjZWxzZQorCSAgaWYgKCBhcml0aF9pbnZhbGlkKDEpIDwgMCApCisJICAgIHJldHVybiAxOworI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLworCX0KKworICAgICAgLyogODA0ODYgYXBwZWFycyB0byBkbyB0aGlzICovCisgICAgICBpZiAoIHNpZ24wID09IFNJR05fTkVHICkKKwlzZXRfcHJlY2lzaW9uX2ZsYWdfZG93bigpOworICAgICAgZWxzZQorCXNldF9wcmVjaXNpb25fZmxhZ191cCgpOworICAgIH0KKworICBpZiAoIGV4cG9uZW50KGRlc3QpIDw9IEVYUF9VTkRFUiApCisgICAgRVhDRVBUSU9OKEVYX1VuZGVyZmxvdyk7CisKKyAgcmV0dXJuIDA7CisKK30KKworCisKKworI3VuZGVmIEhJUE9XRVIKKyNkZWZpbmUJSElQT1dFUgkxMAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBsb2d0ZXJtc1tISVBPV0VSXSA9Cit7CisgIDB4MmE4ZWNhNTcwNWZjMmVmMExMLAorICAweGY2Mzg0ZWUxZDAxZmViY2VMTCwKKyAgMHgwOTNiYjYyODc3Y2RmNjQyTEwsCisgIDB4MDA2OTg1ZDhhOWVjNDM5YkxMLAorICAweDAwMDUyMTJjNGY1NWE5YzhMTCwKKyAgMHgwMDAwNDMyNmExNjkyN2YwTEwsCisgIDB4MDAwMDAzOGQxZDgwYTBlN0xMLAorICAweDAwMDAwMDMxNDFjYzgwYzZMTCwKKyAgMHgwMDAwMDAwMmIxNjY4YzlmTEwsCisgIDB4MDAwMDAwMDAyYzdhNDZhYUxMCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsZWFkdGVybSA9IDB4YjgwMDAwMDA7CisKKworLyotLS0gbG9nMl9rZXJuZWwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgIEJhc2UgMiBsb2dhcml0aG0gYnkgYSBwb2x5bm9taWFsIGFwcHJveGltYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgbG9nMih4KzEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgbG9nMl9rZXJuZWwoRlBVX1JFRyBjb25zdCAqYXJnLCB1X2NoYXIgYXJnc2lnbiwgWHNpZyAqYWNjdW1fcmVzdWx0LAorCQkJbG9uZyBpbnQgKmV4cG9uKQoreworICBsb25nIGludCAgICAgICAgICAgICBleHBvbmVudCwgYWRqOworICB1bnNpZ25lZCBsb25nIGxvbmcgICBYc3E7CisgIFhzaWcgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yLCBOdW1lciwgRGVub20sIGFyZ1NpZ25pZiwgYXJnX3NpZ25pZjsKKworICBleHBvbmVudCA9IGV4cG9uZW50MTYoYXJnKTsKKyAgTnVtZXIubHN3ID0gRGVub20ubHN3ID0gMDsKKyAgWFNJR19MTChOdW1lcikgPSBYU0lHX0xMKERlbm9tKSA9IHNpZ25pZmljYW5kKGFyZyk7CisgIGlmICggYXJnc2lnbiA9PSBTSUdOX1BPUyApCisgICAgeworICAgICAgc2hyX1hzaWcoJkRlbm9tLCAyIC0gKDEgKyBleHBvbmVudCkpOworICAgICAgRGVub20ubXN3IHw9IDB4ODAwMDAwMDA7CisgICAgICBkaXZfWHNpZygmTnVtZXIsICZEZW5vbSwgJmFyZ1NpZ25pZik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2hyX1hzaWcoJkRlbm9tLCAxIC0gKDEgKyBleHBvbmVudCkpOworICAgICAgbmVnYXRlX1hzaWcoJkRlbm9tKTsKKyAgICAgIGlmICggRGVub20ubXN3ICYgMHg4MDAwMDAwMCApCisJeworCSAgZGl2X1hzaWcoJk51bWVyLCAmRGVub20sICZhcmdTaWduaWYpOworCSAgZXhwb25lbnQgKys7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIERlbm9tIG11c3QgYmUgMS4wICovCisJICBhcmdTaWduaWYubHN3ID0gTnVtZXIubHN3OyBhcmdTaWduaWYubWlkdyA9IE51bWVyLm1pZHc7CisJICBhcmdTaWduaWYubXN3ID0gTnVtZXIubXN3OworCX0KKyAgICB9CisKKyNpZm5kZWYgUEVDVUxJQVJfNDg2CisgIC8qIFNob3VsZCBjaGVjayBoZXJlIHRoYXQgIHxsb2NhbF9hcmd8ICBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlICovCisgIGlmICggZXhwb25lbnQgPj0gLTIgKQorICAgIHsKKyAgICAgIGlmICggKGV4cG9uZW50ID4gLTIpIHx8CisJICAoYXJnU2lnbmlmLm1zdyA+ICh1bnNpZ25lZCkweGFmYjBjY2MwKSApCisJeworCSAgLyogVGhlIGFyZ3VtZW50IGlzIHRvbyBsYXJnZSAqLworCX0KKyAgICB9CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisKKyAgYXJnX3NpZ25pZi5sc3cgPSBhcmdTaWduaWYubHN3OyBYU0lHX0xMKGFyZ19zaWduaWYpID0gWFNJR19MTChhcmdTaWduaWYpOworICBhZGogPSBub3JtX1hzaWcoJmFyZ1NpZ25pZik7CisgIGFjY3VtdWxhdG9yLmxzdyA9IGFyZ1NpZ25pZi5sc3c7IFhTSUdfTEwoYWNjdW11bGF0b3IpID0gWFNJR19MTChhcmdTaWduaWYpOworICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmFjY3VtdWxhdG9yKTsKKyAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCAyKigtMSAtICgxICsgZXhwb25lbnQgKyBhZGopKSk7CisgIFhzcSA9IFhTSUdfTEwoYWNjdW11bGF0b3IpOworICBpZiAoIGFjY3VtdWxhdG9yLmxzdyAmIDB4ODAwMDAwMDAgKQorICAgIFhzcSsrOworCisgIGFjY3VtdWxhdG9yLm1zdyA9IGFjY3VtdWxhdG9yLm1pZHcgPSBhY2N1bXVsYXRvci5sc3cgPSAwOworICAvKiBEbyB0aGUgYmFzaWMgZml4ZWQgcG9pbnQgcG9seW5vbWlhbCBldmFsdWF0aW9uICovCisgIHBvbHlub21pYWxfWHNpZygmYWNjdW11bGF0b3IsICZYc3EsIGxvZ3Rlcm1zLCBISVBPV0VSLTEpOworCisgIG11bF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmYXJnU2lnbmlmKTsKKyAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCA2IC0gYWRqKTsKKworICBtdWwzMl9Yc2lnKCZhcmdfc2lnbmlmLCBsZWFkdGVybSk7CisgIGFkZF90d29fWHNpZygmYWNjdW11bGF0b3IsICZhcmdfc2lnbmlmLCAmZXhwb25lbnQpOworCisgICpleHBvbiA9IGV4cG9uZW50ICsgMTsKKyAgYWNjdW1fcmVzdWx0LT5sc3cgPSBhY2N1bXVsYXRvci5sc3c7CisgIGFjY3VtX3Jlc3VsdC0+bWlkdyA9IGFjY3VtdWxhdG9yLm1pZHc7CisgIGFjY3VtX3Jlc3VsdC0+bXN3ID0gYWNjdW11bGF0b3IubXN3OworCit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcG9seV9zaW4uYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9wb2x5X3Npbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjMxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcG9seV9zaW4uYwpAQCAtMCwwICsxLDM5NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcG9seV9zaW4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIENvbXB1dGF0aW9uIG9mIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIHNpbiBmdW5jdGlvbiBhbmQgdGhlIGNvc2luZSAgICAgICB8CisgfCAgZnVuY3Rpb24gYnkgYSBwb2x5bm9taWFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3LDE5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1AbWVsYnBjLm9yZy5hdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAicmVnX2NvbnN0YW50LmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKyNpbmNsdWRlICJwb2x5LmgiCisKKworI2RlZmluZQlOX0NPRUZGX1AJNAorI2RlZmluZQlOX0NPRUZGX04JNAorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIHBvc190ZXJtc19sW05fQ09FRkZfUF0gPQoreworICAweGFhYWFhYWFhYWFhYWFhYWJMTCwKKyAgMHgwMGQwMGQwMGQwMGNmOTA2TEwsCisgIDB4MDAwMDA2Yjk5MTU5YThiYkxMLAorICAweDAwMDAwMDAwMGQ3MzkyZTZMTAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBuZWdfdGVybXNfbFtOX0NPRUZGX05dID0KK3sKKyAgMHgyMjIyMjIyMjIyMjIyMTY3TEwsCisgIDB4MDAwMmUzYmM3NGFhYjYyNExMLAorICAweDAwMDAwMDBiMDkyMjkwNjJMTCwKKyAgMHgwMDAwMDAwMDAwMGM3OTczTEwKK307CisKKworCisjZGVmaW5lCU5fQ09FRkZfUEgJNAorI2RlZmluZQlOX0NPRUZGX05ICTQKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgcG9zX3Rlcm1zX2hbTl9DT0VGRl9QSF0gPQoreworICAweDAwMDAwMDAwMDAwMDAwMDBMTCwKKyAgMHgwNWIwNWIwNWIwNWIwNDA2TEwsCisgIDB4MDAwMDQ5ZjkzZWRkOTFhOUxMLAorICAweDAwMDAwMDAwYzljOWVkNjJMTAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBuZWdfdGVybXNfaFtOX0NPRUZGX05IXSA9Cit7CisgIDB4YWFhYWFhYWFhYWFhYWE5OExMLAorICAweDAwMWEwMWEwMWEwMTkwNjRMTCwKKyAgMHgwMDAwMDA4Zjc2YzY4YTc3TEwsCisgIDB4MDAwMDAwMDAwMGQ1OGY1ZUxMCit9OworCisKKy8qLS0tIHBvbHlfc2luZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkCXBvbHlfc2luZShGUFVfUkVHICpzdDBfcHRyKQoreworICBpbnQgICAgICAgICAgICAgICAgIGV4cG9uZW50LCBlY2hhbmdlOworICBYc2lnICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yLCBhcmdTcXJkLCBhcmdUbzQ7CisgIHVuc2lnbmVkIGxvbmcgICAgICAgZml4X3VwLCBhZGo7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyAgZml4ZWRfYXJnOworICBGUFVfUkVHCSAgICAgIHJlc3VsdDsKKworICBleHBvbmVudCA9IGV4cG9uZW50KHN0MF9wdHIpOworCisgIGFjY3VtdWxhdG9yLmxzdyA9IGFjY3VtdWxhdG9yLm1pZHcgPSBhY2N1bXVsYXRvci5tc3cgPSAwOworCisgIC8qIFNwbGl0IGludG8gdHdvIHJhbmdlcywgZm9yIGFyZ3VtZW50cyBiZWxvdyBhbmQgYWJvdmUgMS4wICovCisgIC8qIFRoZSBib3VuZGFyeSBiZXR3ZWVuIHVwcGVyIGFuZCBsb3dlciBpcyBhcHByb3ggMC44ODMwOTEwMTI1OSAqLworICBpZiAoIChleHBvbmVudCA8IC0xKSB8fCAoKGV4cG9uZW50ID09IC0xKSAmJiAoc3QwX3B0ci0+c2lnaCA8PSAweGUyMTI0MGFhKSkgKQorICAgIHsKKyAgICAgIC8qIFRoZSBhcmd1bWVudCBpcyA8PSAwLjg4MzA5MTAxMjU5ICovCisKKyAgICAgIGFyZ1NxcmQubXN3ID0gc3QwX3B0ci0+c2lnaDsgYXJnU3FyZC5taWR3ID0gc3QwX3B0ci0+c2lnbDsgYXJnU3FyZC5sc3cgPSAwOworICAgICAgbXVsNjRfWHNpZygmYXJnU3FyZCwgJnNpZ25pZmljYW5kKHN0MF9wdHIpKTsKKyAgICAgIHNocl9Yc2lnKCZhcmdTcXJkLCAyKigtMS1leHBvbmVudCkpOworICAgICAgYXJnVG80Lm1zdyA9IGFyZ1NxcmQubXN3OyBhcmdUbzQubWlkdyA9IGFyZ1NxcmQubWlkdzsKKyAgICAgIGFyZ1RvNC5sc3cgPSBhcmdTcXJkLmxzdzsKKyAgICAgIG11bF9Yc2lnX1hzaWcoJmFyZ1RvNCwgJmFyZ1RvNCk7CisKKyAgICAgIHBvbHlub21pYWxfWHNpZygmYWNjdW11bGF0b3IsICZYU0lHX0xMKGFyZ1RvNCksIG5lZ190ZXJtc19sLAorCQkgICAgICBOX0NPRUZGX04tMSk7CisgICAgICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmFyZ1NxcmQpOworICAgICAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKworICAgICAgcG9seW5vbWlhbF9Yc2lnKCZhY2N1bXVsYXRvciwgJlhTSUdfTEwoYXJnVG80KSwgcG9zX3Rlcm1zX2wsCisJCSAgICAgIE5fQ09FRkZfUC0xKTsKKworICAgICAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCAyKTsgICAgLyogRGl2aWRlIGJ5IGZvdXIgKi8KKyAgICAgIGFjY3VtdWxhdG9yLm1zdyB8PSAweDgwMDAwMDAwOyAgLyogQWRkIDEuMCAqLworCisgICAgICBtdWw2NF9Yc2lnKCZhY2N1bXVsYXRvciwgJnNpZ25pZmljYW5kKHN0MF9wdHIpKTsKKyAgICAgIG11bDY0X1hzaWcoJmFjY3VtdWxhdG9yLCAmc2lnbmlmaWNhbmQoc3QwX3B0cikpOworICAgICAgbXVsNjRfWHNpZygmYWNjdW11bGF0b3IsICZzaWduaWZpY2FuZChzdDBfcHRyKSk7CisKKyAgICAgIC8qIERpdmlkZSBieSBmb3VyLCBGUFVfUkVHIGNvbXBhdGlibGUsIGV0YyAqLworICAgICAgZXhwb25lbnQgPSAzKmV4cG9uZW50OworCisgICAgICAvKiBUaGUgbWluaW11bSBleHBvbmVudCBkaWZmZXJlbmNlIGlzIDMgKi8KKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgZXhwb25lbnQoc3QwX3B0cikgLSBleHBvbmVudCk7CisKKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisgICAgICBYU0lHX0xMKGFjY3VtdWxhdG9yKSArPSBzaWduaWZpY2FuZChzdDBfcHRyKTsKKworICAgICAgZWNoYW5nZSA9IHJvdW5kX1hzaWcoJmFjY3VtdWxhdG9yKTsKKworICAgICAgc2V0ZXhwb25lbnRwb3MoJnJlc3VsdCwgZXhwb25lbnQoc3QwX3B0cikgKyBlY2hhbmdlKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBUaGUgYXJndW1lbnQgaXMgPiAwLjg4MzA5MTAxMjU5ICovCisgICAgICAvKiBXZSB1c2Ugc2luKHN0KDApKSA9IGNvcyhwaS8yLXN0KDApKSAqLworCisgICAgICBmaXhlZF9hcmcgPSBzaWduaWZpY2FuZChzdDBfcHRyKTsKKworICAgICAgaWYgKCBleHBvbmVudCA9PSAwICkKKwl7CisJICAvKiBUaGUgYXJndW1lbnQgaXMgPj0gMS4wICovCisKKwkgIC8qIFB1dCB0aGUgYmluYXJ5IHBvaW50IGF0IHRoZSBsZWZ0LiAqLworCSAgZml4ZWRfYXJnIDw8PSAxOworCX0KKyAgICAgIC8qIHBpLzIgaW4gaGV4IGlzOiAxLjkyMWZiNTQ0NDJkMTg0NjkgODk4Q0M1MTcwMUI4MzlBMiA1MjA0OUMxICovCisgICAgICBmaXhlZF9hcmcgPSAweDkyMWZiNTQ0NDJkMTg0NjlMTCAtIGZpeGVkX2FyZzsKKyAgICAgIC8qIFRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlIHdoaWNoIGFyaXNlcyBkdWUgdG8gcm91bmRpbmcsIHRvIGZpeCBoZXJlLiAqLworICAgICAgaWYgKCBmaXhlZF9hcmcgPT0gMHhmZmZmZmZmZmZmZmZmZmZmTEwgKQorCWZpeGVkX2FyZyA9IDA7CisKKyAgICAgIFhTSUdfTEwoYXJnU3FyZCkgPSBmaXhlZF9hcmc7IGFyZ1NxcmQubHN3ID0gMDsKKyAgICAgIG11bDY0X1hzaWcoJmFyZ1NxcmQsICZmaXhlZF9hcmcpOworCisgICAgICBYU0lHX0xMKGFyZ1RvNCkgPSBYU0lHX0xMKGFyZ1NxcmQpOyBhcmdUbzQubHN3ID0gYXJnU3FyZC5sc3c7CisgICAgICBtdWxfWHNpZ19Yc2lnKCZhcmdUbzQsICZhcmdUbzQpOworCisgICAgICBwb2x5bm9taWFsX1hzaWcoJmFjY3VtdWxhdG9yLCAmWFNJR19MTChhcmdUbzQpLCBuZWdfdGVybXNfaCwKKwkJICAgICAgTl9DT0VGRl9OSC0xKTsKKyAgICAgIG11bF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmYXJnU3FyZCk7CisgICAgICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3IpOworCisgICAgICBwb2x5bm9taWFsX1hzaWcoJmFjY3VtdWxhdG9yLCAmWFNJR19MTChhcmdUbzQpLCBwb3NfdGVybXNfaCwKKwkJICAgICAgTl9DT0VGRl9QSC0xKTsKKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIG11bDY0X1hzaWcoJmFjY3VtdWxhdG9yLCAmZml4ZWRfYXJnKTsKKyAgICAgIG11bDY0X1hzaWcoJmFjY3VtdWxhdG9yLCAmZml4ZWRfYXJnKTsKKworICAgICAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCAzKTsKKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIGFkZF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmYXJnU3FyZCk7CisKKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgMSk7CisKKyAgICAgIGFjY3VtdWxhdG9yLmxzdyB8PSAxOyAgLyogQSB6ZXJvIGFjY3VtdWxhdG9yIGhlcmUgd291bGQgY2F1c2UgcHJvYmxlbXMgKi8KKyAgICAgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIC8qIFRoZSBiYXNpYyBjb21wdXRhdGlvbiBpcyBjb21wbGV0ZS4gTm93IGZpeCB0aGUgYW5zd2VyIHRvCisJIGNvbXBlbnNhdGUgZm9yIHRoZSBlcnJvciBkdWUgdG8gdGhlIGFwcHJveGltYXRpb24gdXNlZCBmb3IKKwkgcGkvMgorCSAqLworCisgICAgICAvKiBUaGlzIGhhcyBhbiBleHBvbmVudCBvZiAtNjUgKi8KKyAgICAgIGZpeF91cCA9IDB4ODk4Y2M1MTc7CisgICAgICAvKiBUaGUgZml4LXVwIG5lZWRzIHRvIGJlIGltcHJvdmVkIGZvciBsYXJnZXIgYXJncyAqLworICAgICAgaWYgKCBhcmdTcXJkLm1zdyAmIDB4ZmZjMDAwMDAgKQorCXsKKwkgIC8qIEdldCBhYm91dCAzMiBiaXQgcHJlY2lzaW9uIGluIHRoZXNlOiAqLworCSAgZml4X3VwIC09IG11bF8zMl8zMigweDg5OGNjNTE3LCBhcmdTcXJkLm1zdykgLyA2OworCX0KKyAgICAgIGZpeF91cCA9IG11bF8zMl8zMihmaXhfdXAsIExMX01TVyhmaXhlZF9hcmcpKTsKKworICAgICAgYWRqID0gYWNjdW11bGF0b3IubHN3OyAgICAvKiB0ZW1wIHNhdmUgKi8KKyAgICAgIGFjY3VtdWxhdG9yLmxzdyAtPSBmaXhfdXA7CisgICAgICBpZiAoIGFjY3VtdWxhdG9yLmxzdyA+IGFkaiApCisJWFNJR19MTChhY2N1bXVsYXRvcikgLS07CisKKyAgICAgIGVjaGFuZ2UgPSByb3VuZF9Yc2lnKCZhY2N1bXVsYXRvcik7CisKKyAgICAgIHNldGV4cG9uZW50cG9zKCZyZXN1bHQsIGVjaGFuZ2UgLSAxKTsKKyAgICB9CisKKyAgc2lnbmlmaWNhbmQoJnJlc3VsdCkgPSBYU0lHX0xMKGFjY3VtdWxhdG9yKTsKKyAgc2V0c2lnbigmcmVzdWx0LCBnZXRzaWduKHN0MF9wdHIpKTsKKyAgRlBVX2NvcHlfdG9fcmVnMCgmcmVzdWx0LCBUQUdfVmFsaWQpOworCisjaWZkZWYgUEFSQU5PSUQKKyAgaWYgKCAoZXhwb25lbnQoJnJlc3VsdCkgPj0gMCkKKyAgICAgICYmIChzaWduaWZpY2FuZCgmcmVzdWx0KSA+IDB4ODAwMDAwMDAwMDAwMDAwMExMKSApCisgICAgeworICAgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTUwKTsKKyAgICB9CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworfQorCisKKworLyotLS0gcG9seV9jb3MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQJcG9seV9jb3MoRlBVX1JFRyAqc3QwX3B0cikKK3sKKyAgRlBVX1JFRwkgICAgICByZXN1bHQ7CisgIGxvbmcgaW50ICAgICAgICAgICAgZXhwb25lbnQsIGV4cDIsIGVjaGFuZ2U7CisgIFhzaWcgICAgICAgICAgICAgICAgYWNjdW11bGF0b3IsIGFyZ1NxcmQsIGZpeF91cCwgYXJnVG80OworICB1bnNpZ25lZCBsb25nIGxvbmcgIGZpeGVkX2FyZzsKKworI2lmZGVmIFBBUkFOT0lECisgIGlmICggKGV4cG9uZW50KHN0MF9wdHIpID4gMCkKKyAgICAgIHx8ICgoZXhwb25lbnQoc3QwX3B0cikgPT0gMCkKKwkgICYmIChzaWduaWZpY2FuZChzdDBfcHRyKSA+IDB4YzkwZmRhYTIyMTY4YzIzNExMKSkgKQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZzAoJkNPTlNUX1FOYU4sIFRBR19TcGVjaWFsKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworICBleHBvbmVudCA9IGV4cG9uZW50KHN0MF9wdHIpOworCisgIGFjY3VtdWxhdG9yLmxzdyA9IGFjY3VtdWxhdG9yLm1pZHcgPSBhY2N1bXVsYXRvci5tc3cgPSAwOworCisgIGlmICggKGV4cG9uZW50IDwgLTEpIHx8ICgoZXhwb25lbnQgPT0gLTEpICYmIChzdDBfcHRyLT5zaWdoIDw9IDB4YjAwZDZmNTQpKSApCisgICAgeworICAgICAgLyogYXJnIGlzIDwgMC42ODc3MDUgKi8KKworICAgICAgYXJnU3FyZC5tc3cgPSBzdDBfcHRyLT5zaWdoOyBhcmdTcXJkLm1pZHcgPSBzdDBfcHRyLT5zaWdsOworICAgICAgYXJnU3FyZC5sc3cgPSAwOworICAgICAgbXVsNjRfWHNpZygmYXJnU3FyZCwgJnNpZ25pZmljYW5kKHN0MF9wdHIpKTsKKworICAgICAgaWYgKCBleHBvbmVudCA8IC0xICkKKwl7CisJICAvKiBzaGlmdCB0aGUgYXJndW1lbnQgcmlnaHQgYnkgdGhlIHJlcXVpcmVkIHBsYWNlcyAqLworCSAgc2hyX1hzaWcoJmFyZ1NxcmQsIDIqKC0xLWV4cG9uZW50KSk7CisJfQorCisgICAgICBhcmdUbzQubXN3ID0gYXJnU3FyZC5tc3c7IGFyZ1RvNC5taWR3ID0gYXJnU3FyZC5taWR3OworICAgICAgYXJnVG80LmxzdyA9IGFyZ1NxcmQubHN3OworICAgICAgbXVsX1hzaWdfWHNpZygmYXJnVG80LCAmYXJnVG80KTsKKworICAgICAgcG9seW5vbWlhbF9Yc2lnKCZhY2N1bXVsYXRvciwgJlhTSUdfTEwoYXJnVG80KSwgbmVnX3Rlcm1zX2gsCisJCSAgICAgIE5fQ09FRkZfTkgtMSk7CisgICAgICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmFyZ1NxcmQpOworICAgICAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKworICAgICAgcG9seW5vbWlhbF9Yc2lnKCZhY2N1bXVsYXRvciwgJlhTSUdfTEwoYXJnVG80KSwgcG9zX3Rlcm1zX2gsCisJCSAgICAgIE5fQ09FRkZfUEgtMSk7CisgICAgICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3IpOworCisgICAgICBtdWw2NF9Yc2lnKCZhY2N1bXVsYXRvciwgJnNpZ25pZmljYW5kKHN0MF9wdHIpKTsKKyAgICAgIG11bDY0X1hzaWcoJmFjY3VtdWxhdG9yLCAmc2lnbmlmaWNhbmQoc3QwX3B0cikpOworICAgICAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCAtMiooMStleHBvbmVudCkpOworCisgICAgICBzaHJfWHNpZygmYWNjdW11bGF0b3IsIDMpOworICAgICAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKworICAgICAgYWRkX1hzaWdfWHNpZygmYWNjdW11bGF0b3IsICZhcmdTcXJkKTsKKworICAgICAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCAxKTsKKworICAgICAgLyogSXQgZG9lc24ndCBtYXR0ZXIgaWYgYWNjdW11bGF0b3IgaXMgYWxsIHplcm8gaGVyZSwgdGhlCisJIGZvbGxvd2luZyBjb2RlIHdpbGwgd29yayBvayAqLworICAgICAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKworICAgICAgaWYgKCBhY2N1bXVsYXRvci5sc3cgJiAweDgwMDAwMDAwICkKKwlYU0lHX0xMKGFjY3VtdWxhdG9yKSArKzsKKyAgICAgIGlmICggYWNjdW11bGF0b3IubXN3ID09IDAgKQorCXsKKwkgIC8qIFRoZSByZXN1bHQgaXMgMS4wICovCisJICBGUFVfY29weV90b19yZWcwKCZDT05TVF8xLCBUQUdfVmFsaWQpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzaWduaWZpY2FuZCgmcmVzdWx0KSA9IFhTSUdfTEwoYWNjdW11bGF0b3IpOworICAgICAgCisJICAvKiB3aWxsIGJlIGEgdmFsaWQgcG9zaXRpdmUgbnIgd2l0aCBleHBvbiA9IC0xICovCisJICBzZXRleHBvbmVudHBvcygmcmVzdWx0LCAtMSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZpeGVkX2FyZyA9IHNpZ25pZmljYW5kKHN0MF9wdHIpOworCisgICAgICBpZiAoIGV4cG9uZW50ID09IDAgKQorCXsKKwkgIC8qIFRoZSBhcmd1bWVudCBpcyA+PSAxLjAgKi8KKworCSAgLyogUHV0IHRoZSBiaW5hcnkgcG9pbnQgYXQgdGhlIGxlZnQuICovCisJICBmaXhlZF9hcmcgPDw9IDE7CisJfQorICAgICAgLyogcGkvMiBpbiBoZXggaXM6IDEuOTIxZmI1NDQ0MmQxODQ2OSA4OThDQzUxNzAxQjgzOUEyIDUyMDQ5QzEgKi8KKyAgICAgIGZpeGVkX2FyZyA9IDB4OTIxZmI1NDQ0MmQxODQ2OUxMIC0gZml4ZWRfYXJnOworICAgICAgLyogVGhlcmUgaXMgYSBzcGVjaWFsIGNhc2Ugd2hpY2ggYXJpc2VzIGR1ZSB0byByb3VuZGluZywgdG8gZml4IGhlcmUuICovCisgICAgICBpZiAoIGZpeGVkX2FyZyA9PSAweGZmZmZmZmZmZmZmZmZmZmZMTCApCisJZml4ZWRfYXJnID0gMDsKKworICAgICAgZXhwb25lbnQgPSAtMTsKKyAgICAgIGV4cDIgPSAtMTsKKworICAgICAgLyogQSBzaGlmdCBpcyBuZWVkZWQgaGVyZSBvbmx5IGZvciBhIG5hcnJvdyByYW5nZSBvZiBhcmd1bWVudHMsCisJIGkuZS4gZm9yIGZpeGVkX2FyZyBhcHByb3ggMl4tMzIsIGJ1dCB3ZSBwaWNrIHVwIG1vcmUuLi4gKi8KKyAgICAgIGlmICggIShMTF9NU1coZml4ZWRfYXJnKSAmIDB4ZmZmZjAwMDApICkKKwl7CisJICBmaXhlZF9hcmcgPDw9IDE2OworCSAgZXhwb25lbnQgLT0gMTY7CisJICBleHAyIC09IDE2OworCX0KKworICAgICAgWFNJR19MTChhcmdTcXJkKSA9IGZpeGVkX2FyZzsgYXJnU3FyZC5sc3cgPSAwOworICAgICAgbXVsNjRfWHNpZygmYXJnU3FyZCwgJmZpeGVkX2FyZyk7CisKKyAgICAgIGlmICggZXhwb25lbnQgPCAtMSApCisJeworCSAgLyogc2hpZnQgdGhlIGFyZ3VtZW50IHJpZ2h0IGJ5IHRoZSByZXF1aXJlZCBwbGFjZXMgKi8KKwkgIHNocl9Yc2lnKCZhcmdTcXJkLCAyKigtMS1leHBvbmVudCkpOworCX0KKworICAgICAgYXJnVG80Lm1zdyA9IGFyZ1NxcmQubXN3OyBhcmdUbzQubWlkdyA9IGFyZ1NxcmQubWlkdzsKKyAgICAgIGFyZ1RvNC5sc3cgPSBhcmdTcXJkLmxzdzsKKyAgICAgIG11bF9Yc2lnX1hzaWcoJmFyZ1RvNCwgJmFyZ1RvNCk7CisKKyAgICAgIHBvbHlub21pYWxfWHNpZygmYWNjdW11bGF0b3IsICZYU0lHX0xMKGFyZ1RvNCksIG5lZ190ZXJtc19sLAorCQkgICAgICBOX0NPRUZGX04tMSk7CisgICAgICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvciwgJmFyZ1NxcmQpOworICAgICAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKworICAgICAgcG9seW5vbWlhbF9Yc2lnKCZhY2N1bXVsYXRvciwgJlhTSUdfTEwoYXJnVG80KSwgcG9zX3Rlcm1zX2wsCisJCSAgICAgIE5fQ09FRkZfUC0xKTsKKworICAgICAgc2hyX1hzaWcoJmFjY3VtdWxhdG9yLCAyKTsgICAgLyogRGl2aWRlIGJ5IGZvdXIgKi8KKyAgICAgIGFjY3VtdWxhdG9yLm1zdyB8PSAweDgwMDAwMDAwOyAgLyogQWRkIDEuMCAqLworCisgICAgICBtdWw2NF9Yc2lnKCZhY2N1bXVsYXRvciwgJmZpeGVkX2FyZyk7CisgICAgICBtdWw2NF9Yc2lnKCZhY2N1bXVsYXRvciwgJmZpeGVkX2FyZyk7CisgICAgICBtdWw2NF9Yc2lnKCZhY2N1bXVsYXRvciwgJmZpeGVkX2FyZyk7CisKKyAgICAgIC8qIERpdmlkZSBieSBmb3VyLCBGUFVfUkVHIGNvbXBhdGlibGUsIGV0YyAqLworICAgICAgZXhwb25lbnQgPSAzKmV4cG9uZW50OworCisgICAgICAvKiBUaGUgbWluaW11bSBleHBvbmVudCBkaWZmZXJlbmNlIGlzIDMgKi8KKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgZXhwMiAtIGV4cG9uZW50KTsKKworICAgICAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yKTsKKyAgICAgIFhTSUdfTEwoYWNjdW11bGF0b3IpICs9IGZpeGVkX2FyZzsKKworICAgICAgLyogVGhlIGJhc2ljIGNvbXB1dGF0aW9uIGlzIGNvbXBsZXRlLiBOb3cgZml4IHRoZSBhbnN3ZXIgdG8KKwkgY29tcGVuc2F0ZSBmb3IgdGhlIGVycm9yIGR1ZSB0byB0aGUgYXBwcm94aW1hdGlvbiB1c2VkIGZvcgorCSBwaS8yCisJICovCisKKyAgICAgIC8qIFRoaXMgaGFzIGFuIGV4cG9uZW50IG9mIC02NSAqLworICAgICAgWFNJR19MTChmaXhfdXApID0gMHg4OThjYzUxNzAxYjgzOWEybGw7CisgICAgICBmaXhfdXAubHN3ID0gMDsKKworICAgICAgLyogVGhlIGZpeC11cCBuZWVkcyB0byBiZSBpbXByb3ZlZCBmb3IgbGFyZ2VyIGFyZ3MgKi8KKyAgICAgIGlmICggYXJnU3FyZC5tc3cgJiAweGZmYzAwMDAwICkKKwl7CisJICAvKiBHZXQgYWJvdXQgMzIgYml0IHByZWNpc2lvbiBpbiB0aGVzZTogKi8KKwkgIGZpeF91cC5tc3cgLT0gbXVsXzMyXzMyKDB4ODk4Y2M1MTcsIGFyZ1NxcmQubXN3KSAvIDI7CisJICBmaXhfdXAubXN3ICs9IG11bF8zMl8zMigweDg5OGNjNTE3LCBhcmdUbzQubXN3KSAvIDI0OworCX0KKworICAgICAgZXhwMiArPSBub3JtX1hzaWcoJmFjY3VtdWxhdG9yKTsKKyAgICAgIHNocl9Yc2lnKCZhY2N1bXVsYXRvciwgMSk7IC8qIFByZXZlbnQgb3ZlcmZsb3cgKi8KKyAgICAgIGV4cDIrKzsKKyAgICAgIHNocl9Yc2lnKCZmaXhfdXAsIDY1ICsgZXhwMik7CisKKyAgICAgIGFkZF9Yc2lnX1hzaWcoJmFjY3VtdWxhdG9yLCAmZml4X3VwKTsKKworICAgICAgZWNoYW5nZSA9IHJvdW5kX1hzaWcoJmFjY3VtdWxhdG9yKTsKKworICAgICAgc2V0ZXhwb25lbnRwb3MoJnJlc3VsdCwgZXhwMiArIGVjaGFuZ2UpOworICAgICAgc2lnbmlmaWNhbmQoJnJlc3VsdCkgPSBYU0lHX0xMKGFjY3VtdWxhdG9yKTsKKyAgICB9CisKKyAgRlBVX2NvcHlfdG9fcmVnMCgmcmVzdWx0LCBUQUdfVmFsaWQpOworCisjaWZkZWYgUEFSQU5PSUQKKyAgaWYgKCAoZXhwb25lbnQoJnJlc3VsdCkgPj0gMCkKKyAgICAgICYmIChzaWduaWZpY2FuZCgmcmVzdWx0KSA+IDB4ODAwMDAwMDAwMDAwMDAwMExMKSApCisgICAgeworICAgICAgRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTUxKTsKKyAgICB9CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfdGFuLmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvcG9seV90YW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGYzZTAzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlfdGFuLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHBvbHlfdGFuLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvbXB1dGUgdGhlIHRhbiBvZiBhIEZQVV9SRUcsIHVzaW5nIGEgcG9seW5vbWlhbCBhcHByb3hpbWF0aW9uLiAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk0LDE5OTcsMTk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCAgIGJpbGxtQG1lbGJwYy5vcmcuYXUgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAicmVnX2NvbnN0YW50LmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKyNpbmNsdWRlICJwb2x5LmgiCisKKworI2RlZmluZQlIaVBPV0VSb3AJMwkvKiBvZGQgcG9seSwgcG9zaXRpdmUgdGVybXMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgb2RkcGx0ZXJtW0hpUE9XRVJvcF0gPQoreworICAweDAwMDAwMDAwMDAwMDAwMDBMTCwKKyAgMHgwMDUxYTFjZjA4ZmNhMjI4TEwsCisgIDB4MDAwMDAwMDA3MTI4NGZmN0xMCit9OworCisjZGVmaW5lCUhpUE9XRVJvbgkyCS8qIG9kZCBwb2x5LCBuZWdhdGl2ZSB0ZXJtcyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBvZGRuZWd0ZXJtW0hpUE9XRVJvbl0gPQoreworICAgMHgxMjkxYTlhMTg0MjQ0ZTgwTEwsCisgICAweDAwMDA1ODMyNDU4MTljMjFMTAorfTsKKworI2RlZmluZQlIaVBPV0VSZXAJMgkvKiBldmVuIHBvbHksIHBvc2l0aXZlIHRlcm1zICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIGV2ZW5wbHRlcm1bSGlQT1dFUmVwXSA9Cit7CisgIDB4MGU4NDg4ODRiNTM5ZTg4OExMLAorICAweDAwMDAzYzdmMThiODg3ZGFMTAorfTsKKworI2RlZmluZQlIaVBPV0VSZW4JMgkvKiBldmVuIHBvbHksIG5lZ2F0aXZlIHRlcm1zICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIGV2ZW5uZWd0ZXJtW0hpUE9XRVJlbl0gPQoreworICAweGYxZjAyMDBmZDUxNTY5Y2NMTCwKKyAgMHgwMDNhZmI0NjEwNWM0NDMyTEwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgdHdvdGhpcmRzID0gMHhhYWFhYWFhYWFhYWFhYWFiTEw7CisKKworLyotLS0gcG9seV90YW4oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQJcG9seV90YW4oRlBVX1JFRyAqc3QwX3B0cikKK3sKKyAgbG9uZyBpbnQgICAgCQlleHBvbmVudDsKKyAgaW50ICAgICAgICAgICAgICAgICAgIGludmVydDsKKyAgWHNpZyAgICAgICAgICAgICAgICAgIGFyZ1NxLCBhcmdTcVNxLCBhY2N1bXVsYXRvcm8sIGFjY3VtdWxhdG9yZSwgYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdTaWduaWYsIGZpeF91cDsKKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIGFkajsKKworICBleHBvbmVudCA9IGV4cG9uZW50KHN0MF9wdHIpOworCisjaWZkZWYgUEFSQU5PSUQKKyAgaWYgKCBzaWdubmVnYXRpdmUoc3QwX3B0cikgKQkvKiBDYW4ndCBoYWNrIGEgbnVtYmVyIDwgMC4wICovCisgICAgeyBhcml0aF9pbnZhbGlkKDApOyByZXR1cm47IH0gIC8qIE5lZWQgYSBwb3NpdGl2ZSBudW1iZXIgKi8KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisgIC8qIFNwbGl0IHRoZSBwcm9ibGVtIGludG8gdHdvIGRvbWFpbnMsIHNtYWxsZXIgYW5kIGxhcmdlciB0aGFuIHBpLzQgKi8KKyAgaWYgKCAoZXhwb25lbnQgPT0gMCkgfHwgKChleHBvbmVudCA9PSAtMSkgJiYgKHN0MF9wdHItPnNpZ2ggPiAweGM5MGZkYWEyKSkgKQorICAgIHsKKyAgICAgIC8qIFRoZSBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4gKGFwcHJveCkgcGkvNCAqLworICAgICAgaW52ZXJ0ID0gMTsKKyAgICAgIGFjY3VtLmxzdyA9IDA7CisgICAgICBYU0lHX0xMKGFjY3VtKSA9IHNpZ25pZmljYW5kKHN0MF9wdHIpOworIAorICAgICAgaWYgKCBleHBvbmVudCA9PSAwICkKKwl7CisJICAvKiBUaGUgYXJndW1lbnQgaXMgPj0gMS4wICovCisJICAvKiBQdXQgdGhlIGJpbmFyeSBwb2ludCBhdCB0aGUgbGVmdC4gKi8KKwkgIFhTSUdfTEwoYWNjdW0pIDw8PSAxOworCX0KKyAgICAgIC8qIHBpLzIgaW4gaGV4IGlzOiAxLjkyMWZiNTQ0NDJkMTg0NjkgODk4Q0M1MTcwMUI4MzlBMiA1MjA0OUMxICovCisgICAgICBYU0lHX0xMKGFjY3VtKSA9IDB4OTIxZmI1NDQ0MmQxODQ2OUxMIC0gWFNJR19MTChhY2N1bSk7CisgICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoaWNoIGFyaXNlcyBkdWUgdG8gcm91bmRpbmcuICovCisgICAgICBpZiAoIFhTSUdfTEwoYWNjdW0pID09IDB4ZmZmZmZmZmZmZmZmZmZmZkxMICkKKwl7CisJICBGUFVfc2V0dGFnMChUQUdfVmFsaWQpOworCSAgc2lnbmlmaWNhbmQoc3QwX3B0cikgPSAweDhhNTFlMDRkYWFiZGEzNjBMTDsKKwkgIHNldGV4cG9uZW50MTYoc3QwX3B0ciwgKDB4NDEgKyBFWFRFTkRFRF9FYmlhcykgfCBTSUdOX05lZ2F0aXZlKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGFyZ1NpZ25pZi5sc3cgPSBhY2N1bS5sc3c7CisgICAgICBYU0lHX0xMKGFyZ1NpZ25pZikgPSBYU0lHX0xMKGFjY3VtKTsKKyAgICAgIGV4cG9uZW50ID0gLTEgKyBub3JtX1hzaWcoJmFyZ1NpZ25pZik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW52ZXJ0ID0gMDsKKyAgICAgIGFyZ1NpZ25pZi5sc3cgPSAwOworICAgICAgWFNJR19MTChhY2N1bSkgPSBYU0lHX0xMKGFyZ1NpZ25pZikgPSBzaWduaWZpY2FuZChzdDBfcHRyKTsKKyAKKyAgICAgIGlmICggZXhwb25lbnQgPCAtMSApCisJeworCSAgLyogc2hpZnQgdGhlIGFyZ3VtZW50IHJpZ2h0IGJ5IHRoZSByZXF1aXJlZCBwbGFjZXMgKi8KKwkgIGlmICggRlBVX3NocngoJlhTSUdfTEwoYWNjdW0pLCAtMS1leHBvbmVudCkgPj0gMHg4MDAwMDAwMFUgKQorCSAgICBYU0lHX0xMKGFjY3VtKSArKzsJLyogcm91bmQgdXAgKi8KKwl9CisgICAgfQorCisgIFhTSUdfTEwoYXJnU3EpID0gWFNJR19MTChhY2N1bSk7IGFyZ1NxLmxzdyA9IGFjY3VtLmxzdzsKKyAgbXVsX1hzaWdfWHNpZygmYXJnU3EsICZhcmdTcSk7CisgIFhTSUdfTEwoYXJnU3FTcSkgPSBYU0lHX0xMKGFyZ1NxKTsgYXJnU3FTcS5sc3cgPSBhcmdTcS5sc3c7CisgIG11bF9Yc2lnX1hzaWcoJmFyZ1NxU3EsICZhcmdTcVNxKTsKKworICAvKiBDb21wdXRlIHRoZSBuZWdhdGl2ZSB0ZXJtcyBmb3IgdGhlIG51bWVyYXRvciBwb2x5bm9taWFsICovCisgIGFjY3VtdWxhdG9yby5tc3cgPSBhY2N1bXVsYXRvcm8ubWlkdyA9IGFjY3VtdWxhdG9yby5sc3cgPSAwOworICBwb2x5bm9taWFsX1hzaWcoJmFjY3VtdWxhdG9ybywgJlhTSUdfTEwoYXJnU3FTcSksIG9kZG5lZ3Rlcm0sIEhpUE9XRVJvbi0xKTsKKyAgbXVsX1hzaWdfWHNpZygmYWNjdW11bGF0b3JvLCAmYXJnU3EpOworICBuZWdhdGVfWHNpZygmYWNjdW11bGF0b3JvKTsKKyAgLyogQWRkIHRoZSBwb3NpdGl2ZSB0ZXJtcyAqLworICBwb2x5bm9taWFsX1hzaWcoJmFjY3VtdWxhdG9ybywgJlhTSUdfTEwoYXJnU3FTcSksIG9kZHBsdGVybSwgSGlQT1dFUm9wLTEpOworCisgIAorICAvKiBDb21wdXRlIHRoZSBwb3NpdGl2ZSB0ZXJtcyBmb3IgdGhlIGRlbm9taW5hdG9yIHBvbHlub21pYWwgKi8KKyAgYWNjdW11bGF0b3JlLm1zdyA9IGFjY3VtdWxhdG9yZS5taWR3ID0gYWNjdW11bGF0b3JlLmxzdyA9IDA7CisgIHBvbHlub21pYWxfWHNpZygmYWNjdW11bGF0b3JlLCAmWFNJR19MTChhcmdTcVNxKSwgZXZlbnBsdGVybSwgSGlQT1dFUmVwLTEpOworICBtdWxfWHNpZ19Yc2lnKCZhY2N1bXVsYXRvcmUsICZhcmdTcSk7CisgIG5lZ2F0ZV9Yc2lnKCZhY2N1bXVsYXRvcmUpOworICAvKiBBZGQgdGhlIG5lZ2F0aXZlIHRlcm1zICovCisgIHBvbHlub21pYWxfWHNpZygmYWNjdW11bGF0b3JlLCAmWFNJR19MTChhcmdTcVNxKSwgZXZlbm5lZ3Rlcm0sIEhpUE9XRVJlbi0xKTsKKyAgLyogTXVsdGlwbHkgYnkgYXJnXjIgKi8KKyAgbXVsNjRfWHNpZygmYWNjdW11bGF0b3JlLCAmWFNJR19MTChhcmdTaWduaWYpKTsKKyAgbXVsNjRfWHNpZygmYWNjdW11bGF0b3JlLCAmWFNJR19MTChhcmdTaWduaWYpKTsKKyAgLyogZGUtbm9ybWFsaXplIGFuZCBkaXZpZGUgYnkgMiAqLworICBzaHJfWHNpZygmYWNjdW11bGF0b3JlLCAtMiooMStleHBvbmVudCkgKyAxKTsKKyAgbmVnYXRlX1hzaWcoJmFjY3VtdWxhdG9yZSk7ICAgICAgLyogVGhpcyBkb2VzIDEgLSBhY2N1bXVsYXRvciAqLworCisgIC8qIE5vdyBmaW5kIHRoZSByYXRpby4gKi8KKyAgaWYgKCBhY2N1bXVsYXRvcmUubXN3ID09IDAgKQorICAgIHsKKyAgICAgIC8qIGFjY3VtdWxhdG9ybyBtdXN0IGNvbnRhaW4gMS4wIGhlcmUsIChhY3R1YWxseSwgMCkgYnV0IGl0CisJIHJlYWxseSBkb2Vzbid0IG1hdHRlciB3aGF0IHZhbHVlIHdlIHVzZSBiZWNhdXNlIGl0IHdpbGwKKwkgaGF2ZSBuZWdsaWdpYmxlIGVmZmVjdCBpbiBsYXRlciBjYWxjdWxhdGlvbnMKKwkgKi8KKyAgICAgIFhTSUdfTEwoYWNjdW0pID0gMHg4MDAwMDAwMDAwMDAwMDAwTEw7CisgICAgICBhY2N1bS5sc3cgPSAwOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGRpdl9Yc2lnKCZhY2N1bXVsYXRvcm8sICZhY2N1bXVsYXRvcmUsICZhY2N1bSk7CisgICAgfQorCisgIC8qIE11bHRpcGx5IGJ5IDEvMyAqIGFyZ14zICovCisgIG11bDY0X1hzaWcoJmFjY3VtLCAmWFNJR19MTChhcmdTaWduaWYpKTsKKyAgbXVsNjRfWHNpZygmYWNjdW0sICZYU0lHX0xMKGFyZ1NpZ25pZikpOworICBtdWw2NF9Yc2lnKCZhY2N1bSwgJlhTSUdfTEwoYXJnU2lnbmlmKSk7CisgIG11bDY0X1hzaWcoJmFjY3VtLCAmdHdvdGhpcmRzKTsKKyAgc2hyX1hzaWcoJmFjY3VtLCAtMiooZXhwb25lbnQrMSkpOworCisgIC8qIHRhbihhcmcpID0gYXJnICsgYWNjdW0gKi8KKyAgYWRkX3R3b19Yc2lnKCZhY2N1bSwgJmFyZ1NpZ25pZiwgJmV4cG9uZW50KTsKKworICBpZiAoIGludmVydCApCisgICAgeworICAgICAgLyogV2Ugbm93IGhhdmUgdGhlIHZhbHVlIG9mIHRhbihwaV8yIC0gYXJnKSB3aGVyZSBwaV8yIGlzIGFuCisJIGFwcHJveGltYXRpb24gZm9yIHBpLzIKKwkgKi8KKyAgICAgIC8qIFRoZSBuZXh0IHN0ZXAgaXMgdG8gZml4IHRoZSBhbnN3ZXIgdG8gY29tcGVuc2F0ZSBmb3IgdGhlCisJIGVycm9yIGR1ZSB0byB0aGUgYXBwcm94aW1hdGlvbiB1c2VkIGZvciBwaS8yCisJICovCisKKyAgICAgIC8qIFRoaXMgaXMgKGFwcHJveCkgZGVsdGEsIHRoZSBlcnJvciBpbiBvdXIgYXBwcm94IGZvciBwaS8yCisJIChzZWUgYWJvdmUpLiBJdCBoYXMgYW4gZXhwb25lbnQgb2YgLTY1CisJICovCisgICAgICBYU0lHX0xMKGZpeF91cCkgPSAweDg5OGNjNTE3MDFiODM5YTJMTDsKKyAgICAgIGZpeF91cC5sc3cgPSAwOworCisgICAgICBpZiAoIGV4cG9uZW50ID09IDAgKQorCWFkaiA9IDB4ZmZmZmZmZmY7ICAgLyogV2Ugd2FudCBhcHByb3ggMS4wIGhlcmUsIGJ1dAorCQkJICAgICAgIHRoaXMgaXMgY2xvc2UgZW5vdWdoLiAqLworICAgICAgZWxzZSBpZiAoIGV4cG9uZW50ID4gLTMwICkKKwl7CisJICBhZGogPSBhY2N1bS5tc3cgPj4gLShleHBvbmVudCsxKTsgICAgICAvKiB0YW4gKi8KKwkgIGFkaiA9IG11bF8zMl8zMihhZGosIGFkaik7ICAgICAgICAgICAgIC8qIHRhbl4yICovCisJfQorICAgICAgZWxzZQorCWFkaiA9IDA7CisgICAgICBhZGogPSBtdWxfMzJfMzIoMHg4OThjYzUxNywgYWRqKTsgICAgICAgICAgLyogZGVsdGEgKiB0YW5eMiAqLworCisgICAgICBmaXhfdXAubXN3ICs9IGFkajsKKyAgICAgIGlmICggIShmaXhfdXAubXN3ICYgMHg4MDAwMDAwMCkgKSAgIC8qIGRpZCBmaXhfdXAgb3ZlcmZsb3cgPyAqLworCXsKKwkgIC8qIFllcywgd2UgbmVlZCB0byBhZGQgYW4gbXNiICovCisJICBzaHJfWHNpZygmZml4X3VwLCAxKTsKKwkgIGZpeF91cC5tc3cgfD0gMHg4MDAwMDAwMDsKKwkgIHNocl9Yc2lnKCZmaXhfdXAsIDY0ICsgZXhwb25lbnQpOworCX0KKyAgICAgIGVsc2UKKwlzaHJfWHNpZygmZml4X3VwLCA2NSArIGV4cG9uZW50KTsKKworICAgICAgYWRkX3R3b19Yc2lnKCZhY2N1bSwgJmZpeF91cCwgJmV4cG9uZW50KTsKKworICAgICAgLyogYWNjdW0gbm93IGNvbnRhaW5zIHRhbihwaS8yIC0gYXJnKS4KKwkgVXNlIHRhbihhcmcpID0gMS4wIC8gdGFuKHBpLzIgLSBhcmcpCisJICovCisgICAgICBhY2N1bXVsYXRvcm8ubHN3ID0gYWNjdW11bGF0b3JvLm1pZHcgPSAwOworICAgICAgYWNjdW11bGF0b3JvLm1zdyA9IDB4ODAwMDAwMDA7CisgICAgICBkaXZfWHNpZygmYWNjdW11bGF0b3JvLCAmYWNjdW0sICZhY2N1bSk7CisgICAgICBleHBvbmVudCA9IC0gZXhwb25lbnQgLSAxOworICAgIH0KKworICAvKiBUcmFuc2ZlciB0aGUgcmVzdWx0ICovCisgIHJvdW5kX1hzaWcoJmFjY3VtKTsKKyAgRlBVX3NldHRhZzAoVEFHX1ZhbGlkKTsKKyAgc2lnbmlmaWNhbmQoc3QwX3B0cikgPSBYU0lHX0xMKGFjY3VtKTsKKyAgc2V0ZXhwb25lbnQxNihzdDBfcHRyLCBleHBvbmVudCArIEVYVEVOREVEX0ViaWFzKTsgIC8qIFJlc3VsdCBpcyBwb3NpdGl2ZS4gKi8KKworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlub21fWHNpZy5TIGIvYXJjaC9pMzg2L21hdGgtZW11L3BvbHlub21fWHNpZy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MzE1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcG9seW5vbV9Yc2lnLlMKQEAgLTAsMCArMSwxMzUgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHBvbHlub21pYWxfWHNpZy5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IEZpeGVkIHBvaW50IGFyaXRobWV0aWMgcG9seW5vbWlhbCBldmFsdWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk0LDE5OTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCBiaWxsbUBqYWNvYmkubWF0aHMubW9uYXNoLmVkdS5hdSB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENhbGwgZnJvbSBDIGFzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICB2b2lkIHBvbHlub21pYWxfWHNpZyhYc2lnICphY2N1bSwgdW5zaWduZWQgbG9uZyBsb25nIHgsICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB0ZXJtc1tdLCBpbnQgbikgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29tcHV0ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCB0ZXJtc1swXSArICh0ZXJtc1sxXSArICh0ZXJtc1syXSArIC4uLiArICh0ZXJtc1tuLTFdKngpKngpKngpKngpIC4uLiApKnggIHwKKyB8IGFuZCBhZGRzIHRoZSByZXN1bHQgdG8gdGhlIDEyIGJ5dGUgWHNpZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgVGhlIHRlcm1zW10gYXJlIGVhY2ggOCBieXRlcywgYnV0IGFsbCBjb21wdXRhdGlvbiBpcyBwZXJmb3JtZWQgdG8gMTIgYnl0ZSB8CisgfCBwcmVjaXNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgY2FyZWZ1bGx5OiBtb3N0IG92ZXJmbG93IG9mIGludGVybWVkaWF0ZSAgICAgICB8CisgfCByZXN1bHRzIGlzIGNvbnRyb2xsZWQsIGJ1dCBvdmVyZmxvdyBvZiB0aGUgcmVzdWx0IGlzIG5vdC4gICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS5maWxlCSJwb2x5bm9taWFsX1hzaWcuUyIKKworI2luY2x1ZGUgImZwdV9lbXUuaCIKKworCisjZGVmaW5lCVRFUk1fU0laRQkkOAorI2RlZmluZQlTVU1fTVMJCS0yMCglZWJwKQkvKiBzdW0gbXMgbG9uZyAqLworI2RlZmluZSBTVU1fTUlERExFCS0yNCglZWJwKQkvKiBzdW0gbWlkZGxlIGxvbmcgKi8KKyNkZWZpbmUJU1VNX0xTCQktMjgoJWVicCkJLyogc3VtIGxzIGxvbmcgKi8KKyNkZWZpbmUJQUNDVU1fTVMJLTQoJWVicCkJLyogYWNjdW0gbXMgbG9uZyAqLworI2RlZmluZQlBQ0NVTV9NSURETEUJLTgoJWVicCkJLyogYWNjdW0gbWlkZGxlIGxvbmcgKi8KKyNkZWZpbmUJQUNDVU1fTFMJLTEyKCVlYnApCS8qIGFjY3VtIGxzIGxvbmcgKi8KKyNkZWZpbmUgT1ZFUkZMT1dFRCAgICAgIC0xNiglZWJwKQkvKiBhZGRpdGlvbiBvdmVyZmxvdyBmbGFnICovCisKKy50ZXh0CitFTlRSWShwb2x5bm9taWFsX1hzaWcpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJc3VibAkkMzIsJWVzcAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJcHVzaGwJJWVieAorCisJbW92bAlQQVJBTTIsJWVzaQkJLyogeCAqLworCW1vdmwJUEFSQU0zLCVlZGkJCS8qIHRlcm1zICovCisKKwltb3ZsCVRFUk1fU0laRSwlZWF4CisJbXVsbAlQQVJBTTQJCQkvKiBuICovCisJYWRkbAklZWF4LCVlZGkKKworCW1vdmwJNCglZWRpKSwlZWR4CQkvKiB0ZXJtc1tuXSAqLworCW1vdmwJJWVkeCxTVU1fTVMKKwltb3ZsCSglZWRpKSwlZWR4CQkvKiB0ZXJtc1tuXSAqLworCW1vdmwJJWVkeCxTVU1fTUlERExFCisJeG9yCSVlYXgsJWVheAorCW1vdmwJJWVheCxTVU1fTFMKKwltb3ZiCSVhbCxPVkVSRkxPV0VECisKKwlzdWJsCVRFUk1fU0laRSwlZWRpCisJZGVjbAlQQVJBTTQKKwlqcwlMX2FjY3VtX2RvbmUKKworTF9hY2N1bV9sb29wOgorCXhvcgklZWF4LCVlYXgKKwltb3ZsCSVlYXgsQUNDVU1fTVMKKwltb3ZsCSVlYXgsQUNDVU1fTUlERExFCisKKwltb3ZsCVNVTV9NSURETEUsJWVheAorCW11bGwJKCVlc2kpCQkJLyogeCBscyBsb25nICovCisJbW92bAklZWR4LEFDQ1VNX0xTCisKKwltb3ZsCVNVTV9NSURETEUsJWVheAorCW11bGwJNCglZXNpKQkJCS8qIHggbXMgbG9uZyAqLworCWFkZGwJJWVheCxBQ0NVTV9MUworCWFkY2wJJWVkeCxBQ0NVTV9NSURETEUKKwlhZGNsCSQwLEFDQ1VNX01TCisKKwltb3ZsCVNVTV9NUywlZWF4CisJbXVsbAkoJWVzaSkJCQkvKiB4IGxzIGxvbmcgKi8KKwlhZGRsCSVlYXgsQUNDVU1fTFMKKwlhZGNsCSVlZHgsQUNDVU1fTUlERExFCisJYWRjbAkkMCxBQ0NVTV9NUworCisJbW92bAlTVU1fTVMsJWVheAorCW11bGwJNCglZXNpKQkJCS8qIHggbXMgbG9uZyAqLworCWFkZGwJJWVheCxBQ0NVTV9NSURETEUKKwlhZGNsCSVlZHgsQUNDVU1fTVMKKworCXRlc3RiCSQweGZmLE9WRVJGTE9XRUQKKwlqeglMX25vX292ZXJmbG93CisKKwltb3ZsCSglZXNpKSwlZWF4CisJYWRkbAklZWF4LEFDQ1VNX01JRERMRQorCW1vdmwJNCglZXNpKSwlZWF4CisJYWRjbAklZWF4LEFDQ1VNX01TCQkvKiBUaGlzIGNvdWxkIG92ZXJmbG93IHRvbyAqLworCitMX25vX292ZXJmbG93OgorCisvKgorICogTm93IHB1dCB0aGUgc3VtIG9mIG5leHQgdGVybSBhbmQgdGhlIGFjY3VtdWxhdG9yCisgKiBpbnRvIHRoZSBzdW0gcmVnaXN0ZXIKKyAqLworCW1vdmwJQUNDVU1fTFMsJWVheAorCWFkZGwJKCVlZGkpLCVlYXgJCS8qIHRlcm0gbHMgbG9uZyAqLworCW1vdmwJJWVheCxTVU1fTFMKKwltb3ZsCUFDQ1VNX01JRERMRSwlZWF4CisJYWRjbAkoJWVkaSksJWVheAkJLyogdGVybSBscyBsb25nICovCisJbW92bAklZWF4LFNVTV9NSURETEUKKwltb3ZsCUFDQ1VNX01TLCVlYXgKKwlhZGNsCTQoJWVkaSksJWVheAkJLyogdGVybSBtcyBsb25nICovCisJbW92bAklZWF4LFNVTV9NUworCXNiYmIJJWFsLCVhbAorCW1vdmIJJWFsLE9WRVJGTE9XRUQJCS8qIFVzZWQgaW4gdGhlIG5leHQgaXRlcmF0aW9uICovCisKKwlzdWJsCVRFUk1fU0laRSwlZWRpCisJZGVjbAlQQVJBTTQKKwlqbnMJTF9hY2N1bV9sb29wCisKK0xfYWNjdW1fZG9uZToKKwltb3ZsCVBBUkFNMSwlZWRpCQkvKiBhY2N1bSAqLworCW1vdmwJU1VNX0xTLCVlYXgKKwlhZGRsCSVlYXgsKCVlZGkpCisJbW92bAlTVU1fTUlERExFLCVlYXgKKwlhZGNsCSVlYXgsNCglZWRpKQorCW1vdmwJU1VNX01TLCVlYXgKKwlhZGNsCSVlYXgsOCglZWRpKQorCisJcG9wbAklZWJ4CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJbGVhdmUKKwlyZXQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfYWRkX3N1Yi5jIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19hZGRfc3ViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NkM2IzNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfYWRkX3N1Yi5jCkBAIC0wLDAgKzEsMzc0IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByZWdfYWRkX3N1Yi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBGdW5jdGlvbnMgdG8gYWRkIG9yIHN1YnRyYWN0IHR3byByZWdpc3RlcnMgYW5kIHB1dCB0aGUgcmVzdWx0IGluIGEgdGhpcmQuIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgRm9yIGVhY2ggZnVuY3Rpb24sIHRoZSBkZXN0aW5hdGlvbiBtYXkgYmUgYW55IEZQVV9SRUcsIGluY2x1ZGluZyBvbmUgb2YgIHwKKyB8IHRoZSBzb3VyY2UgRlBVX1JFR3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIEVhY2ggZnVuY3Rpb24gcmV0dXJucyAwIGlmIHRoZSBhbnN3ZXIgaXMgby5rLiwgb3RoZXJ3aXNlIGEgbm9uLXplcm8gICAgICB8CisgfCB2YWx1ZSBpcyByZXR1cm5lZCwgaW5kaWNhdGluZyBlaXRoZXIgYW4gZXhjZXB0aW9uIGNvbmRpdGlvbiBvciBhbiAgICAgICAgIHwKKyB8IGludGVybmFsIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAicmVnX2NvbnN0YW50LmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImNvbnRyb2xfdy5oIgorI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKworc3RhdGljCitpbnQgYWRkX3N1Yl9zcGVjaWFscyhGUFVfUkVHIGNvbnN0ICphLCB1X2NoYXIgdGFnYSwgdV9jaGFyIHNpZ25hLAorCQkgICAgIEZQVV9SRUcgY29uc3QgKmIsIHVfY2hhciB0YWdiLCB1X2NoYXIgc2lnbmIsCisJCSAgICAgRlBVX1JFRyAqZGVzdCwgaW50IGRlc3RzdG5yLCBpbnQgY29udHJvbF93KTsKKworLyoKKyAgT3BlcmF0ZXMgb24gc3QoMCkgYW5kIHN0KG4pLCBvciBvbiBzdCgwKSBhbmQgdGVtcG9yYXJ5IGRhdGEuCisgIFRoZSBkZXN0aW5hdGlvbiBtdXN0IGJlIG9uZSBvZiB0aGUgc291cmNlIHN0KHgpLgorICAqLworaW50IEZQVV9hZGQoRlBVX1JFRyBjb25zdCAqYiwgdV9jaGFyIHRhZ2IsIGludCBkZXN0c3RuciwgaW50IGNvbnRyb2xfdykKK3sKKyAgRlBVX1JFRyAqYSA9ICZzdCgwKTsKKyAgRlBVX1JFRyAqZGVzdCA9ICZzdChkZXN0c3Rucik7CisgIHVfY2hhciBzaWduYiA9IGdldHNpZ24oYik7CisgIHVfY2hhciB0YWdhID0gRlBVX2dldHRhZzAoKTsKKyAgdV9jaGFyIHNpZ25hID0gZ2V0c2lnbihhKTsKKyAgdV9jaGFyIHNhdmVkX3NpZ24gPSBnZXRzaWduKGRlc3QpOworICBpbnQgZGlmZiwgdGFnLCBleHBhLCBleHBiOworICAKKyAgaWYgKCAhKHRhZ2EgfCB0YWdiKSApCisgICAgeworICAgICAgZXhwYSA9IGV4cG9uZW50KGEpOworICAgICAgZXhwYiA9IGV4cG9uZW50KGIpOworCisgICAgdmFsaWRfYWRkOgorICAgICAgLyogQm90aCByZWdpc3RlcnMgYXJlIHZhbGlkICovCisgICAgICBpZiAoIShzaWduYSBeIHNpZ25iKSkKKwl7CisJICAvKiBzaWducyBhcmUgdGhlIHNhbWUgKi8KKwkgIHRhZyA9IEZQVV91X2FkZChhLCBiLCBkZXN0LCBjb250cm9sX3csIHNpZ25hLCBleHBhLCBleHBiKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogVGhlIHNpZ25zIGFyZSBkaWZmZXJlbnQsIHNvIGRvIGEgc3VidHJhY3Rpb24gKi8KKwkgIGRpZmYgPSBleHBhIC0gZXhwYjsKKwkgIGlmICghZGlmZikKKwkgICAgeworCSAgICAgIGRpZmYgPSBhLT5zaWdoIC0gYi0+c2lnaDsgIC8qIFRoaXMgd29ya3Mgb25seSBpZiB0aGUgbXMgYml0cworCQkJCQkgICAgYXJlIGlkZW50aWNhbC4gKi8KKwkgICAgICBpZiAoIWRpZmYpCisJCXsKKwkJICBkaWZmID0gYS0+c2lnbCA+IGItPnNpZ2w7CisJCSAgaWYgKCFkaWZmKQorCQkgICAgZGlmZiA9IC0oYS0+c2lnbCA8IGItPnNpZ2wpOworCQl9CisJICAgIH0KKyAgICAgIAorCSAgaWYgKGRpZmYgPiAwKQorCSAgICB7CisJICAgICAgdGFnID0gRlBVX3Vfc3ViKGEsIGIsIGRlc3QsIGNvbnRyb2xfdywgc2lnbmEsIGV4cGEsIGV4cGIpOworCSAgICB9CisJICBlbHNlIGlmICggZGlmZiA8IDAgKQorCSAgICB7CisJICAgICAgdGFnID0gRlBVX3Vfc3ViKGIsIGEsIGRlc3QsIGNvbnRyb2xfdywgc2lnbmIsIGV4cGIsIGV4cGEpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBGUFVfY29weV90b19yZWdpKCZDT05TVF9aLCBUQUdfWmVybywgZGVzdHN0bnIpOworCSAgICAgIC8qIHNpZ24gZGVwZW5kcyB1cG9uIHJvdW5kaW5nIG1vZGUgKi8KKwkgICAgICBzZXRzaWduKGRlc3QsICgoY29udHJvbF93ICYgQ1dfUkMpICE9IFJDX0RPV04pCisJCSAgICAgID8gU0lHTl9QT1MgOiBTSUdOX05FRyk7CisJICAgICAgcmV0dXJuIFRBR19aZXJvOworCSAgICB9CisJfQorCisgICAgICBpZiAoIHRhZyA8IDAgKQorCXsKKwkgIHNldHNpZ24oZGVzdCwgc2F2ZWRfc2lnbik7CisJICByZXR1cm4gdGFnOworCX0KKyAgICAgIEZQVV9zZXR0YWdpKGRlc3RzdG5yLCB0YWcpOworICAgICAgcmV0dXJuIHRhZzsKKyAgICB9CisKKyAgaWYgKCB0YWdhID09IFRBR19TcGVjaWFsICkKKyAgICB0YWdhID0gRlBVX1NwZWNpYWwoYSk7CisgIGlmICggdGFnYiA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnYiA9IEZQVV9TcGVjaWFsKGIpOworCisgIGlmICggKCh0YWdhID09IFRBR19WYWxpZCkgJiYgKHRhZ2IgPT0gVFdfRGVub3JtYWwpKQorCSAgICB8fCAoKHRhZ2EgPT0gVFdfRGVub3JtYWwpICYmICh0YWdiID09IFRBR19WYWxpZCkpCisJICAgIHx8ICgodGFnYSA9PSBUV19EZW5vcm1hbCkgJiYgKHRhZ2IgPT0gVFdfRGVub3JtYWwpKSApCisgICAgeworICAgICAgRlBVX1JFRyB4LCB5OworCisgICAgICBpZiAoIGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCXJldHVybiBGUFVfRXhjZXB0aW9uOworCisgICAgICBGUFVfdG9fZXhwMTYoYSwgJngpOworICAgICAgRlBVX3RvX2V4cDE2KGIsICZ5KTsKKyAgICAgIGEgPSAmeDsKKyAgICAgIGIgPSAmeTsKKyAgICAgIGV4cGEgPSBleHBvbmVudDE2KGEpOworICAgICAgZXhwYiA9IGV4cG9uZW50MTYoYik7CisgICAgICBnb3RvIHZhbGlkX2FkZDsKKyAgICB9CisKKyAgaWYgKCAodGFnYSA9PSBUV19OYU4pIHx8ICh0YWdiID09IFRXX05hTikgKQorICAgIHsKKyAgICAgIGlmICggZGVzdHN0bnIgPT0gMCApCisJcmV0dXJuIHJlYWxfMm9wX05hTihiLCB0YWdiLCBkZXN0c3RuciwgYSk7CisgICAgICBlbHNlCisJcmV0dXJuIHJlYWxfMm9wX05hTihhLCB0YWdhLCBkZXN0c3RuciwgYSk7CisgICAgfQorCisgIHJldHVybiBhZGRfc3ViX3NwZWNpYWxzKGEsIHRhZ2EsIHNpZ25hLCBiLCB0YWdiLCBzaWduYiwKKwkJCSAgZGVzdCwgZGVzdHN0bnIsIGNvbnRyb2xfdyk7Cit9CisKKworLyogU3VidHJhY3QgYiBmcm9tIGEuICAoYS1iKSAtPiBkZXN0ICovCitpbnQgRlBVX3N1YihpbnQgZmxhZ3MsIGludCBybSwgaW50IGNvbnRyb2xfdykKK3sKKyAgRlBVX1JFRyBjb25zdCAqYSwgKmI7CisgIEZQVV9SRUcgKmRlc3Q7CisgIHVfY2hhciB0YWdhLCB0YWdiLCBzaWduYSwgc2lnbmIsIHNhdmVkX3NpZ24sIHNpZ247CisgIGludCBkaWZmLCB0YWcgPSAwLCBleHBhLCBleHBiLCBkZXN0c3RucjsKKworICBhID0gJnN0KDApOworICB0YWdhID0gRlBVX2dldHRhZzAoKTsKKworICBkZXN0c3RuciA9IDA7CisgIGlmICggZmxhZ3MgJiBMT0FERUQgKQorICAgIHsKKyAgICAgIGIgPSAoRlBVX1JFRyAqKXJtOworICAgICAgdGFnYiA9IGZsYWdzICYgMHgwZjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBiID0gJnN0KHJtKTsKKyAgICAgIHRhZ2IgPSBGUFVfZ2V0dGFnaShybSk7CisKKyAgICAgIGlmICggZmxhZ3MgJiBERVNUX1JNICkKKwlkZXN0c3RuciA9IHJtOworICAgIH0KKworICBzaWduYSA9IGdldHNpZ24oYSk7CisgIHNpZ25iID0gZ2V0c2lnbihiKTsKKworICBpZiAoIGZsYWdzICYgUkVWICkKKyAgICB7CisgICAgICBzaWduYSBePSBTSUdOX05FRzsKKyAgICAgIHNpZ25iIF49IFNJR05fTkVHOworICAgIH0KKworICBkZXN0ID0gJnN0KGRlc3RzdG5yKTsKKyAgc2F2ZWRfc2lnbiA9IGdldHNpZ24oZGVzdCk7CisKKyAgaWYgKCAhKHRhZ2EgfCB0YWdiKSApCisgICAgeworICAgICAgZXhwYSA9IGV4cG9uZW50KGEpOworICAgICAgZXhwYiA9IGV4cG9uZW50KGIpOworCisgICAgdmFsaWRfc3VidHJhY3Q6CisgICAgICAvKiBCb3RoIHJlZ2lzdGVycyBhcmUgdmFsaWQgKi8KKworICAgICAgZGlmZiA9IGV4cGEgLSBleHBiOworCisgICAgICBpZiAoIWRpZmYpCisJeworCSAgZGlmZiA9IGEtPnNpZ2ggLSBiLT5zaWdoOyAgLyogV29ya3Mgb25seSBpZiBtcyBiaXRzIGFyZSBpZGVudGljYWwgKi8KKwkgIGlmICghZGlmZikKKwkgICAgeworCSAgICAgIGRpZmYgPSBhLT5zaWdsID4gYi0+c2lnbDsKKwkgICAgICBpZiAoIWRpZmYpCisJCWRpZmYgPSAtKGEtPnNpZ2wgPCBiLT5zaWdsKTsKKwkgICAgfQorCX0KKworICAgICAgc3dpdGNoICggKCgoaW50KXNpZ25hKSoyICsgc2lnbmIpIC8gU0lHTl9ORUcgKQorCXsKKwljYXNlIDA6IC8qIFAgLSBQICovCisJY2FzZSAzOiAvKiBOIC0gTiAqLworCSAgaWYgKGRpZmYgPiAwKQorCSAgICB7CisJICAgICAgLyogfGF8ID4gfGJ8ICovCisJICAgICAgdGFnID0gRlBVX3Vfc3ViKGEsIGIsIGRlc3QsIGNvbnRyb2xfdywgc2lnbmEsIGV4cGEsIGV4cGIpOworCSAgICB9CisJICBlbHNlIGlmICggZGlmZiA9PSAwICkKKwkgICAgeworCSAgICAgIEZQVV9jb3B5X3RvX3JlZ2koJkNPTlNUX1osIFRBR19aZXJvLCBkZXN0c3Rucik7CisKKwkgICAgICAvKiBzaWduIGRlcGVuZHMgdXBvbiByb3VuZGluZyBtb2RlICovCisJICAgICAgc2V0c2lnbihkZXN0LCAoKGNvbnRyb2xfdyAmIENXX1JDKSAhPSBSQ19ET1dOKQorCQk/IFNJR05fUE9TIDogU0lHTl9ORUcpOworCSAgICAgIHJldHVybiBUQUdfWmVybzsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgc2lnbiA9IHNpZ25hIF4gU0lHTl9ORUc7CisJICAgICAgdGFnID0gRlBVX3Vfc3ViKGIsIGEsIGRlc3QsIGNvbnRyb2xfdywgc2lnbiwgZXhwYiwgZXhwYSk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgMTogLyogUCAtIE4gKi8KKwkgIHRhZyA9IEZQVV91X2FkZChhLCBiLCBkZXN0LCBjb250cm9sX3csIFNJR05fUE9TLCBleHBhLCBleHBiKTsKKwkgIGJyZWFrOworCWNhc2UgMjogLyogTiAtIFAgKi8KKwkgIHRhZyA9IEZQVV91X2FkZChhLCBiLCBkZXN0LCBjb250cm9sX3csIFNJR05fTkVHLCBleHBhLCBleHBiKTsKKwkgIGJyZWFrOworI2lmZGVmIFBBUkFOT0lECisJZGVmYXVsdDoKKwkgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDExMSk7CisJICByZXR1cm4gLTE7CisjZW5kaWYKKwl9CisgICAgICBpZiAoIHRhZyA8IDAgKQorCXsKKwkgIHNldHNpZ24oZGVzdCwgc2F2ZWRfc2lnbik7CisJICByZXR1cm4gdGFnOworCX0KKyAgICAgIEZQVV9zZXR0YWdpKGRlc3RzdG5yLCB0YWcpOworICAgICAgcmV0dXJuIHRhZzsKKyAgICB9CisKKyAgaWYgKCB0YWdhID09IFRBR19TcGVjaWFsICkKKyAgICB0YWdhID0gRlBVX1NwZWNpYWwoYSk7CisgIGlmICggdGFnYiA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnYiA9IEZQVV9TcGVjaWFsKGIpOworCisgIGlmICggKCh0YWdhID09IFRBR19WYWxpZCkgJiYgKHRhZ2IgPT0gVFdfRGVub3JtYWwpKQorCSAgICB8fCAoKHRhZ2EgPT0gVFdfRGVub3JtYWwpICYmICh0YWdiID09IFRBR19WYWxpZCkpCisJICAgIHx8ICgodGFnYSA9PSBUV19EZW5vcm1hbCkgJiYgKHRhZ2IgPT0gVFdfRGVub3JtYWwpKSApCisgICAgeworICAgICAgRlBVX1JFRyB4LCB5OworCisgICAgICBpZiAoIGRlbm9ybWFsX29wZXJhbmQoKSA8IDAgKQorCXJldHVybiBGUFVfRXhjZXB0aW9uOworCisgICAgICBGUFVfdG9fZXhwMTYoYSwgJngpOworICAgICAgRlBVX3RvX2V4cDE2KGIsICZ5KTsKKyAgICAgIGEgPSAmeDsKKyAgICAgIGIgPSAmeTsKKyAgICAgIGV4cGEgPSBleHBvbmVudDE2KGEpOworICAgICAgZXhwYiA9IGV4cG9uZW50MTYoYik7CisKKyAgICAgIGdvdG8gdmFsaWRfc3VidHJhY3Q7CisgICAgfQorCisgIGlmICggKHRhZ2EgPT0gVFdfTmFOKSB8fCAodGFnYiA9PSBUV19OYU4pICkKKyAgICB7CisgICAgICBGUFVfUkVHIGNvbnN0ICpkMSwgKmQyOworICAgICAgaWYgKCBmbGFncyAmIFJFViApCisJeworCSAgZDEgPSBiOworCSAgZDIgPSBhOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBkMSA9IGE7CisJICBkMiA9IGI7CisJfQorICAgICAgaWYgKCBmbGFncyAmIExPQURFRCApCisJcmV0dXJuIHJlYWxfMm9wX05hTihiLCB0YWdiLCBkZXN0c3RuciwgZDEpOworICAgICAgaWYgKCBmbGFncyAmIERFU1RfUk0gKQorCXJldHVybiByZWFsXzJvcF9OYU4oYSwgdGFnYSwgZGVzdHN0bnIsIGQyKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gcmVhbF8yb3BfTmFOKGIsIHRhZ2IsIGRlc3RzdG5yLCBkMik7CisgICAgfQorCisgICAgcmV0dXJuIGFkZF9zdWJfc3BlY2lhbHMoYSwgdGFnYSwgc2lnbmEsIGIsIHRhZ2IsIHNpZ25iIF4gU0lHTl9ORUcsCisJCQkgICAgZGVzdCwgZGVzdHN0bnIsIGNvbnRyb2xfdyk7Cit9CisKKworc3RhdGljCitpbnQgYWRkX3N1Yl9zcGVjaWFscyhGUFVfUkVHIGNvbnN0ICphLCB1X2NoYXIgdGFnYSwgdV9jaGFyIHNpZ25hLAorCQkgICAgIEZQVV9SRUcgY29uc3QgKmIsIHVfY2hhciB0YWdiLCB1X2NoYXIgc2lnbmIsCisJCSAgICAgRlBVX1JFRyAqZGVzdCwgaW50IGRlc3RzdG5yLCBpbnQgY29udHJvbF93KQoreworICBpZiAoICgodGFnYSA9PSBUV19EZW5vcm1hbCkgfHwgKHRhZ2IgPT0gVFdfRGVub3JtYWwpKQorICAgICAgICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisgICAgcmV0dXJuIEZQVV9FeGNlcHRpb247CisKKyAgaWYgKHRhZ2EgPT0gVEFHX1plcm8pCisgICAgeworICAgICAgaWYgKHRhZ2IgPT0gVEFHX1plcm8pCisJeworCSAgLyogQm90aCBhcmUgemVybywgcmVzdWx0IHdpbGwgYmUgemVyby4gKi8KKwkgIHVfY2hhciBkaWZmZXJlbnRfc2lnbnMgPSBzaWduYSBeIHNpZ25iOworCisJICBGUFVfY29weV90b19yZWdpKGEsIFRBR19aZXJvLCBkZXN0c3Rucik7CisJICBpZiAoIGRpZmZlcmVudF9zaWducyApCisJICAgIHsKKwkgICAgICAvKiBTaWducyBhcmUgZGlmZmVyZW50LiAqLworCSAgICAgIC8qIFNpZ24gb2YgYW5zd2VyIGRlcGVuZHMgdXBvbiByb3VuZGluZyBtb2RlLiAqLworCSAgICAgIHNldHNpZ24oZGVzdCwgKChjb250cm9sX3cgJiBDV19SQykgIT0gUkNfRE9XTikKKwkJICAgICAgPyBTSUdOX1BPUyA6IFNJR05fTkVHKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBzZXRzaWduKGRlc3QsIHNpZ25hKTsgIC8qIHNpZ25hIG1heSBkaWZmZXIgZnJvbSB0aGUgc2lnbiBvZiBhLiAqLworCSAgcmV0dXJuIFRBR19aZXJvOworCX0KKyAgICAgIGVsc2UKKwl7CisJICByZWdfY29weShiLCBkZXN0KTsKKwkgIGlmICggKHRhZ2IgPT0gVFdfRGVub3JtYWwpICYmIChiLT5zaWdoICYgMHg4MDAwMDAwMCkgKQorCSAgICB7CisJICAgICAgLyogQSBwc2V1ZG9EZW5vcm1hbCwgY29udmVydCBpdC4gKi8KKwkgICAgICBhZGRleHBvbmVudChkZXN0LCAxKTsKKwkgICAgICB0YWdiID0gVEFHX1ZhbGlkOworCSAgICB9CisJICBlbHNlIGlmICggdGFnYiA+IFRBR19FbXB0eSApCisJICAgIHRhZ2IgPSBUQUdfU3BlY2lhbDsKKwkgIHNldHNpZ24oZGVzdCwgc2lnbmIpOyAgLyogc2lnbmIgbWF5IGRpZmZlciBmcm9tIHRoZSBzaWduIG9mIGIuICovCisJICBGUFVfc2V0dGFnaShkZXN0c3RuciwgdGFnYik7CisJICByZXR1cm4gdGFnYjsKKwl9CisgICAgfQorICBlbHNlIGlmICh0YWdiID09IFRBR19aZXJvKQorICAgIHsKKyAgICAgIHJlZ19jb3B5KGEsIGRlc3QpOworICAgICAgaWYgKCAodGFnYSA9PSBUV19EZW5vcm1hbCkgJiYgKGEtPnNpZ2ggJiAweDgwMDAwMDAwKSApCisJeworCSAgLyogQSBwc2V1ZG9EZW5vcm1hbCAqLworCSAgYWRkZXhwb25lbnQoZGVzdCwgMSk7CisJICB0YWdhID0gVEFHX1ZhbGlkOworCX0KKyAgICAgIGVsc2UgaWYgKCB0YWdhID4gVEFHX0VtcHR5ICkKKwl0YWdhID0gVEFHX1NwZWNpYWw7CisgICAgICBzZXRzaWduKGRlc3QsIHNpZ25hKTsgIC8qIHNpZ25hIG1heSBkaWZmZXIgZnJvbSB0aGUgc2lnbiBvZiBhLiAqLworICAgICAgRlBVX3NldHRhZ2koZGVzdHN0bnIsIHRhZ2EpOworICAgICAgcmV0dXJuIHRhZ2E7CisgICAgfQorICBlbHNlIGlmICh0YWdhID09IFRXX0luZmluaXR5KQorICAgIHsKKyAgICAgIGlmICggKHRhZ2IgIT0gVFdfSW5maW5pdHkpIHx8IChzaWduYSA9PSBzaWduYikgKQorCXsKKwkgIEZQVV9jb3B5X3RvX3JlZ2koYSwgVEFHX1NwZWNpYWwsIGRlc3RzdG5yKTsKKwkgIHNldHNpZ24oZGVzdCwgc2lnbmEpOyAgLyogc2lnbmEgbWF5IGRpZmZlciBmcm9tIHRoZSBzaWduIG9mIGEuICovCisJICByZXR1cm4gdGFnYTsKKwl9CisgICAgICAvKiBJbmZpbml0eS1JbmZpbml0eSBpcyB1bmRlZmluZWQuICovCisgICAgICByZXR1cm4gYXJpdGhfaW52YWxpZChkZXN0c3Rucik7CisgICAgfQorICBlbHNlIGlmICh0YWdiID09IFRXX0luZmluaXR5KQorICAgIHsKKyAgICAgIEZQVV9jb3B5X3RvX3JlZ2koYiwgVEFHX1NwZWNpYWwsIGRlc3RzdG5yKTsKKyAgICAgIHNldHNpZ24oZGVzdCwgc2lnbmIpOyAgLyogc2lnbmIgbWF5IGRpZmZlciBmcm9tIHRoZSBzaWduIG9mIGIuICovCisgICAgICByZXR1cm4gdGFnYjsKKyAgICB9CisKKyNpZmRlZiBQQVJBTk9JRAorICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMDEpOworI2VuZGlmCisKKyAgcmV0dXJuIEZQVV9FeGNlcHRpb247Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfY29tcGFyZS5jIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19jb21wYXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3YzViNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfY29tcGFyZS5jCkBAIC0wLDAgKzEsMzgxIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByZWdfY29tcGFyZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb21wYXJlIHR3byBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCBjb21wYXJlKCkgaXMgdGhlIGNvcmUgRlBVX1JFRyBjb21wYXJpc29uIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjaW5jbHVkZSAiY29udHJvbF93LmgiCisjaW5jbHVkZSAic3RhdHVzX3cuaCIKKworCitzdGF0aWMgaW50IGNvbXBhcmUoRlBVX1JFRyBjb25zdCAqYiwgaW50IHRhZ2IpCit7CisgIGludCBkaWZmLCBleHAwLCBleHBiOworICB1X2NoYXIJICAJc3QwX3RhZzsKKyAgRlBVX1JFRyAgCSpzdDBfcHRyOworICBGUFVfUkVHCXgsIHk7CisgIHVfY2hhcgkJc3QwX3NpZ24sIHNpZ25iID0gZ2V0c2lnbihiKTsKKworICBzdDBfcHRyID0gJnN0KDApOworICBzdDBfdGFnID0gRlBVX2dldHRhZzAoKTsKKyAgc3QwX3NpZ24gPSBnZXRzaWduKHN0MF9wdHIpOworCisgIGlmICggdGFnYiA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnYiA9IEZQVV9TcGVjaWFsKGIpOworICBpZiAoIHN0MF90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHN0MF90YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKworICBpZiAoICgoc3QwX3RhZyAhPSBUQUdfVmFsaWQpICYmIChzdDBfdGFnICE9IFRXX0Rlbm9ybWFsKSkKKyAgICAgICB8fCAoKHRhZ2IgIT0gVEFHX1ZhbGlkKSAmJiAodGFnYiAhPSBUV19EZW5vcm1hbCkpICkKKyAgICB7CisgICAgICBpZiAoIHN0MF90YWcgPT0gVEFHX1plcm8gKQorCXsKKwkgIGlmICggdGFnYiA9PSBUQUdfWmVybyApIHJldHVybiBDT01QX0FfZXFfQjsKKwkgIGlmICggdGFnYiA9PSBUQUdfVmFsaWQgKQorCSAgICByZXR1cm4gKChzaWduYiA9PSBTSUdOX1BPUykgPyBDT01QX0FfbHRfQiA6IENPTVBfQV9ndF9CKTsKKwkgIGlmICggdGFnYiA9PSBUV19EZW5vcm1hbCApCisJICAgIHJldHVybiAoKHNpZ25iID09IFNJR05fUE9TKSA/IENPTVBfQV9sdF9CIDogQ09NUF9BX2d0X0IpCisJICAgIHwgQ09NUF9EZW5vcm1hbDsKKwl9CisgICAgICBlbHNlIGlmICggdGFnYiA9PSBUQUdfWmVybyApCisJeworCSAgaWYgKCBzdDBfdGFnID09IFRBR19WYWxpZCApCisJICAgIHJldHVybiAoKHN0MF9zaWduID09IFNJR05fUE9TKSA/IENPTVBfQV9ndF9CIDogQ09NUF9BX2x0X0IpOworCSAgaWYgKCBzdDBfdGFnID09IFRXX0Rlbm9ybWFsICkKKwkgICAgcmV0dXJuICgoc3QwX3NpZ24gPT0gU0lHTl9QT1MpID8gQ09NUF9BX2d0X0IgOiBDT01QX0FfbHRfQikKKwkgICAgfCBDT01QX0Rlbm9ybWFsOworCX0KKworICAgICAgaWYgKCBzdDBfdGFnID09IFRXX0luZmluaXR5ICkKKwl7CisJICBpZiAoICh0YWdiID09IFRBR19WYWxpZCkgfHwgKHRhZ2IgPT0gVEFHX1plcm8pICkKKwkgICAgcmV0dXJuICgoc3QwX3NpZ24gPT0gU0lHTl9QT1MpID8gQ09NUF9BX2d0X0IgOiBDT01QX0FfbHRfQik7CisJICBlbHNlIGlmICggdGFnYiA9PSBUV19EZW5vcm1hbCApCisJICAgIHJldHVybiAoKHN0MF9zaWduID09IFNJR05fUE9TKSA/IENPTVBfQV9ndF9CIDogQ09NUF9BX2x0X0IpCisJICAgICAgfCBDT01QX0Rlbm9ybWFsOworCSAgZWxzZSBpZiAoIHRhZ2IgPT0gVFdfSW5maW5pdHkgKQorCSAgICB7CisJICAgICAgLyogVGhlIDgwNDg2IGJvb2sgc2F5cyB0aGF0IGluZmluaXRpZXMgY2FuIGJlIGVxdWFsISAqLworCSAgICAgIHJldHVybiAoc3QwX3NpZ24gPT0gc2lnbmIpID8gQ09NUF9BX2VxX0IgOgorCQkoKHN0MF9zaWduID09IFNJR05fUE9TKSA/IENPTVBfQV9ndF9CIDogQ09NUF9BX2x0X0IpOworCSAgICB9CisJICAvKiBGYWxsIHRocm91Z2ggdG8gdGhlIE5hTiBjb2RlICovCisJfQorICAgICAgZWxzZSBpZiAoIHRhZ2IgPT0gVFdfSW5maW5pdHkgKQorCXsKKwkgIGlmICggKHN0MF90YWcgPT0gVEFHX1ZhbGlkKSB8fCAoc3QwX3RhZyA9PSBUQUdfWmVybykgKQorCSAgICByZXR1cm4gKChzaWduYiA9PSBTSUdOX1BPUykgPyBDT01QX0FfbHRfQiA6IENPTVBfQV9ndF9CKTsKKwkgIGlmICggc3QwX3RhZyA9PSBUV19EZW5vcm1hbCApCisJICAgIHJldHVybiAoKHNpZ25iID09IFNJR05fUE9TKSA/IENPTVBfQV9sdF9CIDogQ09NUF9BX2d0X0IpCisJCXwgQ09NUF9EZW5vcm1hbDsKKwkgIC8qIEZhbGwgdGhyb3VnaCB0byB0aGUgTmFOIGNvZGUgKi8KKwl9CisKKyAgICAgIC8qIFRoZSBvbmx5IHBvc3NpYmlsaXR5IG5vdyBzaG91bGQgYmUgdGhhdCBvbmUgb2YgdGhlIGFyZ3VtZW50cworCSBpcyBhIE5hTiAqLworICAgICAgaWYgKCAoc3QwX3RhZyA9PSBUV19OYU4pIHx8ICh0YWdiID09IFRXX05hTikgKQorCXsKKwkgIGludCBzaWduYWxsaW5nID0gMCwgdW5zdXBwb3J0ZWQgPSAwOworCSAgaWYgKCBzdDBfdGFnID09IFRXX05hTiApCisJICAgIHsKKwkgICAgICBzaWduYWxsaW5nID0gKHN0MF9wdHItPnNpZ2ggJiAweGMwMDAwMDAwKSA9PSAweDgwMDAwMDAwOworCSAgICAgIHVuc3VwcG9ydGVkID0gISgoZXhwb25lbnQoc3QwX3B0cikgPT0gRVhQX09WRVIpCisJCQkgICAgICAmJiAoc3QwX3B0ci0+c2lnaCAmIDB4ODAwMDAwMDApKTsKKwkgICAgfQorCSAgaWYgKCB0YWdiID09IFRXX05hTiApCisJICAgIHsKKwkgICAgICBzaWduYWxsaW5nIHw9IChiLT5zaWdoICYgMHhjMDAwMDAwMCkgPT0gMHg4MDAwMDAwMDsKKwkgICAgICB1bnN1cHBvcnRlZCB8PSAhKChleHBvbmVudChiKSA9PSBFWFBfT1ZFUikKKwkJCSAgICAgICAmJiAoYi0+c2lnaCAmIDB4ODAwMDAwMDApKTsKKwkgICAgfQorCSAgaWYgKCBzaWduYWxsaW5nIHx8IHVuc3VwcG9ydGVkICkKKwkgICAgcmV0dXJuIENPTVBfTm9fQ29tcCB8IENPTVBfU05hTiB8IENPTVBfTmFOOworCSAgZWxzZQorCSAgICAvKiBOZWl0aGVyIGlzIGEgc2lnbmFsaW5nIE5hTiAqLworCSAgICByZXR1cm4gQ09NUF9Ob19Db21wIHwgQ09NUF9OYU47CisJfQorICAgICAgCisgICAgICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisgICAgfQorICAKKyAgaWYgKHN0MF9zaWduICE9IHNpZ25iKQorICAgIHsKKyAgICAgIHJldHVybiAoKHN0MF9zaWduID09IFNJR05fUE9TKSA/IENPTVBfQV9ndF9CIDogQ09NUF9BX2x0X0IpCisJfCAoICgoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgfHwgKHRhZ2IgPT0gVFdfRGVub3JtYWwpKSA/CisJICAgIENPTVBfRGVub3JtYWwgOiAwKTsKKyAgICB9CisKKyAgaWYgKCAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkgfHwgKHRhZ2IgPT0gVFdfRGVub3JtYWwpICkKKyAgICB7CisgICAgICBGUFVfdG9fZXhwMTYoc3QwX3B0ciwgJngpOworICAgICAgRlBVX3RvX2V4cDE2KGIsICZ5KTsKKyAgICAgIHN0MF9wdHIgPSAmeDsKKyAgICAgIGIgPSAmeTsKKyAgICAgIGV4cDAgPSBleHBvbmVudDE2KHN0MF9wdHIpOworICAgICAgZXhwYiA9IGV4cG9uZW50MTYoYik7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZXhwMCA9IGV4cG9uZW50KHN0MF9wdHIpOworICAgICAgZXhwYiA9IGV4cG9uZW50KGIpOworICAgIH0KKworI2lmZGVmIFBBUkFOT0lECisgIGlmICghKHN0MF9wdHItPnNpZ2ggJiAweDgwMDAwMDAwKSkgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworICBpZiAoIShiLT5zaWdoICYgMHg4MDAwMDAwMCkpIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisgIGRpZmYgPSBleHAwIC0gZXhwYjsKKyAgaWYgKCBkaWZmID09IDAgKQorICAgIHsKKyAgICAgIGRpZmYgPSBzdDBfcHRyLT5zaWdoIC0gYi0+c2lnaDsgIC8qIFdvcmtzIG9ubHkgaWYgbXMgYml0cyBhcmUKKwkJCQkJICAgICAgaWRlbnRpY2FsICovCisgICAgICBpZiAoIGRpZmYgPT0gMCApCisJeworCWRpZmYgPSBzdDBfcHRyLT5zaWdsID4gYi0+c2lnbDsKKwlpZiAoIGRpZmYgPT0gMCApCisJICBkaWZmID0gLShzdDBfcHRyLT5zaWdsIDwgYi0+c2lnbCk7CisJfQorICAgIH0KKworICBpZiAoIGRpZmYgPiAwICkKKyAgICB7CisgICAgICByZXR1cm4gKChzdDBfc2lnbiA9PSBTSUdOX1BPUykgPyBDT01QX0FfZ3RfQiA6IENPTVBfQV9sdF9CKQorCXwgKCAoKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpIHx8ICh0YWdiID09IFRXX0Rlbm9ybWFsKSkgPworCSAgICBDT01QX0Rlbm9ybWFsIDogMCk7CisgICAgfQorICBpZiAoIGRpZmYgPCAwICkKKyAgICB7CisgICAgICByZXR1cm4gKChzdDBfc2lnbiA9PSBTSUdOX1BPUykgPyBDT01QX0FfbHRfQiA6IENPTVBfQV9ndF9CKQorCXwgKCAoKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpIHx8ICh0YWdiID09IFRXX0Rlbm9ybWFsKSkgPworCSAgICBDT01QX0Rlbm9ybWFsIDogMCk7CisgICAgfQorCisgIHJldHVybiBDT01QX0FfZXFfQgorICAgIHwgKCAoKHN0MF90YWcgPT0gVFdfRGVub3JtYWwpIHx8ICh0YWdiID09IFRXX0Rlbm9ybWFsKSkgPworCUNPTVBfRGVub3JtYWwgOiAwKTsKKworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCBzdCgwKSBpcyBub3QgZW1wdHkgKi8KK2ludCBGUFVfY29tcGFyZV9zdF9kYXRhKEZQVV9SRUcgY29uc3QgKmxvYWRlZF9kYXRhLCB1X2NoYXIgbG9hZGVkX3RhZykKK3sKKyAgaW50IGYgPSAwLCBjOworCisgIGMgPSBjb21wYXJlKGxvYWRlZF9kYXRhLCBsb2FkZWRfdGFnKTsKKworICBpZiAoYyAmIENPTVBfTmFOKQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKyAgICAgIGYgPSBTV19DMyB8IFNXX0MyIHwgU1dfQzA7CisgICAgfQorICBlbHNlCisgICAgc3dpdGNoIChjICYgNykKKyAgICAgIHsKKyAgICAgIGNhc2UgQ09NUF9BX2x0X0I6CisJZiA9IFNXX0MwOworCWJyZWFrOworICAgICAgY2FzZSBDT01QX0FfZXFfQjoKKwlmID0gU1dfQzM7CisJYnJlYWs7CisgICAgICBjYXNlIENPTVBfQV9ndF9COgorCWYgPSAwOworCWJyZWFrOworICAgICAgY2FzZSBDT01QX05vX0NvbXA6CisJZiA9IFNXX0MzIHwgU1dfQzIgfCBTV19DMDsKKwlicmVhazsKKyNpZmRlZiBQQVJBTk9JRAorICAgICAgZGVmYXVsdDoKKwlFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMjEpOworCWYgPSBTV19DMyB8IFNXX0MyIHwgU1dfQzA7CisJYnJlYWs7CisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKyAgICAgIH0KKyAgc2V0Y2MoZik7CisgIGlmIChjICYgQ09NUF9EZW5vcm1hbCkKKyAgICB7CisgICAgICByZXR1cm4gZGVub3JtYWxfb3BlcmFuZCgpIDwgMDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY29tcGFyZV9zdF9zdChpbnQgbnIpCit7CisgIGludCBmID0gMCwgYzsKKyAgRlBVX1JFRyAqc3RfcHRyOworCisgIGlmICggIU5PVF9FTVBUWSgwKSB8fCAhTk9UX0VNUFRZKG5yKSApCisgICAgeworICAgICAgc2V0Y2MoU1dfQzMgfCBTV19DMiB8IFNXX0MwKTsKKyAgICAgIC8qIFN0YWNrIGZhdWx0ICovCisgICAgICBFWENFUFRJT04oRVhfU3RhY2tVbmRlcik7CisgICAgICByZXR1cm4gIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKTsKKyAgICB9CisKKyAgc3RfcHRyID0gJnN0KG5yKTsKKyAgYyA9IGNvbXBhcmUoc3RfcHRyLCBGUFVfZ2V0dGFnaShucikpOworICBpZiAoYyAmIENPTVBfTmFOKQorICAgIHsKKyAgICAgIHNldGNjKFNXX0MzIHwgU1dfQzIgfCBTV19DMCk7CisgICAgICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisgICAgICByZXR1cm4gIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKTsKKyAgICB9CisgIGVsc2UKKyAgICBzd2l0Y2ggKGMgJiA3KQorICAgICAgeworICAgICAgY2FzZSBDT01QX0FfbHRfQjoKKwlmID0gU1dfQzA7CisJYnJlYWs7CisgICAgICBjYXNlIENPTVBfQV9lcV9COgorCWYgPSBTV19DMzsKKwlicmVhazsKKyAgICAgIGNhc2UgQ09NUF9BX2d0X0I6CisJZiA9IDA7CisJYnJlYWs7CisgICAgICBjYXNlIENPTVBfTm9fQ29tcDoKKwlmID0gU1dfQzMgfCBTV19DMiB8IFNXX0MwOworCWJyZWFrOworI2lmZGVmIFBBUkFOT0lECisgICAgICBkZWZhdWx0OgorCUVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDEyMik7CisJZiA9IFNXX0MzIHwgU1dfQzIgfCBTV19DMDsKKwlicmVhazsKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworICAgICAgfQorICBzZXRjYyhmKTsKKyAgaWYgKGMgJiBDT01QX0Rlbm9ybWFsKQorICAgIHsKKyAgICAgIHJldHVybiBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjb21wYXJlX3Vfc3Rfc3QoaW50IG5yKQoreworICBpbnQgZiA9IDAsIGM7CisgIEZQVV9SRUcgKnN0X3B0cjsKKworICBpZiAoICFOT1RfRU1QVFkoMCkgfHwgIU5PVF9FTVBUWShucikgKQorICAgIHsKKyAgICAgIHNldGNjKFNXX0MzIHwgU1dfQzIgfCBTV19DMCk7CisgICAgICAvKiBTdGFjayBmYXVsdCAqLworICAgICAgRVhDRVBUSU9OKEVYX1N0YWNrVW5kZXIpOworICAgICAgcmV0dXJuICEoY29udHJvbF93b3JkICYgQ1dfSW52YWxpZCk7CisgICAgfQorCisgIHN0X3B0ciA9ICZzdChucik7CisgIGMgPSBjb21wYXJlKHN0X3B0ciwgRlBVX2dldHRhZ2kobnIpKTsKKyAgaWYgKGMgJiBDT01QX05hTikKKyAgICB7CisgICAgICBzZXRjYyhTV19DMyB8IFNXX0MyIHwgU1dfQzApOworICAgICAgaWYgKGMgJiBDT01QX1NOYU4pICAgICAgIC8qIFRoaXMgaXMgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuCisJCQkJICB1bi1vcmRlcmVkIGFuZCBvcmRpbmFyeSBjb21wYXJpc29ucyAqLworCXsKKwkgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKwkgIHJldHVybiAhKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpOworCX0KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgZWxzZQorICAgIHN3aXRjaCAoYyAmIDcpCisgICAgICB7CisgICAgICBjYXNlIENPTVBfQV9sdF9COgorCWYgPSBTV19DMDsKKwlicmVhazsKKyAgICAgIGNhc2UgQ09NUF9BX2VxX0I6CisJZiA9IFNXX0MzOworCWJyZWFrOworICAgICAgY2FzZSBDT01QX0FfZ3RfQjoKKwlmID0gMDsKKwlicmVhazsKKyAgICAgIGNhc2UgQ09NUF9Ob19Db21wOgorCWYgPSBTV19DMyB8IFNXX0MyIHwgU1dfQzA7CisJYnJlYWs7CisjaWZkZWYgUEFSQU5PSUQKKyAgICAgIGRlZmF1bHQ6CisJRVhDRVBUSU9OKEVYX0lOVEVSTkFMfDB4MTIzKTsKKwlmID0gU1dfQzMgfCBTV19DMiB8IFNXX0MwOworCWJyZWFrOworI2VuZGlmIC8qIFBBUkFOT0lEICovIAorICAgICAgfQorICBzZXRjYyhmKTsKKyAgaWYgKGMgJiBDT01QX0Rlbm9ybWFsKQorICAgIHsKKyAgICAgIHJldHVybiBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBmY29tX3N0KHZvaWQpCit7CisgIC8qIGZjb20gc3QoaSkgKi8KKyAgY29tcGFyZV9zdF9zdChGUFVfcm0pOworfQorCisKK3ZvaWQgZmNvbXBzdCh2b2lkKQoreworICAvKiBmY29tcCBzdChpKSAqLworICBpZiAoICFjb21wYXJlX3N0X3N0KEZQVV9ybSkgKQorICAgIEZQVV9wb3AoKTsKK30KKworCit2b2lkIGZjb21wcCh2b2lkKQoreworICAvKiBmY29tcHAgKi8KKyAgaWYgKEZQVV9ybSAhPSAxKQorICAgIHsKKyAgICAgIEZQVV9pbGxlZ2FsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoICFjb21wYXJlX3N0X3N0KDEpICkKKyAgICAgIHBvcHBvcCgpOworfQorCisKK3ZvaWQgZnVjb21fKHZvaWQpCit7CisgIC8qIGZ1Y29tIHN0KGkpICovCisgIGNvbXBhcmVfdV9zdF9zdChGUFVfcm0pOworCit9CisKKwordm9pZCBmdWNvbXAodm9pZCkKK3sKKyAgLyogZnVjb21wIHN0KGkpICovCisgIGlmICggIWNvbXBhcmVfdV9zdF9zdChGUFVfcm0pICkKKyAgICBGUFVfcG9wKCk7Cit9CisKKwordm9pZCBmdWNvbXBwKHZvaWQpCit7CisgIC8qIGZ1Y29tcHAgKi8KKyAgaWYgKEZQVV9ybSA9PSAxKQorICAgIHsKKyAgICAgIGlmICggIWNvbXBhcmVfdV9zdF9zdCgxKSApCisJcG9wcG9wKCk7CisgICAgfQorICBlbHNlCisgICAgRlBVX2lsbGVnYWwoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfY29uc3RhbnQuYyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfY29uc3RhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODUwMTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19jb25zdGFudC5jCkBAIC0wLDAgKzEsMTIwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByZWdfY29uc3RhbnQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBBbGwgb2YgdGhlIGNvbnN0YW50IEZQVV9SRUdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjaW5jbHVkZSAic3RhdHVzX3cuaCIKKyNpbmNsdWRlICJyZWdfY29uc3RhbnQuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKworCisjZGVmaW5lIE1BS0VfUkVHKHMsZSxsLGgpIHsgbCwgaCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVhURU5ERURfRWJpYXMrKGUpKSB8ICgoU0lHTl8jI3MgIT0gMCkqMHg4MDAwKSkgfQorCitGUFVfUkVHIGNvbnN0IENPTlNUXzEgICAgPSBNQUtFX1JFRyhQT1MsIDAsIDB4MDAwMDAwMDAsIDB4ODAwMDAwMDApOworI2lmIDAKK0ZQVV9SRUcgY29uc3QgQ09OU1RfMiAgICA9IE1BS0VfUkVHKFBPUywgMSwgMHgwMDAwMDAwMCwgMHg4MDAwMDAwMCk7CitGUFVfUkVHIGNvbnN0IENPTlNUX0hBTEYgPSBNQUtFX1JFRyhQT1MsIC0xLCAweDAwMDAwMDAwLCAweDgwMDAwMDAwKTsKKyNlbmRpZiAgLyogIDAgICovCitzdGF0aWMgRlBVX1JFRyBjb25zdCBDT05TVF9MMlQgID0gTUFLRV9SRUcoUE9TLCAxLCAweGNkMWI4YWZlLCAweGQ0OWE3ODRiKTsKK3N0YXRpYyBGUFVfUkVHIGNvbnN0IENPTlNUX0wyRSAgPSBNQUtFX1JFRyhQT1MsIDAsIDB4NWMxN2YwYmMsIDB4YjhhYTNiMjkpOworRlBVX1JFRyBjb25zdCBDT05TVF9QSSAgID0gTUFLRV9SRUcoUE9TLCAxLCAweDIxNjhjMjM1LCAweGM5MGZkYWEyKTsKK0ZQVV9SRUcgY29uc3QgQ09OU1RfUEkyICA9IE1BS0VfUkVHKFBPUywgMCwgMHgyMTY4YzIzNSwgMHhjOTBmZGFhMik7CitGUFVfUkVHIGNvbnN0IENPTlNUX1BJNCAgPSBNQUtFX1JFRyhQT1MsIC0xLCAweDIxNjhjMjM1LCAweGM5MGZkYWEyKTsKK3N0YXRpYyBGUFVfUkVHIGNvbnN0IENPTlNUX0xHMiAgPSBNQUtFX1JFRyhQT1MsIC0yLCAweGZiY2ZmNzk5LCAweDlhMjA5YTg0KTsKK3N0YXRpYyBGUFVfUkVHIGNvbnN0IENPTlNUX0xOMiAgPSBNQUtFX1JFRyhQT1MsIC0xLCAweGQxY2Y3OWFjLCAweGIxNzIxN2Y3KTsKKworLyogRXh0cmEgYml0cyB0byB0YWtlIHBpLzIgdG8gbW9yZSB0aGFuIDEyOCBiaXRzIHByZWNpc2lvbi4gKi8KK0ZQVV9SRUcgY29uc3QgQ09OU1RfUEkyZXh0cmEgPSBNQUtFX1JFRyhORUcsIC02NiwKKwkJCQkJIDB4ZmM4ZjhjYmIsIDB4ZWNlNjc1ZDEpOworCisvKiBPbmx5IHRoZSBzaWduIChhbmQgdGFnKSBpcyB1c2VkIGluIGludGVybmFsIHplcm9lcyAqLworRlBVX1JFRyBjb25zdCBDT05TVF9aICAgID0gTUFLRV9SRUcoUE9TLCBFWFBfVU5ERVIsIDB4MCwgMHgwKTsKKworLyogT25seSB0aGUgc2lnbiBhbmQgc2lnbmlmaWNhbmQgKGFuZCB0YWcpIGFyZSB1c2VkIGluIGludGVybmFsIE5hTnMgKi8KKy8qIFRoZSA4MDQ4NiBuZXZlciBnZW5lcmF0ZXMgb25lIG9mIHRoZXNlIAorRlBVX1JFRyBjb25zdCBDT05TVF9TTkFOID0gTUFLRV9SRUcoUE9TLCBFWFBfT1ZFUiwgMHgwMDAwMDAwMSwgMHg4MDAwMDAwMCk7CisgKi8KKy8qIFRoaXMgaXMgdGhlIHJlYWwgaW5kZWZpbml0ZSBRTmFOICovCitGUFVfUkVHIGNvbnN0IENPTlNUX1FOYU4gPSBNQUtFX1JFRyhORUcsIEVYUF9PVkVSLCAweDAwMDAwMDAwLCAweEMwMDAwMDAwKTsKKworLyogT25seSB0aGUgc2lnbiAoYW5kIHRhZykgaXMgdXNlZCBpbiBpbnRlcm5hbCBpbmZpbml0aWVzICovCitGUFVfUkVHIGNvbnN0IENPTlNUX0lORiAgPSBNQUtFX1JFRyhQT1MsIEVYUF9PVkVSLCAweDAwMDAwMDAwLCAweDgwMDAwMDAwKTsKKworCitzdGF0aWMgdm9pZCBmbGRfY29uc3QoRlBVX1JFRyBjb25zdCAqYywgaW50IGFkaiwgdV9jaGFyIHRhZykKK3sKKyAgRlBVX1JFRyAqc3RfbmV3X3B0cjsKKworICBpZiAoIFNUQUNLX09WRVJGTE9XICkKKyAgICB7CisgICAgICBGUFVfc3RhY2tfb3ZlcmZsb3coKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIHB1c2goKTsKKyAgcmVnX2NvcHkoYywgc3RfbmV3X3B0cik7CisgIHN0X25ld19wdHItPnNpZ2wgKz0gYWRqOyAgLyogRm9yIGFsbCBvdXIgZmxkeHh4IGNvbnN0YW50cywgd2UgZG9uJ3QgbmVlZCB0bworCQkJICAgICAgIGJvcnJvdyBvciBjYXJyeS4gKi8KKyAgRlBVX3NldHRhZzAodGFnKTsKKyAgY2xlYXJfQzEoKTsKK30KKworLyogQSBmYXN0IHdheSB0byBmaW5kIG91dCB3aGV0aGVyIHggaXMgb25lIG9mIFJDX0RPV04gb3IgUkNfQ0hPUAorICAgKGFuZCBub3Qgb25lIG9mIFJDX1JORCBvciBSQ19VUCkuCisgICAqLworI2RlZmluZSBET1dOX09SX0NIT1AoeCkgICh4ICYgUkNfRE9XTikKKworc3RhdGljIHZvaWQgZmxkMShpbnQgcmMpCit7CisgIGZsZF9jb25zdCgmQ09OU1RfMSwgMCwgVEFHX1ZhbGlkKTsKK30KKworc3RhdGljIHZvaWQgZmxkbDJ0KGludCByYykKK3sKKyAgZmxkX2NvbnN0KCZDT05TVF9MMlQsIChyYyA9PSBSQ19VUCkgPyAxIDogMCwgVEFHX1ZhbGlkKTsKK30KKworc3RhdGljIHZvaWQgZmxkbDJlKGludCByYykKK3sKKyAgZmxkX2NvbnN0KCZDT05TVF9MMkUsIERPV05fT1JfQ0hPUChyYykgPyAtMSA6IDAsIFRBR19WYWxpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsZHBpKGludCByYykKK3sKKyAgZmxkX2NvbnN0KCZDT05TVF9QSSwgRE9XTl9PUl9DSE9QKHJjKSA/IC0xIDogMCwgVEFHX1ZhbGlkKTsKK30KKworc3RhdGljIHZvaWQgZmxkbGcyKGludCByYykKK3sKKyAgZmxkX2NvbnN0KCZDT05TVF9MRzIsIERPV05fT1JfQ0hPUChyYykgPyAtMSA6IDAsIFRBR19WYWxpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsZGxuMihpbnQgcmMpCit7CisgIGZsZF9jb25zdCgmQ09OU1RfTE4yLCBET1dOX09SX0NIT1AocmMpID8gLTEgOiAwLCBUQUdfVmFsaWQpOworfQorCitzdGF0aWMgdm9pZCBmbGR6KGludCByYykKK3sKKyAgZmxkX2NvbnN0KCZDT05TVF9aLCAwLCBUQUdfWmVybyk7Cit9CisKK3R5cGVkZWYgdm9pZCAoKkZVTkNfUkMpKGludCk7CisKK3N0YXRpYyBGVU5DX1JDIGNvbnN0YW50c190YWJsZVtdID0geworICBmbGQxLCBmbGRsMnQsIGZsZGwyZSwgZmxkcGksIGZsZGxnMiwgZmxkbG4yLCBmbGR6LCAoRlVOQ19SQylGUFVfaWxsZWdhbAorfTsKKwordm9pZCBmY29uc3Qodm9pZCkKK3sKKyAgKGNvbnN0YW50c190YWJsZVtGUFVfcm1dKShjb250cm9sX3dvcmQgJiBDV19SQyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2NvbnN0YW50LmggYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2NvbnN0YW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZmFlYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfY29uc3RhbnQuaApAQCAtMCwwICsxLDI1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByZWdfY29uc3RhbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgICBiaWxsbUB2YXhjLmNjLm1vbmFzaC5lZHUuYXUgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX1JFR19DT05TVEFOVF9IXworI2RlZmluZSBfUkVHX0NPTlNUQU5UX0hfCisKKyNpbmNsdWRlICJmcHVfZW11LmgiCisKK2V4dGVybiBGUFVfUkVHIGNvbnN0IENPTlNUXzE7CitleHRlcm4gRlBVX1JFRyBjb25zdCBDT05TVF9QSTsKK2V4dGVybiBGUFVfUkVHIGNvbnN0IENPTlNUX1BJMjsKK2V4dGVybiBGUFVfUkVHIGNvbnN0IENPTlNUX1BJMmV4dHJhOworZXh0ZXJuIEZQVV9SRUcgY29uc3QgQ09OU1RfUEk0OworZXh0ZXJuIEZQVV9SRUcgY29uc3QgQ09OU1RfWjsKK2V4dGVybiBGUFVfUkVHIGNvbnN0IENPTlNUX1BJTkY7CitleHRlcm4gRlBVX1JFRyBjb25zdCBDT05TVF9JTkY7CitleHRlcm4gRlBVX1JFRyBjb25zdCBDT05TVF9NSU5GOworZXh0ZXJuIEZQVV9SRUcgY29uc3QgQ09OU1RfUU5hTjsKKworI2VuZGlmIC8qIF9SRUdfQ09OU1RBTlRfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfY29udmVydC5jIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19jb252ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhMjU4NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfY29udmVydC5jCkBAIC0wLDAgKzEsNTMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHJlZ19jb252ZXJ0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBDb252ZXJ0IHJlZ2lzdGVyIHJlcHJlc2VudGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk0LDE5OTYsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCBBdXN0cmFsaWEgfAorIHwgICAgICAgICAgICAgICAgICBFLW1haWwgICBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorCisKK2ludCBGUFVfdG9fZXhwMTYoRlBVX1JFRyBjb25zdCAqYSwgRlBVX1JFRyAqeCkKK3sKKyAgaW50IHNpZ24gPSBnZXRzaWduKGEpOworCisgICoobG9uZyBsb25nICopJih4LT5zaWdsKSA9ICooY29uc3QgbG9uZyBsb25nICopJihhLT5zaWdsKTsKKworICAvKiBTZXQgdXAgdGhlIGV4cG9uZW50IGFzIGEgMTYgYml0IHF1YW50aXR5LiAqLworICBzZXRleHBvbmVudDE2KHgsIGV4cG9uZW50KGEpKTsKKworICBpZiAoIGV4cG9uZW50MTYoeCkgPT0gRVhQX1VOREVSICkKKyAgICB7CisgICAgICAvKiBUaGUgbnVtYmVyIGlzIGEgZGUtbm9ybWFsIG9yIHBzZXVkb2Rlbm9ybWFsLiAqLworICAgICAgLyogV2Ugb25seSBkZWFsIHdpdGggdGhlIHNpZ25pZmljYW5kIGFuZCBleHBvbmVudC4gKi8KKworICAgICAgaWYgKHgtPnNpZ2ggJiAweDgwMDAwMDAwKQorCXsKKwkgIC8qIElzIGEgcHNldWRvZGVub3JtYWwuICovCisJICAvKiBUaGlzIGlzIG5vbi04MDQ4NiBiZWhhdmlvdXIgYmVjYXVzZSB0aGUgbnVtYmVyCisJICAgICBsb3NlcyBpdHMgJ2Rlbm9ybWFsJyBpZGVudGl0eS4gKi8KKwkgIGFkZGV4cG9uZW50KHgsIDEpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBJcyBhIGRlbm9ybWFsLiAqLworCSAgYWRkZXhwb25lbnQoeCwgMSk7CisJICBGUFVfbm9ybWFsaXplX251byh4KTsKKwl9CisgICAgfQorCisgIGlmICggISh4LT5zaWdoICYgMHg4MDAwMDAwMCkgKQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTCB8IDB4MTgwKTsKKyAgICB9CisKKyAgcmV0dXJuIHNpZ247Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfZGl2aWRlLmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2RpdmlkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZWU3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2RpdmlkZS5jCkBAIC0wLDAgKzEsMjA3IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByZWdfZGl2aWRlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBEaXZpZGUgb25lIEZQVV9SRUcgYnkgYW5vdGhlciBhbmQgcHV0IHRoZSByZXN1bHQgaW4gYSBkZXN0aW5hdGlvbiBGUFVfUkVHLnwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTk2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1AamFjb2JpLm1hdGhzLm1vbmFzaC5lZHUuYXUgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBSZXR1cm4gdmFsdWUgaXMgdGhlIHRhZyBvZiB0aGUgYW5zd2VyLCBvci1lZCB3aXRoIEZQVV9FeGNlcHRpb24gaWYgICAgIHwKKyB8ICAgIG9uZSB3YXMgcmFpc2VkLCBvciAtMSBvbiBpbnRlcm5hbCBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgVGhlIGRlc3RpbmF0aW9uIG1heSBiZSBhbnkgRlBVX1JFRywgaW5jbHVkaW5nIG9uZSBvZiB0aGUgc291cmNlIEZQVV9SRUdzLiB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJleGNlcHRpb24uaCIKKyNpbmNsdWRlICJyZWdfY29uc3RhbnQuaCIKKyNpbmNsdWRlICJmcHVfZW11LmgiCisjaW5jbHVkZSAiZnB1X3N5c3RlbS5oIgorCisvKgorICBEaXZpZGUgb25lIHJlZ2lzdGVyIGJ5IGFub3RoZXIgYW5kIHB1dCB0aGUgcmVzdWx0IGludG8gYSB0aGlyZCByZWdpc3Rlci4KKyAgKi8KK2ludCBGUFVfZGl2KGludCBmbGFncywgaW50IHJtLCBpbnQgY29udHJvbF93KQoreworICBGUFVfUkVHIHgsIHk7CisgIEZQVV9SRUcgY29uc3QgKmEsICpiLCAqc3QwX3B0ciwgKnN0X3B0cjsKKyAgRlBVX1JFRyAqZGVzdDsKKyAgdV9jaGFyIHRhZ2EsIHRhZ2IsIHNpZ25hLCBzaWduYiwgc2lnbiwgc2F2ZWRfc2lnbjsKKyAgaW50IHRhZywgZGVzdHN0bnI7CisKKyAgaWYgKCBmbGFncyAmIERFU1RfUk0gKQorICAgIGRlc3RzdG5yID0gcm07CisgIGVsc2UKKyAgICBkZXN0c3RuciA9IDA7CisKKyAgaWYgKCBmbGFncyAmIFJFViApCisgICAgeworICAgICAgYiA9ICZzdCgwKTsKKyAgICAgIHN0MF9wdHIgPSBiOworICAgICAgdGFnYiA9IEZQVV9nZXR0YWcwKCk7CisgICAgICBpZiAoIGZsYWdzICYgTE9BREVEICkKKwl7CisJICBhID0gKEZQVV9SRUcgKilybTsKKwkgIHRhZ2EgPSBmbGFncyAmIDB4MGY7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGEgPSAmc3Qocm0pOworCSAgc3RfcHRyID0gYTsKKwkgIHRhZ2EgPSBGUFVfZ2V0dGFnaShybSk7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGEgPSAmc3QoMCk7CisgICAgICBzdDBfcHRyID0gYTsKKyAgICAgIHRhZ2EgPSBGUFVfZ2V0dGFnMCgpOworICAgICAgaWYgKCBmbGFncyAmIExPQURFRCApCisJeworCSAgYiA9IChGUFVfUkVHICopcm07CisJICB0YWdiID0gZmxhZ3MgJiAweDBmOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBiID0gJnN0KHJtKTsKKwkgIHN0X3B0ciA9IGI7CisJICB0YWdiID0gRlBVX2dldHRhZ2kocm0pOworCX0KKyAgICB9CisKKyAgc2lnbmEgPSBnZXRzaWduKGEpOworICBzaWduYiA9IGdldHNpZ24oYik7CisKKyAgc2lnbiA9IHNpZ25hIF4gc2lnbmI7CisKKyAgZGVzdCA9ICZzdChkZXN0c3Rucik7CisgIHNhdmVkX3NpZ24gPSBnZXRzaWduKGRlc3QpOworCisgIGlmICggISh0YWdhIHwgdGFnYikgKQorICAgIHsKKyAgICAgIC8qIEJvdGggcmVncyBWYWxpZCwgdGhpcyBzaG91bGQgYmUgdGhlIG1vc3QgY29tbW9uIGNhc2UuICovCisgICAgICByZWdfY29weShhLCAmeCk7CisgICAgICByZWdfY29weShiLCAmeSk7CisgICAgICBzZXRwb3NpdGl2ZSgmeCk7CisgICAgICBzZXRwb3NpdGl2ZSgmeSk7CisgICAgICB0YWcgPSBGUFVfdV9kaXYoJngsICZ5LCBkZXN0LCBjb250cm9sX3csIHNpZ24pOworCisgICAgICBpZiAoIHRhZyA8IDAgKQorCXJldHVybiB0YWc7CisKKyAgICAgIEZQVV9zZXR0YWdpKGRlc3RzdG5yLCB0YWcpOworICAgICAgcmV0dXJuIHRhZzsKKyAgICB9CisKKyAgaWYgKCB0YWdhID09IFRBR19TcGVjaWFsICkKKyAgICB0YWdhID0gRlBVX1NwZWNpYWwoYSk7CisgIGlmICggdGFnYiA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnYiA9IEZQVV9TcGVjaWFsKGIpOworCisgIGlmICggKCh0YWdhID09IFRBR19WYWxpZCkgJiYgKHRhZ2IgPT0gVFdfRGVub3JtYWwpKQorCSAgICB8fCAoKHRhZ2EgPT0gVFdfRGVub3JtYWwpICYmICh0YWdiID09IFRBR19WYWxpZCkpCisJICAgIHx8ICgodGFnYSA9PSBUV19EZW5vcm1hbCkgJiYgKHRhZ2IgPT0gVFdfRGVub3JtYWwpKSApCisgICAgeworICAgICAgaWYgKCBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwICkKKwlyZXR1cm4gRlBVX0V4Y2VwdGlvbjsKKworICAgICAgRlBVX3RvX2V4cDE2KGEsICZ4KTsKKyAgICAgIEZQVV90b19leHAxNihiLCAmeSk7CisgICAgICB0YWcgPSBGUFVfdV9kaXYoJngsICZ5LCBkZXN0LCBjb250cm9sX3csIHNpZ24pOworICAgICAgaWYgKCB0YWcgPCAwICkKKwlyZXR1cm4gdGFnOworCisgICAgICBGUFVfc2V0dGFnaShkZXN0c3RuciwgdGFnKTsKKyAgICAgIHJldHVybiB0YWc7CisgICAgfQorICBlbHNlIGlmICggKHRhZ2EgPD0gVFdfRGVub3JtYWwpICYmICh0YWdiIDw9IFRXX0Rlbm9ybWFsKSApCisgICAgeworICAgICAgaWYgKCB0YWdiICE9IFRBR19aZXJvICkKKwl7CisJICAvKiBXYW50IHRvIGZpbmQgWmVyby9WYWxpZCAqLworCSAgaWYgKCB0YWdiID09IFRXX0Rlbm9ybWFsICkKKwkgICAgeworCSAgICAgIGlmICggZGVub3JtYWxfb3BlcmFuZCgpIDwgMCApCisJCXJldHVybiBGUFVfRXhjZXB0aW9uOworCSAgICB9CisKKwkgIC8qIFRoZSByZXN1bHQgaXMgemVyby4gKi8KKwkgIEZQVV9jb3B5X3RvX3JlZ2koJkNPTlNUX1osIFRBR19aZXJvLCBkZXN0c3Rucik7CisJICBzZXRzaWduKGRlc3QsIHNpZ24pOworCSAgcmV0dXJuIFRBR19aZXJvOworCX0KKyAgICAgIC8qIFdlIGhhdmUgYW4gZXhjZXB0aW9uIGNvbmRpdGlvbiwgZWl0aGVyIDAvMCBvciBWYWxpZC9aZXJvLiAqLworICAgICAgaWYgKCB0YWdhID09IFRBR19aZXJvICkKKwl7CisJICAvKiAwLzAgKi8KKwkgIHJldHVybiBhcml0aF9pbnZhbGlkKGRlc3RzdG5yKTsKKwl9CisgICAgICAvKiBWYWxpZC9aZXJvICovCisgICAgICByZXR1cm4gRlBVX2RpdmlkZV9ieV96ZXJvKGRlc3RzdG5yLCBzaWduKTsKKyAgICB9CisgIC8qIE11c3QgaGF2ZSBpbmZpbml0aWVzLCBOYU5zLCBldGMgKi8KKyAgZWxzZSBpZiAoICh0YWdhID09IFRXX05hTikgfHwgKHRhZ2IgPT0gVFdfTmFOKSApCisgICAgeworICAgICAgaWYgKCBmbGFncyAmIExPQURFRCApCisJcmV0dXJuIHJlYWxfMm9wX05hTigoRlBVX1JFRyAqKXJtLCBmbGFncyAmIDB4MGYsIDAsIHN0MF9wdHIpOworCisgICAgICBpZiAoIGZsYWdzICYgREVTVF9STSApCisJeworCSAgaW50IHRhZzsKKwkgIHRhZyA9IEZQVV9nZXR0YWcwKCk7CisJICBpZiAoIHRhZyA9PSBUQUdfU3BlY2lhbCApCisJICAgIHRhZyA9IEZQVV9TcGVjaWFsKHN0MF9wdHIpOworCSAgcmV0dXJuIHJlYWxfMm9wX05hTihzdDBfcHRyLCB0YWcsIHJtLCAoZmxhZ3MgJiBSRVYpID8gc3QwX3B0ciA6ICZzdChybSkpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbnQgdGFnOworCSAgdGFnID0gRlBVX2dldHRhZ2kocm0pOworCSAgaWYgKCB0YWcgPT0gVEFHX1NwZWNpYWwgKQorCSAgICB0YWcgPSBGUFVfU3BlY2lhbCgmc3Qocm0pKTsKKwkgIHJldHVybiByZWFsXzJvcF9OYU4oJnN0KHJtKSwgdGFnLCAwLCAoZmxhZ3MgJiBSRVYpID8gc3QwX3B0ciA6ICZzdChybSkpOworCX0KKyAgICB9CisgIGVsc2UgaWYgKHRhZ2EgPT0gVFdfSW5maW5pdHkpCisgICAgeworICAgICAgaWYgKHRhZ2IgPT0gVFdfSW5maW5pdHkpCisJeworCSAgLyogaW5maW5pdHkvaW5maW5pdHkgKi8KKwkgIHJldHVybiBhcml0aF9pbnZhbGlkKGRlc3RzdG5yKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogdGFnYiBtdXN0IGJlIFZhbGlkIG9yIFplcm8gKi8KKwkgIGlmICggKHRhZ2IgPT0gVFdfRGVub3JtYWwpICYmIChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwKSApCisJICAgIHJldHVybiBGUFVfRXhjZXB0aW9uOworCSAgCisJICAvKiBJbmZpbml0eSBkaXZpZGVkIGJ5IFplcm8gb3IgVmFsaWQgZG9lcworCSAgICAgbm90IHJhaXNlIGFuZCBleGNlcHRpb24sIGJ1dCByZXR1cm5zIEluZmluaXR5ICovCisJICBGUFVfY29weV90b19yZWdpKGEsIFRBR19TcGVjaWFsLCBkZXN0c3Rucik7CisJICBzZXRzaWduKGRlc3QsIHNpZ24pOworCSAgcmV0dXJuIHRhZ2E7CisJfQorICAgIH0KKyAgZWxzZSBpZiAodGFnYiA9PSBUV19JbmZpbml0eSkKKyAgICB7CisgICAgICBpZiAoICh0YWdhID09IFRXX0Rlbm9ybWFsKSAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCXJldHVybiBGUFVfRXhjZXB0aW9uOworCisgICAgICAvKiBUaGUgcmVzdWx0IGlzIHplcm8uICovCisgICAgICBGUFVfY29weV90b19yZWdpKCZDT05TVF9aLCBUQUdfWmVybywgZGVzdHN0bnIpOworICAgICAgc2V0c2lnbihkZXN0LCBzaWduKTsKKyAgICAgIHJldHVybiBUQUdfWmVybzsKKyAgICB9CisjaWZkZWYgUEFSQU5PSUQKKyAgZWxzZQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDEwMik7CisgICAgICByZXR1cm4gRlBVX0V4Y2VwdGlvbjsKKyAgICB9CisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfbGRfc3RyLmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2xkX3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNmVkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX2xkX3N0ci5jCkBAIC0wLDAgKzEsMTM3MCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcmVnX2xkX3N0ci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQWxsIG9mIHRoZSBmdW5jdGlvbnMgd2hpY2ggdHJhbnNmZXIgZGF0YSBiZXR3ZWVuIHVzZXIgbWVtb3J5IGFuZCBGUFVfUkVHcy58CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTQsMTk5NiwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsIEF1c3RyYWxpYSB8CisgfCAgICAgICAgICAgICAgICAgIEUtbWFpbCAgIGJpbGxtQHN1YnVyYmlhLm5ldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgTm90ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBUaGUgZmlsZSBjb250YWlucyBjb2RlIHdoaWNoIGFjY2Vzc2VzIHVzZXIgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIEVtdWxhdG9yIHN0YXRpYyBkYXRhIG1heSBjaGFuZ2Ugd2hlbiB1c2VyIG1lbW9yeSBpcyBhY2Nlc3NlZCwgZHVlIHRvICAgfAorIHwgICAgb3RoZXIgcHJvY2Vzc2VzIHVzaW5nIHRoZSBlbXVsYXRvciB3aGlsZSBzd2FwcGluZyBpcyBpbiBwcm9ncmVzcy4gICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJmcHVfZW11LmgiCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZnB1X3N5c3RlbS5oIgorI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgInJlZ19jb25zdGFudC5oIgorI2luY2x1ZGUgImNvbnRyb2xfdy5oIgorI2luY2x1ZGUgInN0YXR1c193LmgiCisKKworI2RlZmluZSBET1VCTEVfRW1heCAxMDIzICAgICAgICAgLyogbGFyZ2VzdCB2YWxpZCBleHBvbmVudCAqLworI2RlZmluZSBET1VCTEVfRWJpYXMgMTAyMworI2RlZmluZSBET1VCTEVfRW1pbiAoLTEwMjIpICAgICAgLyogc21hbGxlc3QgdmFsaWQgZXhwb25lbnQgKi8KKworI2RlZmluZSBTSU5HTEVfRW1heCAxMjcgICAgICAgICAgLyogbGFyZ2VzdCB2YWxpZCBleHBvbmVudCAqLworI2RlZmluZSBTSU5HTEVfRWJpYXMgMTI3CisjZGVmaW5lIFNJTkdMRV9FbWluICgtMTI2KSAgICAgICAvKiBzbWFsbGVzdCB2YWxpZCBleHBvbmVudCAqLworCisKK3N0YXRpYyB1X2NoYXIgbm9ybWFsaXplX25vX2V4Y2VwKEZQVV9SRUcgKnIsIGludCBleHAsIGludCBzaWduKQoreworICB1X2NoYXIgdGFnOworCisgIHNldGV4cG9uZW50MTYociwgZXhwKTsKKworICB0YWcgPSBGUFVfbm9ybWFsaXplX251byhyKTsKKyAgc3RkZXhwKHIpOworICBpZiAoIHNpZ24gKQorICAgIHNldG5lZ2F0aXZlKHIpOworCisgIHJldHVybiB0YWc7Cit9CisKKworaW50IEZQVV90YWdvZihGUFVfUkVHICpwdHIpCit7CisgIGludCBleHA7CisKKyAgZXhwID0gZXhwb25lbnQxNihwdHIpICYgMHg3ZmZmOworICBpZiAoIGV4cCA9PSAwICkKKyAgICB7CisgICAgICBpZiAoICEocHRyLT5zaWdoIHwgcHRyLT5zaWdsKSApCisJeworCSAgcmV0dXJuIFRBR19aZXJvOworCX0KKyAgICAgIC8qIFRoZSBudW1iZXIgaXMgYSBkZS1ub3JtYWwgb3IgcHNldWRvZGVub3JtYWwuICovCisgICAgICByZXR1cm4gVEFHX1NwZWNpYWw7CisgICAgfQorCisgIGlmICggZXhwID09IDB4N2ZmZiApCisgICAgeworICAgICAgLyogSXMgYW4gSW5maW5pdHksIGEgTmFOLCBvciBhbiB1bnN1cHBvcnRlZCBkYXRhIHR5cGUuICovCisgICAgICByZXR1cm4gVEFHX1NwZWNpYWw7CisgICAgfQorCisgIGlmICggIShwdHItPnNpZ2ggJiAweDgwMDAwMDAwKSApCisgICAgeworICAgICAgLyogVW5zdXBwb3J0ZWQgZGF0YSB0eXBlLiAqLworICAgICAgLyogVmFsaWQgbnVtYmVycyBoYXZlIHRoZSBtcyBiaXQgc2V0IHRvIDEuICovCisgICAgICAvKiBVbm5vcm1hbC4gKi8KKyAgICAgIHJldHVybiBUQUdfU3BlY2lhbDsKKyAgICB9CisKKyAgcmV0dXJuIFRBR19WYWxpZDsKK30KKworCisvKiBHZXQgYSBsb25nIGRvdWJsZSBmcm9tIHVzZXIgbWVtb3J5ICovCitpbnQgRlBVX2xvYWRfZXh0ZW5kZWQobG9uZyBkb3VibGUgX191c2VyICpzLCBpbnQgc3RucikKK3sKKyAgRlBVX1JFRyAqc3RpX3B0ciA9ICZzdChzdG5yKTsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgRlBVX2FjY2Vzc19vayhWRVJJRllfUkVBRCwgcywgMTApOworICBfX2NvcHlfZnJvbV91c2VyKHN0aV9wdHIsIHMsIDEwKTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICByZXR1cm4gRlBVX3RhZ29mKHN0aV9wdHIpOworfQorCisKKy8qIEdldCBhIGRvdWJsZSBmcm9tIHVzZXIgbWVtb3J5ICovCitpbnQgRlBVX2xvYWRfZG91YmxlKGRvdWJsZSBfX3VzZXIgKmRmbG9hdCwgRlBVX1JFRyAqbG9hZGVkX2RhdGEpCit7CisgIGludCBleHAsIHRhZywgbmVnYXRpdmU7CisgIHVuc2lnbmVkIG02NCwgbDY0OworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELCBkZmxvYXQsIDgpOworICBGUFVfZ2V0X3VzZXIobTY0LCAxICsgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRmbG9hdCk7CisgIEZQVV9nZXRfdXNlcihsNjQsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkZmxvYXQpOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIG5lZ2F0aXZlID0gKG02NCAmIDB4ODAwMDAwMDApID8gU0lHTl9OZWdhdGl2ZSA6IFNJR05fUG9zaXRpdmU7CisgIGV4cCA9ICgobTY0ICYgMHg3ZmYwMDAwMCkgPj4gMjApIC0gRE9VQkxFX0ViaWFzICsgRVhURU5ERURfRWJpYXM7CisgIG02NCAmPSAweGZmZmZmOworICBpZiAoIGV4cCA+IERPVUJMRV9FbWF4ICsgRVhURU5ERURfRWJpYXMgKQorICAgIHsKKyAgICAgIC8qIEluZmluaXR5IG9yIE5hTiAqLworICAgICAgaWYgKChtNjQgPT0gMCkgJiYgKGw2NCA9PSAwKSkKKwl7CisJICAvKiArLSBpbmZpbml0eSAqLworCSAgbG9hZGVkX2RhdGEtPnNpZ2ggPSAweDgwMDAwMDAwOworCSAgbG9hZGVkX2RhdGEtPnNpZ2wgPSAweDAwMDAwMDAwOworCSAgZXhwID0gRVhQX0luZmluaXR5ICsgRVhURU5ERURfRWJpYXM7CisJICB0YWcgPSBUQUdfU3BlY2lhbDsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogTXVzdCBiZSBhIHNpZ25hbGluZyBvciBxdWlldCBOYU4gKi8KKwkgIGV4cCA9IEVYUF9OYU4gKyBFWFRFTkRFRF9FYmlhczsKKwkgIGxvYWRlZF9kYXRhLT5zaWdoID0gKG02NCA8PCAxMSkgfCAweDgwMDAwMDAwOworCSAgbG9hZGVkX2RhdGEtPnNpZ2ggfD0gbDY0ID4+IDIxOworCSAgbG9hZGVkX2RhdGEtPnNpZ2wgPSBsNjQgPDwgMTE7CisJICB0YWcgPSBUQUdfU3BlY2lhbDsgICAgLyogVGhlIGNhbGxpbmcgZnVuY3Rpb24gbXVzdCBsb29rIGZvciBOYU5zICovCisJfQorICAgIH0KKyAgZWxzZSBpZiAoIGV4cCA8IERPVUJMRV9FbWluICsgRVhURU5ERURfRWJpYXMgKQorICAgIHsKKyAgICAgIC8qIFplcm8gb3IgZGUtbm9ybWFsICovCisgICAgICBpZiAoKG02NCA9PSAwKSAmJiAobDY0ID09IDApKQorCXsKKwkgIC8qIFplcm8gKi8KKwkgIHJlZ19jb3B5KCZDT05TVF9aLCBsb2FkZWRfZGF0YSk7CisJICBleHAgPSAwOworCSAgdGFnID0gVEFHX1plcm87CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIERlLW5vcm1hbCAqLworCSAgbG9hZGVkX2RhdGEtPnNpZ2ggPSBtNjQgPDwgMTE7CisJICBsb2FkZWRfZGF0YS0+c2lnaCB8PSBsNjQgPj4gMjE7CisJICBsb2FkZWRfZGF0YS0+c2lnbCA9IGw2NCA8PCAxMTsKKworCSAgcmV0dXJuIG5vcm1hbGl6ZV9ub19leGNlcChsb2FkZWRfZGF0YSwgRE9VQkxFX0VtaW4sIG5lZ2F0aXZlKQorCSAgICB8IChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwID8gRlBVX0V4Y2VwdGlvbiA6IDApOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsb2FkZWRfZGF0YS0+c2lnaCA9IChtNjQgPDwgMTEpIHwgMHg4MDAwMDAwMDsKKyAgICAgIGxvYWRlZF9kYXRhLT5zaWdoIHw9IGw2NCA+PiAyMTsKKyAgICAgIGxvYWRlZF9kYXRhLT5zaWdsID0gbDY0IDw8IDExOworCisgICAgICB0YWcgPSBUQUdfVmFsaWQ7CisgICAgfQorCisgIHNldGV4cG9uZW50MTYobG9hZGVkX2RhdGEsIGV4cCB8IG5lZ2F0aXZlKTsKKworICByZXR1cm4gdGFnOworfQorCisKKy8qIEdldCBhIGZsb2F0IGZyb20gdXNlciBtZW1vcnkgKi8KK2ludCBGUFVfbG9hZF9zaW5nbGUoZmxvYXQgX191c2VyICpzaW5nbGUsIEZQVV9SRUcgKmxvYWRlZF9kYXRhKQoreworICB1bnNpZ25lZCBtMzI7CisgIGludCBleHAsIHRhZywgbmVnYXRpdmU7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNpbmdsZSwgNCk7CisgIEZQVV9nZXRfdXNlcihtMzIsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBzaW5nbGUpOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIG5lZ2F0aXZlID0gKG0zMiAmIDB4ODAwMDAwMDApID8gU0lHTl9OZWdhdGl2ZSA6IFNJR05fUG9zaXRpdmU7CisKKyAgaWYgKCEobTMyICYgMHg3ZmZmZmZmZikpCisgICAgeworICAgICAgLyogWmVybyAqLworICAgICAgcmVnX2NvcHkoJkNPTlNUX1osIGxvYWRlZF9kYXRhKTsKKyAgICAgIGFkZGV4cG9uZW50KGxvYWRlZF9kYXRhLCBuZWdhdGl2ZSk7CisgICAgICByZXR1cm4gVEFHX1plcm87CisgICAgfQorICBleHAgPSAoKG0zMiAmIDB4N2Y4MDAwMDApID4+IDIzKSAtIFNJTkdMRV9FYmlhcyArIEVYVEVOREVEX0ViaWFzOworICBtMzIgPSAobTMyICYgMHg3ZmZmZmYpIDw8IDg7CisgIGlmICggZXhwIDwgU0lOR0xFX0VtaW4gKyBFWFRFTkRFRF9FYmlhcyApCisgICAgeworICAgICAgLyogRGUtbm9ybWFscyAqLworICAgICAgbG9hZGVkX2RhdGEtPnNpZ2ggPSBtMzI7CisgICAgICBsb2FkZWRfZGF0YS0+c2lnbCA9IDA7CisKKyAgICAgIHJldHVybiBub3JtYWxpemVfbm9fZXhjZXAobG9hZGVkX2RhdGEsIFNJTkdMRV9FbWluLCBuZWdhdGl2ZSkKKwl8IChkZW5vcm1hbF9vcGVyYW5kKCkgPCAwID8gRlBVX0V4Y2VwdGlvbiA6IDApOworICAgIH0KKyAgZWxzZSBpZiAoIGV4cCA+IFNJTkdMRV9FbWF4ICsgRVhURU5ERURfRWJpYXMgKQorICAgIHsKKyAgICAvKiBJbmZpbml0eSBvciBOYU4gKi8KKyAgICAgIGlmICggbTMyID09IDAgKQorCXsKKwkgIC8qICstIGluZmluaXR5ICovCisJICBsb2FkZWRfZGF0YS0+c2lnaCA9IDB4ODAwMDAwMDA7CisJICBsb2FkZWRfZGF0YS0+c2lnbCA9IDB4MDAwMDAwMDA7CisJICBleHAgPSBFWFBfSW5maW5pdHkgKyBFWFRFTkRFRF9FYmlhczsKKwkgIHRhZyA9IFRBR19TcGVjaWFsOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBNdXN0IGJlIGEgc2lnbmFsaW5nIG9yIHF1aWV0IE5hTiAqLworCSAgZXhwID0gRVhQX05hTiArIEVYVEVOREVEX0ViaWFzOworCSAgbG9hZGVkX2RhdGEtPnNpZ2ggPSBtMzIgfCAweDgwMDAwMDAwOworCSAgbG9hZGVkX2RhdGEtPnNpZ2wgPSAwOworCSAgdGFnID0gVEFHX1NwZWNpYWw7ICAvKiBUaGUgY2FsbGluZyBmdW5jdGlvbiBtdXN0IGxvb2sgZm9yIE5hTnMgKi8KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbG9hZGVkX2RhdGEtPnNpZ2ggPSBtMzIgfCAweDgwMDAwMDAwOworICAgICAgbG9hZGVkX2RhdGEtPnNpZ2wgPSAwOworICAgICAgdGFnID0gVEFHX1ZhbGlkOworICAgIH0KKworICBzZXRleHBvbmVudDE2KGxvYWRlZF9kYXRhLCBleHAgfCBuZWdhdGl2ZSk7ICAvKiBTZXQgdGhlIHNpZ24uICovCisKKyAgcmV0dXJuIHRhZzsKK30KKworCisvKiBHZXQgYSBsb25nIGxvbmcgZnJvbSB1c2VyIG1lbW9yeSAqLworaW50IEZQVV9sb2FkX2ludDY0KGxvbmcgbG9uZyBfX3VzZXIgKl9zKQoreworICBsb25nIGxvbmcgczsKKyAgaW50IHNpZ247CisgIEZQVV9SRUcgKnN0MF9wdHIgPSAmc3QoMCk7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIF9zLCA4KTsKKyAgY29weV9mcm9tX3VzZXIoJnMsX3MsOCk7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgaWYgKHMgPT0gMCkKKyAgICB7CisgICAgICByZWdfY29weSgmQ09OU1RfWiwgc3QwX3B0cik7CisgICAgICByZXR1cm4gVEFHX1plcm87CisgICAgfQorCisgIGlmIChzID4gMCkKKyAgICBzaWduID0gU0lHTl9Qb3NpdGl2ZTsKKyAgZWxzZQorICB7CisgICAgcyA9IC1zOworICAgIHNpZ24gPSBTSUdOX05lZ2F0aXZlOworICB9CisKKyAgc2lnbmlmaWNhbmQoc3QwX3B0cikgPSBzOworCisgIHJldHVybiBub3JtYWxpemVfbm9fZXhjZXAoc3QwX3B0ciwgNjMsIHNpZ24pOworfQorCisKKy8qIEdldCBhIGxvbmcgZnJvbSB1c2VyIG1lbW9yeSAqLworaW50IEZQVV9sb2FkX2ludDMyKGxvbmcgX191c2VyICpfcywgRlBVX1JFRyAqbG9hZGVkX2RhdGEpCit7CisgIGxvbmcgczsKKyAgaW50IG5lZ2F0aXZlOworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELCBfcywgNCk7CisgIEZQVV9nZXRfdXNlcihzLCBfcyk7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgaWYgKHMgPT0gMCkKKyAgICB7IHJlZ19jb3B5KCZDT05TVF9aLCBsb2FkZWRfZGF0YSk7IHJldHVybiBUQUdfWmVybzsgfQorCisgIGlmIChzID4gMCkKKyAgICBuZWdhdGl2ZSA9IFNJR05fUG9zaXRpdmU7CisgIGVsc2UKKyAgICB7CisgICAgICBzID0gLXM7CisgICAgICBuZWdhdGl2ZSA9IFNJR05fTmVnYXRpdmU7CisgICAgfQorCisgIGxvYWRlZF9kYXRhLT5zaWdoID0gczsKKyAgbG9hZGVkX2RhdGEtPnNpZ2wgPSAwOworCisgIHJldHVybiBub3JtYWxpemVfbm9fZXhjZXAobG9hZGVkX2RhdGEsIDMxLCBuZWdhdGl2ZSk7Cit9CisKKworLyogR2V0IGEgc2hvcnQgZnJvbSB1c2VyIG1lbW9yeSAqLworaW50IEZQVV9sb2FkX2ludDE2KHNob3J0IF9fdXNlciAqX3MsIEZQVV9SRUcgKmxvYWRlZF9kYXRhKQoreworICBpbnQgcywgbmVnYXRpdmU7CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIF9zLCAyKTsKKyAgLyogQ2FzdCBhcyBzaG9ydCB0byBnZXQgdGhlIHNpZ24gZXh0ZW5kZWQuICovCisgIEZQVV9nZXRfdXNlcihzLCBfcyk7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgaWYgKHMgPT0gMCkKKyAgICB7IHJlZ19jb3B5KCZDT05TVF9aLCBsb2FkZWRfZGF0YSk7IHJldHVybiBUQUdfWmVybzsgfQorCisgIGlmIChzID4gMCkKKyAgICBuZWdhdGl2ZSA9IFNJR05fUG9zaXRpdmU7CisgIGVsc2UKKyAgICB7CisgICAgICBzID0gLXM7CisgICAgICBuZWdhdGl2ZSA9IFNJR05fTmVnYXRpdmU7CisgICAgfQorCisgIGxvYWRlZF9kYXRhLT5zaWdoID0gcyA8PCAxNjsKKyAgbG9hZGVkX2RhdGEtPnNpZ2wgPSAwOworCisgIHJldHVybiBub3JtYWxpemVfbm9fZXhjZXAobG9hZGVkX2RhdGEsIDE1LCBuZWdhdGl2ZSk7Cit9CisKKworLyogR2V0IGEgcGFja2VkIGJjZCBhcnJheSBmcm9tIHVzZXIgbWVtb3J5ICovCitpbnQgRlBVX2xvYWRfYmNkKHVfY2hhciBfX3VzZXIgKnMpCit7CisgIEZQVV9SRUcgKnN0MF9wdHIgPSAmc3QoMCk7CisgIGludCBwb3M7CisgIHVfY2hhciBiY2Q7CisgIGxvbmcgbG9uZyBsPTA7CisgIGludCBzaWduOworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELCBzLCAxMCk7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisgIGZvciAoIHBvcyA9IDg7IHBvcyA+PSAwOyBwb3MtLSkKKyAgICB7CisgICAgICBsICo9IDEwOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgICAgICBGUFVfZ2V0X3VzZXIoYmNkLCBzK3Bvcyk7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09OOworICAgICAgbCArPSBiY2QgPj4gNDsKKyAgICAgIGwgKj0gMTA7CisgICAgICBsICs9IGJjZCAmIDB4MGY7CisgICAgfQorIAorICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgRlBVX2dldF91c2VyKHNpZ24sIHMrOSk7CisgIHNpZ24gPSBzaWduICYgMHg4MCA/IFNJR05fTmVnYXRpdmUgOiBTSUdOX1Bvc2l0aXZlOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIGlmICggbCA9PSAwICkKKyAgICB7CisgICAgICByZWdfY29weSgmQ09OU1RfWiwgc3QwX3B0cik7CisgICAgICBhZGRleHBvbmVudChzdDBfcHRyLCBzaWduKTsgICAvKiBTZXQgdGhlIHNpZ24uICovCisgICAgICByZXR1cm4gVEFHX1plcm87CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgc2lnbmlmaWNhbmQoc3QwX3B0cikgPSBsOworICAgICAgcmV0dXJuIG5vcm1hbGl6ZV9ub19leGNlcChzdDBfcHRyLCA2Mywgc2lnbik7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFB1dCBhIGxvbmcgZG91YmxlIGludG8gdXNlciBtZW1vcnkgKi8KK2ludCBGUFVfc3RvcmVfZXh0ZW5kZWQoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsIGxvbmcgZG91YmxlIF9fdXNlciAqZCkKK3sKKyAgLyoKKyAgICBUaGUgb25seSBleGNlcHRpb24gcmFpc2VkIGJ5IGFuIGF0dGVtcHQgdG8gc3RvcmUgdG8gYW4KKyAgICBleHRlbmRlZCBmb3JtYXQgaXMgdGhlIEludmFsaWQgU3RhY2sgZXhjZXB0aW9uLCBpLmUuCisgICAgYXR0ZW1wdGluZyB0byBzdG9yZSBmcm9tIGFuIGVtcHR5IHJlZ2lzdGVyLgorICAgKi8KKworICBpZiAoIHN0MF90YWcgIT0gVEFHX0VtcHR5ICkKKyAgICB7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgICAgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkLCAxMCk7CisKKyAgICAgIEZQVV9wdXRfdXNlcihzdDBfcHRyLT5zaWdsLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZCk7CisgICAgICBGUFVfcHV0X3VzZXIoc3QwX3B0ci0+c2lnaCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopICgodV9jaGFyIF9fdXNlciAqKWQgKyA0KSk7CisgICAgICBGUFVfcHV0X3VzZXIoZXhwb25lbnQxNihzdDBfcHRyKSwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoKHVfY2hhciBfX3VzZXIgKilkICsgOCkpOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIC8qIEVtcHR5IHJlZ2lzdGVyIChzdGFjayB1bmRlcmZsb3cpICovCisgIEVYQ0VQVElPTihFWF9TdGFja1VuZGVyKTsKKyAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkICkKKyAgICB7CisgICAgICAvKiBUaGUgbWFza2VkIHJlc3BvbnNlICovCisgICAgICAvKiBQdXQgb3V0IHRoZSBRTmFOIGluZGVmaW5pdGUgKi8KKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2FjY2Vzc19vayhWRVJJRllfV1JJVEUsZCwxMCk7CisgICAgICBGUFVfcHV0X3VzZXIoMCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGQpOworICAgICAgRlBVX3B1dF91c2VyKDB4YzAwMDAwMDAsIDEgKyAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZCk7CisgICAgICBGUFVfcHV0X3VzZXIoMHhmZmZmLCA0ICsgKHNob3J0IF9fdXNlciAqKSBkKTsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIGVsc2UKKyAgICByZXR1cm4gMDsKKworfQorCisKKy8qIFB1dCBhIGRvdWJsZSBpbnRvIHVzZXIgbWVtb3J5ICovCitpbnQgRlBVX3N0b3JlX2RvdWJsZShGUFVfUkVHICpzdDBfcHRyLCB1X2NoYXIgc3QwX3RhZywgZG91YmxlIF9fdXNlciAqZGZsb2F0KQoreworICB1bnNpZ25lZCBsb25nIGxbMl07CisgIHVuc2lnbmVkIGxvbmcgaW5jcmVtZW50ID0gMDsJLyogYXZvaWQgZ2NjIHdhcm5pbmdzICovCisgIGludCBwcmVjaXNpb25fbG9zczsKKyAgaW50IGV4cDsKKyAgRlBVX1JFRyB0bXA7CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19WYWxpZCApCisgICAgeworICAgICAgcmVnX2NvcHkoc3QwX3B0ciwgJnRtcCk7CisgICAgICBleHAgPSBleHBvbmVudCgmdG1wKTsKKworICAgICAgaWYgKCBleHAgPCBET1VCTEVfRW1pbiApICAgICAvKiBJdCBtYXkgYmUgYSBkZW5vcm1hbCAqLworCXsKKwkgIGFkZGV4cG9uZW50KCZ0bXAsIC1ET1VCTEVfRW1pbiArIDUyKTsgIC8qIGxhcmdlc3QgZXhwIHRvIGJlIDUxICovCisKKwlkZW5vcm1hbF9hcmc6CisKKwkgIGlmICggKHByZWNpc2lvbl9sb3NzID0gRlBVX3JvdW5kX3RvX2ludCgmdG1wLCBzdDBfdGFnKSkgKQorCSAgICB7CisjaWZkZWYgUEVDVUxJQVJfNDg2CisJICAgICAgLyogRGlkIGl0IHJvdW5kIHRvIGEgbm9uLWRlbm9ybWFsID8gKi8KKwkgICAgICAvKiBUaGlzIGJlaGF2aW91ciBtaWdodCBiZSByZWdhcmRlZCBhcyBwZWN1bGlhciwgaXQgYXBwZWFycworCQkgdGhhdCB0aGUgODA0ODYgcm91bmRzIHRvIHRoZSBkZXN0IHByZWNpc2lvbiwgdGhlbgorCQkgY29udmVydHMgdG8gZGVjaWRlIHVuZGVyZmxvdy4gKi8KKwkgICAgICBpZiAoICEoKHRtcC5zaWdoID09IDB4MDAxMDAwMDApICYmICh0bXAuc2lnbCA9PSAwKSAmJgorCQkgIChzdDBfcHRyLT5zaWdsICYgMHgwMDAwMDdmZikpICkKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKwkJeworCQkgIEVYQ0VQVElPTihFWF9VbmRlcmZsb3cpOworCQkgIC8qIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2U6IHNlZSBzZWMgMTYuMi41LjEgb2YKKwkJICAgICB0aGUgODA0ODYgYm9vayAqLworCQkgIGlmICggIShjb250cm9sX3dvcmQgJiBDV19VbmRlcmZsb3cpICkKKwkJICAgIHJldHVybiAwOworCQl9CisJICAgICAgRVhDRVBUSU9OKHByZWNpc2lvbl9sb3NzKTsKKwkgICAgICBpZiAoICEoY29udHJvbF93b3JkICYgQ1dfUHJlY2lzaW9uKSApCisJCXJldHVybiAwOworCSAgICB9CisJICBsWzBdID0gdG1wLnNpZ2w7CisJICBsWzFdID0gdG1wLnNpZ2g7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICggdG1wLnNpZ2wgJiAweDAwMDAwN2ZmICkKKwkgICAgeworCSAgICAgIHByZWNpc2lvbl9sb3NzID0gMTsKKwkgICAgICBzd2l0Y2ggKGNvbnRyb2xfd29yZCAmIENXX1JDKQorCQl7CisJCWNhc2UgUkNfUk5EOgorCQkgIC8qIFJvdW5kaW5nIGNhbiBnZXQgYSBsaXR0bGUgbWVzc3kuLiAqLworCQkgIGluY3JlbWVudCA9ICgodG1wLnNpZ2wgJiAweDdmZikgPiAweDQwMCkgfCAgLyogbmVhcmVzdCAqLworCQkgICAgKCh0bXAuc2lnbCAmIDB4YzAwKSA9PSAweGMwMCk7ICAgICAgICAgICAgLyogb2RkIC0+IGV2ZW4gKi8KKwkJICBicmVhazsKKwkJY2FzZSBSQ19ET1dOOiAgIC8qIHRvd2FyZHMgLWluZmluaXR5ICovCisJCSAgaW5jcmVtZW50ID0gc2lnbnBvc2l0aXZlKCZ0bXApID8gMCA6IHRtcC5zaWdsICYgMHg3ZmY7CisJCSAgYnJlYWs7CisJCWNhc2UgUkNfVVA6ICAgICAvKiB0b3dhcmRzICtpbmZpbml0eSAqLworCQkgIGluY3JlbWVudCA9IHNpZ25wb3NpdGl2ZSgmdG1wKSA/IHRtcC5zaWdsICYgMHg3ZmYgOiAwOworCQkgIGJyZWFrOworCQljYXNlIFJDX0NIT1A6CisJCSAgaW5jcmVtZW50ID0gMDsKKwkJICBicmVhazsKKwkJfQorCSAgCisJICAgICAgLyogVHJ1bmNhdGUgdGhlIG1hbnRpc3NhICovCisJICAgICAgdG1wLnNpZ2wgJj0gMHhmZmZmZjgwMDsKKwkgIAorCSAgICAgIGlmICggaW5jcmVtZW50ICkKKwkJeworCQkgIGlmICggdG1wLnNpZ2wgPj0gMHhmZmZmZjgwMCApCisJCSAgICB7CisJCSAgICAgIC8qIHRoZSBzaWdsIHBhcnQgb3ZlcmZsb3dzICovCisJCSAgICAgIGlmICggdG1wLnNpZ2ggPT0gMHhmZmZmZmZmZiApCisJCQl7CisJCQkgIC8qIFRoZSBzaWdoIHBhcnQgb3ZlcmZsb3dzICovCisJCQkgIHRtcC5zaWdoID0gMHg4MDAwMDAwMDsKKwkJCSAgZXhwKys7CisJCQkgIGlmIChleHAgPj0gRVhQX09WRVIpCisJCQkgICAgZ290byBvdmVyZmxvdzsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICB0bXAuc2lnaCArKzsKKwkJCX0KKwkJICAgICAgdG1wLnNpZ2wgPSAweDAwMDAwMDAwOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgLyogV2Ugb25seSBuZWVkIHRvIGluY3JlbWVudCBzaWdsICovCisJCSAgICAgIHRtcC5zaWdsICs9IDB4MDAwMDA4MDA7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICBwcmVjaXNpb25fbG9zcyA9IDA7CisJICAKKwkgIGxbMF0gPSAodG1wLnNpZ2wgPj4gMTEpIHwgKHRtcC5zaWdoIDw8IDIxKTsKKwkgIGxbMV0gPSAoKHRtcC5zaWdoID4+IDExKSAmIDB4ZmZmZmYpOworCisJICBpZiAoIGV4cCA+IERPVUJMRV9FbWF4ICkKKwkgICAgeworCSAgICBvdmVyZmxvdzoKKwkgICAgICBFWENFUFRJT04oRVhfT3ZlcmZsb3cpOworCSAgICAgIGlmICggIShjb250cm9sX3dvcmQgJiBDV19PdmVyZmxvdykgKQorCQlyZXR1cm4gMDsKKwkgICAgICBzZXRfcHJlY2lzaW9uX2ZsYWdfdXAoKTsKKwkgICAgICBpZiAoICEoY29udHJvbF93b3JkICYgQ1dfUHJlY2lzaW9uKSApCisJCXJldHVybiAwOworCisJICAgICAgLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZTogc2VlIHNlYyAxNi4yLjUuMSBvZiB0aGUgODA0ODYgYm9vayAqLworCSAgICAgIC8qIE92ZXJmbG93IHRvIGluZmluaXR5ICovCisJICAgICAgbFswXSA9IDB4MDAwMDAwMDA7CS8qIFNldCB0byAqLworCSAgICAgIGxbMV0gPSAweDdmZjAwMDAwOwkvKiArIElORiAqLworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoIHByZWNpc2lvbl9sb3NzICkKKwkJeworCQkgIGlmICggaW5jcmVtZW50ICkKKwkJICAgIHNldF9wcmVjaXNpb25fZmxhZ191cCgpOworCQkgIGVsc2UKKwkJICAgIHNldF9wcmVjaXNpb25fZmxhZ19kb3duKCk7CisJCX0KKwkgICAgICAvKiBBZGQgdGhlIGV4cG9uZW50ICovCisJICAgICAgbFsxXSB8PSAoKChleHArRE9VQkxFX0ViaWFzKSAmIDB4N2ZmKSA8PCAyMCk7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmIChzdDBfdGFnID09IFRBR19aZXJvKQorICAgIHsKKyAgICAgIC8qIE51bWJlciBpcyB6ZXJvICovCisgICAgICBsWzBdID0gMDsKKyAgICAgIGxbMV0gPSAwOworICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHsKKyAgICAgIHN0MF90YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKyAgICAgIGlmICggc3QwX3RhZyA9PSBUV19EZW5vcm1hbCApCisJeworCSAgLyogQSBkZW5vcm1hbCB3aWxsIGFsd2F5cyB1bmRlcmZsb3cuICovCisjaWZuZGVmIFBFQ1VMSUFSXzQ4NgorCSAgLyogQW4gODA0ODYgaXMgc3VwcG9zZWQgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZQorCSAgICAgYSBkZW5vcm1hbCBleGNlcHRpb24gaGVyZSwgYnV0Li4uICovCisJICAvKiBVbmRlcmZsb3cgaGFzIHByaW9yaXR5LiAqLworCSAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19VbmRlcmZsb3cgKQorCSAgICBkZW5vcm1hbF9vcGVyYW5kKCk7CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisJICByZWdfY29weShzdDBfcHRyLCAmdG1wKTsKKwkgIGdvdG8gZGVub3JtYWxfYXJnOworCX0KKyAgICAgIGVsc2UgaWYgKHN0MF90YWcgPT0gVFdfSW5maW5pdHkpCisJeworCSAgbFswXSA9IDA7CisJICBsWzFdID0gMHg3ZmYwMDAwMDsKKwl9CisgICAgICBlbHNlIGlmIChzdDBfdGFnID09IFRXX05hTikKKwl7CisJICAvKiBJcyBpdCByZWFsbHkgYSBOYU4gPyAqLworCSAgaWYgKCAoZXhwb25lbnQoc3QwX3B0cikgPT0gRVhQX09WRVIpCisJICAgICAgICYmIChzdDBfcHRyLT5zaWdoICYgMHg4MDAwMDAwMCkgKQorCSAgICB7CisJICAgICAgLyogU2VlIGlmIHdlIGNhbiBnZXQgYSB2YWxpZCBOYU4gZnJvbSB0aGUgRlBVX1JFRyAqLworCSAgICAgIGxbMF0gPSAoc3QwX3B0ci0+c2lnbCA+PiAxMSkgfCAoc3QwX3B0ci0+c2lnaCA8PCAyMSk7CisJICAgICAgbFsxXSA9ICgoc3QwX3B0ci0+c2lnaCA+PiAxMSkgJiAweGZmZmZmKTsKKwkgICAgICBpZiAoICEoc3QwX3B0ci0+c2lnaCAmIDB4NDAwMDAwMDApICkKKwkJeworCQkgIC8qIEl0IGlzIGEgc2lnbmFsbGluZyBOYU4gKi8KKwkJICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisJCSAgaWYgKCAhKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpICkKKwkJICAgIHJldHVybiAwOworCQkgIGxbMV0gfD0gKDB4NDAwMDAwMDAgPj4gMTEpOworCQl9CisJICAgICAgbFsxXSB8PSAweDdmZjAwMDAwOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvKiBJdCBpcyBhbiB1bnN1cHBvcnRlZCBkYXRhIHR5cGUgKi8KKwkgICAgICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisJICAgICAgaWYgKCAhKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpICkKKwkJcmV0dXJuIDA7CisJICAgICAgbFswXSA9IDA7CisJICAgICAgbFsxXSA9IDB4ZmZmODAwMDA7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUQUdfRW1wdHkgKQorICAgIHsKKyAgICAgIC8qIEVtcHR5IHJlZ2lzdGVyIChzdGFjayB1bmRlcmZsb3cpICovCisgICAgICBFWENFUFRJT04oRVhfU3RhY2tVbmRlcik7CisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorCXsKKwkgIC8qIFRoZSBtYXNrZWQgcmVzcG9uc2UgKi8KKwkgIC8qIFB1dCBvdXQgdGhlIFFOYU4gaW5kZWZpbml0ZSAqLworCSAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisJICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSxkZmxvYXQsOCk7CisJICBGUFVfcHV0X3VzZXIoMCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRmbG9hdCk7CisJICBGUFVfcHV0X3VzZXIoMHhmZmY4MDAwMCwgMSArICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkZmxvYXQpOworCSAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKwkgIHJldHVybiAxOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsKKyAgICB9CisgIGlmICggZ2V0c2lnbihzdDBfcHRyKSApCisgICAgbFsxXSB8PSAweDgwMDAwMDAwOworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSxkZmxvYXQsOCk7CisgIEZQVV9wdXRfdXNlcihsWzBdLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilkZmxvYXQpOworICBGUFVfcHV0X3VzZXIobFsxXSwgMSArICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWRmbG9hdCk7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgcmV0dXJuIDE7Cit9CisKKworLyogUHV0IGEgZmxvYXQgaW50byB1c2VyIG1lbW9yeSAqLworaW50IEZQVV9zdG9yZV9zaW5nbGUoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsIGZsb2F0IF9fdXNlciAqc2luZ2xlKQoreworICBsb25nIHRlbXBsID0gMDsKKyAgdW5zaWduZWQgbG9uZyBpbmNyZW1lbnQgPSAwOyAgICAgCS8qIGF2b2lkIGdjYyB3YXJuaW5ncyAqLworICBpbnQgcHJlY2lzaW9uX2xvc3M7CisgIGludCBleHA7CisgIEZQVV9SRUcgdG1wOworCisgIGlmICggc3QwX3RhZyA9PSBUQUdfVmFsaWQgKQorICAgIHsKKworICAgICAgcmVnX2NvcHkoc3QwX3B0ciwgJnRtcCk7CisgICAgICBleHAgPSBleHBvbmVudCgmdG1wKTsKKworICAgICAgaWYgKCBleHAgPCBTSU5HTEVfRW1pbiApCisJeworCSAgYWRkZXhwb25lbnQoJnRtcCwgLVNJTkdMRV9FbWluICsgMjMpOyAgLyogbGFyZ2VzdCBleHAgdG8gYmUgMjIgKi8KKworCWRlbm9ybWFsX2FyZzoKKworCSAgaWYgKCAocHJlY2lzaW9uX2xvc3MgPSBGUFVfcm91bmRfdG9faW50KCZ0bXAsIHN0MF90YWcpKSApCisJICAgIHsKKyNpZmRlZiBQRUNVTElBUl80ODYKKwkgICAgICAvKiBEaWQgaXQgcm91bmQgdG8gYSBub24tZGVub3JtYWwgPyAqLworCSAgICAgIC8qIFRoaXMgYmVoYXZpb3VyIG1pZ2h0IGJlIHJlZ2FyZGVkIGFzIHBlY3VsaWFyLCBpdCBhcHBlYXJzCisJCSB0aGF0IHRoZSA4MDQ4NiByb3VuZHMgdG8gdGhlIGRlc3QgcHJlY2lzaW9uLCB0aGVuCisJCSBjb252ZXJ0cyB0byBkZWNpZGUgdW5kZXJmbG93LiAqLworCSAgICAgIGlmICggISgodG1wLnNpZ2wgPT0gMHgwMDgwMDAwMCkgJiYKKwkJICAoKHN0MF9wdHItPnNpZ2ggJiAweDAwMDAwMGZmKSB8fCBzdDBfcHRyLT5zaWdsKSkgKQorI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLworCQl7CisJCSAgRVhDRVBUSU9OKEVYX1VuZGVyZmxvdyk7CisJCSAgLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZTogc2VlIHNlYyAxNi4yLjUuMSBvZgorCQkgICAgIHRoZSA4MDQ4NiBib29rICovCisJCSAgaWYgKCAhKGNvbnRyb2xfd29yZCAmIENXX1VuZGVyZmxvdykgKQorCQkgICAgcmV0dXJuIDA7CisJCX0KKwkgICAgICBFWENFUFRJT04ocHJlY2lzaW9uX2xvc3MpOworCSAgICAgIGlmICggIShjb250cm9sX3dvcmQgJiBDV19QcmVjaXNpb24pICkKKwkJcmV0dXJuIDA7CisJICAgIH0KKwkgIHRlbXBsID0gdG1wLnNpZ2w7CisgICAgICB9CisgICAgICBlbHNlCisJeworCSAgaWYgKCB0bXAuc2lnbCB8ICh0bXAuc2lnaCAmIDB4MDAwMDAwZmYpICkKKwkgICAgeworCSAgICAgIHVuc2lnbmVkIGxvbmcgc2lnaCA9IHRtcC5zaWdoOworCSAgICAgIHVuc2lnbmVkIGxvbmcgc2lnbCA9IHRtcC5zaWdsOworCSAgICAgIAorCSAgICAgIHByZWNpc2lvbl9sb3NzID0gMTsKKwkgICAgICBzd2l0Y2ggKGNvbnRyb2xfd29yZCAmIENXX1JDKQorCQl7CisJCWNhc2UgUkNfUk5EOgorCQkgIGluY3JlbWVudCA9ICgoc2lnaCAmIDB4ZmYpID4gMHg4MCkgICAgICAgLyogbW9yZSB0aGFuIGhhbGYgKi8KKwkJICAgIHx8ICgoKHNpZ2ggJiAweGZmKSA9PSAweDgwKSAmJiBzaWdsKSAgIC8qIG1vcmUgdGhhbiBoYWxmICovCisJCSAgICB8fCAoKHNpZ2ggJiAweDE4MCkgPT0gMHgxODApOyAgICAgICAgLyogcm91bmQgdG8gZXZlbiAqLworCQkgIGJyZWFrOworCQljYXNlIFJDX0RPV046ICAgLyogdG93YXJkcyAtaW5maW5pdHkgKi8KKwkJICBpbmNyZW1lbnQgPSBzaWducG9zaXRpdmUoJnRtcCkKKwkJICAgID8gMCA6IChzaWdsIHwgKHNpZ2ggJiAweGZmKSk7CisJCSAgYnJlYWs7CisJCWNhc2UgUkNfVVA6ICAgICAvKiB0b3dhcmRzICtpbmZpbml0eSAqLworCQkgIGluY3JlbWVudCA9IHNpZ25wb3NpdGl2ZSgmdG1wKQorCQkgICAgPyAoc2lnbCB8IChzaWdoICYgMHhmZikpIDogMDsKKwkJICBicmVhazsKKwkJY2FzZSBSQ19DSE9QOgorCQkgIGluY3JlbWVudCA9IDA7CisJCSAgYnJlYWs7CisJCX0KKwkgIAorCSAgICAgIC8qIFRydW5jYXRlIHBhcnQgb2YgdGhlIG1hbnRpc3NhICovCisJICAgICAgdG1wLnNpZ2wgPSAwOworCSAgCisJICAgICAgaWYgKGluY3JlbWVudCkKKwkJeworCQkgIGlmICggc2lnaCA+PSAweGZmZmZmZjAwICkKKwkJICAgIHsKKwkJICAgICAgLyogVGhlIHNpZ2ggcGFydCBvdmVyZmxvd3MgKi8KKwkJICAgICAgdG1wLnNpZ2ggPSAweDgwMDAwMDAwOworCQkgICAgICBleHArKzsKKwkJICAgICAgaWYgKCBleHAgPj0gRVhQX09WRVIgKQorCQkJZ290byBvdmVyZmxvdzsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIHRtcC5zaWdoICY9IDB4ZmZmZmZmMDA7CisJCSAgICAgIHRtcC5zaWdoICs9IDB4MTAwOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgdG1wLnNpZ2ggJj0gMHhmZmZmZmYwMDsgIC8qIEZpbmlzaCB0aGUgdHJ1bmNhdGlvbiAqLworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcHJlY2lzaW9uX2xvc3MgPSAwOworICAgICAgCisJICB0ZW1wbCA9ICh0bXAuc2lnaCA+PiA4KSAmIDB4MDA3ZmZmZmY7CisKKwkgIGlmICggZXhwID4gU0lOR0xFX0VtYXggKQorCSAgICB7CisJICAgIG92ZXJmbG93OgorCSAgICAgIEVYQ0VQVElPTihFWF9PdmVyZmxvdyk7CisJICAgICAgaWYgKCAhKGNvbnRyb2xfd29yZCAmIENXX092ZXJmbG93KSApCisJCXJldHVybiAwOworCSAgICAgIHNldF9wcmVjaXNpb25fZmxhZ191cCgpOworCSAgICAgIGlmICggIShjb250cm9sX3dvcmQgJiBDV19QcmVjaXNpb24pICkKKwkJcmV0dXJuIDA7CisKKwkgICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlOiBzZWUgc2VjIDE2LjIuNS4xIG9mIHRoZSA4MDQ4NiBib29rLiAqLworCSAgICAgIC8qIE1hc2tlZCByZXNwb25zZSBpcyBvdmVyZmxvdyB0byBpbmZpbml0eS4gKi8KKwkgICAgICB0ZW1wbCA9IDB4N2Y4MDAwMDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICggcHJlY2lzaW9uX2xvc3MgKQorCQl7CisJCSAgaWYgKCBpbmNyZW1lbnQgKQorCQkgICAgc2V0X3ByZWNpc2lvbl9mbGFnX3VwKCk7CisJCSAgZWxzZQorCQkgICAgc2V0X3ByZWNpc2lvbl9mbGFnX2Rvd24oKTsKKwkJfQorCSAgICAgIC8qIEFkZCB0aGUgZXhwb25lbnQgKi8KKwkgICAgICB0ZW1wbCB8PSAoKGV4cCtTSU5HTEVfRWJpYXMpICYgMHhmZikgPDwgMjM7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmIChzdDBfdGFnID09IFRBR19aZXJvKQorICAgIHsKKyAgICAgIHRlbXBsID0gMDsKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICB7CisgICAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisgICAgICBpZiAoc3QwX3RhZyA9PSBUV19EZW5vcm1hbCkKKwl7CisJICByZWdfY29weShzdDBfcHRyLCAmdG1wKTsKKworCSAgLyogQSBkZW5vcm1hbCB3aWxsIGFsd2F5cyB1bmRlcmZsb3cuICovCisjaWZuZGVmIFBFQ1VMSUFSXzQ4NgorCSAgLyogQW4gODA0ODYgaXMgc3VwcG9zZWQgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZQorCSAgICAgYSBkZW5vcm1hbCBleGNlcHRpb24gaGVyZSwgYnV0Li4uICovCisJICAvKiBVbmRlcmZsb3cgaGFzIHByaW9yaXR5LiAqLworCSAgaWYgKCBjb250cm9sX3dvcmQgJiBDV19VbmRlcmZsb3cgKQorCSAgICBkZW5vcm1hbF9vcGVyYW5kKCk7CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovIAorCSAgZ290byBkZW5vcm1hbF9hcmc7CisJfQorICAgICAgZWxzZSBpZiAoc3QwX3RhZyA9PSBUV19JbmZpbml0eSkKKwl7CisJICB0ZW1wbCA9IDB4N2Y4MDAwMDA7CisJfQorICAgICAgZWxzZSBpZiAoc3QwX3RhZyA9PSBUV19OYU4pCisJeworCSAgLyogSXMgaXQgcmVhbGx5IGEgTmFOID8gKi8KKwkgIGlmICggKGV4cG9uZW50KHN0MF9wdHIpID09IEVYUF9PVkVSKSAmJiAoc3QwX3B0ci0+c2lnaCAmIDB4ODAwMDAwMDApICkKKwkgICAgeworCSAgICAgIC8qIFNlZSBpZiB3ZSBjYW4gZ2V0IGEgdmFsaWQgTmFOIGZyb20gdGhlIEZQVV9SRUcgKi8KKwkgICAgICB0ZW1wbCA9IHN0MF9wdHItPnNpZ2ggPj4gODsKKwkgICAgICBpZiAoICEoc3QwX3B0ci0+c2lnaCAmIDB4NDAwMDAwMDApICkKKwkJeworCQkgIC8qIEl0IGlzIGEgc2lnbmFsbGluZyBOYU4gKi8KKwkJICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisJCSAgaWYgKCAhKGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQpICkKKwkJICAgIHJldHVybiAwOworCQkgIHRlbXBsIHw9ICgweDQwMDAwMDAwID4+IDgpOworCQl9CisJICAgICAgdGVtcGwgfD0gMHg3ZjgwMDAwMDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogSXQgaXMgYW4gdW5zdXBwb3J0ZWQgZGF0YSB0eXBlICovCisJICAgICAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCSAgICAgIGlmICggIShjb250cm9sX3dvcmQgJiBDV19JbnZhbGlkKSApCisJCXJldHVybiAwOworCSAgICAgIHRlbXBsID0gMHhmZmMwMDAwMDsKKwkgICAgfQorCX0KKyNpZmRlZiBQQVJBTk9JRAorICAgICAgZWxzZQorCXsKKwkgIEVYQ0VQVElPTihFWF9JTlRFUk5BTHwweDE2NCk7CisJICByZXR1cm4gMDsKKwl9CisjZW5kaWYKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRBR19FbXB0eSApCisgICAgeworICAgICAgLyogRW1wdHkgcmVnaXN0ZXIgKHN0YWNrIHVuZGVyZmxvdykgKi8KKyAgICAgIEVYQ0VQVElPTihFWF9TdGFja1VuZGVyKTsKKyAgICAgIGlmICggY29udHJvbF93b3JkICYgRVhfSW52YWxpZCApCisJeworCSAgLyogVGhlIG1hc2tlZCByZXNwb25zZSAqLworCSAgLyogUHV0IG91dCB0aGUgUU5hTiBpbmRlZmluaXRlICovCisJICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKwkgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLHNpbmdsZSw0KTsKKwkgIEZQVV9wdXRfdXNlcigweGZmYzAwMDAwLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgc2luZ2xlKTsKKwkgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisJICByZXR1cm4gMTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorI2lmZGVmIFBBUkFOT0lECisgIGVsc2UKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxNjMpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VuZGlmCisgIGlmICggZ2V0c2lnbihzdDBfcHRyKSApCisgICAgdGVtcGwgfD0gMHg4MDAwMDAwMDsKKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgRlBVX2FjY2Vzc19vayhWRVJJRllfV1JJVEUsc2luZ2xlLDQpOworICBGUFVfcHV0X3VzZXIodGVtcGwsKHVuc2lnbmVkIGxvbmcgX191c2VyICopIHNpbmdsZSk7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgcmV0dXJuIDE7Cit9CisKKworLyogUHV0IGEgbG9uZyBsb25nIGludG8gdXNlciBtZW1vcnkgKi8KK2ludCBGUFVfc3RvcmVfaW50NjQoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsIGxvbmcgbG9uZyBfX3VzZXIgKmQpCit7CisgIEZQVV9SRUcgdDsKKyAgbG9uZyBsb25nIHRsbDsKKyAgaW50IHByZWNpc2lvbl9sb3NzOworCisgIGlmICggc3QwX3RhZyA9PSBUQUdfRW1wdHkgKQorICAgIHsKKyAgICAgIC8qIEVtcHR5IHJlZ2lzdGVyIChzdGFjayB1bmRlcmZsb3cpICovCisgICAgICBFWENFUFRJT04oRVhfU3RhY2tVbmRlcik7CisgICAgICBnb3RvIGludmFsaWRfb3BlcmFuZDsKKyAgICB9CisgIGVsc2UgaWYgKCBzdDBfdGFnID09IFRBR19TcGVjaWFsICkKKyAgICB7CisgICAgICBzdDBfdGFnID0gRlBVX1NwZWNpYWwoc3QwX3B0cik7CisgICAgICBpZiAoIChzdDBfdGFnID09IFRXX0luZmluaXR5KSB8fAorCSAgIChzdDBfdGFnID09IFRXX05hTikgKQorCXsKKwkgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKwkgIGdvdG8gaW52YWxpZF9vcGVyYW5kOworCX0KKyAgICB9CisKKyAgcmVnX2NvcHkoc3QwX3B0ciwgJnQpOworICBwcmVjaXNpb25fbG9zcyA9IEZQVV9yb3VuZF90b19pbnQoJnQsIHN0MF90YWcpOworICAoKGxvbmcgKikmdGxsKVswXSA9IHQuc2lnbDsKKyAgKChsb25nICopJnRsbClbMV0gPSB0LnNpZ2g7CisgIGlmICggKHByZWNpc2lvbl9sb3NzID09IDEpIHx8CisgICAgICAoKHQuc2lnaCAmIDB4ODAwMDAwMDApICYmCisgICAgICAgISgodC5zaWdoID09IDB4ODAwMDAwMDApICYmICh0LnNpZ2wgPT0gMCkgJiYKKwkgc2lnbm5lZ2F0aXZlKCZ0KSkpICkKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisgICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlOiBzZWUgc2VjIDE2LjIuNS4xIG9mIHRoZSA4MDQ4NiBib29rICovCisgICAgaW52YWxpZF9vcGVyYW5kOgorICAgICAgaWYgKCBjb250cm9sX3dvcmQgJiBFWF9JbnZhbGlkICkKKwl7CisJICAvKiBQcm9kdWNlIHNvbWV0aGluZyBsaWtlIFFOYU4gImluZGVmaW5pdGUiICovCisJICB0bGwgPSAweDgwMDAwMDAwMDAwMDAwMDBMTDsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCBwcmVjaXNpb25fbG9zcyApCisJc2V0X3ByZWNpc2lvbl9mbGFnKHByZWNpc2lvbl9sb3NzKTsKKyAgICAgIGlmICggc2lnbm5lZ2F0aXZlKCZ0KSApCisJdGxsID0gLSB0bGw7CisgICAgfQorCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSxkLDgpOworICBjb3B5X3RvX3VzZXIoZCwgJnRsbCwgOCk7CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisKKyAgcmV0dXJuIDE7Cit9CisKKworLyogUHV0IGEgbG9uZyBpbnRvIHVzZXIgbWVtb3J5ICovCitpbnQgRlBVX3N0b3JlX2ludDMyKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCBsb25nIF9fdXNlciAqZCkKK3sKKyAgRlBVX1JFRyB0OworICBpbnQgcHJlY2lzaW9uX2xvc3M7CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19FbXB0eSApCisgICAgeworICAgICAgLyogRW1wdHkgcmVnaXN0ZXIgKHN0YWNrIHVuZGVyZmxvdykgKi8KKyAgICAgIEVYQ0VQVElPTihFWF9TdGFja1VuZGVyKTsKKyAgICAgIGdvdG8gaW52YWxpZF9vcGVyYW5kOworICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHsKKyAgICAgIHN0MF90YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKyAgICAgIGlmICggKHN0MF90YWcgPT0gVFdfSW5maW5pdHkpIHx8CisJICAgKHN0MF90YWcgPT0gVFdfTmFOKSApCisJeworCSAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCSAgZ290byBpbnZhbGlkX29wZXJhbmQ7CisJfQorICAgIH0KKworICByZWdfY29weShzdDBfcHRyLCAmdCk7CisgIHByZWNpc2lvbl9sb3NzID0gRlBVX3JvdW5kX3RvX2ludCgmdCwgc3QwX3RhZyk7CisgIGlmICh0LnNpZ2ggfHwKKyAgICAgICgodC5zaWdsICYgMHg4MDAwMDAwMCkgJiYKKyAgICAgICAhKCh0LnNpZ2wgPT0gMHg4MDAwMDAwMCkgJiYgc2lnbm5lZ2F0aXZlKCZ0KSkpICkKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisgICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlOiBzZWUgc2VjIDE2LjIuNS4xIG9mIHRoZSA4MDQ4NiBib29rICovCisgICAgaW52YWxpZF9vcGVyYW5kOgorICAgICAgaWYgKCBjb250cm9sX3dvcmQgJiBFWF9JbnZhbGlkICkKKwl7CisJICAvKiBQcm9kdWNlIHNvbWV0aGluZyBsaWtlIFFOYU4gImluZGVmaW5pdGUiICovCisJICB0LnNpZ2wgPSAweDgwMDAwMDAwOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIHByZWNpc2lvbl9sb3NzICkKKwlzZXRfcHJlY2lzaW9uX2ZsYWcocHJlY2lzaW9uX2xvc3MpOworICAgICAgaWYgKCBzaWdubmVnYXRpdmUoJnQpICkKKwl0LnNpZ2wgPSAtKGxvbmcpdC5zaWdsOworICAgIH0KKworICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgRlBVX2FjY2Vzc19vayhWRVJJRllfV1JJVEUsZCw0KTsKKyAgRlBVX3B1dF91c2VyKHQuc2lnbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGQpOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIHJldHVybiAxOworfQorCisKKy8qIFB1dCBhIHNob3J0IGludG8gdXNlciBtZW1vcnkgKi8KK2ludCBGUFVfc3RvcmVfaW50MTYoRlBVX1JFRyAqc3QwX3B0ciwgdV9jaGFyIHN0MF90YWcsIHNob3J0IF9fdXNlciAqZCkKK3sKKyAgRlBVX1JFRyB0OworICBpbnQgcHJlY2lzaW9uX2xvc3M7CisKKyAgaWYgKCBzdDBfdGFnID09IFRBR19FbXB0eSApCisgICAgeworICAgICAgLyogRW1wdHkgcmVnaXN0ZXIgKHN0YWNrIHVuZGVyZmxvdykgKi8KKyAgICAgIEVYQ0VQVElPTihFWF9TdGFja1VuZGVyKTsKKyAgICAgIGdvdG8gaW52YWxpZF9vcGVyYW5kOworICAgIH0KKyAgZWxzZSBpZiAoIHN0MF90YWcgPT0gVEFHX1NwZWNpYWwgKQorICAgIHsKKyAgICAgIHN0MF90YWcgPSBGUFVfU3BlY2lhbChzdDBfcHRyKTsKKyAgICAgIGlmICggKHN0MF90YWcgPT0gVFdfSW5maW5pdHkpIHx8CisJICAgKHN0MF90YWcgPT0gVFdfTmFOKSApCisJeworCSAgRVhDRVBUSU9OKEVYX0ludmFsaWQpOworCSAgZ290byBpbnZhbGlkX29wZXJhbmQ7CisJfQorICAgIH0KKworICByZWdfY29weShzdDBfcHRyLCAmdCk7CisgIHByZWNpc2lvbl9sb3NzID0gRlBVX3JvdW5kX3RvX2ludCgmdCwgc3QwX3RhZyk7CisgIGlmICh0LnNpZ2ggfHwKKyAgICAgICgodC5zaWdsICYgMHhmZmZmODAwMCkgJiYKKyAgICAgICAhKCh0LnNpZ2wgPT0gMHg4MDAwKSAmJiBzaWdubmVnYXRpdmUoJnQpKSkgKQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKyAgICAgIC8qIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2U6IHNlZSBzZWMgMTYuMi41LjEgb2YgdGhlIDgwNDg2IGJvb2sgKi8KKyAgICBpbnZhbGlkX29wZXJhbmQ6CisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIEVYX0ludmFsaWQgKQorCXsKKwkgIC8qIFByb2R1Y2Ugc29tZXRoaW5nIGxpa2UgUU5hTiAiaW5kZWZpbml0ZSIgKi8KKwkgIHQuc2lnbCA9IDB4ODAwMDsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYgKCBwcmVjaXNpb25fbG9zcyApCisJc2V0X3ByZWNpc2lvbl9mbGFnKHByZWNpc2lvbl9sb3NzKTsKKyAgICAgIGlmICggc2lnbm5lZ2F0aXZlKCZ0KSApCisJdC5zaWdsID0gLXQuc2lnbDsKKyAgICB9CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLGQsMik7CisgIEZQVV9wdXRfdXNlcigoc2hvcnQpdC5zaWdsLCBkKTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICByZXR1cm4gMTsKK30KKworCisvKiBQdXQgYSBwYWNrZWQgYmNkIGFycmF5IGludG8gdXNlciBtZW1vcnkgKi8KK2ludCBGUFVfc3RvcmVfYmNkKEZQVV9SRUcgKnN0MF9wdHIsIHVfY2hhciBzdDBfdGFnLCB1X2NoYXIgX191c2VyICpkKQoreworICBGUFVfUkVHIHQ7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBsbDsKKyAgdV9jaGFyIGI7CisgIGludCBpLCBwcmVjaXNpb25fbG9zczsKKyAgdV9jaGFyIHNpZ24gPSAoZ2V0c2lnbihzdDBfcHRyKSA9PSBTSUdOX05FRykgPyAweDgwIDogMDsKKworICBpZiAoIHN0MF90YWcgPT0gVEFHX0VtcHR5ICkKKyAgICB7CisgICAgICAvKiBFbXB0eSByZWdpc3RlciAoc3RhY2sgdW5kZXJmbG93KSAqLworICAgICAgRVhDRVBUSU9OKEVYX1N0YWNrVW5kZXIpOworICAgICAgZ290byBpbnZhbGlkX29wZXJhbmQ7CisgICAgfQorICBlbHNlIGlmICggc3QwX3RhZyA9PSBUQUdfU3BlY2lhbCApCisgICAgeworICAgICAgc3QwX3RhZyA9IEZQVV9TcGVjaWFsKHN0MF9wdHIpOworICAgICAgaWYgKCAoc3QwX3RhZyA9PSBUV19JbmZpbml0eSkgfHwKKwkgICAoc3QwX3RhZyA9PSBUV19OYU4pICkKKwl7CisJICBFWENFUFRJT04oRVhfSW52YWxpZCk7CisJICBnb3RvIGludmFsaWRfb3BlcmFuZDsKKwl9CisgICAgfQorCisgIHJlZ19jb3B5KHN0MF9wdHIsICZ0KTsKKyAgcHJlY2lzaW9uX2xvc3MgPSBGUFVfcm91bmRfdG9faW50KCZ0LCBzdDBfdGFnKTsKKyAgbGwgPSBzaWduaWZpY2FuZCgmdCk7CisKKyAgLyogQ2hlY2sgZm9yIG92ZXJmbG93LCBieSBjb21wYXJpbmcgd2l0aCA5OTk5OTk5OTk5OTk5OTk5OTkgZGVjaW1hbC4gKi8KKyAgaWYgKCAodC5zaWdoID4gMHgwZGUwYjZiMykgfHwKKyAgICAgICgodC5zaWdoID09IDB4MGRlMGI2YjMpICYmICh0LnNpZ2wgPiAweGE3NjNmZmZmKSkgKQorICAgIHsKKyAgICAgIEVYQ0VQVElPTihFWF9JbnZhbGlkKTsKKyAgICAgIC8qIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2U6IHNlZSBzZWMgMTYuMi41LjEgb2YgdGhlIDgwNDg2IGJvb2sgKi8KKyAgICBpbnZhbGlkX29wZXJhbmQ6CisgICAgICBpZiAoIGNvbnRyb2xfd29yZCAmIENXX0ludmFsaWQgKQorCXsKKwkgIC8qIFByb2R1Y2UgdGhlIFFOYU4gImluZGVmaW5pdGUiICovCisJICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKwkgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLGQsMTApOworCSAgZm9yICggaSA9IDA7IGkgPCA3OyBpKyspCisJICAgIEZQVV9wdXRfdXNlcigwLCBkK2kpOyAvKiBUaGVzZSBieXRlcyAidW5kZWZpbmVkIiAqLworCSAgRlBVX3B1dF91c2VyKDB4YzAsIGQrNyk7IC8qIFRoaXMgYnl0ZSAidW5kZWZpbmVkIiAqLworCSAgRlBVX3B1dF91c2VyKDB4ZmYsIGQrOCk7CisJICBGUFVfcHV0X3VzZXIoMHhmZiwgZCs5KTsKKwkgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisJICByZXR1cm4gMTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorICBlbHNlIGlmICggcHJlY2lzaW9uX2xvc3MgKQorICAgIHsKKyAgICAgIC8qIFByZWNpc2lvbiBsb3NzIGRvZXNuJ3Qgc3RvcCB0aGUgZGF0YSB0cmFuc2ZlciAqLworICAgICAgc2V0X3ByZWNpc2lvbl9mbGFnKHByZWNpc2lvbl9sb3NzKTsKKyAgICB9CisKKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLGQsMTApOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworICBmb3IgKCBpID0gMDsgaSA8IDk7IGkrKykKKyAgICB7CisgICAgICBiID0gRlBVX2Rpdl9zbWFsbCgmbGwsIDEwKTsKKyAgICAgIGIgfD0gKEZQVV9kaXZfc21hbGwoJmxsLCAxMCkpIDw8IDQ7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09GRjsKKyAgICAgIEZQVV9wdXRfdXNlcihiLCBkK2kpOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgICB9CisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfcHV0X3VzZXIoc2lnbiwgZCs5KTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICByZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiByIGdldHMgbWFuZ2xlZCBzdWNoIHRoYXQgc2lnIGlzIGludCwgc2lnbjogCisgICBpdCBpcyBOT1Qgbm9ybWFsaXplZCAqLworLyogVGhlIHJldHVybiB2YWx1ZSAoaW4gZWF4KSBpcyB6ZXJvIGlmIHRoZSByZXN1bHQgaXMgZXhhY3QsCisgICBpZiBiaXRzIGFyZSBjaGFuZ2VkIGR1ZSB0byByb3VuZGluZywgdHJ1bmNhdGlvbiwgZXRjLCB0aGVuCisgICBhIG5vbi16ZXJvIHZhbHVlIGlzIHJldHVybmVkICovCisvKiBPdmVyZmxvdyBpcyBzaWduYWxsZWQgYnkgYSBub24temVybyByZXR1cm4gdmFsdWUgKGluIGVheCkuCisgICBJbiB0aGUgY2FzZSBvZiBvdmVyZmxvdywgdGhlIHJldHVybmVkIHNpZ25pZmljYW5kIGFsd2F5cyBoYXMgdGhlCisgICBsYXJnZXN0IHBvc3NpYmxlIHZhbHVlICovCitpbnQgRlBVX3JvdW5kX3RvX2ludChGUFVfUkVHICpyLCB1X2NoYXIgdGFnKQoreworICB1X2NoYXIgICAgIHZlcnlfYmlnOworICB1bnNpZ25lZCBlYXg7CisKKyAgaWYgKHRhZyA9PSBUQUdfWmVybykKKyAgICB7CisgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB6ZXJvIGlzIHJldHVybmVkICovCisgICAgICBzaWduaWZpY2FuZChyKSA9IDA7CisgICAgICByZXR1cm4gMDsgICAgICAgIC8qIG8uay4gKi8KKyAgICB9CisKKyAgaWYgKGV4cG9uZW50KHIpID4gNjMpCisgICAgeworICAgICAgci0+c2lnbCA9IHItPnNpZ2ggPSB+MDsgICAgICAvKiBUaGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIG51bWJlciAqLworICAgICAgcmV0dXJuIDE7ICAgICAgICAvKiBvdmVyZmxvdyAqLworICAgIH0KKworICBlYXggPSBGUFVfc2hyeHMoJnItPnNpZ2wsIDYzIC0gZXhwb25lbnQocikpOworICB2ZXJ5X2JpZyA9ICEofihyLT5zaWdoKSB8IH4oci0+c2lnbCkpOyAgLyogdGVzdCBmb3IgMHhmZmYuLi5mZmYgKi8KKyNkZWZpbmUJaGFsZl9vcl9tb3JlCShlYXggJiAweDgwMDAwMDAwKQorI2RlZmluZQlmcmFjX3BhcnQJKGVheCkKKyNkZWZpbmUgbW9yZV90aGFuX2hhbGYgICgoZWF4ICYgMHg4MDAwMDAwMSkgPT0gMHg4MDAwMDAwMSkKKyAgc3dpdGNoIChjb250cm9sX3dvcmQgJiBDV19SQykKKyAgICB7CisgICAgY2FzZSBSQ19STkQ6CisgICAgICBpZiAoIG1vcmVfdGhhbl9oYWxmICAgICAgICAgICAgICAgCS8qIG5lYXJlc3QgKi8KKwkgIHx8IChoYWxmX29yX21vcmUgJiYgKHItPnNpZ2wgJiAxKSkgKQkvKiBvZGQgLT4gZXZlbiAqLworCXsKKwkgIGlmICggdmVyeV9iaWcgKSByZXR1cm4gMTsgICAgICAgIC8qIG92ZXJmbG93ICovCisJICBzaWduaWZpY2FuZChyKSArKzsKKwkgIHJldHVybiBQUkVDSVNJT05fTE9TVF9VUDsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIFJDX0RPV046CisgICAgICBpZiAoZnJhY19wYXJ0ICYmIGdldHNpZ24ocikpCisJeworCSAgaWYgKCB2ZXJ5X2JpZyApIHJldHVybiAxOyAgICAgICAgLyogb3ZlcmZsb3cgKi8KKwkgIHNpZ25pZmljYW5kKHIpICsrOworCSAgcmV0dXJuIFBSRUNJU0lPTl9MT1NUX1VQOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkNfVVA6CisgICAgICBpZiAoZnJhY19wYXJ0ICYmICFnZXRzaWduKHIpKQorCXsKKwkgIGlmICggdmVyeV9iaWcgKSByZXR1cm4gMTsgICAgICAgIC8qIG92ZXJmbG93ICovCisJICBzaWduaWZpY2FuZChyKSArKzsKKwkgIHJldHVybiBQUkVDSVNJT05fTE9TVF9VUDsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIFJDX0NIT1A6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIGVheCA/IFBSRUNJU0lPTl9MT1NUX0RPV04gOiAwOworCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordV9jaGFyIF9fdXNlciAqZmxkZW52KGZwdV9hZGRyX21vZGVzIGFkZHJfbW9kZXMsIHVfY2hhciBfX3VzZXIgKnMpCit7CisgIHVuc2lnbmVkIHNob3J0IHRhZ193b3JkID0gMDsKKyAgdV9jaGFyIHRhZzsKKyAgaW50IGk7CisKKyAgaWYgKCAoYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgPT0gVk04NikgfHwKKyAgICAgICgoYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgPT0gUE0xNikKKyAgICAgIF4gKGFkZHJfbW9kZXMub3ZlcnJpZGUub3BlcmFuZF9zaXplID09IE9QX1NJWkVfUFJFRklYKSkgKQorICAgIHsKKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICAgICAgRlBVX2FjY2Vzc19vayhWRVJJRllfUkVBRCwgcywgMHgwZSk7CisgICAgICBGUFVfZ2V0X3VzZXIoY29udHJvbF93b3JkLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIHMpOworICAgICAgRlBVX2dldF91c2VyKHBhcnRpYWxfc3RhdHVzLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChzKzIpKTsKKyAgICAgIEZQVV9nZXRfdXNlcih0YWdfd29yZCwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAocys0KSk7CisgICAgICBGUFVfZ2V0X3VzZXIoaW5zdHJ1Y3Rpb25fYWRkcmVzcy5vZmZzZXQsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKHMrNikpOworICAgICAgRlBVX2dldF91c2VyKGluc3RydWN0aW9uX2FkZHJlc3Muc2VsZWN0b3IsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKHMrOCkpOworICAgICAgRlBVX2dldF91c2VyKG9wZXJhbmRfYWRkcmVzcy5vZmZzZXQsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKHMrMHgwYSkpOworICAgICAgRlBVX2dldF91c2VyKG9wZXJhbmRfYWRkcmVzcy5zZWxlY3RvciwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAocysweDBjKSk7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09OOworICAgICAgcyArPSAweDBlOworICAgICAgaWYgKCBhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSA9PSBWTTg2ICkKKwl7CisJICBpbnN0cnVjdGlvbl9hZGRyZXNzLm9mZnNldAorCSAgICArPSAoaW5zdHJ1Y3Rpb25fYWRkcmVzcy5zZWxlY3RvciAmIDB4ZjAwMCkgPDwgNDsKKwkgIG9wZXJhbmRfYWRkcmVzcy5vZmZzZXQgKz0gKG9wZXJhbmRfYWRkcmVzcy5zZWxlY3RvciAmIDB4ZjAwMCkgPDwgNDsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgICAgICBGUFVfYWNjZXNzX29rKFZFUklGWV9SRUFELCBzLCAweDFjKTsKKyAgICAgIEZQVV9nZXRfdXNlcihjb250cm9sX3dvcmQsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgcyk7CisgICAgICBGUFVfZ2V0X3VzZXIocGFydGlhbF9zdGF0dXMsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKHMrNCkpOworICAgICAgRlBVX2dldF91c2VyKHRhZ193b3JkLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChzKzgpKTsKKyAgICAgIEZQVV9nZXRfdXNlcihpbnN0cnVjdGlvbl9hZGRyZXNzLm9mZnNldCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIChzKzB4MGMpKTsKKyAgICAgIEZQVV9nZXRfdXNlcihpbnN0cnVjdGlvbl9hZGRyZXNzLnNlbGVjdG9yLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChzKzB4MTApKTsKKyAgICAgIEZQVV9nZXRfdXNlcihpbnN0cnVjdGlvbl9hZGRyZXNzLm9wY29kZSwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAocysweDEyKSk7CisgICAgICBGUFVfZ2V0X3VzZXIob3BlcmFuZF9hZGRyZXNzLm9mZnNldCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIChzKzB4MTQpKTsKKyAgICAgIEZQVV9nZXRfdXNlcihvcGVyYW5kX2FkZHJlc3Muc2VsZWN0b3IsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSAocysweDE4KSk7CisgICAgICBSRV9FTlRSQU5UX0NIRUNLX09OOworICAgICAgcyArPSAweDFjOworICAgIH0KKworI2lmZGVmIFBFQ1VMSUFSXzQ4NgorICBjb250cm9sX3dvcmQgJj0gfjB4ZTA4MDsKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8gCisKKyAgdG9wID0gKHBhcnRpYWxfc3RhdHVzID4+IFNXX1RvcF9TaGlmdCkgJiA3OworCisgIGlmICggcGFydGlhbF9zdGF0dXMgJiB+Y29udHJvbF93b3JkICYgQ1dfRXhjZXB0aW9ucyApCisgICAgcGFydGlhbF9zdGF0dXMgfD0gKFNXX1N1bW1hcnkgfCBTV19CYWNrd2FyZCk7CisgIGVsc2UKKyAgICBwYXJ0aWFsX3N0YXR1cyAmPSB+KFNXX1N1bW1hcnkgfCBTV19CYWNrd2FyZCk7CisKKyAgZm9yICggaSA9IDA7IGkgPCA4OyBpKysgKQorICAgIHsKKyAgICAgIHRhZyA9IHRhZ193b3JkICYgMzsKKyAgICAgIHRhZ193b3JkID4+PSAyOworCisgICAgICBpZiAoIHRhZyA9PSBUQUdfRW1wdHkgKQorCS8qIE5ldyB0YWcgaXMgZW1wdHkuICBBY2NlcHQgaXQgKi8KKwlGUFVfc2V0dGFnKGksIFRBR19FbXB0eSk7CisgICAgICBlbHNlIGlmICggRlBVX2dldHRhZyhpKSA9PSBUQUdfRW1wdHkgKQorCXsKKwkgIC8qIE9sZCB0YWcgaXMgZW1wdHkgYW5kIG5ldyB0YWcgaXMgbm90IGVtcHR5LiAgTmV3IHRhZyBpcyBkZXRlcm1pbmVkCisJICAgICBieSBvbGQgcmVnIGNvbnRlbnRzICovCisJICBpZiAoIGV4cG9uZW50KCZmcHVfcmVnaXN0ZXIoaSkpID09IC0gRVhURU5ERURfRWJpYXMgKQorCSAgICB7CisJICAgICAgaWYgKCAhKGZwdV9yZWdpc3RlcihpKS5zaWdsIHwgZnB1X3JlZ2lzdGVyKGkpLnNpZ2gpICkKKwkJRlBVX3NldHRhZyhpLCBUQUdfWmVybyk7CisJICAgICAgZWxzZQorCQlGUFVfc2V0dGFnKGksIFRBR19TcGVjaWFsKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoIGV4cG9uZW50KCZmcHVfcmVnaXN0ZXIoaSkpID09IDB4N2ZmZiAtIEVYVEVOREVEX0ViaWFzICkKKwkgICAgeworCSAgICAgIEZQVV9zZXR0YWcoaSwgVEFHX1NwZWNpYWwpOworCSAgICB9CisJICBlbHNlIGlmICggZnB1X3JlZ2lzdGVyKGkpLnNpZ2ggJiAweDgwMDAwMDAwICkKKwkgICAgRlBVX3NldHRhZyhpLCBUQUdfVmFsaWQpOworCSAgZWxzZQorCSAgICBGUFVfc2V0dGFnKGksIFRBR19TcGVjaWFsKTsgICAvKiBBbiBVbi1ub3JtYWwgKi8KKyAgCX0KKyAgICAgIC8qIEVsc2Ugb2xkIHRhZyBpcyBub3QgZW1wdHkgYW5kIG5ldyB0YWcgaXMgbm90IGVtcHR5LiAgT2xkIHRhZworCSByZW1haW5zIGNvcnJlY3QgKi8KKyAgICB9CisKKyAgcmV0dXJuIHM7Cit9CisKKwordm9pZCBmcnN0b3IoZnB1X2FkZHJfbW9kZXMgYWRkcl9tb2RlcywgdV9jaGFyIF9fdXNlciAqZGF0YV9hZGRyZXNzKQoreworICBpbnQgaSwgcmVnbnI7CisgIHVfY2hhciBfX3VzZXIgKnMgPSBmbGRlbnYoYWRkcl9tb2RlcywgZGF0YV9hZGRyZXNzKTsKKyAgaW50IG9mZnNldCA9ICh0b3AgJiA3KSAqIDEwLCBvdGhlciA9IDgwIC0gb2Zmc2V0OworCisgIC8qIENvcHkgYWxsIHJlZ2lzdGVycyBpbiBzdGFjayBvcmRlci4gKi8KKyAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgIEZQVV9hY2Nlc3Nfb2soVkVSSUZZX1JFQUQscyw4MCk7CisgIF9fY29weV9mcm9tX3VzZXIocmVnaXN0ZXJfYmFzZStvZmZzZXQsIHMsIG90aGVyKTsKKyAgaWYgKCBvZmZzZXQgKQorICAgIF9fY29weV9mcm9tX3VzZXIocmVnaXN0ZXJfYmFzZSwgcytvdGhlciwgb2Zmc2V0KTsKKyAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKworICBmb3IgKCBpID0gMDsgaSA8IDg7IGkrKyApCisgICAgeworICAgICAgcmVnbnIgPSAoaSt0b3ApICYgNzsKKyAgICAgIGlmICggRlBVX2dldHRhZyhyZWducikgIT0gVEFHX0VtcHR5ICkKKwkvKiBUaGUgbG9hZGVkIGRhdGEgb3Zlci1yaWRlcyBhbGwgb3RoZXIgY2FzZXMuICovCisJRlBVX3NldHRhZyhyZWduciwgRlBVX3RhZ29mKCZzdChpKSkpOworICAgIH0KKworfQorCisKK3VfY2hhciBfX3VzZXIgKmZzdGVudihmcHVfYWRkcl9tb2RlcyBhZGRyX21vZGVzLCB1X2NoYXIgX191c2VyICpkKQoreworICBpZiAoIChhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSA9PSBWTTg2KSB8fAorICAgICAgKChhZGRyX21vZGVzLmRlZmF1bHRfbW9kZSA9PSBQTTE2KQorICAgICAgXiAoYWRkcl9tb2Rlcy5vdmVycmlkZS5vcGVyYW5kX3NpemUgPT0gT1BfU0laRV9QUkVGSVgpKSApCisgICAgeworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgICAgICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSxkLDE0KTsKKyNpZmRlZiBQRUNVTElBUl80ODYKKyAgICAgIEZQVV9wdXRfdXNlcihjb250cm9sX3dvcmQgJiB+MHhlMDgwLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZCk7CisjZWxzZQorICAgICAgRlBVX3B1dF91c2VyKGNvbnRyb2xfd29yZCwgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSBkKTsKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKyAgICAgIEZQVV9wdXRfdXNlcihzdGF0dXNfd29yZCgpLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChkKzIpKTsKKyAgICAgIEZQVV9wdXRfdXNlcihmcHVfdGFnX3dvcmQsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKGQrNCkpOworICAgICAgRlBVX3B1dF91c2VyKGluc3RydWN0aW9uX2FkZHJlc3Mub2Zmc2V0LCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChkKzYpKTsKKyAgICAgIEZQVV9wdXRfdXNlcihvcGVyYW5kX2FkZHJlc3Mub2Zmc2V0LCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChkKzB4MGEpKTsKKyAgICAgIGlmICggYWRkcl9tb2Rlcy5kZWZhdWx0X21vZGUgPT0gVk04NiApCisJeworCSAgRlBVX3B1dF91c2VyKChpbnN0cnVjdGlvbl9hZGRyZXNzLm9mZnNldCAmIDB4ZjAwMDApID4+IDQsCisJCSAgICAgICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKGQrOCkpOworCSAgRlBVX3B1dF91c2VyKChvcGVyYW5kX2FkZHJlc3Mub2Zmc2V0ICYgMHhmMDAwMCkgPj4gNCwKKwkJICAgICAgKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKSAoZCsweDBjKSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIEZQVV9wdXRfdXNlcihpbnN0cnVjdGlvbl9hZGRyZXNzLnNlbGVjdG9yLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopIChkKzgpKTsKKwkgIEZQVV9wdXRfdXNlcihvcGVyYW5kX2FkZHJlc3Muc2VsZWN0b3IsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgKGQrMHgwYykpOworCX0KKyAgICAgIFJFX0VOVFJBTlRfQ0hFQ0tfT047CisgICAgICBkICs9IDB4MGU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PRkY7CisgICAgICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSwgZCwgNyo0KTsKKyNpZmRlZiBQRUNVTElBUl80ODYKKyAgICAgIGNvbnRyb2xfd29yZCAmPSB+MHhlMDgwOworICAgICAgLyogQW4gODA0ODYgc2V0cyBuZWFybHkgYWxsIG9mIHRoZSByZXNlcnZlZCBiaXRzIHRvIDEuICovCisgICAgICBjb250cm9sX3dvcmQgfD0gMHhmZmZmMDA0MDsKKyAgICAgIHBhcnRpYWxfc3RhdHVzID0gc3RhdHVzX3dvcmQoKSB8IDB4ZmZmZjAwMDA7CisgICAgICBmcHVfdGFnX3dvcmQgfD0gMHhmZmZmMDAwMDsKKyAgICAgIEkzODcuc29mdC5mY3MgJj0gfjB4ZjgwMDAwMDA7CisgICAgICBJMzg3LnNvZnQuZm9zIHw9IDB4ZmZmZjAwMDA7CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovCisgICAgICBfX2NvcHlfdG9fdXNlcihkLCAmY29udHJvbF93b3JkLCA3KjQpOworICAgICAgUkVfRU5UUkFOVF9DSEVDS19PTjsKKyAgICAgIGQgKz0gMHgxYzsKKyAgICB9CisgIAorICBjb250cm9sX3dvcmQgfD0gQ1dfRXhjZXB0aW9uczsKKyAgcGFydGlhbF9zdGF0dXMgJj0gfihTV19TdW1tYXJ5IHwgU1dfQmFja3dhcmQpOworCisgIHJldHVybiBkOworfQorCisKK3ZvaWQgZnNhdmUoZnB1X2FkZHJfbW9kZXMgYWRkcl9tb2RlcywgdV9jaGFyIF9fdXNlciAqZGF0YV9hZGRyZXNzKQoreworICB1X2NoYXIgX191c2VyICpkOworICBpbnQgb2Zmc2V0ID0gKHRvcCAmIDcpICogMTAsIG90aGVyID0gODAgLSBvZmZzZXQ7CisKKyAgZCA9IGZzdGVudihhZGRyX21vZGVzLCBkYXRhX2FkZHJlc3MpOworCisgIFJFX0VOVFJBTlRfQ0hFQ0tfT0ZGOworICBGUFVfYWNjZXNzX29rKFZFUklGWV9XUklURSxkLDgwKTsKKworICAvKiBDb3B5IGFsbCByZWdpc3RlcnMgaW4gc3RhY2sgb3JkZXIuICovCisgIF9fY29weV90b191c2VyKGQsIHJlZ2lzdGVyX2Jhc2Urb2Zmc2V0LCBvdGhlcik7CisgIGlmICggb2Zmc2V0ICkKKyAgICBfX2NvcHlfdG9fdXNlcihkK290aGVyLCByZWdpc3Rlcl9iYXNlLCBvZmZzZXQpOworICBSRV9FTlRSQU5UX0NIRUNLX09OOworCisgIGZpbml0KCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfbXVsLmMgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX211bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjUwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX211bC5jCkBAIC0wLDAgKzEsMTMyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByZWdfbXVsLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBNdWx0aXBseSBvbmUgRlBVX1JFRyBieSBhbm90aGVyLCBwdXQgdGhlIHJlc3VsdCBpbiBhIGRlc3RpbmF0aW9uIEZQVV9SRUcuIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBSZXR1cm5zIHRoZSB0YWcgb2YgdGhlIHJlc3VsdCBpZiBubyBleGNlcHRpb25zIG9yIGVycm9ycyBvY2N1cnJlZC4gICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8IFRoZSBkZXN0aW5hdGlvbiBtYXkgYmUgYW55IEZQVV9SRUcsIGluY2x1ZGluZyBvbmUgb2YgdGhlIHNvdXJjZSBGUFVfUkVHcy4gfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgInJlZ19jb25zdGFudC5oIgorI2luY2x1ZGUgImZwdV9zeXN0ZW0uaCIKKworCisvKgorICBNdWx0aXBseSB0d28gcmVnaXN0ZXJzIHRvIGdpdmUgYSByZWdpc3RlciByZXN1bHQuCisgIFRoZSBzb3VyY2VzIGFyZSBzdChkZXN0c3RucikgYW5kIChiLHRhZ2Isc2lnbmIpLgorICBUaGUgZGVzdGluYXRpb24gaXMgc3QoZGVzdHN0bnIpLgorICAqLworLyogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIHdpdGggbm9uLWVtcHR5IHNvdXJjZSByZWdpc3RlcnMgKi8KK2ludCBGUFVfbXVsKEZQVV9SRUcgY29uc3QgKmIsIHVfY2hhciB0YWdiLCBpbnQgZGVzdHN0bnIsIGludCBjb250cm9sX3cpCit7CisgIEZQVV9SRUcgKmEgPSAmc3QoZGVzdHN0bnIpOworICBGUFVfUkVHICpkZXN0ID0gYTsKKyAgdV9jaGFyIHRhZ2EgPSBGUFVfZ2V0dGFnaShkZXN0c3Rucik7CisgIHVfY2hhciBzYXZlZF9zaWduID0gZ2V0c2lnbihkZXN0KTsKKyAgdV9jaGFyIHNpZ24gPSAoZ2V0c2lnbihhKSBeIGdldHNpZ24oYikpOworICBpbnQgdGFnOworCisKKyAgaWYgKCAhKHRhZ2EgfCB0YWdiKSApCisgICAgeworICAgICAgLyogQm90aCByZWdzIFZhbGlkLCB0aGlzIHNob3VsZCBiZSB0aGUgbW9zdCBjb21tb24gY2FzZS4gKi8KKworICAgICAgdGFnID0gRlBVX3VfbXVsKGEsIGIsIGRlc3QsIGNvbnRyb2xfdywgc2lnbiwgZXhwb25lbnQoYSkgKyBleHBvbmVudChiKSk7CisgICAgICBpZiAoIHRhZyA8IDAgKQorCXsKKwkgIHNldHNpZ24oZGVzdCwgc2F2ZWRfc2lnbik7CisJICByZXR1cm4gdGFnOworCX0KKyAgICAgIEZQVV9zZXR0YWdpKGRlc3RzdG5yLCB0YWcpOworICAgICAgcmV0dXJuIHRhZzsKKyAgICB9CisKKyAgaWYgKCB0YWdhID09IFRBR19TcGVjaWFsICkKKyAgICB0YWdhID0gRlBVX1NwZWNpYWwoYSk7CisgIGlmICggdGFnYiA9PSBUQUdfU3BlY2lhbCApCisgICAgdGFnYiA9IEZQVV9TcGVjaWFsKGIpOworCisgIGlmICggKCh0YWdhID09IFRBR19WYWxpZCkgJiYgKHRhZ2IgPT0gVFdfRGVub3JtYWwpKQorCSAgICB8fCAoKHRhZ2EgPT0gVFdfRGVub3JtYWwpICYmICh0YWdiID09IFRBR19WYWxpZCkpCisJICAgIHx8ICgodGFnYSA9PSBUV19EZW5vcm1hbCkgJiYgKHRhZ2IgPT0gVFdfRGVub3JtYWwpKSApCisgICAgeworICAgICAgRlBVX1JFRyB4LCB5OworICAgICAgaWYgKCBkZW5vcm1hbF9vcGVyYW5kKCkgPCAwICkKKwlyZXR1cm4gRlBVX0V4Y2VwdGlvbjsKKworICAgICAgRlBVX3RvX2V4cDE2KGEsICZ4KTsKKyAgICAgIEZQVV90b19leHAxNihiLCAmeSk7CisgICAgICB0YWcgPSBGUFVfdV9tdWwoJngsICZ5LCBkZXN0LCBjb250cm9sX3csIHNpZ24sCisJCSAgICAgIGV4cG9uZW50MTYoJngpICsgZXhwb25lbnQxNigmeSkpOworICAgICAgaWYgKCB0YWcgPCAwICkKKwl7CisJICBzZXRzaWduKGRlc3QsIHNhdmVkX3NpZ24pOworCSAgcmV0dXJuIHRhZzsKKwl9CisgICAgICBGUFVfc2V0dGFnaShkZXN0c3RuciwgdGFnKTsKKyAgICAgIHJldHVybiB0YWc7CisgICAgfQorICBlbHNlIGlmICggKHRhZ2EgPD0gVFdfRGVub3JtYWwpICYmICh0YWdiIDw9IFRXX0Rlbm9ybWFsKSApCisgICAgeworICAgICAgaWYgKCAoKHRhZ2IgPT0gVFdfRGVub3JtYWwpIHx8ICh0YWdhID09IFRXX0Rlbm9ybWFsKSkKKwkgICAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorCXJldHVybiBGUFVfRXhjZXB0aW9uOworCisgICAgICAvKiBNdXN0IGhhdmUgZWl0aGVyIGJvdGggYXJndW1lbnRzID09IHplcm8sIG9yCisJIG9uZSB2YWxpZCBhbmQgdGhlIG90aGVyIHplcm8uCisJIFRoZSByZXN1bHQgaXMgdGhlcmVmb3JlIHplcm8uICovCisgICAgICBGUFVfY29weV90b19yZWdpKCZDT05TVF9aLCBUQUdfWmVybywgZGVzdHN0bnIpOworICAgICAgLyogVGhlIDgwNDg2IGJvb2sgc2F5cyB0aGF0IHRoZSBhbnN3ZXIgaXMgKzAsIGJ1dCBhIHJlYWwKKwkgODA0ODYgYmVoYXZlcyB0aGlzIHdheS4KKwkgSUVFRS03NTQgYXBwYXJlbnRseSBzYXlzIGl0IHNob3VsZCBiZSB0aGlzIHdheS4gKi8KKyAgICAgIHNldHNpZ24oZGVzdCwgc2lnbik7CisgICAgICByZXR1cm4gVEFHX1plcm87CisgICAgfQorICAgICAgLyogTXVzdCBoYXZlIGluZmluaXRpZXMsIE5hTnMsIGV0YyAqLworICBlbHNlIGlmICggKHRhZ2EgPT0gVFdfTmFOKSB8fCAodGFnYiA9PSBUV19OYU4pICkKKyAgICB7CisgICAgICByZXR1cm4gcmVhbF8yb3BfTmFOKGIsIHRhZ2IsIGRlc3RzdG5yLCAmc3QoMCkpOworICAgIH0KKyAgZWxzZSBpZiAoICgodGFnYSA9PSBUV19JbmZpbml0eSkgJiYgKHRhZ2IgPT0gVEFHX1plcm8pKQorCSAgICB8fCAoKHRhZ2IgPT0gVFdfSW5maW5pdHkpICYmICh0YWdhID09IFRBR19aZXJvKSkgKQorICAgIHsKKyAgICAgIHJldHVybiBhcml0aF9pbnZhbGlkKGRlc3RzdG5yKTsgIC8qIFplcm8qSW5maW5pdHkgaXMgaW52YWxpZCAqLworICAgIH0KKyAgZWxzZSBpZiAoICgodGFnYSA9PSBUV19EZW5vcm1hbCkgfHwgKHRhZ2IgPT0gVFdfRGVub3JtYWwpKQorCSAgICAmJiAoZGVub3JtYWxfb3BlcmFuZCgpIDwgMCkgKQorICAgIHsKKyAgICAgIHJldHVybiBGUFVfRXhjZXB0aW9uOworICAgIH0KKyAgZWxzZSBpZiAodGFnYSA9PSBUV19JbmZpbml0eSkKKyAgICB7CisgICAgICBGUFVfY29weV90b19yZWdpKGEsIFRBR19TcGVjaWFsLCBkZXN0c3Rucik7CisgICAgICBzZXRzaWduKGRlc3QsIHNpZ24pOworICAgICAgcmV0dXJuIFRBR19TcGVjaWFsOworICAgIH0KKyAgZWxzZSBpZiAodGFnYiA9PSBUV19JbmZpbml0eSkKKyAgICB7CisgICAgICBGUFVfY29weV90b19yZWdpKGIsIFRBR19TcGVjaWFsLCBkZXN0c3Rucik7CisgICAgICBzZXRzaWduKGRlc3QsIHNpZ24pOworICAgICAgcmV0dXJuIFRBR19TcGVjaWFsOworICAgIH0KKworI2lmZGVmIFBBUkFOT0lECisgIGVsc2UKKyAgICB7CisgICAgICBFWENFUFRJT04oRVhfSU5URVJOQUx8MHgxMDIpOworICAgICAgcmV0dXJuIEZQVV9FeGNlcHRpb247CisgICAgfQorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX25vcm0uUyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfbm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNjM1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX25vcm0uUwpAQCAtMCwwICsxLDE0NyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcmVnX25vcm0uUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk1LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBOb3JtYWxpemUgdGhlIHZhbHVlIGluIGEgRlBVX1JFRy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ2FsbCBmcm9tIEMgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBpbnQgRlBVX25vcm1hbGl6ZShGUFVfUkVHICpuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgaW50IEZQVV9ub3JtYWxpemVfbnVvKEZQVV9SRUcgKm4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIFJldHVybiB2YWx1ZSBpcyB0aGUgdGFnIG9mIHRoZSBhbnN3ZXIsIG9yLWVkIHdpdGggRlBVX0V4Y2VwdGlvbiBpZiAgICAgfAorIHwgICAgb25lIHdhcyByYWlzZWQsIG9yIC0xIG9uIGludGVybmFsIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImZwdV9lbXUuaCIKKworCisudGV4dAorRU5UUlkoRlBVX25vcm1hbGl6ZSkKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlwdXNobAklZWJ4CisKKwltb3ZsCVBBUkFNMSwlZWJ4CisKKwltb3ZsCVNJR0goJWVieCksJWVkeAorCW1vdmwJU0lHTCglZWJ4KSwlZWF4CisKKwlvcmwJJWVkeCwlZWR4CS8qIG1zIGJpdHMgKi8KKwlqcwlMX2RvbmUJCS8qIEFscmVhZHkgbm9ybWFsaXplZCAqLworCWpueglMX3NoaWZ0XzEJLyogU2hpZnQgbGVmdCAxIC0gMzEgYml0cyAqLworCisJb3JsCSVlYXgsJWVheAorCWp6CUxfemVybwkJLyogVGhlIGNvbnRlbnRzIGFyZSB6ZXJvICovCisKKwltb3ZsCSVlYXgsJWVkeAorCXhvcmwJJWVheCwlZWF4CisJc3VidwkkMzIsRVhQKCVlYngpCS8qIFRoaXMgY2FuIGNhdXNlIGFuIHVuZGVyZmxvdyAqLworCisvKiBXZSBuZWVkIHRvIHNoaWZ0IGxlZnQgYnkgMSAtIDMxIGJpdHMgKi8KK0xfc2hpZnRfMToKKwlic3JsCSVlZHgsJWVjeAkvKiBnZXQgdGhlIHJlcXVpcmVkIHNoaWZ0IGluICVlY3ggKi8KKwlzdWJsCSQzMSwlZWN4CisJbmVnbAklZWN4CisJc2hsZAklY2wsJWVheCwlZWR4CisJc2hsCSVjbCwlZWF4CisJc3VidwklY3gsRVhQKCVlYngpCS8qIFRoaXMgY2FuIGNhdXNlIGFuIHVuZGVyZmxvdyAqLworCisJbW92bAklZWR4LFNJR0goJWVieCkKKwltb3ZsCSVlYXgsU0lHTCglZWJ4KQorCitMX2RvbmU6CisJY21wdwlFWFBfT1ZFUixFWFAoJWVieCkKKwlqZ2UJTF9vdmVyZmxvdworCisJY21wdwlFWFBfVU5ERVIsRVhQKCVlYngpCisJamxlCUxfdW5kZXJmbG93CisKK0xfZXhpdF92YWxpZDoKKwltb3ZsCVRBR19WYWxpZCwlZWF4CisKKwkvKiBDb252ZXJ0IHRoZSBleHBvbmVudCB0byA4MHg4NyBmb3JtLiAqLworCWFkZHcJRVhURU5ERURfRWJpYXMsRVhQKCVlYngpCisJYW5kdwkkMHg3ZmZmLEVYUCglZWJ4KQorCitMX2V4aXQ6CisJcG9wbAklZWJ4CisJbGVhdmUKKwlyZXQKKworCitMX3plcm86CisJbW92dwkkMCxFWFAoJWVieCkKKwltb3ZsCVRBR19aZXJvLCVlYXgKKwlqbXAJTF9leGl0CisKK0xfdW5kZXJmbG93OgorCS8qIENvbnZlcnQgdGhlIGV4cG9uZW50IHRvIDgweDg3IGZvcm0uICovCisJYWRkdwlFWFRFTkRFRF9FYmlhcyxFWFAoJWVieCkKKwlwdXNoCSVlYngKKwljYWxsCWFyaXRoX3VuZGVyZmxvdworCXBvcAklZWJ4CisJam1wCUxfZXhpdAorCitMX292ZXJmbG93OgorCS8qIENvbnZlcnQgdGhlIGV4cG9uZW50IHRvIDgweDg3IGZvcm0uICovCisJYWRkdwlFWFRFTkRFRF9FYmlhcyxFWFAoJWVieCkKKwlwdXNoCSVlYngKKwljYWxsCWFyaXRoX292ZXJmbG93CisJcG9wCSVlYngKKwlqbXAJTF9leGl0CisKKworCisvKiBOb3JtYWxpc2Ugd2l0aG91dCByZXBvcnRpbmcgdW5kZXJmbG93IG9yIG92ZXJmbG93ICovCitFTlRSWShGUFVfbm9ybWFsaXplX251bykKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlwdXNobAklZWJ4CisKKwltb3ZsCVBBUkFNMSwlZWJ4CisKKwltb3ZsCVNJR0goJWVieCksJWVkeAorCW1vdmwJU0lHTCglZWJ4KSwlZWF4CisKKwlvcmwJJWVkeCwlZWR4CS8qIG1zIGJpdHMgKi8KKwlqcwlMX2V4aXRfbnVvX3ZhbGlkCS8qIEFscmVhZHkgbm9ybWFsaXplZCAqLworCWpueglMX251b19zaGlmdF8xCS8qIFNoaWZ0IGxlZnQgMSAtIDMxIGJpdHMgKi8KKworCW9ybAklZWF4LCVlYXgKKwlqeglMX2V4aXRfbnVvX3plcm8JCS8qIFRoZSBjb250ZW50cyBhcmUgemVybyAqLworCisJbW92bAklZWF4LCVlZHgKKwl4b3JsCSVlYXgsJWVheAorCXN1YncJJDMyLEVYUCglZWJ4KQkvKiBUaGlzIGNhbiBjYXVzZSBhbiB1bmRlcmZsb3cgKi8KKworLyogV2UgbmVlZCB0byBzaGlmdCBsZWZ0IGJ5IDEgLSAzMSBiaXRzICovCitMX251b19zaGlmdF8xOgorCWJzcmwJJWVkeCwlZWN4CS8qIGdldCB0aGUgcmVxdWlyZWQgc2hpZnQgaW4gJWVjeCAqLworCXN1YmwJJDMxLCVlY3gKKwluZWdsCSVlY3gKKwlzaGxkCSVjbCwlZWF4LCVlZHgKKwlzaGwJJWNsLCVlYXgKKwlzdWJ3CSVjeCxFWFAoJWVieCkJLyogVGhpcyBjYW4gY2F1c2UgYW4gdW5kZXJmbG93ICovCisKKwltb3ZsCSVlZHgsU0lHSCglZWJ4KQorCW1vdmwJJWVheCxTSUdMKCVlYngpCisKK0xfZXhpdF9udW9fdmFsaWQ6CisJbW92bAlUQUdfVmFsaWQsJWVheAorCisJcG9wbAklZWJ4CisJbGVhdmUKKwlyZXQKKworTF9leGl0X251b196ZXJvOgorCW1vdmwJVEFHX1plcm8sJWVheAorCW1vdncJRVhQX1VOREVSLEVYUCglZWJ4KQorCisJcG9wbAklZWJ4CisJbGVhdmUKKwlyZXQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfcm91bmQuUyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfcm91bmQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWQ0ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ19yb3VuZC5TCkBAIC0wLDAgKzEsNzA4IEBACisJLmZpbGUgInJlZ19yb3VuZC5TIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcmVnX3JvdW5kLlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgUm91bmRpbmcvdHJ1bmNhdGlvbi9ldGMgZm9yIEZQVSBiYXNpYyBhcml0aG1ldGljIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MywxOTk1LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsIGJpbGxtQHN1YnVyYmlhLm5ldCAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgVGhpcyBjb2RlIGhhcyBmb3VyIHBvc3NpYmxlIGVudHJ5IHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBUaGUgZm9sbG93aW5nIG11c3QgYmUgZW50ZXJlZCBieSBhIGptcCBpbnN0cnVjdGlvbjogICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgZnB1X3JlZ19yb3VuZCwgZnB1X3JlZ19yb3VuZF9zcXJ0LCBhbmQgZnB1X0FyaXRoX2V4aXQuICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBUaGUgRlBVX3JvdW5kIGVudHJ5IHBvaW50IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgQyBjb2RlLiAgICAgICAgICAgICAgIHwKKyB8IEZyb20gQywgY2FsbCBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgIGludCBGUFVfcm91bmQoRlBVX1JFRyAqYXJnLCB1bnNpZ25lZCBpbnQgZXh0ZW50LCB1bnNpZ25lZCBpbnQgY29udHJvbF93KSB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIFJldHVybiB2YWx1ZSBpcyB0aGUgdGFnIG9mIHRoZSBhbnN3ZXIsIG9yLWVkIHdpdGggRlBVX0V4Y2VwdGlvbiBpZiAgICAgfAorIHwgICAgb25lIHdhcyByYWlzZWQsIG9yIC0xIG9uIGludGVybmFsIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IEZvciBjb3JyZWN0ICJ1cCIgYW5kICJkb3duIiByb3VuZGluZywgdGhlIGFyZ3VtZW50IG11c3QgaGF2ZSB0aGUgY29ycmVjdCAgfAorIHwgc2lnbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCBGb3VyIGVudHJ5IHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgTmVlZGVkIGJ5IGJvdGggdGhlIGZwdV9yZWdfcm91bmQgYW5kIGZwdV9yZWdfcm91bmRfc3FydCBlbnRyeSBwb2ludHM6ICAgICB8CisgfCAgJWVheDolZWJ4ICA2NCBiaXQgc2lnbmlmaWNhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAlZWR4ICAgICAgIDMyIGJpdCBleHRlbnNpb24gb2YgdGhlIHNpZ25pZmljYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICVlZGkgICAgICAgcG9pbnRlciB0byBhbiBGUFVfUkVHIGZvciB0aGUgcmVzdWx0IHRvIGJlIHN0b3JlZCAgICAgICAgICAgICB8CisgfCAgc3RhY2sgICAgICBjYWxsaW5nIGZ1bmN0aW9uIG11c3QgaGF2ZSBzZXQgdXAgYSBDIHN0YWNrIGZyYW1lIGFuZCAgICAgICAgIHwKKyB8ICAgICAgICAgICAgIHB1c2hlZCAlZXNpLCAlZWRpLCBhbmQgJWVieCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBOZWVkZWQganVzdCBmb3IgdGhlIGZwdV9yZWdfcm91bmRfc3FydCBlbnRyeSBwb2ludDogICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAlY3ggIEEgY29udHJvbCB3b3JkIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgRlBVIGNvbnRyb2wgd29yZC4gICAgICAgICAgfAorIHwgT3RoZXJ3aXNlLCBQQVJBTTQgbXVzdCBnaXZlIHN1Y2ggYSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgVGhlIHNpZ25pZmljYW5kIGFuZCBpdHMgZXh0ZW5zaW9uIGFyZSBhc3N1bWVkIHRvIGJlIGV4YWN0IGluIHRoZSAgICAgICAgICB8CisgfCBmb2xsb3dpbmcgc2Vuc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgSWYgdGhlIHNpZ25pZmljYW5kIGJ5IGl0c2VsZiBpcyB0aGUgZXhhY3QgcmVzdWx0IHRoZW4gdGhlIHNpZ25pZmljYW5kICAgfAorIHwgICBleHRlbnNpb24gKCVlZHgpIG11c3QgY29udGFpbiAwLCBvdGhlcndpc2UgdGhlIHNpZ25pZmljYW5kIGV4dGVuc2lvbiAgICB8CisgfCAgIG11c3QgYmUgbm9uLXplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgSWYgdGhlIHNpZ25pZmljYW5kIGV4dGVuc2lvbiBpcyBub24temVybyB0aGVuIHRoZSBzaWduaWZpY2FuZCBpcyAgICAgICAgfAorIHwgICBzbWFsbGVyIHRoYW4gdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29ycmVjdCBleGFjdCByZXN1bHQgYnkgYW4gYW1vdW50ICAgICB8CisgfCAgIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCBsZXNzIHRoYW4gb25lIGxzIGJpdCBvZiB0aGUgc2lnbmlmaWNhbmQuICAgICAgICAgIHwKKyB8ICAgVGhlIHNpZ25pZmljYW5kIGV4dGVuc2lvbiBpcyBvbmx5IHJlcXVpcmVkIHRvIGhhdmUgdGhyZWUgcG9zc2libGUgICAgICAgfAorIHwgICBub24temVybyB2YWx1ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICBsZXNzIHRoYW4gMHg4MDAwMDAwMCAgPD0+IHRoZSBzaWduaWZpY2FuZCBpcyBsZXNzIHRoYW4gMS8yIGFuIGxzICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IHNtYWxsZXIgdGhhbiB0aGUgbWFnbml0dWRlIG9mIHRoZSAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIGV4YWN0IHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgIGV4YWN0bHkgMHg4MDAwMDAwMCAgPD0+IHRoZSBzaWduaWZpY2FuZCBpcyBleGFjdGx5IDEvMiBhbiBscyBiaXQgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxlciB0aGFuIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHRydWUgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdCByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBncmVhdGVyIHRoYW4gMHg4MDAwMDAwMCAgPD0+IHRoZSBzaWduaWZpY2FuZCBpcyBtb3JlIHRoYW4gMS8yIGFuIGxzICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IHNtYWxsZXIgdGhhbiB0aGUgbWFnbml0dWRlIG9mIHRoZSAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIGV4YWN0IHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgVGhlIGNvZGUgaW4gdGhpcyBtb2R1bGUgaGFzIGJlY29tZSBxdWl0ZSBjb21wbGV4LCBidXQgaXQgc2hvdWxkIGhhbmRsZSAgIHwKKyB8ICBhbGwgb2YgdGhlIEZQVSBmbGFncyB3aGljaCBhcmUgc2V0IGF0IHRoaXMgc3RhZ2Ugb2YgdGhlIGJhc2ljIGFyaXRobWV0aWMgfAorIHwgIGNvbXB1dGF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgVGhlcmUgYXJlIGEgZmV3IHJhcmUgY2FzZXMgd2hlcmUgdGhlIHJlc3VsdHMgYXJlIG5vdCBzZXQgaWRlbnRpY2FsbHkgdG8gIHwKKyB8ICBhIHJlYWwgRlBVLiBUaGVzZSByZXF1aXJlIGEgYml0IG1vcmUgdGhvdWdodCBiZWNhdXNlIGF0IHRoaXMgc3RhZ2UgdGhlICAgfAorIHwgIHJlc3VsdHMgb2YgdGhlIGNvZGUgaGVyZSBhcHBlYXIgdG8gYmUgbW9yZSBjb25zaXN0ZW50Li4uICAgICAgICAgICAgICAgICB8CisgfCAgVGhpcyBtYXkgYmUgY2hhbmdlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImNvbnRyb2xfdy5oIgorCisvKiBGbGFncyBmb3IgRlBVX2JpdHNfbG9zdCAqLworI2RlZmluZQlMT1NUX0RPV04JJDEKKyNkZWZpbmUJTE9TVF9VUAkJJDIKKworLyogRmxhZ3MgZm9yIEZQVV9kZW5vcm1hbCAqLworI2RlZmluZQlERU5PUk1BTAkkMQorI2RlZmluZQlVTk1BU0tFRF9VTkRFUkZMT1cgJDIKKworCisjaWZuZGVmIE5PTl9SRUVOVFJBTlRfRlBVCisvKglNYWtlIHRoZSBjb2RlIHJlLWVudHJhbnQgYnkgcHV0dGluZworCWxvY2FsIHN0b3JhZ2Ugb24gdGhlIHN0YWNrOiAqLworI2RlZmluZSBGUFVfYml0c19sb3N0CSglZXNwKQorI2RlZmluZSBGUFVfZGVub3JtYWwJMSglZXNwKQorCisjZWxzZQorLyoJTm90IHJlLWVudHJhbnQsIHNvIHdlIGNhbiBnYWluIHNwZWVkIGJ5IHB1dHRpbmcKKwlsb2NhbCBzdG9yYWdlIGluIGEgc3RhdGljIGFyZWE6ICovCisuZGF0YQorCS5hbGlnbiA0LDAKK0ZQVV9iaXRzX2xvc3Q6CisJLmJ5dGUJMAorRlBVX2Rlbm9ybWFsOgorCS5ieXRlCTAKKyNlbmRpZiAvKiBOT05fUkVFTlRSQU5UX0ZQVSAqLworCisKKy50ZXh0CisuZ2xvYmwgZnB1X3JlZ19yb3VuZAorLmdsb2JsIGZwdV9Bcml0aF9leGl0CisKKy8qIEVudHJ5IHBvaW50IHdoZW4gY2FsbGVkIGZyb20gQyAqLworRU5UUlkoRlBVX3JvdW5kKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJcHVzaGwJJWVieAorCisJbW92bAlQQVJBTTEsJWVkaQorCW1vdmwJU0lHSCglZWRpKSwlZWF4CisJbW92bAlTSUdMKCVlZGkpLCVlYngKKwltb3ZsCVBBUkFNMiwlZWR4CisKK2ZwdV9yZWdfcm91bmQ6CQkJLyogTm9ybWFsIGVudHJ5IHBvaW50ICovCisJbW92bAlQQVJBTTQsJWVjeAorCisjaWZuZGVmIE5PTl9SRUVOVFJBTlRfRlBVCisJcHVzaGwJJWVieAkJLyogYWRqdXN0IHRoZSBzdGFjayBwb2ludGVyICovCisjZW5kaWYgLyogTk9OX1JFRU5UUkFOVF9GUFUgKi8gCisKKyNpZmRlZiBQQVJBTk9JRAorLyogQ2Fubm90IHVzZSB0aGlzIGhlcmUgeWV0ICovCisvKglvcmwJJWVheCwlZWF4ICovCisvKglqbnMJTF9lbnRyeV9idWdnZWQgKi8KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisJY21wdwlFWFBfVU5ERVIsRVhQKCVlZGkpCisJamxlCUxfTWFrZV9kZW5vcm0JCQkvKiBUaGUgbnVtYmVyIGlzIGEgZGUtbm9ybWFsICovCisKKwltb3ZiCSQwLEZQVV9kZW5vcm1hbAkJCS8qIDAgLT4gbm90IGEgZGUtbm9ybWFsICovCisKK0Rlbm9ybV9kb25lOgorCW1vdmIJJDAsRlBVX2JpdHNfbG9zdAkJLyogTm8gYml0cyB5ZXQgbG9zdCBpbiByb3VuZGluZyAqLworCisJbW92bAklZWN4LCVlc2kKKwlhbmRsCUNXX1BDLCVlY3gKKwljbXBsCVBSXzY0X0JJVFMsJWVjeAorCWplCUxSb3VuZF9Ub182NAorCisJY21wbAlQUl81M19CSVRTLCVlY3gKKwlqZQlMUm91bmRfVG9fNTMKKworCWNtcGwJUFJfMjRfQklUUywlZWN4CisJamUJTFJvdW5kX1RvXzI0CisKKyNpZmRlZiBQRUNVTElBUl80ODYKKy8qIFdpdGggdGhlIHByZWNpc2lvbiBjb250cm9sIGJpdHMgc2V0IHRvIDAxICIocmVzZXJ2ZWQpIiwgYSByZWFsIDgwNDg2CisgICBiZWhhdmVzIGFzIGlmIHRoZSBwcmVjaXNpb24gY29udHJvbCBiaXRzIHdlcmUgc2V0IHRvIDExICI2NCBiaXRzIiAqLworCWNtcGwJUFJfUkVTRVJWRURfQklUUywlZWN4CisJamUJTFJvdW5kX1RvXzY0CisjaWZkZWYgUEFSQU5PSUQKKwlqbXAJTF9idWdnZWRfZGVub3JtXzQ4NgorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorI2Vsc2UKKyNpZmRlZiBQQVJBTk9JRAorCWptcAlMX2J1Z2dlZF9kZW5vcm0JLyogVGhlcmUgaXMgbm8gYnVnLCBqdXN0IGEgYmFkIGNvbnRyb2wgd29yZCAqLworI2VuZGlmIC8qIFBBUkFOT0lEICovIAorI2VuZGlmIC8qIFBFQ1VMSUFSXzQ4NiAqLworCisKKy8qIFJvdW5kIGV0YyB0byAyNCBiaXQgcHJlY2lzaW9uICovCitMUm91bmRfVG9fMjQ6CisJbW92bAklZXNpLCVlY3gKKwlhbmRsCUNXX1JDLCVlY3gKKwljbXBsCVJDX1JORCwlZWN4CisJamUJTFJvdW5kX25lYXJlc3RfMjQKKworCWNtcGwJUkNfQ0hPUCwlZWN4CisJamUJTENoZWNrX3RydW5jYXRlXzI0CisKKwljbXBsCVJDX1VQLCVlY3gJCS8qIFRvd2FyZHMgK2luZmluaXR5ICovCisJamUJTFVwXzI0CisKKwljbXBsCVJDX0RPV04sJWVjeAkJLyogVG93YXJkcyAtaW5maW5pdHkgKi8KKwlqZQlMRG93bl8yNAorCisjaWZkZWYgUEFSQU5PSUQKKwlqbXAJTF9idWdnZWRfcm91bmQyNAorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCitMVXBfMjQ6CisJY21wYglTSUdOX1BPUyxQQVJBTTUKKwlqbmUJTENoZWNrX3RydW5jYXRlXzI0CS8qIElmIG5lZ2F0aXZlIHRoZW4gIHVwPT10cnVuY2F0ZSAqLworCisJam1wCUxDaGVja18yNF9yb3VuZF91cAorCitMRG93bl8yNDoKKwljbXBiCVNJR05fUE9TLFBBUkFNNQorCWplCUxDaGVja190cnVuY2F0ZV8yNAkvKiBJZiBwb3NpdGl2ZSB0aGVuICBkb3duPT10cnVuY2F0ZSAqLworCitMQ2hlY2tfMjRfcm91bmRfdXA6CisJbW92bAklZWF4LCVlY3gKKwlhbmRsCSQweDAwMDAwMGZmLCVlY3gKKwlvcmwJJWVieCwlZWN4CisJb3JsCSVlZHgsJWVjeAorCWpueglMRG9fMjRfcm91bmRfdXAKKwlqbXAJTF9SZV9ub3JtYWxpc2UKKworTFJvdW5kX25lYXJlc3RfMjQ6CisJLyogRG8gcm91bmRpbmcgb2YgdGhlIDI0dGggYml0IGlmIG5lZWRlZCAobmVhcmVzdCBvciBldmVuKSAqLworCW1vdmwJJWVheCwlZWN4CisJYW5kbAkkMHgwMDAwMDBmZiwlZWN4CisJY21wbAkkMHgwMDAwMDA4MCwlZWN4CisJamMJTENoZWNrX3RydW5jYXRlXzI0CS8qIGxlc3MgdGhhbiBoYWxmLCBubyBpbmNyZW1lbnQgbmVlZGVkICovCisKKwlqbmUJTEdyZWF0ZXJfSGFsZl8yNAkvKiBncmVhdGVyIHRoYW4gaGFsZiwgaW5jcmVtZW50IG5lZWRlZCAqLworCisJLyogUG9zc2libHkgaGFsZiwgd2UgbmVlZCB0byBjaGVjayB0aGUgbHMgYml0cyAqLworCW9ybAklZWJ4LCVlYngKKwlqbnoJTEdyZWF0ZXJfSGFsZl8yNAkvKiBncmVhdGVyIHRoYW4gaGFsZiwgaW5jcmVtZW50IG5lZWRlZCAqLworCisJb3JsCSVlZHgsJWVkeAorCWpueglMR3JlYXRlcl9IYWxmXzI0CS8qIGdyZWF0ZXIgdGhhbiBoYWxmLCBpbmNyZW1lbnQgbmVlZGVkICovCisKKwkvKiBFeGFjdGx5IGhhbGYsIGluY3JlbWVudCBvbmx5IGlmIDI0dGggYml0IGlzIDEgKHJvdW5kIHRvIGV2ZW4pICovCisJdGVzdGwJJDB4MDAwMDAxMDAsJWVheAorCWp6CUxEb190cnVuY2F0ZV8yNAorCitMR3JlYXRlcl9IYWxmXzI0OgkJCS8qIFJvdW5kaW5nOiBpbmNyZW1lbnQgYXQgdGhlIDI0dGggYml0ICovCitMRG9fMjRfcm91bmRfdXA6CisJYW5kbAkkMHhmZmZmZmYwMCwlZWF4CS8qIFRydW5jYXRlIHRvIDI0IGJpdHMgKi8KKwl4b3JsCSVlYngsJWVieAorCW1vdmIJTE9TVF9VUCxGUFVfYml0c19sb3N0CisJYWRkbAkkMHgwMDAwMDEwMCwlZWF4CisJam1wCUxDaGVja19Sb3VuZF9PdmVyZmxvdworCitMQ2hlY2tfdHJ1bmNhdGVfMjQ6CisJbW92bAklZWF4LCVlY3gKKwlhbmRsCSQweDAwMDAwMGZmLCVlY3gKKwlvcmwJJWVieCwlZWN4CisJb3JsCSVlZHgsJWVjeAorCWp6CUxfUmVfbm9ybWFsaXNlCQkvKiBObyB0cnVuY2F0aW9uIG5lZWRlZCAqLworCitMRG9fdHJ1bmNhdGVfMjQ6CisJYW5kbAkkMHhmZmZmZmYwMCwlZWF4CS8qIFRydW5jYXRlIHRvIDI0IGJpdHMgKi8KKwl4b3JsCSVlYngsJWVieAorCW1vdmIJTE9TVF9ET1dOLEZQVV9iaXRzX2xvc3QKKwlqbXAJTF9SZV9ub3JtYWxpc2UKKworCisvKiBSb3VuZCBldGMgdG8gNTMgYml0IHByZWNpc2lvbiAqLworTFJvdW5kX1RvXzUzOgorCW1vdmwJJWVzaSwlZWN4CisJYW5kbAlDV19SQywlZWN4CisJY21wbAlSQ19STkQsJWVjeAorCWplCUxSb3VuZF9uZWFyZXN0XzUzCisKKwljbXBsCVJDX0NIT1AsJWVjeAorCWplCUxDaGVja190cnVuY2F0ZV81MworCisJY21wbAlSQ19VUCwlZWN4CQkvKiBUb3dhcmRzICtpbmZpbml0eSAqLworCWplCUxVcF81MworCisJY21wbAlSQ19ET1dOLCVlY3gJCS8qIFRvd2FyZHMgLWluZmluaXR5ICovCisJamUJTERvd25fNTMKKworI2lmZGVmIFBBUkFOT0lECisJam1wCUxfYnVnZ2VkX3JvdW5kNTMKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworTFVwXzUzOgorCWNtcGIJU0lHTl9QT1MsUEFSQU01CisJam5lCUxDaGVja190cnVuY2F0ZV81MwkvKiBJZiBuZWdhdGl2ZSB0aGVuICB1cD09dHJ1bmNhdGUgKi8KKworCWptcAlMQ2hlY2tfNTNfcm91bmRfdXAKKworTERvd25fNTM6CisJY21wYglTSUdOX1BPUyxQQVJBTTUKKwlqZQlMQ2hlY2tfdHJ1bmNhdGVfNTMJLyogSWYgcG9zaXRpdmUgdGhlbiAgZG93bj09dHJ1bmNhdGUgKi8KKworTENoZWNrXzUzX3JvdW5kX3VwOgorCW1vdmwJJWVieCwlZWN4CisJYW5kbAkkMHgwMDAwMDdmZiwlZWN4CisJb3JsCSVlZHgsJWVjeAorCWpueglMRG9fNTNfcm91bmRfdXAKKwlqbXAJTF9SZV9ub3JtYWxpc2UKKworTFJvdW5kX25lYXJlc3RfNTM6CisJLyogRG8gcm91bmRpbmcgb2YgdGhlIDUzcmQgYml0IGlmIG5lZWRlZCAobmVhcmVzdCBvciBldmVuKSAqLworCW1vdmwJJWVieCwlZWN4CisJYW5kbAkkMHgwMDAwMDdmZiwlZWN4CisJY21wbAkkMHgwMDAwMDQwMCwlZWN4CisJamMJTENoZWNrX3RydW5jYXRlXzUzCS8qIGxlc3MgdGhhbiBoYWxmLCBubyBpbmNyZW1lbnQgbmVlZGVkICovCisKKwlqbnoJTEdyZWF0ZXJfSGFsZl81MwkvKiBncmVhdGVyIHRoYW4gaGFsZiwgaW5jcmVtZW50IG5lZWRlZCAqLworCisJLyogUG9zc2libHkgaGFsZiwgd2UgbmVlZCB0byBjaGVjayB0aGUgbHMgYml0cyAqLworCW9ybAklZWR4LCVlZHgKKwlqbnoJTEdyZWF0ZXJfSGFsZl81MwkvKiBncmVhdGVyIHRoYW4gaGFsZiwgaW5jcmVtZW50IG5lZWRlZCAqLworCisJLyogRXhhY3RseSBoYWxmLCBpbmNyZW1lbnQgb25seSBpZiA1M3JkIGJpdCBpcyAxIChyb3VuZCB0byBldmVuKSAqLworCXRlc3RsCSQweDAwMDAwODAwLCVlYngKKwlqeglMVHJ1bmNhdGVfNTMKKworTEdyZWF0ZXJfSGFsZl81MzoJCQkvKiBSb3VuZGluZzogaW5jcmVtZW50IGF0IHRoZSA1M3JkIGJpdCAqLworTERvXzUzX3JvdW5kX3VwOgorCW1vdmIJTE9TVF9VUCxGUFVfYml0c19sb3N0CisJYW5kbAkkMHhmZmZmZjgwMCwlZWJ4CS8qIFRydW5jYXRlIHRvIDUzIGJpdHMgKi8KKwlhZGRsCSQweDAwMDAwODAwLCVlYngKKwlhZGNsCSQwLCVlYXgKKwlqbXAJTENoZWNrX1JvdW5kX092ZXJmbG93CisKK0xDaGVja190cnVuY2F0ZV81MzoKKwltb3ZsCSVlYngsJWVjeAorCWFuZGwJJDB4MDAwMDA3ZmYsJWVjeAorCW9ybAklZWR4LCVlY3gKKwlqeglMX1JlX25vcm1hbGlzZQorCitMVHJ1bmNhdGVfNTM6CisJbW92YglMT1NUX0RPV04sRlBVX2JpdHNfbG9zdAorCWFuZGwJJDB4ZmZmZmY4MDAsJWVieAkvKiBUcnVuY2F0ZSB0byA1MyBiaXRzICovCisJam1wCUxfUmVfbm9ybWFsaXNlCisKKworLyogUm91bmQgZXRjIHRvIDY0IGJpdCBwcmVjaXNpb24gKi8KK0xSb3VuZF9Ub182NDoKKwltb3ZsCSVlc2ksJWVjeAorCWFuZGwJQ1dfUkMsJWVjeAorCWNtcGwJUkNfUk5ELCVlY3gKKwlqZQlMUm91bmRfbmVhcmVzdF82NAorCisJY21wbAlSQ19DSE9QLCVlY3gKKwlqZQlMQ2hlY2tfdHJ1bmNhdGVfNjQKKworCWNtcGwJUkNfVVAsJWVjeAkJLyogVG93YXJkcyAraW5maW5pdHkgKi8KKwlqZQlMVXBfNjQKKworCWNtcGwJUkNfRE9XTiwlZWN4CQkvKiBUb3dhcmRzIC1pbmZpbml0eSAqLworCWplCUxEb3duXzY0CisKKyNpZmRlZiBQQVJBTk9JRAorCWptcAlMX2J1Z2dlZF9yb3VuZDY0CisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKK0xVcF82NDoKKwljbXBiCVNJR05fUE9TLFBBUkFNNQorCWpuZQlMQ2hlY2tfdHJ1bmNhdGVfNjQJLyogSWYgbmVnYXRpdmUgdGhlbiAgdXA9PXRydW5jYXRlICovCisKKwlvcmwJJWVkeCwlZWR4CisJam56CUxEb182NF9yb3VuZF91cAorCWptcAlMX1JlX25vcm1hbGlzZQorCitMRG93bl82NDoKKwljbXBiCVNJR05fUE9TLFBBUkFNNQorCWplCUxDaGVja190cnVuY2F0ZV82NAkvKiBJZiBwb3NpdGl2ZSB0aGVuICBkb3duPT10cnVuY2F0ZSAqLworCisJb3JsCSVlZHgsJWVkeAorCWpueglMRG9fNjRfcm91bmRfdXAKKwlqbXAJTF9SZV9ub3JtYWxpc2UKKworTFJvdW5kX25lYXJlc3RfNjQ6CisJY21wbAkkMHg4MDAwMDAwMCwlZWR4CisJamMJTENoZWNrX3RydW5jYXRlXzY0CisKKwlqbmUJTERvXzY0X3JvdW5kX3VwCisKKwkvKiBOb3cgdGVzdCBmb3Igcm91bmQtdG8tZXZlbiAqLworCXRlc3RiCSQxLCVibAorCWp6CUxDaGVja190cnVuY2F0ZV82NAorCitMRG9fNjRfcm91bmRfdXA6CisJbW92YglMT1NUX1VQLEZQVV9iaXRzX2xvc3QKKwlhZGRsCSQxLCVlYngKKwlhZGNsCSQwLCVlYXgKKworTENoZWNrX1JvdW5kX092ZXJmbG93OgorCWpuYwlMX1JlX25vcm1hbGlzZQorCisJLyogT3ZlcmZsb3csIGFkanVzdCB0aGUgcmVzdWx0IChzaWduaWZpY2FuZCB0byAxLjApICovCisJcmNybAkkMSwlZWF4CisJcmNybAkkMSwlZWJ4CisJaW5jdwlFWFAoJWVkaSkKKwlqbXAJTF9SZV9ub3JtYWxpc2UKKworTENoZWNrX3RydW5jYXRlXzY0OgorCW9ybAklZWR4LCVlZHgKKwlqeglMX1JlX25vcm1hbGlzZQorCitMVHJ1bmNhdGVfNjQ6CisJbW92YglMT1NUX0RPV04sRlBVX2JpdHNfbG9zdAorCitMX1JlX25vcm1hbGlzZToKKwl0ZXN0YgkkMHhmZixGUFVfZGVub3JtYWwKKwlqbnoJTm9ybWFsaXNlX3Jlc3VsdAorCitMX05vcm1hbGlzZWQ6CisJbW92bAlUQUdfVmFsaWQsJWVkeAorCitMX2RlTm9ybWFsaXNlZDoKKwljbXBiCUxPU1RfVVAsRlBVX2JpdHNfbG9zdAorCWplCUxfcHJlY2lzaW9uX2xvc3RfdXAKKworCWNtcGIJTE9TVF9ET1dOLEZQVV9iaXRzX2xvc3QKKwlqZQlMX3ByZWNpc2lvbl9sb3N0X2Rvd24KKworTF9ub19wcmVjaXNpb25fbG9zczoKKwkvKiBzdG9yZSB0aGUgcmVzdWx0ICovCisKK0xfU3RvcmVfc2lnbmlmaWNhbmQ6CisJbW92bAklZWF4LFNJR0goJWVkaSkKKwltb3ZsCSVlYngsU0lHTCglZWRpKQorCisJY21wdwlFWFBfT1ZFUixFWFAoJWVkaSkKKwlqZ2UJTF9vdmVyZmxvdworCisJbW92bAklZWR4LCVlYXgKKworCS8qIENvbnZlcnQgdGhlIGV4cG9uZW50IHRvIDgweDg3IGZvcm0uICovCisJYWRkdwlFWFRFTkRFRF9FYmlhcyxFWFAoJWVkaSkKKwlhbmR3CSQweDdmZmYsRVhQKCVlZGkpCisKK2ZwdV9yZWdfcm91bmRfc2lnbmVkX3NwZWNpYWxfZXhpdDoKKworCWNtcGIJU0lHTl9QT1MsUEFSQU01CisJamUJZnB1X3JlZ19yb3VuZF9zcGVjaWFsX2V4aXQKKworCW9ydwkkMHg4MDAwLEVYUCglZWRpKQkvKiBOZWdhdGl2ZSBzaWduIGZvciB0aGUgcmVzdWx0LiAqLworCitmcHVfcmVnX3JvdW5kX3NwZWNpYWxfZXhpdDoKKworI2lmbmRlZiBOT05fUkVFTlRSQU5UX0ZQVQorCXBvcGwJJWVieAkJLyogYWRqdXN0IHRoZSBzdGFjayBwb2ludGVyICovCisjZW5kaWYgLyogTk9OX1JFRU5UUkFOVF9GUFUgKi8gCisKK2ZwdV9Bcml0aF9leGl0OgorCXBvcGwJJWVieAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CisKKworLyoKKyAqIFNldCB0aGUgRlBVIHN0YXR1cyBmbGFncyB0byByZXByZXNlbnQgcHJlY2lzaW9uIGxvc3MgZHVlIHRvCisgKiByb3VuZC11cC4KKyAqLworTF9wcmVjaXNpb25fbG9zdF91cDoKKwlwdXNoCSVlZHgKKwlwdXNoCSVlYXgKKwljYWxsCXNldF9wcmVjaXNpb25fZmxhZ191cAorCXBvcGwJJWVheAorCXBvcGwJJWVkeAorCWptcAlMX25vX3ByZWNpc2lvbl9sb3NzCisKKy8qCisgKiBTZXQgdGhlIEZQVSBzdGF0dXMgZmxhZ3MgdG8gcmVwcmVzZW50IHByZWNpc2lvbiBsb3NzIGR1ZSB0bworICogdHJ1bmNhdGlvbi4KKyAqLworTF9wcmVjaXNpb25fbG9zdF9kb3duOgorCXB1c2gJJWVkeAorCXB1c2gJJWVheAorCWNhbGwJc2V0X3ByZWNpc2lvbl9mbGFnX2Rvd24KKwlwb3BsCSVlYXgKKwlwb3BsCSVlZHgKKwlqbXAJTF9ub19wcmVjaXNpb25fbG9zcworCisKKy8qCisgKiBUaGUgbnVtYmVyIGlzIGEgZGVub3JtYWwgKHdoaWNoIG1pZ2h0IGdldCByb3VuZGVkIHVwIHRvIGEgbm9ybWFsKQorICogU2hpZnQgdGhlIG51bWJlciByaWdodCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJpdHMsIHdoaWNoIHdpbGwKKyAqIGhhdmUgdG8gYmUgdW5kb25lIGxhdGVyLi4uCisgKi8KK0xfTWFrZV9kZW5vcm06CisJLyogVGhlIGFjdGlvbiB0byBiZSB0YWtlbiBkZXBlbmRzIHVwb24gd2hldGhlciB0aGUgdW5kZXJmbG93CisJICAgZXhjZXB0aW9uIGlzIG1hc2tlZCAqLworCXRlc3RiCUNXX1VuZGVyZmxvdywlY2wJCS8qIFVuZGVyZmxvdyBtYXNrLiAqLworCWp6CVVubWFza2VkX3VuZGVyZmxvdwkJLyogRG8gbm90IG1ha2UgYSBkZW5vcm1hbC4gKi8KKworCW1vdmIJREVOT1JNQUwsRlBVX2Rlbm9ybWFsCisKKwlwdXNobAklZWN4CQkvKiBTYXZlICovCisJbW92dwlFWFBfVU5ERVIrMSwlY3gKKwlzdWJ3CUVYUCglZWRpKSwlY3gKKworCWNtcHcJJDY0LCVjeAkvKiBzaHJkIG9ubHkgd29ya3MgZm9yIDAuLjMxIGJpdHMgKi8KKwlqbmMJRGVub3JtX3NoaWZ0X21vcmVfdGhhbl82MworCisJY21wdwkkMzIsJWN4CS8qIHNocmQgb25seSB3b3JrcyBmb3IgMC4uMzEgYml0cyAqLworCWpuYwlEZW5vcm1fc2hpZnRfbW9yZV90aGFuXzMyCisKKy8qCisgKiBXZSBnb3QgaGVyZSB3aXRob3V0IGp1bXBzIGJ5IGFzc3VtaW5nIHRoYXQgdGhlIG1vc3QgY29tbW9uIHJlcXVpcmVtZW50CisgKiAgIGlzIGZvciBhIHNtYWxsIGRlLW5vcm1hbGlzaW5nIHNoaWZ0LgorICogU2hpZnQgYnkgWzEuLjMxXSBiaXRzCisgKi8KKwlhZGR3CSVjeCxFWFAoJWVkaSkKKwlvcmwJJWVkeCwlZWR4CS8qIGV4dGVuc2lvbiAqLworCXNldG5lCSVjaAkJLyogU2F2ZSB3aGV0aGVyICVlZHggaXMgbm9uLXplcm8gKi8KKwl4b3JsCSVlZHgsJWVkeAorCXNocmQJJWNsLCVlYngsJWVkeAorCXNocmQJJWNsLCVlYXgsJWVieAorCXNocgklY2wsJWVheAorCW9yYgklY2gsJWRsCisJcG9wbAklZWN4CisJam1wCURlbm9ybV9kb25lCisKKy8qIFNoaWZ0IGJ5IFszMi4uNjNdIGJpdHMgKi8KK0Rlbm9ybV9zaGlmdF9tb3JlX3RoYW5fMzI6CisJYWRkdwklY3gsRVhQKCVlZGkpCisJc3ViYgkkMzIsJWNsCisJb3JsCSVlZHgsJWVkeAorCXNldG5lCSVjaAorCW9yYgklY2gsJWJsCisJeG9ybAklZWR4LCVlZHgKKwlzaHJkCSVjbCwlZWJ4LCVlZHgKKwlzaHJkCSVjbCwlZWF4LCVlYngKKwlzaHIJJWNsLCVlYXgKKwlvcmwJJWVkeCwlZWR4CQkvKiB0ZXN0IHRoZXNlIDMyIGJpdHMgKi8KKwlzZXRuZQklY2wKKwlvcmIJJWNoLCVibAorCW9yYgklY2wsJWJsCisJbW92bAklZWJ4LCVlZHgKKwltb3ZsCSVlYXgsJWVieAorCXhvcmwJJWVheCwlZWF4CisJcG9wbAklZWN4CisJam1wCURlbm9ybV9kb25lCisKKy8qIFNoaWZ0IGJ5IFs2NC4uKSBiaXRzICovCitEZW5vcm1fc2hpZnRfbW9yZV90aGFuXzYzOgorCWNtcHcJJDY0LCVjeAorCWpuZQlEZW5vcm1fc2hpZnRfbW9yZV90aGFuXzY0CisKKy8qIEV4YWN0bHkgNjQgYml0IHNoaWZ0ICovCisJYWRkdwklY3gsRVhQKCVlZGkpCisJeG9ybAklZWN4LCVlY3gKKwlvcmwJJWVkeCwlZWR4CisJc2V0bmUJJWNsCisJb3JsCSVlYngsJWVieAorCXNldG5lCSVjaAorCW9yYgklY2gsJWNsCisJb3JiCSVjbCwlYWwKKwltb3ZsCSVlYXgsJWVkeAorCXhvcmwJJWVheCwlZWF4CisJeG9ybAklZWJ4LCVlYngKKwlwb3BsCSVlY3gKKwlqbXAJRGVub3JtX2RvbmUKKworRGVub3JtX3NoaWZ0X21vcmVfdGhhbl82NDoKKwltb3Z3CUVYUF9VTkRFUisxLEVYUCglZWRpKQorLyogVGhpcyBpcyBlYXN5LCAlZWF4IG11c3QgYmUgbm9uLXplcm8sIHNvLi4gKi8KKwltb3ZsCSQxLCVlZHgKKwl4b3JsCSVlYXgsJWVheAorCXhvcmwJJWVieCwlZWJ4CisJcG9wbAklZWN4CisJam1wCURlbm9ybV9kb25lCisKKworVW5tYXNrZWRfdW5kZXJmbG93OgorCW1vdmIJVU5NQVNLRURfVU5ERVJGTE9XLEZQVV9kZW5vcm1hbAorCWptcAlEZW5vcm1fZG9uZQorCisKKy8qIFVuZG8gdGhlIGRlLW5vcm1hbGlzYXRpb24uICovCitOb3JtYWxpc2VfcmVzdWx0OgorCWNtcGIJVU5NQVNLRURfVU5ERVJGTE9XLEZQVV9kZW5vcm1hbAorCWplCVNpZ25hbF91bmRlcmZsb3cKKworLyogVGhlIG51bWJlciBtdXN0IGJlIGEgZGVub3JtYWwgaWYgd2UgZ290IGhlcmUuICovCisjaWZkZWYgUEFSQU5PSUQKKwkvKiBCdXQgY2hlY2sgaXQuLi4ganVzdCBpbiBjYXNlLiAqLworCWNtcHcJRVhQX1VOREVSKzEsRVhQKCVlZGkpCisJam5lCUxfbm9ybV9idWdnZWQKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisjaWZkZWYgUEVDVUxJQVJfNDg2CisJLyoKKwkgKiBUaGlzIGltcGxlbWVudHMgYSBzcGVjaWFsIGZlYXR1cmUgb2YgODA0ODYgYmVoYXZpb3VyLgorCSAqIFVuZGVyZmxvdyB3aWxsIGJlIHNpZ25hbGxlZCBldmVuIGlmIHRoZSBudW1iZXIgaXMKKwkgKiBub3QgYSBkZW5vcm1hbCBhZnRlciByb3VuZGluZy4KKwkgKiBUaGlzIGRpZmZlcmVuY2Ugb2NjdXJzIG9ubHkgZm9yIG1hc2tlZCB1bmRlcmZsb3csIGFuZCBub3QKKwkgKiBpbiB0aGUgdW5tYXNrZWQgY2FzZS4KKwkgKiBBY3R1YWwgODA0ODYgYmVoYXZpb3VyIGRpZmZlcnMgZnJvbSB0aGlzIGluIHNvbWUgY2lyY3Vtc3RhbmNlcy4KKwkgKi8KKwlvcmwJJWVheCwlZWF4CQkvKiBtcyBiaXRzICovCisJanMJTFBzZXVkb0Rlbm9ybWFsCQkvKiBXaWxsIGJlIG1hc2tlZCB1bmRlcmZsb3cgKi8KKyNlbHNlCisJb3JsCSVlYXgsJWVheAkJLyogbXMgYml0cyAqLworCWpzCUxfTm9ybWFsaXNlZAkJLyogTm8gbG9uZ2VyIGEgZGVub3JtYWwgKi8KKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8gCisKKwlqbnoJTERlbm9ybWFsX2Fkal9leHBvbmVudAorCisJb3JsCSVlYngsJWVieAorCWp6CUxfdW5kZXJmbG93X3RvX3plcm8JLyogVGhlIGNvbnRlbnRzIGFyZSB6ZXJvICovCisKK0xEZW5vcm1hbF9hZGpfZXhwb25lbnQ6CisJZGVjdwlFWFAoJWVkaSkKKworTFBzZXVkb0Rlbm9ybWFsOgorCXRlc3RiCSQweGZmLEZQVV9iaXRzX2xvc3QJLyogYml0cyBsb3N0ID09IHVuZGVyZmxvdyAqLworCW1vdmwJVEFHX1NwZWNpYWwsJWVkeAorCWp6CUxfZGVOb3JtYWxpc2VkCisKKwkvKiBUaGVyZSBtdXN0IGJlIGEgbWFza2VkIHVuZGVyZmxvdyAqLworCXB1c2gJJWVheAorCXB1c2hsCUVYX1VuZGVyZmxvdworCWNhbGwJRVhDRVBUSU9OCisJcG9wbAklZWF4CisJcG9wbAklZWF4CisJbW92bAlUQUdfU3BlY2lhbCwlZWR4CisJam1wCUxfZGVOb3JtYWxpc2VkCisKKworLyoKKyAqIFRoZSBvcGVyYXRpb25zIHJlc3VsdGVkIGluIGEgbnVtYmVyIHRvbyBzbWFsbCB0byByZXByZXNlbnQuCisgKiBNYXNrZWQgcmVzcG9uc2UuCisgKi8KK0xfdW5kZXJmbG93X3RvX3plcm86CisJcHVzaAklZWF4CisJY2FsbAlzZXRfcHJlY2lzaW9uX2ZsYWdfZG93bgorCXBvcGwJJWVheAorCisJcHVzaAklZWF4CisJcHVzaGwJRVhfVW5kZXJmbG93CisJY2FsbAlFWENFUFRJT04KKwlwb3BsCSVlYXgKKwlwb3BsCSVlYXgKKworLyogUmVkdWNlIHRoZSBleHBvbmVudCB0byBFWFBfVU5ERVIgKi8KKwltb3Z3CUVYUF9VTkRFUixFWFAoJWVkaSkKKwltb3ZsCVRBR19aZXJvLCVlZHgKKwlqbXAJTF9TdG9yZV9zaWduaWZpY2FuZAorCisKKy8qIFRoZSBvcGVyYXRpb25zIHJlc3VsdGVkIGluIGEgbnVtYmVyIHRvbyBsYXJnZSB0byByZXByZXNlbnQuICovCitMX292ZXJmbG93OgorCWFkZHcJRVhURU5ERURfRWJpYXMsRVhQKCVlZGkpCS8qIFNldCBmb3IgdW5tYXNrZWQgcmVzcG9uc2UuICovCisJcHVzaAklZWRpCisJY2FsbAlhcml0aF9vdmVyZmxvdworCXBvcAklZWRpCisJam1wCWZwdV9yZWdfcm91bmRfc2lnbmVkX3NwZWNpYWxfZXhpdAorCisKK1NpZ25hbF91bmRlcmZsb3c6CisJLyogVGhlIG51bWJlciBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gYSBub24tZGVub3JtYWwgKi8KKwkvKiBieSB0aGUgcm91bmRpbmcgb3BlcmF0aW9ucy4gKi8KKwljbXB3CUVYUF9VTkRFUixFWFAoJWVkaSkKKwlqbGUJRG9fdW5tYXNrZWRfdW5kZXJmbG93CisKKwlqbXAJTF9Ob3JtYWxpc2VkCisKK0RvX3VubWFza2VkX3VuZGVyZmxvdzoKKwkvKiBJbmNyZWFzZSB0aGUgZXhwb25lbnQgYnkgdGhlIG1hZ2ljIG51bWJlciAqLworCWFkZHcJJCgzKigxPDwxMykpLEVYUCglZWRpKQorCXB1c2gJJWVheAorCXB1c2hsCUVYX1VuZGVyZmxvdworCWNhbGwJRVhDRVBUSU9OCisJcG9wbAklZWF4CisJcG9wbAklZWF4CisJam1wCUxfTm9ybWFsaXNlZAorCisKKyNpZmRlZiBQQVJBTk9JRAorI2lmZGVmIFBFQ1VMSUFSXzQ4NgorTF9idWdnZWRfZGVub3JtXzQ4NjoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIzNgorCWNhbGwJRVhDRVBUSU9OCisJcG9wbAklZWJ4CisJam1wCUxfZXhjZXB0aW9uX2V4aXQKKyNlbHNlCitMX2J1Z2dlZF9kZW5vcm06CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyMzAKKwljYWxsCUVYQ0VQVElPTgorCXBvcGwJJWVieAorCWptcAlMX2V4Y2VwdGlvbl9leGl0CisjZW5kaWYgLyogUEVDVUxJQVJfNDg2ICovIAorCitMX2J1Z2dlZF9yb3VuZDI0OgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjMxCisJY2FsbAlFWENFUFRJT04KKwlwb3BsCSVlYngKKwlqbXAJTF9leGNlcHRpb25fZXhpdAorCitMX2J1Z2dlZF9yb3VuZDUzOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjMyCisJY2FsbAlFWENFUFRJT04KKwlwb3BsCSVlYngKKwlqbXAJTF9leGNlcHRpb25fZXhpdAorCitMX2J1Z2dlZF9yb3VuZDY0OgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjMzCisJY2FsbAlFWENFUFRJT04KKwlwb3BsCSVlYngKKwlqbXAJTF9leGNlcHRpb25fZXhpdAorCitMX25vcm1fYnVnZ2VkOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjM0CisJY2FsbAlFWENFUFRJT04KKwlwb3BsCSVlYngKKwlqbXAJTF9leGNlcHRpb25fZXhpdAorCitMX2VudHJ5X2J1Z2dlZDoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIzNQorCWNhbGwJRVhDRVBUSU9OCisJcG9wbAklZWJ4CitMX2V4Y2VwdGlvbl9leGl0OgorCW1vdgkkLTEsJWVheAorCWptcAlmcHVfcmVnX3JvdW5kX3NwZWNpYWxfZXhpdAorI2VuZGlmIC8qIFBBUkFOT0lEICovIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3JlZ191X2FkZC5TIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ191X2FkZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YzRjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX3VfYWRkLlMKQEAgLTAsMCArMSwxNjcgQEAKKwkuZmlsZQkicmVnX3VfYWRkLlMiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByZWdfdV9hZGQuUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBBZGQgdHdvIHZhbGlkIChUQUdfVmFsaWQpIEZQVV9SRUcgbnVtYmVycywgb2YgdGhlIHNhbWUgc2lnbiwgYW5kIHB1dCB0aGUgIHwKKyB8ICAgcmVzdWx0IGluIGEgZGVzdGluYXRpb24gRlBVX1JFRy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk1LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCBBdXN0cmFsaWEgfAorIHwgICAgICAgICAgICAgICAgICBFLW1haWwgICBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENhbGwgZnJvbSBDIGFzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBpbnQgIEZQVV91X2FkZChGUFVfUkVHICphcmcxLCBGUFVfUkVHICphcmcyLCBGUFVfUkVHICphbnN3LCAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250cm9sX3cpICAgICAgICAgICAgIHwKKyB8ICAgIFJldHVybiB2YWx1ZSBpcyB0aGUgdGFnIG9mIHRoZSBhbnN3ZXIsIG9yLWVkIHdpdGggRlBVX0V4Y2VwdGlvbiBpZiAgICAgfAorIHwgICAgb25lIHdhcyByYWlzZWQsIG9yIC0xIG9uIGludGVybmFsIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyB8ICAgIEtlcm5lbCBhZGRpdGlvbiByb3V0aW5lIEZQVV91X2FkZChyZWcgKmFyZzEsIHJlZyAqYXJnMiwgcmVnICphbnN3KS4KKyB8ICAgIFRha2VzIHR3byB2YWxpZCByZWcgZi5wLiBudW1iZXJzIChUQUdfVmFsaWQpLCB3aGljaCBhcmUKKyB8ICAgIHRyZWF0ZWQgYXMgdW5zaWduZWQgbnVtYmVycywKKyB8ICAgIGFuZCByZXR1cm5zIHRoZWlyIHN1bSBhcyBhIFRBR19WYWxpZCBvciBUQUdfU3BlY2lhbCBmLnAuIG51bWJlci4KKyB8ICAgIFRoZSByZXR1cm5lZCBudW1iZXIgaXMgbm9ybWFsaXplZC4KKyB8ICAgIEJhc2ljIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGlmIFBBUkFOT0lEIGlzIGRlZmluZWQuCisgKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKyNpbmNsdWRlICJjb250cm9sX3cuaCIKKworLnRleHQKK0VOVFJZKEZQVV91X2FkZCkKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYngKKworCW1vdmwJUEFSQU0xLCVlc2kJCS8qIHNvdXJjZSAxICovCisJbW92bAlQQVJBTTIsJWVkaQkJLyogc291cmNlIDIgKi8KKworCW1vdmwJUEFSQU02LCVlY3gKKwltb3ZsCSVlY3gsJWVkeAorCXN1YmwJUEFSQU03LCVlY3gJCQkvKiBleHAxIC0gZXhwMiAqLworCWpnZQlMX2FyZzFfbGFyZ2VyCisKKwkvKiBudW0xIGlzIHNtYWxsZXIgKi8KKwltb3ZsCVNJR0woJWVzaSksJWVieAorCW1vdmwJU0lHSCglZXNpKSwlZWF4CisKKwltb3ZsCSVlZGksJWVzaQorCW1vdmwJUEFSQU03LCVlZHgKKwluZWd3CSVjeAorCWptcAlMX2FjY3VtX2xvYWRlZAorCitMX2FyZzFfbGFyZ2VyOgorCS8qIG51bTEgaGFzIGxhcmdlciBvciBlcXVhbCBleHBvbmVudCAqLworCW1vdmwJU0lHTCglZWRpKSwlZWJ4CisJbW92bAlTSUdIKCVlZGkpLCVlYXgKKworTF9hY2N1bV9sb2FkZWQ6CisJbW92bAlQQVJBTTMsJWVkaQkJLyogZGVzdGluYXRpb24gKi8KKwltb3Z3CSVkeCxFWFAoJWVkaSkJCS8qIENvcHkgZXhwb25lbnQgdG8gZGVzdGluYXRpb24gKi8KKworCXhvcmwJJWVkeCwlZWR4CQkvKiBjbGVhciB0aGUgZXh0ZW5zaW9uICovCisKKyNpZmRlZiBQQVJBTk9JRAorCXRlc3RsCSQweDgwMDAwMDAwLCVlYXgKKwlqZQlMX2J1Z2dlZAorCisJdGVzdGwJJDB4ODAwMDAwMDAsU0lHSCglZXNpKQorCWplCUxfYnVnZ2VkCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworLyogVGhlIG51bWJlciB0byBiZSBzaGlmdGVkIGlzIGluICVlYXg6JWVieDolZWR4ICovCisJY21wdwkkMzIsJWN4CQkvKiBzaHJkIG9ubHkgd29ya3MgZm9yIDAuLjMxIGJpdHMgKi8KKwlqbmMJTF9tb3JlX3RoYW5fMzEKKworLyogbGVzcyB0aGFuIDMyIGJpdHMgKi8KKwlzaHJkCSVjbCwlZWJ4LCVlZHgKKwlzaHJkCSVjbCwlZWF4LCVlYngKKwlzaHIJJWNsLCVlYXgKKwlqbXAJTF9zaGlmdF9kb25lCisKK0xfbW9yZV90aGFuXzMxOgorCWNtcHcJJDY0LCVjeAorCWpuYwlMX21vcmVfdGhhbl82MworCisJc3ViYgkkMzIsJWNsCisJanoJTF9leGFjdGx5XzMyCisKKwlzaHJkCSVjbCwlZWF4LCVlZHgKKwlzaHIJJWNsLCVlYXgKKwlvcmwJJWVieCwlZWJ4CisJanoJTF9tb3JlXzMxX25vX2xvdwkvKiBub25lIG9mIHRoZSBsb3dlc3QgYml0cyBpcyBzZXQgKi8KKworCW9ybAkkMSwlZWR4CQkJLyogcmVjb3JkIHRoZSBmYWN0IGluIHRoZSBleHRlbnNpb24gKi8KKworTF9tb3JlXzMxX25vX2xvdzoKKwltb3ZsCSVlYXgsJWVieAorCXhvcmwJJWVheCwlZWF4CisJam1wCUxfc2hpZnRfZG9uZQorCitMX2V4YWN0bHlfMzI6CisJbW92bAklZWJ4LCVlZHgKKwltb3ZsCSVlYXgsJWVieAorCXhvcmwJJWVheCwlZWF4CisJam1wCUxfc2hpZnRfZG9uZQorCitMX21vcmVfdGhhbl82MzoKKwljbXB3CSQ2NSwlY3gKKwlqbmMJTF9tb3JlX3RoYW5fNjQKKworCW1vdmwJJWVheCwlZWR4CisJb3JsCSVlYngsJWVieAorCWp6CUxfbW9yZV82M19ub19sb3cKKworCW9ybAkkMSwlZWR4CisJam1wCUxfbW9yZV82M19ub19sb3cKKworTF9tb3JlX3RoYW5fNjQ6CisJbW92bAkkMSwlZWR4CQkvKiBUaGUgc2hpZnRlZCBuciBhbHdheXMgYXQgbGVhc3Qgb25lICcxJyAqLworCitMX21vcmVfNjNfbm9fbG93OgorCXhvcmwJJWVieCwlZWJ4CisJeG9ybAklZWF4LCVlYXgKKworTF9zaGlmdF9kb25lOgorCS8qIE5vdyBkbyB0aGUgYWRkaXRpb24gKi8KKwlhZGRsCVNJR0woJWVzaSksJWVieAorCWFkY2wJU0lHSCglZXNpKSwlZWF4CisJam5jCUxfcm91bmRfdGhlX3Jlc3VsdAorCisJLyogT3ZlcmZsb3csIGFkanVzdCB0aGUgcmVzdWx0ICovCisJcmNybAkkMSwlZWF4CisJcmNybAkkMSwlZWJ4CisJcmNybAkkMSwlZWR4CisJam5jCUxfbm9fYml0X2xvc3QKKworCW9ybAkkMSwlZWR4CisKK0xfbm9fYml0X2xvc3Q6CisJaW5jdwlFWFAoJWVkaSkKKworTF9yb3VuZF90aGVfcmVzdWx0OgorCWptcAlmcHVfcmVnX3JvdW5kCS8qIFJvdW5kIHRoZSByZXN1bHQgKi8KKworCisKKyNpZmRlZiBQQVJBTk9JRAorLyogSWYgd2UgZXZlciBnZXQgaGVyZSB0aGVuIHdlIGhhdmUgcHJvYmxlbXMhICovCitMX2J1Z2dlZDoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIwMQorCWNhbGwJRVhDRVBUSU9OCisJcG9wCSVlYngKKwltb3ZsCSQtMSwlZWF4CisJam1wCUxfZXhpdAorCitMX2V4aXQ6CisJcG9wbAklZWJ4CisJcG9wbAklZWRpCisJcG9wbAklZXNpCisJbGVhdmUKKwlyZXQKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3JlZ191X2Rpdi5TIGIvYXJjaC9pMzg2L21hdGgtZW11L3JlZ191X2Rpdi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDA2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX3VfZGl2LlMKQEAgLTAsMCArMSw0NzEgQEAKKwkuZmlsZQkicmVnX3VfZGl2LlMiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICByZWdfdV9kaXYuUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBEaXZpZGUgb25lIEZQVV9SRUcgYnkgYW5vdGhlciBhbmQgcHV0IHRoZSByZXN1bHQgaW4gYSBkZXN0aW5hdGlvbiBGUFVfUkVHLnwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgQXVzdHJhbGlhIHwKKyB8ICAgICAgICAgICAgICAgICAgRS1tYWlsICAgYmlsbG1Ac3VidXJiaWEubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCBDYWxsIGZyb20gQyBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgIGludCBGUFVfdV9kaXYoRlBVX1JFRyAqYSwgRlBVX1JFRyAqYiwgRlBVX1JFRyAqZGVzdCwgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvbnRyb2xfd29yZCwgY2hhciAqc2lnbikgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBEb2VzIG5vdCBjb21wdXRlIHRoZSBkZXN0aW5hdGlvbiBleHBvbmVudCwgYnV0IGRvZXMgYWRqdXN0IGl0LiAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBSZXR1cm4gdmFsdWUgaXMgdGhlIHRhZyBvZiB0aGUgYW5zd2VyLCBvci1lZCB3aXRoIEZQVV9FeGNlcHRpb24gaWYgICAgIHwKKyB8ICAgIG9uZSB3YXMgcmFpc2VkLCBvciAtMSBvbiBpbnRlcm5hbCBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImNvbnRyb2xfdy5oIgorCisKKy8qICNkZWZpbmUJZFNJR0woeCkJKHgpICovCisvKiAjZGVmaW5lCWRTSUdIKHgpCTQoeCkgKi8KKworCisjaWZuZGVmIE5PTl9SRUVOVFJBTlRfRlBVCisvKgorCUxvY2FsIHN0b3JhZ2Ugb24gdGhlIHN0YWNrOgorCVJlc3VsdDoJCUZQVV9hY2N1bV8zOkZQVV9hY2N1bV8yOkZQVV9hY2N1bV8xOkZQVV9hY2N1bV8wCisJT3ZlcmZsb3cgZmxhZzoJb3ZmbF9mbGFnCisgKi8KKyNkZWZpbmUgRlBVX2FjY3VtXzMJLTQoJWVicCkKKyNkZWZpbmUgRlBVX2FjY3VtXzIJLTgoJWVicCkKKyNkZWZpbmUgRlBVX2FjY3VtXzEJLTEyKCVlYnApCisjZGVmaW5lIEZQVV9hY2N1bV8wCS0xNiglZWJwKQorI2RlZmluZSBGUFVfcmVzdWx0XzEJLTIwKCVlYnApCisjZGVmaW5lIEZQVV9yZXN1bHRfMgktMjQoJWVicCkKKyNkZWZpbmUgRlBVX292ZmxfZmxhZwktMjgoJWVicCkKKworI2Vsc2UKKy5kYXRhCisvKgorCUxvY2FsIHN0b3JhZ2UgaW4gYSBzdGF0aWMgYXJlYToKKwlSZXN1bHQ6CQlGUFVfYWNjdW1fMzpGUFVfYWNjdW1fMjpGUFVfYWNjdW1fMTpGUFVfYWNjdW1fMAorCU92ZXJmbG93IGZsYWc6CW92ZmxfZmxhZworICovCisJLmFsaWduIDQsMAorRlBVX2FjY3VtXzM6CisJLmxvbmcJMAorRlBVX2FjY3VtXzI6CisJLmxvbmcJMAorRlBVX2FjY3VtXzE6CisJLmxvbmcJMAorRlBVX2FjY3VtXzA6CisJLmxvbmcJMAorRlBVX3Jlc3VsdF8xOgorCS5sb25nCTAKK0ZQVV9yZXN1bHRfMjoKKwkubG9uZwkwCitGUFVfb3ZmbF9mbGFnOgorCS5ieXRlCTAKKyNlbmRpZiAvKiBOT05fUkVFTlRSQU5UX0ZQVSAqLworCisjZGVmaW5lIFJFR0EJUEFSQU0xCisjZGVmaW5lIFJFR0IJUEFSQU0yCisjZGVmaW5lIERFU1QJUEFSQU0zCisKKy50ZXh0CitFTlRSWShGUFVfdV9kaXYpCisJcHVzaGwJJWVicAorCW1vdmwJJWVzcCwlZWJwCisjaWZuZGVmIE5PTl9SRUVOVFJBTlRfRlBVCisJc3VibAkkMjgsJWVzcAorI2VuZGlmIC8qIE5PTl9SRUVOVFJBTlRfRlBVICovCisKKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYngKKworCW1vdmwJUkVHQSwlZXNpCisJbW92bAlSRUdCLCVlYngKKwltb3ZsCURFU1QsJWVkaQorCisJbW92c3dsCUVYUCglZXNpKSwlZWR4CisJbW92c3dsCUVYUCglZWJ4KSwlZWF4CisJc3VibAklZWF4LCVlZHgKKwlhZGRsCUVYUF9CSUFTLCVlZHgKKworCS8qIEEgZGVub3JtYWwgYW5kIGEgbGFyZ2UgbnVtYmVyIGNhbiBjYXVzZSBhbiBleHBvbmVudCB1bmRlcmZsb3cgKi8KKwljbXBsCUVYUF9XQVlfVU5ERVIsJWVkeAorCWpnCXhFeHBfbm90X3VuZGVyZmxvdworCisJLyogU2V0IHRvIGEgcmVhbGx5IGxvdyB2YWx1ZSBhbGxvdyBjb3JyZWN0IGhhbmRsaW5nICovCisJbW92bAlFWFBfV0FZX1VOREVSLCVlZHgKKworeEV4cF9ub3RfdW5kZXJmbG93OgorCisJbW92dyAgICAlZHgsRVhQKCVlZGkpCisKKyNpZmRlZiBQQVJBTk9JRAorLyoJdGVzdGwJJDB4ODAwMDAwMDAsIFNJR0goJWVzaSkJLy8gRGl2aWRlbmQgKi8KKy8qCWplCUxfYnVnZ2VkICovCisJdGVzdGwJJDB4ODAwMDAwMDAsIFNJR0goJWVieCkJLyogRGl2aXNvciAqLworCWplCUxfYnVnZ2VkCisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKKy8qIENoZWNrIGlmIHRoZSBkaXZpc29yIGNhbiBiZSB0cmVhdGVkIGFzIGhhdmluZyBqdXN0IDMyIGJpdHMgKi8KKwljbXBsCSQwLFNJR0woJWVieCkKKwlqbnoJTF9GdWxsX0RpdmlzaW9uCS8qIENhbid0IGRvIGEgcXVpY2sgZGl2aWRlICovCisKKy8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHppcCB0aHJvdWdoIHRoZSBkaXZpc2lvbiBoZXJlICovCisJbW92bAlTSUdIKCVlYngpLCVlY3gJLyogVGhlIGRpdmlzb3IgKi8KKwltb3ZsCVNJR0goJWVzaSksJWVkeAkvKiBEaXZpZGVuZCAqLworCW1vdmwJU0lHTCglZXNpKSwlZWF4CS8qIERpdmlkZW5kICovCisKKwljbXBsCSVlY3gsJWVkeAorCXNldGFlYglGUFVfb3ZmbF9mbGFnCS8qIEtlZXAgYSByZWNvcmQgKi8KKwlqYglMX25vX2FkanVzdAorCisJc3VibAklZWN4LCVlZHgJLyogUHJldmVudCB0aGUgb3ZlcmZsb3cgKi8KKworTF9ub19hZGp1c3Q6CisJLyogRGl2aWRlIHRoZSA2NCBiaXQgbnVtYmVyIGJ5IHRoZSAzMiBiaXQgZGVub21pbmF0b3IgKi8KKwlkaXZsCSVlY3gKKwltb3ZsCSVlYXgsRlBVX3Jlc3VsdF8yCisKKwkvKiBXb3JrIG9uIHRoZSByZW1haW5kZXIgb2YgdGhlIGZpcnN0IGRpdmlzaW9uICovCisJeG9ybAklZWF4LCVlYXgKKwlkaXZsCSVlY3gKKwltb3ZsCSVlYXgsRlBVX3Jlc3VsdF8xCisKKwkvKiBXb3JrIG9uIHRoZSByZW1haW5kZXIgb2YgdGhlIDY0IGJpdCBkaXZpc2lvbiAqLworCXhvcmwJJWVheCwlZWF4CisJZGl2bAklZWN4CisKKwl0ZXN0YgkkMjU1LEZQVV9vdmZsX2ZsYWcJLyogd2FzIHRoZSBudW0gPiBkZW5vbSA/ICovCisJamUJTF9ub19vdmVyZmxvdworCisJLyogRG8gdGhlIHNoaWZ0aW5nIGhlcmUgKi8KKwkvKiBpbmNyZWFzZSB0aGUgZXhwb25lbnQgKi8KKwlpbmN3CUVYUCglZWRpKQorCisJLyogc2hpZnQgdGhlIG1hbnRpc3NhIHJpZ2h0IG9uZSBiaXQgKi8KKwlzdGMJCQkvKiBUbyBzZXQgdGhlIG1zIGJpdCAqLworCXJjcmwJRlBVX3Jlc3VsdF8yCisJcmNybAlGUFVfcmVzdWx0XzEKKwlyY3JsCSVlYXgKKworTF9ub19vdmVyZmxvdzoKKwlqbXAJTFJvdW5kX3ByZWNpc2lvbgkvKiBEbyB0aGUgcm91bmRpbmcgYXMgcmVxdWlyZWQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBEaXZpZGU6ICAgUmV0dXJuICBhcmcxL2FyZzIgdG8gYXJnMy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgVGhpcyByb3V0aW5lIGRvZXMgbm90IHVzZSB0aGUgZXhwb25lbnRzIG9mIGFyZzEgYW5kIGFyZzIsIGJ1dCBkb2VzICAgICAgIHwKKyB8ICBhZGp1c3QgdGhlIGV4cG9uZW50IG9mIGFyZzMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgVGhlIG1heGltdW0gcmV0dXJuZWQgdmFsdWUgaXMgKGlnbm9yaW5nIGV4cG9uZW50cykgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgLmZmZmZmZmZmIGZmZmZmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gID0gIDEuZmZmZmZmZmYgZmZmZmZmZmUgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgIC44MDAwMDAwMCAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IGFuZCB0aGUgbWluaW11bSBpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAuODAwMDAwMDAgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAgPSAgLjgwMDAwMDAwIDAwMDAwMDAxICAgKHJvdW5kZWQpICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgLmZmZmZmZmZmIGZmZmZmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworTF9GdWxsX0RpdmlzaW9uOgorCS8qIFNhdmUgZXh0ZW5kZWQgZGl2aWRlbmQgaW4gbG9jYWwgcmVnaXN0ZXIgKi8KKwltb3ZsCVNJR0woJWVzaSksJWVheAorCW1vdmwJJWVheCxGUFVfYWNjdW1fMgorCW1vdmwJU0lHSCglZXNpKSwlZWF4CisJbW92bAklZWF4LEZQVV9hY2N1bV8zCisJeG9ybAklZWF4LCVlYXgKKwltb3ZsCSVlYXgsRlBVX2FjY3VtXzEJLyogemVybyB0aGUgZXh0ZW5zaW9uICovCisJbW92bAklZWF4LEZQVV9hY2N1bV8wCS8qIHplcm8gdGhlIGV4dGVuc2lvbiAqLworCisJbW92bAlTSUdMKCVlc2kpLCVlYXgJLyogR2V0IHRoZSBjdXJyZW50IG51bSAqLworCW1vdmwJU0lHSCglZXNpKSwlZWR4CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBJbml0aWFsaXphdGlvbiBkb25lLgorICAgRG8gdGhlIGZpcnN0IDMyIGJpdHMuICovCisKKwltb3ZiCSQwLEZQVV9vdmZsX2ZsYWcKKwljbXBsCVNJR0goJWVieCksJWVkeAkvKiBUZXN0IGZvciBpbW1pbmVudCBvdmVyZmxvdyAqLworCWpiCUxMZXNzX3RoYW5fMQorCWphCUxHcmVhdGVyX3RoYW5fMQorCisJY21wbAlTSUdMKCVlYngpLCVlYXgKKwlqYglMTGVzc190aGFuXzEKKworTEdyZWF0ZXJfdGhhbl8xOgorLyogVGhlIGRpdmlkZW5kIGlzIGdyZWF0ZXIgb3IgZXF1YWwsIHdvdWxkIGNhdXNlIG92ZXJmbG93ICovCisJc2V0YWViCUZQVV9vdmZsX2ZsYWcJCS8qIEtlZXAgYSByZWNvcmQgKi8KKworCXN1YmwJU0lHTCglZWJ4KSwlZWF4CisJc2JibAlTSUdIKCVlYngpLCVlZHgJLyogUHJldmVudCB0aGUgb3ZlcmZsb3cgKi8KKwltb3ZsCSVlYXgsRlBVX2FjY3VtXzIKKwltb3ZsCSVlZHgsRlBVX2FjY3VtXzMKKworTExlc3NfdGhhbl8xOgorLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhIGRpdmlkZW5kIDwgZGl2aXNvciwgd2l0aCBhIHJlY29yZCBvZgorICAgYWRqdXN0bWVudCBpbiBGUFVfb3ZmbF9mbGFnICovCisKKwkvKiBXZSB3aWxsIGRpdmlkZSBieSBhIG51bWJlciB3aGljaCBpcyB0b28gbGFyZ2UgKi8KKwltb3ZsCVNJR0goJWVieCksJWVjeAorCWFkZGwJJDEsJWVjeAorCWpuYwlMRmlyc3RfZGl2X25vdF8xCisKKwkvKiBoZXJlIHdlIG5lZWQgdG8gZGl2aWRlIGJ5IDEwMDAwMDAwMGgsCisJICAgaS5lLiwgbm8gZGl2aXNpb24gYXQgYWxsLi4gKi8KKwltb3YJJWVkeCwlZWF4CisJam1wCUxGaXJzdF9kaXZfZG9uZQorCitMRmlyc3RfZGl2X25vdF8xOgorCWRpdmwJJWVjeAkJLyogRGl2aWRlIHRoZSBudW1lcmF0b3IgYnkgdGhlIGF1Z21lbnRlZAorCQkJCSAgIGRlbm9tIG1zIGR3ICovCisKK0xGaXJzdF9kaXZfZG9uZToKKwltb3ZsCSVlYXgsRlBVX3Jlc3VsdF8yCS8qIFB1dCB0aGUgcmVzdWx0IGluIHRoZSBhbnN3ZXIgKi8KKworCW11bGwJU0lHSCglZWJ4KQkvKiBtdWwgYnkgdGhlIG1zIGR3IG9mIHRoZSBkZW5vbSAqLworCisJc3VibAklZWF4LEZQVV9hY2N1bV8yCS8qIFN1YnRyYWN0IGZyb20gdGhlIG51bSBsb2NhbCByZWcgKi8KKwlzYmJsCSVlZHgsRlBVX2FjY3VtXzMKKworCW1vdmwJRlBVX3Jlc3VsdF8yLCVlYXgJLyogR2V0IHRoZSByZXN1bHQgYmFjayAqLworCW11bGwJU0lHTCglZWJ4KQkvKiBub3cgbXVsIHRoZSBscyBkdyBvZiB0aGUgZGVub20gKi8KKworCXN1YmwJJWVheCxGUFVfYWNjdW1fMQkvKiBTdWJ0cmFjdCBmcm9tIHRoZSBudW0gbG9jYWwgcmVnICovCisJc2JibAklZWR4LEZQVV9hY2N1bV8yCisJc2JibAkkMCxGUFVfYWNjdW1fMworCWplCUxEb18ybmRfMzJfYml0cwkJLyogTXVzdCBjaGVjayBmb3Igbm9uLXplcm8gcmVzdWx0IGhlcmUgKi8KKworI2lmZGVmIFBBUkFOT0lECisJamIJTF9idWdnZWRfMQorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisJLyogbmVlZCB0byBzdWJ0cmFjdCBhbm90aGVyIG9uY2Ugb2YgdGhlIGRlbm9tICovCisJaW5jbAlGUFVfcmVzdWx0XzIJLyogQ29ycmVjdCB0aGUgYW5zd2VyICovCisKKwltb3ZsCVNJR0woJWVieCksJWVheAorCW1vdmwJU0lHSCglZWJ4KSwlZWR4CisJc3VibAklZWF4LEZQVV9hY2N1bV8xCS8qIFN1YnRyYWN0IGZyb20gdGhlIG51bSBsb2NhbCByZWcgKi8KKwlzYmJsCSVlZHgsRlBVX2FjY3VtXzIKKworI2lmZGVmIFBBUkFOT0lECisJc2JibAkkMCxGUFVfYWNjdW1fMworCWpuZQlMX2J1Z2dlZF8xCS8qIE11c3QgY2hlY2sgZm9yIG5vbi16ZXJvIHJlc3VsdCBoZXJlICovCisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBIYWxmIG9mIHRoZSBtYWluIHByb2JsZW0gaXMgZG9uZSwgdGhlcmUgaXMganVzdCBhIHJlZHVjZWQgbnVtZXJhdG9yCisgICB0byBoYW5kbGUgbm93LgorICAgV29yayB3aXRoIHRoZSBzZWNvbmQgMzIgYml0cywgRlBVX2FjY3VtXzAgbm90IHVzZWQgZnJvbSBub3cgb24gKi8KK0xEb18ybmRfMzJfYml0czoKKwltb3ZsCUZQVV9hY2N1bV8yLCVlZHgJLyogZ2V0IHRoZSByZWR1Y2VkIG51bSAqLworCW1vdmwJRlBVX2FjY3VtXzEsJWVheAorCisJLyogbmVlZCB0byBjaGVjayBmb3IgcG9zc2libGUgc3Vic2VxdWVudCBvdmVyZmxvdyAqLworCWNtcGwJU0lHSCglZWJ4KSwlZWR4CisJamIJTERvXzJuZF9kaXYKKwlqYQlMUHJldmVudF8ybmRfb3ZlcmZsb3cKKworCWNtcGwJU0lHTCglZWJ4KSwlZWF4CisJamIJTERvXzJuZF9kaXYKKworTFByZXZlbnRfMm5kX292ZXJmbG93OgorLyogVGhlIG51bWVyYXRvciBpcyBncmVhdGVyIG9yIGVxdWFsLCB3b3VsZCBjYXVzZSBvdmVyZmxvdyAqLworCS8qIHByZXZlbnQgb3ZlcmZsb3cgKi8KKwlzdWJsCVNJR0woJWVieCksJWVheAorCXNiYmwJU0lHSCglZWJ4KSwlZWR4CisJbW92bAklZWR4LEZQVV9hY2N1bV8yCisJbW92bAklZWF4LEZQVV9hY2N1bV8xCisKKwlpbmNsCUZQVV9yZXN1bHRfMgkvKiBSZWZsZWN0IHRoZSBzdWJ0cmFjdGlvbiBpbiB0aGUgYW5zd2VyICovCisKKyNpZmRlZiBQQVJBTk9JRAorCWplCUxfYnVnZ2VkXzIJLyogQ2FuJ3QgYnVtcCB0aGUgcmVzdWx0IHRvIDEuMCAqLworI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCitMRG9fMm5kX2RpdjoKKwljbXBsCSQwLCVlY3gJCS8qIGF1Z21lbnRlZCBkZW5vbSBtc3cgKi8KKwlqbnoJTFNlY29uZF9kaXZfbm90XzEKKworCS8qICVlY3ggPT0gMCwgd2UgYXJlIGRpdmlkaW5nIGJ5IDEuMCAqLworCW1vdgklZWR4LCVlYXgKKwlqbXAJTFNlY29uZF9kaXZfZG9uZQorCitMU2Vjb25kX2Rpdl9ub3RfMToKKwlkaXZsCSVlY3gJCS8qIERpdmlkZSB0aGUgbnVtZXJhdG9yIGJ5IHRoZSBkZW5vbSBtcyBkdyAqLworCitMU2Vjb25kX2Rpdl9kb25lOgorCW1vdmwJJWVheCxGUFVfcmVzdWx0XzEJLyogUHV0IHRoZSByZXN1bHQgaW4gdGhlIGFuc3dlciAqLworCisJbXVsbAlTSUdIKCVlYngpCS8qIG11bCBieSB0aGUgbXMgZHcgb2YgdGhlIGRlbm9tICovCisKKwlzdWJsCSVlYXgsRlBVX2FjY3VtXzEJLyogU3VidHJhY3QgZnJvbSB0aGUgbnVtIGxvY2FsIHJlZyAqLworCXNiYmwJJWVkeCxGUFVfYWNjdW1fMgorCisjaWZkZWYgUEFSQU5PSUQKKwlqYwlMX2J1Z2dlZF8yCisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKKwltb3ZsCUZQVV9yZXN1bHRfMSwlZWF4CS8qIEdldCB0aGUgcmVzdWx0IGJhY2sgKi8KKwltdWxsCVNJR0woJWVieCkJLyogbm93IG11bCB0aGUgbHMgZHcgb2YgdGhlIGRlbm9tICovCisKKwlzdWJsCSVlYXgsRlBVX2FjY3VtXzAJLyogU3VidHJhY3QgZnJvbSB0aGUgbnVtIGxvY2FsIHJlZyAqLworCXNiYmwJJWVkeCxGUFVfYWNjdW1fMQkvKiBTdWJ0cmFjdCBmcm9tIHRoZSBudW0gbG9jYWwgcmVnICovCisJc2JibAkkMCxGUFVfYWNjdW1fMgorCisjaWZkZWYgUEFSQU5PSUQKKwlqYwlMX2J1Z2dlZF8yCisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKKwlqeglMRG9fM3JkXzMyX2JpdHMKKworI2lmZGVmIFBBUkFOT0lECisJY21wbAkkMSxGUFVfYWNjdW1fMgorCWpuZQlMX2J1Z2dlZF8yCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworCS8qIG5lZWQgdG8gc3VidHJhY3QgYW5vdGhlciBvbmNlIG9mIHRoZSBkZW5vbSAqLworCW1vdmwJU0lHTCglZWJ4KSwlZWF4CisJbW92bAlTSUdIKCVlYngpLCVlZHgKKwlzdWJsCSVlYXgsRlBVX2FjY3VtXzAJLyogU3VidHJhY3QgZnJvbSB0aGUgbnVtIGxvY2FsIHJlZyAqLworCXNiYmwJJWVkeCxGUFVfYWNjdW1fMQorCXNiYmwJJDAsRlBVX2FjY3VtXzIKKworI2lmZGVmIFBBUkFOT0lECisJamMJTF9idWdnZWRfMgorCWpuZQlMX2J1Z2dlZF8yCisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCisKKwlhZGRsCSQxLEZQVV9yZXN1bHRfMQkvKiBDb3JyZWN0IHRoZSBhbnN3ZXIgKi8KKwlhZGNsCSQwLEZQVV9yZXN1bHRfMgorCisjaWZkZWYgUEFSQU5PSUQKKwlqYwlMX2J1Z2dlZF8yCS8qIE11c3QgY2hlY2sgZm9yIG5vbi16ZXJvIHJlc3VsdCBoZXJlICovCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFRoZSBkaXZpc2lvbiBpcyBlc3NlbnRpYWxseSBmaW5pc2hlZCBoZXJlLCB3ZSBqdXN0IG5lZWQgdG8gcGVyZm9ybQorICAgdGlkeWluZyBvcGVyYXRpb25zLgorICAgRGVhbCB3aXRoIHRoZSAzcmQgMzIgYml0cyAqLworTERvXzNyZF8zMl9iaXRzOgorCW1vdmwJRlBVX2FjY3VtXzEsJWVkeAkJLyogZ2V0IHRoZSByZWR1Y2VkIG51bSAqLworCW1vdmwJRlBVX2FjY3VtXzAsJWVheAorCisJLyogbmVlZCB0byBjaGVjayBmb3IgcG9zc2libGUgc3Vic2VxdWVudCBvdmVyZmxvdyAqLworCWNtcGwJU0lHSCglZWJ4KSwlZWR4CS8qIGRlbm9tICovCisJamIJTFJvdW5kX3ByZXAKKwlqYQlMUHJldmVudF8zcmRfb3ZlcmZsb3cKKworCWNtcGwJU0lHTCglZWJ4KSwlZWF4CS8qIGRlbm9tICovCisJamIJTFJvdW5kX3ByZXAKKworTFByZXZlbnRfM3JkX292ZXJmbG93OgorCS8qIHByZXZlbnQgb3ZlcmZsb3cgKi8KKwlzdWJsCVNJR0woJWVieCksJWVheAorCXNiYmwJU0lHSCglZWJ4KSwlZWR4CisJbW92bAklZWR4LEZQVV9hY2N1bV8xCisJbW92bAklZWF4LEZQVV9hY2N1bV8wCisKKwlhZGRsCSQxLEZQVV9yZXN1bHRfMQkvKiBSZWZsZWN0IHRoZSBzdWJ0cmFjdGlvbiBpbiB0aGUgYW5zd2VyICovCisJYWRjbAkkMCxGUFVfcmVzdWx0XzIKKwlqbmUJTFJvdW5kX3ByZXAKKwlqbmMJTFJvdW5kX3ByZXAKKworCS8qIFRoaXMgaXMgYSB0cmlja3kgc3BvdCwgdGhlcmUgaXMgYW4gb3ZlcmZsb3cgb2YgdGhlIGFuc3dlciAqLworCW1vdmIJJDI1NSxGUFVfb3ZmbF9mbGFnCQkvKiBPdmVyZmxvdyAtPiAxLjAwMCAqLworCitMUm91bmRfcHJlcDoKKy8qCisgKiBQcmVwYXJlIGZvciByb3VuZGluZy4KKyAqIFRvIHRlc3QgZm9yIHJvdW5kaW5nLCB3ZSBqdXN0IG5lZWQgdG8gY29tcGFyZSAyKmFjY3VtIHdpdGggdGhlCisgKiBkZW5vbS4KKyAqLworCW1vdmwJRlBVX2FjY3VtXzAsJWVjeAorCW1vdmwJRlBVX2FjY3VtXzEsJWVkeAorCW1vdmwJJWVjeCwlZWF4CisJb3JsCSVlZHgsJWVheAorCWp6CUxSb3VuZF9vdmZsCQkvKiBUaGUgYWNjdW11bGF0b3IgY29udGFpbnMgemVyby4gKi8KKworCS8qIE11bHRpcGx5IGJ5IDIgKi8KKwljbGMKKwlyY2xsCSQxLCVlY3gKKwlyY2xsCSQxLCVlZHgKKwlqYwlMUm91bmRfbGFyZ2UJCS8qIE5vIG5lZWQgdG8gY29tcGFyZSwgZGVub20gc21hbGxlciAqLworCisJc3VibAlTSUdMKCVlYngpLCVlY3gKKwlzYmJsCVNJR0goJWVieCksJWVkeAorCWpuYwlMUm91bmRfbm90X3NtYWxsCisKKwltb3ZsCSQweDcwMDAwMDAwLCVlYXgJLyogRGVub20gd2FzIGxhcmdlciAqLworCWptcAlMUm91bmRfb3ZmbAorCitMUm91bmRfbm90X3NtYWxsOgorCWpueglMUm91bmRfbGFyZ2UKKworCW1vdmwJJDB4ODAwMDAwMDAsJWVheAkvKiBSZW1haW5kZXIgd2FzIGV4YWN0bHkgMS8yIGRlbm9tICovCisJam1wCUxSb3VuZF9vdmZsCisKK0xSb3VuZF9sYXJnZToKKwltb3ZsCSQweGZmMDAwMDAwLCVlYXgJLyogRGVub20gd2FzIHNtYWxsZXIgKi8KKworTFJvdW5kX292Zmw6CisvKiBXZSBhcmUgbm93IHJlYWR5IHRvIGRlYWwgd2l0aCByb3VuZGluZywgYnV0IGZpcnN0IHdlIG11c3QgZ2V0CisgICB0aGUgYml0cyBwcm9wZXJseSBhbGlnbmVkICovCisJdGVzdGIJJDI1NSxGUFVfb3ZmbF9mbGFnCS8qIHdhcyB0aGUgbnVtID4gZGVub20gPyAqLworCWplCUxSb3VuZF9wcmVjaXNpb24KKworCWluY3cJRVhQKCVlZGkpCisKKwkvKiBzaGlmdCB0aGUgbWFudGlzc2EgcmlnaHQgb25lIGJpdCAqLworCXN0YwkJCS8qIFdpbGwgc2V0IHRoZSBtcyBiaXQgKi8KKwlyY3JsCUZQVV9yZXN1bHRfMgorCXJjcmwJRlBVX3Jlc3VsdF8xCisJcmNybAklZWF4CisKKy8qIFJvdW5kIHRoZSByZXN1bHQgYXMgcmVxdWlyZWQgKi8KK0xSb3VuZF9wcmVjaXNpb246CisJZGVjdwlFWFAoJWVkaSkJLyogYmluYXJ5IHBvaW50IGJldHdlZW4gMXN0ICYgMm5kIGJpdHMgKi8KKworCW1vdmwJJWVheCwlZWR4CisJbW92bAlGUFVfcmVzdWx0XzEsJWVieAorCW1vdmwJRlBVX3Jlc3VsdF8yLCVlYXgKKwlqbXAJZnB1X3JlZ19yb3VuZAorCisKKyNpZmRlZiBQQVJBTk9JRAorLyogVGhlIGxvZ2ljIGlzIHdyb25nIGlmIHdlIGdvdCBoZXJlICovCitMX2J1Z2dlZDoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIwMgorCWNhbGwJRVhDRVBUSU9OCisJcG9wCSVlYngKKwlqbXAJTF9leGl0CisKK0xfYnVnZ2VkXzE6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyMDMKKwljYWxsCUVYQ0VQVElPTgorCXBvcAklZWJ4CisJam1wCUxfZXhpdAorCitMX2J1Z2dlZF8yOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjA0CisJY2FsbAlFWENFUFRJT04KKwlwb3AJJWVieAorCWptcAlMX2V4aXQKKworTF9leGl0OgorCW1vdmwJJC0xLCVlYXgKKwlwb3BsCSVlYngKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKworCWxlYXZlCisJcmV0CisjZW5kaWYgLyogUEFSQU5PSUQgKi8gCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX3VfbXVsLlMgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX3VfbXVsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczZjEyYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfdV9tdWwuUwpAQCAtMCwwICsxLDE0OCBAQAorCS5maWxlCSJyZWdfdV9tdWwuUyIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHJlZ191X211bC5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcmUgbXVsdGlwbGljYXRpb24gcm91dGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk1LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCBBdXN0cmFsaWEgfAorIHwgICAgICAgICAgICAgICAgICBFLW1haWwgICBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICAgQmFzaWMgbXVsdGlwbGljYXRpb24gcm91dGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBEb2VzIG5vdCBjaGVjayB0aGUgcmVzdWx0aW5nIGV4cG9uZW50IGZvciBvdmVyZmxvdy91bmRlcmZsb3cgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgRlBVX3VfbXVsKEZQVV9SRUcgKmEsIEZQVV9SRUcgKmIsIEZQVV9SRUcgKmMsIHVuc2lnbmVkIGludCBjdyk7ICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIEludGVybmFsIHdvcmtpbmcgaXMgYXQgYXBwcm94IDEyOCBiaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgUmVzdWx0IGlzIHJvdW5kZWQgdG8gbmVhcmVzdCA1MyBvciA2NCBiaXRzLCB1c2luZyAibmVhcmVzdCBvciBldmVuIi4gICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImNvbnRyb2xfdy5oIgorCisKKworI2lmbmRlZiBOT05fUkVFTlRSQU5UX0ZQVQorLyogIExvY2FsIHN0b3JhZ2Ugb24gdGhlIHN0YWNrOiAqLworI2RlZmluZSBGUFVfYWNjdW1fMAktNCglZWJwKQkvKiBtcyB3b3JkICovCisjZGVmaW5lIEZQVV9hY2N1bV8xCS04KCVlYnApCisKKyNlbHNlCisvKiAgTG9jYWwgc3RvcmFnZSBpbiBhIHN0YXRpYyBhcmVhOiAqLworLmRhdGEKKwkuYWxpZ24gNCwwCitGUFVfYWNjdW1fMDoKKwkubG9uZwkwCitGUFVfYWNjdW1fMToKKwkubG9uZwkwCisjZW5kaWYgLyogTk9OX1JFRU5UUkFOVF9GUFUgKi8KKworCisudGV4dAorRU5UUlkoRlBVX3VfbXVsKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorI2lmbmRlZiBOT05fUkVFTlRSQU5UX0ZQVQorCXN1YmwJJDgsJWVzcAorI2VuZGlmIC8qIE5PTl9SRUVOVFJBTlRfRlBVICovIAorCisJcHVzaGwJJWVzaQorCXB1c2hsCSVlZGkKKwlwdXNobAklZWJ4CisKKwltb3ZsCVBBUkFNMSwlZXNpCisJbW92bAlQQVJBTTIsJWVkaQorCisjaWZkZWYgUEFSQU5PSUQKKwl0ZXN0bAkkMHg4MDAwMDAwMCxTSUdIKCVlc2kpCisJanoJTF9idWdnZWQKKwl0ZXN0bAkkMHg4MDAwMDAwMCxTSUdIKCVlZGkpCisJanoJTF9idWdnZWQKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisJeG9ybAklZWN4LCVlY3gKKwl4b3JsCSVlYngsJWVieAorCisJbW92bAlTSUdMKCVlc2kpLCVlYXgKKwltdWxsCVNJR0woJWVkaSkKKwltb3ZsCSVlYXgsRlBVX2FjY3VtXzAKKwltb3ZsCSVlZHgsRlBVX2FjY3VtXzEKKworCW1vdmwJU0lHTCglZXNpKSwlZWF4CisJbXVsbAlTSUdIKCVlZGkpCisJYWRkbAklZWF4LEZQVV9hY2N1bV8xCisJYWRjbAklZWR4LCVlYngKKy8qCWFkY2wJJDAsJWVjeAkJLy8gb3ZlcmZsb3cgaGVyZSBpcyBub3QgcG9zc2libGUgKi8KKworCW1vdmwJU0lHSCglZXNpKSwlZWF4CisJbXVsbAlTSUdMKCVlZGkpCisJYWRkbAklZWF4LEZQVV9hY2N1bV8xCisJYWRjbAklZWR4LCVlYngKKwlhZGNsCSQwLCVlY3gKKworCW1vdmwJU0lHSCglZXNpKSwlZWF4CisJbXVsbAlTSUdIKCVlZGkpCisJYWRkbAklZWF4LCVlYngKKwlhZGNsCSVlZHgsJWVjeAorCisJLyogR2V0IHRoZSBzdW0gb2YgdGhlIGV4cG9uZW50cy4gKi8KKwltb3ZsCVBBUkFNNiwlZWF4CisJc3VibAlFWFBfQklBUy0xLCVlYXgKKworCS8qIFR3byBkZW5vcm1hbHMgY2FuIGNhdXNlIGFuIGV4cG9uZW50IHVuZGVyZmxvdyAqLworCWNtcGwJRVhQX1dBWV9VTkRFUiwlZWF4CisJamcJRXhwX25vdF91bmRlcmZsb3cKKworCS8qIFNldCB0byBhIHJlYWxseSBsb3cgdmFsdWUgYWxsb3cgY29ycmVjdCBoYW5kbGluZyAqLworCW1vdmwJRVhQX1dBWV9VTkRFUiwlZWF4CisKK0V4cF9ub3RfdW5kZXJmbG93OgorCisvKiAgSGF2ZSBub3cgZmluaXNoZWQgd2l0aCB0aGUgc291cmNlcyAqLworCW1vdmwJUEFSQU0zLCVlZGkJLyogUG9pbnQgdG8gdGhlIGRlc3RpbmF0aW9uICovCisJbW92dwklYXgsRVhQKCVlZGkpCisKKy8qICBOb3cgbWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdCBpcyBub3JtYWxpemVkICovCisJdGVzdGwJJDB4ODAwMDAwMDAsJWVjeAorCWpueglMUmVzdWx0X05vcm1hbGlzZWQKKworCS8qIE5vcm1hbGl6ZSBieSBzaGlmdGluZyBsZWZ0IG9uZSBiaXQgKi8KKwlzaGxsCSQxLEZQVV9hY2N1bV8wCisJcmNsbAkkMSxGUFVfYWNjdW1fMQorCXJjbGwJJDEsJWVieAorCXJjbGwJJDEsJWVjeAorCWRlY3cJRVhQKCVlZGkpCisKK0xSZXN1bHRfTm9ybWFsaXNlZDoKKwltb3ZsCUZQVV9hY2N1bV8wLCVlYXgKKwltb3ZsCUZQVV9hY2N1bV8xLCVlZHgKKwlvcmwJJWVheCwlZWF4CisJanoJTF9leHRlbnRfemVybworCisJb3JsCSQxLCVlZHgKKworTF9leHRlbnRfemVybzoKKwltb3ZsCSVlY3gsJWVheAorCWptcAlmcHVfcmVnX3JvdW5kCisKKworI2lmZGVmIFBBUkFOT0lECitMX2J1Z2dlZDoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIwNQorCWNhbGwJRVhDRVBUSU9OCisJcG9wCSVlYngKKwlqbXAJTF9leGl0CisKK0xfZXhpdDoKKwlwb3BsCSVlYngKKwlwb3BsCSVlZGkKKwlwb3BsCSVlc2kKKwlsZWF2ZQorCXJldAorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX3Vfc3ViLlMgYi9hcmNoL2kzODYvbWF0aC1lbXUvcmVnX3Vfc3ViLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2YzI0OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9yZWdfdV9zdWIuUwpAQCAtMCwwICsxLDI3MiBAQAorCS5maWxlCSJyZWdfdV9zdWIuUyIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHJlZ191X3N1Yi5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcmUgZmxvYXRpbmcgcG9pbnQgc3VidHJhY3Rpb24gcm91dGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk1LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCBBdXN0cmFsaWEgfAorIHwgICAgICAgICAgICAgICAgICBFLW1haWwgICBiaWxsbUBzdWJ1cmJpYS5uZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENhbGwgZnJvbSBDIGFzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgaW50IEZQVV91X3N1YihGUFVfUkVHICphcmcxLCBGUFVfUkVHICphcmcyLCBGUFVfUkVHICphbnN3LCAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250cm9sX3cpICAgICAgICAgICAgIHwKKyB8ICAgIFJldHVybiB2YWx1ZSBpcyB0aGUgdGFnIG9mIHRoZSBhbnN3ZXIsIG9yLWVkIHdpdGggRlBVX0V4Y2VwdGlvbiBpZiAgICAgfAorIHwgICAgb25lIHdhcyByYWlzZWQsIG9yIC0xIG9uIGludGVybmFsIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyB8ICAgIEtlcm5lbCBzdWJ0cmFjdGlvbiByb3V0aW5lIEZQVV91X3N1YihyZWcgKmFyZzEsIHJlZyAqYXJnMiwgcmVnICphbnN3KS4KKyB8ICAgIFRha2VzIHR3byB2YWxpZCByZWcgZi5wLiBudW1iZXJzIChUQUdfVmFsaWQpLCB3aGljaCBhcmUKKyB8ICAgIHRyZWF0ZWQgYXMgdW5zaWduZWQgbnVtYmVycywKKyB8ICAgIGFuZCByZXR1cm5zIHRoZWlyIGRpZmZlcmVuY2UgYXMgYSBUQUdfVmFsaWQgb3IgVEFHX1plcm8gZi5wLgorIHwgICAgbnVtYmVyLgorIHwgICAgVGhlIGZpcnN0IG51bWJlciAoYXJnMSkgbXVzdCBiZSB0aGUgbGFyZ2VyLgorIHwgICAgVGhlIHJldHVybmVkIG51bWJlciBpcyBub3JtYWxpemVkLgorIHwgICAgQmFzaWMgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaWYgUEFSQU5PSUQgaXMgZGVmaW5lZC4KKyAqLworCisjaW5jbHVkZSAiZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorI2luY2x1ZGUgImNvbnRyb2xfdy5oIgorCisudGV4dAorRU5UUlkoRlBVX3Vfc3ViKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXB1c2hsCSVlc2kKKwlwdXNobAklZWRpCisJcHVzaGwJJWVieAorCisJbW92bAlQQVJBTTEsJWVzaQkvKiBzb3VyY2UgMSAqLworCW1vdmwJUEFSQU0yLCVlZGkJLyogc291cmNlIDIgKi8KKwkKKwltb3ZsCVBBUkFNNiwlZWN4CisJc3VibAlQQVJBTTcsJWVjeAkvKiBleHAxIC0gZXhwMiAqLworCisjaWZkZWYgUEFSQU5PSUQKKwkvKiBzb3VyY2UgMiBpcyBhbHdheXMgc21hbGxlciB0aGFuIHNvdXJjZSAxICovCisJanMJTF9idWdnZWRfMQorCisJdGVzdGwJJDB4ODAwMDAwMDAsU0lHSCglZWRpKQkvKiBUaGUgYXJncyBhcmUgYXNzdW1lZCB0byBiZSBiZSBub3JtYWxpemVkICovCisJamUJTF9idWdnZWRfMgorCisJdGVzdGwJJDB4ODAwMDAwMDAsU0lHSCglZXNpKQorCWplCUxfYnVnZ2VkXzIKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwJRm9ybSBhIHJlZ2lzdGVyIGhvbGRpbmcgdGhlICAgICB8CisgfAlzbWFsbGVyIG51bWJlciAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW1vdmwJU0lHSCglZWRpKSwlZWF4CS8qIHJlZ2lzdGVyIG1zIHdvcmQgKi8KKwltb3ZsCVNJR0woJWVkaSksJWVieAkvKiByZWdpc3RlciBscyB3b3JkICovCisKKwltb3ZsCVBBUkFNMywlZWRpCS8qIGRlc3RpbmF0aW9uICovCisJbW92bAlQQVJBTTYsJWVkeAorCW1vdncJJWR4LEVYUCglZWRpKQkvKiBDb3B5IGV4cG9uZW50IHRvIGRlc3RpbmF0aW9uICovCisKKwl4b3JsCSVlZHgsJWVkeAkvKiByZWdpc3RlciBleHRlbnNpb24gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8CVNoaWZ0IHRoZSB0ZW1wb3JhcnkgcmVnaXN0ZXIJfAorIHwgICAgICByaWdodCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mCXwKKyB8CXBsYWNlcy4JCQkJfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwljbXB3CSQzMiwlY3gJCS8qIHNocmQgb25seSB3b3JrcyBmb3IgMC4uMzEgYml0cyAqLworCWpuYwlMX21vcmVfdGhhbl8zMQorCisvKiBsZXNzIHRoYW4gMzIgYml0cyAqLworCXNocmQJJWNsLCVlYngsJWVkeAorCXNocmQJJWNsLCVlYXgsJWVieAorCXNocgklY2wsJWVheAorCWptcAlMX3NoaWZ0X2RvbmUKKworTF9tb3JlX3RoYW5fMzE6CisJY21wdwkkNjQsJWN4CisJam5jCUxfbW9yZV90aGFuXzYzCisKKwlzdWJiCSQzMiwlY2wKKwlqeglMX2V4YWN0bHlfMzIKKworCXNocmQJJWNsLCVlYXgsJWVkeAorCXNocgklY2wsJWVheAorCW9ybAklZWJ4LCVlYngKKwlqeglMX21vcmVfMzFfbm9fbG93CS8qIG5vbmUgb2YgdGhlIGxvd2VzdCBiaXRzIGlzIHNldCAqLworCisJb3JsCSQxLCVlZHgJCQkvKiByZWNvcmQgdGhlIGZhY3QgaW4gdGhlIGV4dGVuc2lvbiAqLworCitMX21vcmVfMzFfbm9fbG93OgorCW1vdmwJJWVheCwlZWJ4CisJeG9ybAklZWF4LCVlYXgKKwlqbXAJTF9zaGlmdF9kb25lCisKK0xfZXhhY3RseV8zMjoKKwltb3ZsCSVlYngsJWVkeAorCW1vdmwJJWVheCwlZWJ4CisJeG9ybAklZWF4LCVlYXgKKwlqbXAJTF9zaGlmdF9kb25lCisKK0xfbW9yZV90aGFuXzYzOgorCWNtcHcJJDY1LCVjeAorCWpuYwlMX21vcmVfdGhhbl82NAorCisJLyogU2hpZnQgcmlnaHQgYnkgNjQgYml0cyAqLworCW1vdmwJJWVheCwlZWR4CisJb3JsCSVlYngsJWVieAorCWp6CUxfbW9yZV82M19ub19sb3cKKworCW9ybAkkMSwlZWR4CisJam1wCUxfbW9yZV82M19ub19sb3cKKworTF9tb3JlX3RoYW5fNjQ6CisJam5lCUxfbW9yZV90aGFuXzY1CisKKwkvKiBTaGlmdCByaWdodCBieSA2NSBiaXRzICovCisJLyogQ2FycnkgaXMgY2xlYXIgaWYgd2UgZ2V0IGhlcmUgKi8KKwltb3ZsCSVlYXgsJWVkeAorCXJjcmwJJWVkeAorCWpuYwlMX3NoaWZ0XzY1X25jCisKKwlvcmwJJDEsJWVkeAorCWptcAlMX21vcmVfNjNfbm9fbG93CisKK0xfc2hpZnRfNjVfbmM6CisJb3JsCSVlYngsJWVieAorCWp6CUxfbW9yZV82M19ub19sb3cKKworCW9ybAkkMSwlZWR4CisJam1wCUxfbW9yZV82M19ub19sb3cKKworTF9tb3JlX3RoYW5fNjU6CisJbW92bAkkMSwlZWR4CQkvKiBUaGUgc2hpZnRlZCBuciBhbHdheXMgYXQgbGVhc3Qgb25lICcxJyAqLworCitMX21vcmVfNjNfbm9fbG93OgorCXhvcmwJJWVieCwlZWJ4CisJeG9ybAklZWF4LCVlYXgKKworTF9zaGlmdF9kb25lOgorTF9zdWJ0cjoKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwJRG8gdGhlIHN1YnRyYWN0aW9uCXwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwl4b3JsCSVlY3gsJWVjeAorCXN1YmwJJWVkeCwlZWN4CisJbW92bAklZWN4LCVlZHgKKwltb3ZsCVNJR0woJWVzaSksJWVjeAorCXNiYmwJJWVieCwlZWN4CisJbW92bAklZWN4LCVlYngKKwltb3ZsCVNJR0goJWVzaSksJWVjeAorCXNiYmwJJWVheCwlZWN4CisJbW92bAklZWN4LCVlYXgKKworI2lmZGVmIFBBUkFOT0lECisJLyogV2UgY2FuIG5ldmVyIGdldCBhIGJvcnJvdyAqLworCWpjCUxfYnVnZ2VkCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8CU5vcm1hbGl6ZSB0aGUgcmVzdWx0CQl8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwl0ZXN0bAkkMHg4MDAwMDAwMCwlZWF4CisJam56CUxfcm91bmQJCS8qIG5vIHNoaWZ0aW5nIG5lZWRlZCAqLworCisJb3JsCSVlYXgsJWVheAorCWpueglMX3NoaWZ0XzEJLyogc2hpZnQgbGVmdCAxIC0gMzEgYml0cyAqLworCisJb3JsCSVlYngsJWVieAorCWpueglMX3NoaWZ0XzMyCS8qIHNoaWZ0IGxlZnQgMzIgLSA2MyBiaXRzICovCisKKy8qCisgKgkgQSByYXJlIGNhc2UsIHRoZSBvbmx5IG9uZSB3aGljaCBpcyBub24temVybyBpZiB3ZSBnb3QgaGVyZQorICogICAgICAgICBpczogICAgICAgICAgIDEwMDAwMDAgLi4uLiAwMDAwCisgKiAgICAgICAgICAgICAgICAgICAgICAtMDExMTExMSAuLi4uIDExMTEgMQorICogICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICogICAgICAgICAgICAgICAgICAgICAgIDAwMDAwMDAgLi4uLiAwMDAwIDEgCisgKi8KKworCWNtcGwJJDB4ODAwMDAwMDAsJWVkeAorCWpueglMX211c3RfYmVfemVybworCisJLyogU2hpZnQgbGVmdCA2NCBiaXRzICovCisJc3VidwkkNjQsRVhQKCVlZGkpCisJeGNoZwklZWR4LCVlYXgKKwlqbXAJZnB1X3JlZ19yb3VuZAorCitMX211c3RfYmVfemVybzoKKyNpZmRlZiBQQVJBTk9JRAorCW9ybAklZWR4LCVlZHgKKwlqbnoJTF9idWdnZWRfMworI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisJLyogVGhlIHJlc3VsdCBpcyB6ZXJvICovCisJbW92dwkkMCxFWFAoJWVkaSkJCS8qIGV4cG9uZW50ICovCisJbW92bAkkMCxTSUdMKCVlZGkpCisJbW92bAkkMCxTSUdIKCVlZGkpCisJbW92bAlUQUdfWmVybywlZWF4CisJam1wCUxfZXhpdAorCitMX3NoaWZ0XzMyOgorCW1vdmwJJWVieCwlZWF4CisJbW92bAklZWR4LCVlYngKKwltb3ZsCSQwLCVlZHgKKwlzdWJ3CSQzMixFWFAoJWVkaSkJLyogQ2FuIGdldCB1bmRlcmZsb3cgaGVyZSAqLworCisvKiBXZSBuZWVkIHRvIHNoaWZ0IGxlZnQgYnkgMSAtIDMxIGJpdHMgKi8KK0xfc2hpZnRfMToKKwlic3JsCSVlYXgsJWVjeAkvKiBnZXQgdGhlIHJlcXVpcmVkIHNoaWZ0IGluICVlY3ggKi8KKwlzdWJsCSQzMSwlZWN4CisJbmVnbAklZWN4CisJc2hsZAklY2wsJWVieCwlZWF4CisJc2hsZAklY2wsJWVkeCwlZWJ4CisJc2hsCSVjbCwlZWR4CisJc3VidwklY3gsRVhQKCVlZGkpCS8qIENhbiBnZXQgdW5kZXJmbG93IGhlcmUgKi8KKworTF9yb3VuZDoKKwlqbXAJZnB1X3JlZ19yb3VuZAkvKiBSb3VuZCB0aGUgcmVzdWx0ICovCisKKworI2lmZGVmIFBBUkFOT0lECitMX2J1Z2dlZF8xOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjA2CisJY2FsbAlFWENFUFRJT04KKwlwb3AJJWVieAorCWptcAlMX2Vycm9yX2V4aXQKKworTF9idWdnZWRfMjoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIwOQorCWNhbGwJRVhDRVBUSU9OCisJcG9wCSVlYngKKwlqbXAJTF9lcnJvcl9leGl0CisKK0xfYnVnZ2VkXzM6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyMTAKKwljYWxsCUVYQ0VQVElPTgorCXBvcAklZWJ4CisJam1wCUxfZXJyb3JfZXhpdAorCitMX2J1Z2dlZF80OgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjExCisJY2FsbAlFWENFUFRJT04KKwlwb3AJJWVieAorCWptcAlMX2Vycm9yX2V4aXQKKworTF9idWdnZWQ6CisJcHVzaGwJRVhfSU5URVJOQUx8MHgyMTIKKwljYWxsCUVYQ0VQVElPTgorCXBvcAklZWJ4CisJam1wCUxfZXJyb3JfZXhpdAorCitMX2Vycm9yX2V4aXQ6CisJbW92bAkkLTEsJWVheAorCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworTF9leGl0OgorCXBvcGwJJWVieAorCXBvcGwJJWVkaQorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvcm91bmRfWHNpZy5TIGIvYXJjaC9pMzg2L21hdGgtZW11L3JvdW5kX1hzaWcuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmUwZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21hdGgtZW11L3JvdW5kX1hzaWcuUwpAQCAtMCwwICsxLDE0MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgcm91bmRfWHNpZy5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTMsMTk5NCwxOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgYmlsbG1AamFjb2JpLm1hdGhzLm1vbmFzaC5lZHUuYXUgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBOb3JtYWxpemUgYW5kIHJvdW5kIGEgMTIgYnl0ZSBxdWFudGl0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENhbGwgZnJvbSBDIGFzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBpbnQgcm91bmRfWHNpZyhYc2lnICpuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IE5vcm1hbGl6ZSBhIDEyIGJ5dGUgcXVhbnRpdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ2FsbCBmcm9tIEMgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIGludCBub3JtX1hzaWcoWHNpZyAqbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgRWFjaCBmdW5jdGlvbiByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBzaGlmdCAobnIgb2YgYml0cykuICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkuZmlsZQkicm91bmRfWHNpZy5TIgorCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorCisKKy50ZXh0CitFTlRSWShyb3VuZF9Yc2lnKQorCXB1c2hsCSVlYnAKKwltb3ZsCSVlc3AsJWVicAorCXB1c2hsCSVlYngJCS8qIFJlc2VydmUgc29tZSBzcGFjZSAqLworCXB1c2hsCSVlYngKKwlwdXNobAklZXNpCisKKwltb3ZsCVBBUkFNMSwlZXNpCisKKwltb3ZsCTgoJWVzaSksJWVkeAorCW1vdmwJNCglZXNpKSwlZWJ4CisJbW92bAkoJWVzaSksJWVheAorCisJbW92bAkkMCwtNCglZWJwKQorCisJb3JsCSVlZHgsJWVkeAkvKiBtcyBiaXRzICovCisJanMJTF9yb3VuZAkJLyogQWxyZWFkeSBub3JtYWxpemVkICovCisJam56CUxfc2hpZnRfMQkvKiBTaGlmdCBsZWZ0IDEgLSAzMSBiaXRzICovCisKKwltb3ZsCSVlYngsJWVkeAorCW1vdmwJJWVheCwlZWJ4CisJeG9ybAklZWF4LCVlYXgKKwltb3ZsCSQtMzIsLTQoJWVicCkKKworLyogV2UgbmVlZCB0byBzaGlmdCBsZWZ0IGJ5IDEgLSAzMSBiaXRzICovCitMX3NoaWZ0XzE6CisJYnNybAklZWR4LCVlY3gJLyogZ2V0IHRoZSByZXF1aXJlZCBzaGlmdCBpbiAlZWN4ICovCisJc3VibAkkMzEsJWVjeAorCW5lZ2wJJWVjeAorCXN1YmwJJWVjeCwtNCglZWJwKQorCXNobGQJJWNsLCVlYngsJWVkeAorCXNobGQJJWNsLCVlYXgsJWVieAorCXNobAklY2wsJWVheAorCitMX3JvdW5kOgorCXRlc3RsCSQweDgwMDAwMDAwLCVlYXgKKwlqeglMX2V4aXQKKworCWFkZGwJJDEsJWVieAorCWFkY2wJJDAsJWVkeAorCWpueglMX2V4aXQKKworCW1vdmwJJDB4ODAwMDAwMDAsJWVkeAorCWluY2wJLTQoJWVicCkKKworTF9leGl0OgorCW1vdmwJJWVkeCw4KCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwltb3ZsCSVlYXgsKCVlc2kpCisKKwltb3ZsCS00KCVlYnApLCVlYXgKKworCXBvcGwJJWVzaQorCXBvcGwJJWVieAorCWxlYXZlCisJcmV0CisKKworCisKK0VOVFJZKG5vcm1fWHNpZykKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlwdXNobAklZWJ4CQkvKiBSZXNlcnZlIHNvbWUgc3BhY2UgKi8KKwlwdXNobAklZWJ4CisJcHVzaGwJJWVzaQorCisJbW92bAlQQVJBTTEsJWVzaQorCisJbW92bAk4KCVlc2kpLCVlZHgKKwltb3ZsCTQoJWVzaSksJWVieAorCW1vdmwJKCVlc2kpLCVlYXgKKworCW1vdmwJJDAsLTQoJWVicCkKKworCW9ybAklZWR4LCVlZHgJLyogbXMgYml0cyAqLworCWpzCUxfbl9leGl0CQkvKiBBbHJlYWR5IG5vcm1hbGl6ZWQgKi8KKwlqbnoJTF9uX3NoaWZ0XzEJLyogU2hpZnQgbGVmdCAxIC0gMzEgYml0cyAqLworCisJbW92bAklZWJ4LCVlZHgKKwltb3ZsCSVlYXgsJWVieAorCXhvcmwJJWVheCwlZWF4CisJbW92bAkkLTMyLC00KCVlYnApCisKKwlvcmwJJWVkeCwlZWR4CS8qIG1zIGJpdHMgKi8KKwlqcwlMX25fZXhpdAkvKiBOb3JtYWxpemVkIG5vdyAqLworCWpueglMX25fc2hpZnRfMQkvKiBTaGlmdCBsZWZ0IDEgLSAzMSBiaXRzICovCisKKwltb3ZsCSVlYngsJWVkeAorCW1vdmwJJWVheCwlZWJ4CisJeG9ybAklZWF4LCVlYXgKKwlhZGRsCSQtMzIsLTQoJWVicCkKKwlqbXAJTF9uX2V4aXQJLyogTWlnaHQgbm90IGJlIG5vcm1hbGl6ZWQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHNoaWZ0IG5vIG1vcmUuICovCisKKy8qIFdlIG5lZWQgdG8gc2hpZnQgbGVmdCBieSAxIC0gMzEgYml0cyAqLworTF9uX3NoaWZ0XzE6CisJYnNybAklZWR4LCVlY3gJLyogZ2V0IHRoZSByZXF1aXJlZCBzaGlmdCBpbiAlZWN4ICovCisJc3VibAkkMzEsJWVjeAorCW5lZ2wJJWVjeAorCXN1YmwJJWVjeCwtNCglZWJwKQorCXNobGQJJWNsLCVlYngsJWVkeAorCXNobGQJJWNsLCVlYXgsJWVieAorCXNobAklY2wsJWVheAorCitMX25fZXhpdDoKKwltb3ZsCSVlZHgsOCglZXNpKQorCW1vdmwJJWVieCw0KCVlc2kpCisJbW92bAklZWF4LCglZXNpKQorCisJbW92bAktNCglZWJwKSwlZWF4CisKKwlwb3BsCSVlc2kKKwlwb3BsCSVlYngKKwlsZWF2ZQorCXJldAorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvc2hyX1hzaWcuUyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9zaHJfWHNpZy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxY2RkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvc2hyX1hzaWcuUwpAQCAtMCwwICsxLDg3IEBACisJLmZpbGUJInNocl9Yc2lnLlMiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBzaHJfWHNpZy5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAxMiBieXRlIHJpZ2h0IHNoaWZ0IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTQsMTk5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBBdXN0cmFsaWEuICBFLW1haWwgYmlsbG1AamFjb2JpLm1hdGhzLm1vbmFzaC5lZHUuYXUgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDYWxsIGZyb20gQyBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgdm9pZCBzaHJfWHNpZyhYc2lnICphcmcsIHVuc2lnbmVkIG5yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIEV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgRmFzdGVzdCBmb3Igc21hbGwgc2hpZnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBTaGlmdHMgdGhlIDEyIGJ5dGUgcXVhbnRpdHkgcG9pbnRlZCB0byBieSB0aGUgZmlyc3QgYXJnIChhcmcpICAgICAgICAgICB8CisgfCAgIHJpZ2h0IGJ5IHRoZSBudW1iZXIgb2YgYml0cyBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBhcmcgKG5yKS4gICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAiZnB1X2VtdS5oIgorCisudGV4dAorRU5UUlkoc2hyX1hzaWcpCisJcHVzaAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlwdXNobAklZXNpCisJbW92bAlQQVJBTTIsJWVjeAorCW1vdmwJUEFSQU0xLCVlc2kKKwljbXBsCSQzMiwlZWN4CS8qIHNocmQgb25seSB3b3JrcyBmb3IgMC4uMzEgYml0cyAqLworCWpuYwlMX21vcmVfdGhhbl8zMQorCisvKiBsZXNzIHRoYW4gMzIgYml0cyAqLworCXB1c2hsCSVlYngKKwltb3ZsCSglZXNpKSwlZWF4CS8qIGxzbCAqLworCW1vdmwJNCglZXNpKSwlZWJ4CS8qIG1pZGwgKi8KKwltb3ZsCTgoJWVzaSksJWVkeAkvKiBtc2wgKi8KKwlzaHJkCSVjbCwlZWJ4LCVlYXgKKwlzaHJkCSVjbCwlZWR4LCVlYngKKwlzaHIJJWNsLCVlZHgKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwltb3ZsCSVlZHgsOCglZXNpKQorCXBvcGwJJWVieAorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CisKK0xfbW9yZV90aGFuXzMxOgorCWNtcGwJJDY0LCVlY3gKKwlqbmMJTF9tb3JlX3RoYW5fNjMKKworCXN1YmIJJDMyLCVjbAorCW1vdmwJNCglZXNpKSwlZWF4CS8qIG1pZGwgKi8KKwltb3ZsCTgoJWVzaSksJWVkeAkvKiBtc2wgKi8KKwlzaHJkCSVjbCwlZWR4LCVlYXgKKwlzaHIJJWNsLCVlZHgKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWR4LDQoJWVzaSkKKwltb3ZsCSQwLDgoJWVzaSkKKwlwb3BsCSVlc2kKKwlsZWF2ZQorCXJldAorCitMX21vcmVfdGhhbl82MzoKKwljbXBsCSQ5NiwlZWN4CisJam5jCUxfbW9yZV90aGFuXzk1CisKKwlzdWJiCSQ2NCwlY2wKKwltb3ZsCTgoJWVzaSksJWVheAkvKiBtc2wgKi8KKwlzaHIJJWNsLCVlYXgKKwl4b3JsCSVlZHgsJWVkeAorCW1vdmwJJWVheCwoJWVzaSkKKwltb3ZsCSVlZHgsNCglZXNpKQorCW1vdmwJJWVkeCw4KCVlc2kpCisJcG9wbAklZXNpCisJbGVhdmUKKwlyZXQKKworTF9tb3JlX3RoYW5fOTU6CisJeG9ybAklZWF4LCVlYXgKKwltb3ZsCSVlYXgsKCVlc2kpCisJbW92bAklZWF4LDQoJWVzaSkKKwltb3ZsCSVlYXgsOCglZXNpKQorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWF0aC1lbXUvc3RhdHVzX3cuaCBiL2FyY2gvaTM4Ni9tYXRoLWVtdS9zdGF0dXNfdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDdiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvc3RhdHVzX3cuaApAQCAtMCwwICsxLDY1IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICBzdGF0dXNfdy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCAgIGJpbGxtQHZheGMuY2MubW9uYXNoLmVkdS5hdSAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfU1RBVFVTX0hfCisjZGVmaW5lIF9TVEFUVVNfSF8KKworI2luY2x1ZGUgImZwdV9lbXUuaCIgICAgLyogZm9yIGRlZmluaXRpb24gb2YgUEVDVUxJQVJfNDg2ICovCisKKyNpZmRlZiBfX0FTU0VNQkxZX18KKyNkZWZpbmUJQ29uc3RfXyh4KQkkIyN4CisjZWxzZQorI2RlZmluZQlDb25zdF9fKHgpCXgKKyNlbmRpZgorCisjZGVmaW5lIFNXX0JhY2t3YXJkICAgIAlDb25zdF9fKDB4ODAwMCkJLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBTV19DMwkJQ29uc3RfXygweDQwMDApCS8qIGNvbmRpdGlvbiBiaXQgMyAqLworI2RlZmluZSBTV19Ub3AJCUNvbnN0X18oMHgzODAwKQkvKiB0b3Agb2Ygc3RhY2sgKi8KKyNkZWZpbmUgU1dfVG9wX1NoaWZ0IAlDb25zdF9fKDExKQkvKiBzaGlmdCBmb3IgdG9wIG9mIHN0YWNrIGJpdHMgKi8KKyNkZWZpbmUgU1dfQzIJCUNvbnN0X18oMHgwNDAwKQkvKiBjb25kaXRpb24gYml0IDIgKi8KKyNkZWZpbmUgU1dfQzEJCUNvbnN0X18oMHgwMjAwKQkvKiBjb25kaXRpb24gYml0IDEgKi8KKyNkZWZpbmUgU1dfQzAJCUNvbnN0X18oMHgwMTAwKQkvKiBjb25kaXRpb24gYml0IDAgKi8KKyNkZWZpbmUgU1dfU3VtbWFyeSAgICAgCUNvbnN0X18oMHgwMDgwKQkvKiBleGNlcHRpb24gc3VtbWFyeSAqLworI2RlZmluZSBTV19TdGFja19GYXVsdAlDb25zdF9fKDB4MDA0MCkJLyogc3RhY2sgZmF1bHQgKi8KKyNkZWZpbmUgU1dfUHJlY2lzaW9uICAgCUNvbnN0X18oMHgwMDIwKQkvKiBsb3NzIG9mIHByZWNpc2lvbiAqLworI2RlZmluZSBTV19VbmRlcmZsb3cgICAJQ29uc3RfXygweDAwMTApCS8qIHVuZGVyZmxvdyAqLworI2RlZmluZSBTV19PdmVyZmxvdyAgICAJQ29uc3RfXygweDAwMDgpCS8qIG92ZXJmbG93ICovCisjZGVmaW5lIFNXX1plcm9fRGl2ICAgIAlDb25zdF9fKDB4MDAwNCkJLyogZGl2aWRlIGJ5IHplcm8gKi8KKyNkZWZpbmUgU1dfRGVub3JtX09wICAgCUNvbnN0X18oMHgwMDAyKQkvKiBkZW5vcm1hbGl6ZWQgb3BlcmFuZCAqLworI2RlZmluZSBTV19JbnZhbGlkICAgICAJQ29uc3RfXygweDAwMDEpCS8qIGludmFsaWQgb3BlcmF0aW9uICovCisKKyNkZWZpbmUgU1dfRXhjX01hc2sgICAgIENvbnN0X18oMHgyN2YpICAvKiBTdGF0dXMgd29yZCBleGNlcHRpb24gYml0IG1hc2sgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2RlZmluZSBDT01QX0FfZ3RfQgkxCisjZGVmaW5lIENPTVBfQV9lcV9CCTIKKyNkZWZpbmUgQ09NUF9BX2x0X0IJMworI2RlZmluZSBDT01QX05vX0NvbXAJNAorI2RlZmluZSBDT01QX0Rlbm9ybWFsICAgMHgyMAorI2RlZmluZSBDT01QX05hTgkweDQwCisjZGVmaW5lIENPTVBfU05hTgkweDgwCisKKyNkZWZpbmUgc3RhdHVzX3dvcmQoKSBcCisgICgocGFydGlhbF9zdGF0dXMgJiB+U1dfVG9wICYgMHhmZmZmKSB8ICgodG9wIDw8IFNXX1RvcF9TaGlmdCkgJiBTV19Ub3ApKQorI2RlZmluZSBzZXRjYyhjYykgKHsgXAorICBwYXJ0aWFsX3N0YXR1cyAmPSB+KFNXX0MwfFNXX0MxfFNXX0MyfFNXX0MzKTsgXAorICBwYXJ0aWFsX3N0YXR1cyB8PSAoY2MpICYgKFNXX0MwfFNXX0MxfFNXX0MyfFNXX0MzKTsgfSkKKworI2lmZGVmIFBFQ1VMSUFSXzQ4NgorICAgLyogRGVmYXVsdCwgdGhpcyBjb252ZXlzIG5vIGluZm9ybWF0aW9uLCBidXQgYW4gODA0ODYgZG9lcyBpdC4gKi8KKyAgIC8qIENsZWFyIHRoZSBTV19DMSBiaXQsICJvdGhlciBiaXRzIHVuZGVmaW5lZCIuICovCisjICBkZWZpbmUgY2xlYXJfQzEoKSAgeyBwYXJ0aWFsX3N0YXR1cyAmPSB+U1dfQzE7IH0KKyMgZWxzZQorIyAgZGVmaW5lIGNsZWFyX0MxKCkKKyNlbmRpZiAvKiBQRUNVTElBUl80ODYgKi8KKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX1NUQVRVU19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3ZlcnNpb24uaCBiL2FyY2gvaTM4Ni9tYXRoLWVtdS92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkNzNhMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS92ZXJzaW9uLmgKQEAgLTAsMCArMSwxMiBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgdmVyc2lvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5MywxOTk0LDE5OTYsMTk5NywxOTk5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgVy4gTWV0emVudGhlbiwgMjIgUGFya2VyIFN0LCBPcm1vbmQsIFZpYyAzMTYzLCBBdXN0cmFsaWEgfAorIHwgICAgICAgICAgICAgICAgICBFLW1haWwgICBiaWxsbUBtZWxicGMub3JnLmF1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIEZQVV9WRVJTSU9OICJ3bS1GUFUtZW11IHZlcnNpb24gMi4wMSIKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYXRoLWVtdS93bV9zaHJ4LlMgYi9hcmNoL2kzODYvbWF0aC1lbXUvd21fc2hyeC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODQyODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbWF0aC1lbXUvd21fc2hyeC5TCkBAIC0wLDAgKzEsMjA0IEBACisJLmZpbGUJIndtX3NocnguUyIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIHwgIHdtX3NocnguUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IDY0IGJpdCByaWdodCBzaGlmdCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBDb3B5cmlnaHQgKEMpIDE5OTIsMTk5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICBXLiBNZXR6ZW50aGVuLCAyMiBQYXJrZXIgU3QsIE9ybW9uZCwgVmljIDMxNjMsICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIEF1c3RyYWxpYS4gIEUtbWFpbCBiaWxsbUBqYWNvYmkubWF0aHMubW9uYXNoLmVkdS5hdSB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENhbGwgZnJvbSBDIGFzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICB1bnNpZ25lZCBGUFVfc2hyeCh2b2lkICphcmcxLCB1bnNpZ25lZCBhcmcyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCBhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgdW5zaWduZWQgRlBVX3NocnhzKHZvaWQgKmFyZzEsIHVuc2lnbmVkIGFyZzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJmcHVfZW11LmgiCisKKy50ZXh0CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICAgdW5zaWduZWQgRlBVX3Nocngodm9pZCAqYXJnMSwgdW5zaWduZWQgYXJnMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIEV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgRmFzdGVzdCBmb3Igc21hbGwgc2hpZnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBTaGlmdHMgdGhlIDY0IGJpdCBxdWFudGl0eSBwb2ludGVkIHRvIGJ5IHRoZSBmaXJzdCBhcmcgKGFyZzEpICAgICAgICAgICB8CisgfCAgIHJpZ2h0IGJ5IHRoZSBudW1iZXIgb2YgYml0cyBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBhcmcgKGFyZzIpLiAgICAgICAgIHwKKyB8ICAgRm9ybXMgYSA5NiBiaXQgcXVhbnRpdHkgZnJvbSB0aGUgNjQgYml0IGFyZyBhbmQgZWF4OiAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgWyAgNjQgYml0IGFyZyBdWyBlYXggXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgIHNoaWZ0IHJpZ2h0ICAtLS0tLS0tLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgVGhlIGVheCByZWdpc3RlciBpcyBpbml0aWFsaXplZCB0byAwIGJlZm9yZSB0aGUgc2hpZnRpbmcuICAgICAgICAgICAgICAgfAorIHwgICBSZXN1bHRzIHJldHVybmVkIGluIHRoZSA2NCBiaXQgYXJnIGFuZCBlYXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0VOVFJZKEZQVV9zaHJ4KQorCXB1c2gJJWVicAorCW1vdmwJJWVzcCwlZWJwCisJcHVzaGwJJWVzaQorCW1vdmwJUEFSQU0yLCVlY3gKKwltb3ZsCVBBUkFNMSwlZXNpCisJY21wbAkkMzIsJWVjeAkvKiBzaHJkIG9ubHkgd29ya3MgZm9yIDAuLjMxIGJpdHMgKi8KKwlqbmMJTF9tb3JlX3RoYW5fMzEKKworLyogbGVzcyB0aGFuIDMyIGJpdHMgKi8KKwlwdXNobAklZWJ4CisJbW92bAkoJWVzaSksJWVieAkvKiBsc2wgKi8KKwltb3ZsCTQoJWVzaSksJWVkeAkvKiBtc2wgKi8KKwl4b3JsCSVlYXgsJWVheAkvKiBleHRlbnNpb24gKi8KKwlzaHJkCSVjbCwlZWJ4LCVlYXgKKwlzaHJkCSVjbCwlZWR4LCVlYngKKwlzaHIJJWNsLCVlZHgKKwltb3ZsCSVlYngsKCVlc2kpCisJbW92bAklZWR4LDQoJWVzaSkKKwlwb3BsCSVlYngKKwlwb3BsCSVlc2kKKwlsZWF2ZQorCXJldAorCitMX21vcmVfdGhhbl8zMToKKwljbXBsCSQ2NCwlZWN4CisJam5jCUxfbW9yZV90aGFuXzYzCisKKwlzdWJiCSQzMiwlY2wKKwltb3ZsCSglZXNpKSwlZWF4CS8qIGxzbCAqLworCW1vdmwJNCglZXNpKSwlZWR4CS8qIG1zbCAqLworCXNocmQJJWNsLCVlZHgsJWVheAorCXNocgklY2wsJWVkeAorCW1vdmwJJWVkeCwoJWVzaSkKKwltb3ZsCSQwLDQoJWVzaSkKKwlwb3BsCSVlc2kKKwlsZWF2ZQorCXJldAorCitMX21vcmVfdGhhbl82MzoKKwljbXBsCSQ5NiwlZWN4CisJam5jCUxfbW9yZV90aGFuXzk1CisKKwlzdWJiCSQ2NCwlY2wKKwltb3ZsCTQoJWVzaSksJWVheAkvKiBtc2wgKi8KKwlzaHIJJWNsLCVlYXgKKwl4b3JsCSVlZHgsJWVkeAorCW1vdmwJJWVkeCwoJWVzaSkKKwltb3ZsCSVlZHgsNCglZXNpKQorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CisKK0xfbW9yZV90aGFuXzk1OgorCXhvcmwJJWVheCwlZWF4CisJbW92bAklZWF4LCglZXNpKQorCW1vdmwJJWVheCw0KCVlc2kpCisJcG9wbAklZXNpCisJbGVhdmUKKwlyZXQKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICAgdW5zaWduZWQgRlBVX3NocnhzKHZvaWQgKmFyZzEsIHVuc2lnbmVkIGFyZzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgIEV4dGVuZGVkIHNoaWZ0IHJpZ2h0IGZ1bmN0aW9uIChvcHRpbWl6ZWQgZm9yIHNtYWxsIGZsb2F0aW5nIHBvaW50ICAgICAgIHwKKyB8ICAgaW50ZWdlcnMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBTaGlmdHMgdGhlIDY0IGJpdCBxdWFudGl0eSBwb2ludGVkIHRvIGJ5IHRoZSBmaXJzdCBhcmcgKGFyZzEpICAgICAgICAgICB8CisgfCAgIHJpZ2h0IGJ5IHRoZSBudW1iZXIgb2YgYml0cyBzcGVjaWZpZWQgYnkgdGhlIHNlY29uZCBhcmcgKGFyZzIpLiAgICAgICAgIHwKKyB8ICAgRm9ybXMgYSA5NiBiaXQgcXVhbnRpdHkgZnJvbSB0aGUgNjQgYml0IGFyZyBhbmQgZWF4OiAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgWyAgNjQgYml0IGFyZyBdWyBlYXggXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgIHNoaWZ0IHJpZ2h0ICAtLS0tLS0tLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgVGhlIGVheCByZWdpc3RlciBpcyBpbml0aWFsaXplZCB0byAwIGJlZm9yZSB0aGUgc2hpZnRpbmcuICAgICAgICAgICAgICAgfAorIHwgICBUaGUgbG93ZXIgOCBiaXRzIG9mIGVheCBhcmUgbG9zdCBhbmQgcmVwbGFjZWQgYnkgYSBmbGFnIHdoaWNoIGlzICAgICAgICB8CisgfCAgIHNldCAodG8gMHgwMSkgaWYgYW55IGJpdCwgYXBhcnQgZnJvbSB0aGUgZmlyc3Qgb25lLCBpcyBzZXQgaW4gdGhlICAgICAgIHwKKyB8ICAgcGFydCB3aGljaCBoYXMgYmVlbiBzaGlmdGVkIG91dCBvZiB0aGUgYXJnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICBSZXN1bHRzIHJldHVybmVkIGluIHRoZSA2NCBiaXQgYXJnIGFuZCBlYXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitFTlRSWShGUFVfc2hyeHMpCisJcHVzaAklZWJwCisJbW92bAklZXNwLCVlYnAKKwlwdXNobAklZXNpCisJcHVzaGwJJWVieAorCW1vdmwJUEFSQU0yLCVlY3gKKwltb3ZsCVBBUkFNMSwlZXNpCisJY21wbAkkNjQsJWVjeAkvKiBzaHJkIG9ubHkgd29ya3MgZm9yIDAuLjMxIGJpdHMgKi8KKwlqbmMJTHNfbW9yZV90aGFuXzYzCisKKwljbXBsCSQzMiwlZWN4CS8qIHNocmQgb25seSB3b3JrcyBmb3IgMC4uMzEgYml0cyAqLworCWpjCUxzX2xlc3NfdGhhbl8zMgorCisvKiBXZSBnb3QgaGVyZSB3aXRob3V0IGp1bXBzIGJ5IGFzc3VtaW5nIHRoYXQgdGhlIG1vc3QgY29tbW9uIHJlcXVpcmVtZW50CisgICBpcyBmb3Igc21hbGwgaW50ZWdlcnMgKi8KKy8qIFNoaWZ0IGJ5IFszMi4uNjNdIGJpdHMgKi8KKwlzdWJiCSQzMiwlY2wKKwltb3ZsCSglZXNpKSwlZWF4CS8qIGxzbCAqLworCW1vdmwJNCglZXNpKSwlZWR4CS8qIG1zbCAqLworCXhvcmwJJWVieCwlZWJ4CisJc2hyZAklY2wsJWVheCwlZWJ4CisJc2hyZAklY2wsJWVkeCwlZWF4CisJc2hyCSVjbCwlZWR4CisJb3JsCSVlYngsJWVieAkJLyogdGVzdCB0aGVzZSAzMiBiaXRzICovCisJc2V0bmUJJWJsCisJdGVzdAkkMHg3ZmZmZmZmZiwlZWF4CS8qIGFuZCAzMSBiaXRzIGhlcmUgKi8KKwlzZXRuZQklYmgKKwlvcncJJWJ4LCVieAkJCS8qIEFueSBvZiB0aGUgNjMgYml0IHNldCA/ICovCisJc2V0bmUJJWFsCisJbW92bAklZWR4LCglZXNpKQorCW1vdmwJJDAsNCglZXNpKQorCXBvcGwJJWVieAorCXBvcGwJJWVzaQorCWxlYXZlCisJcmV0CisKKy8qIFNoaWZ0IGJ5IFswLi4zMV0gYml0cyAqLworTHNfbGVzc190aGFuXzMyOgorCW1vdmwJKCVlc2kpLCVlYngJLyogbHNsICovCisJbW92bAk0KCVlc2kpLCVlZHgJLyogbXNsICovCisJeG9ybAklZWF4LCVlYXgJLyogZXh0ZW5zaW9uICovCisJc2hyZAklY2wsJWVieCwlZWF4CisJc2hyZAklY2wsJWVkeCwlZWJ4CisJc2hyCSVjbCwlZWR4CisJdGVzdAkkMHg3ZmZmZmZmZiwlZWF4CS8qIG9ubHkgbmVlZCB0byBsb29rIGF0IGVheCBoZXJlICovCisJc2V0bmUJJWFsCisJbW92bAklZWJ4LCglZXNpKQorCW1vdmwJJWVkeCw0KCVlc2kpCisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJbGVhdmUKKwlyZXQKKworLyogU2hpZnQgYnkgWzY0Li45NV0gYml0cyAqLworTHNfbW9yZV90aGFuXzYzOgorCWNtcGwJJDk2LCVlY3gKKwlqbmMJTHNfbW9yZV90aGFuXzk1CisKKwlzdWJiCSQ2NCwlY2wKKwltb3ZsCSglZXNpKSwlZWJ4CS8qIGxzbCAqLworCW1vdmwJNCglZXNpKSwlZWF4CS8qIG1zbCAqLworCXhvcmwJJWVkeCwlZWR4CS8qIGV4dGVuc2lvbiAqLworCXNocmQJJWNsLCVlYngsJWVkeAorCXNocmQJJWNsLCVlYXgsJWVieAorCXNocgklY2wsJWVheAorCW9ybAklZWJ4LCVlZHgKKwlzZXRuZQklYmwKKwl0ZXN0CSQweDdmZmZmZmZmLCVlYXgJLyogb25seSBuZWVkIHRvIGxvb2sgYXQgZWF4IGhlcmUgKi8KKwlzZXRuZQklYmgKKwlvcncJJWJ4LCVieAorCXNldG5lCSVhbAorCXhvcmwJJWVkeCwlZWR4CisJbW92bAklZWR4LCglZXNpKQkvKiBzZXQgdG8gemVybyAqLworCW1vdmwJJWVkeCw0KCVlc2kpCS8qIHNldCB0byB6ZXJvICovCisJcG9wbAklZWJ4CisJcG9wbAklZXNpCisJbGVhdmUKKwlyZXQKKworTHNfbW9yZV90aGFuXzk1OgorLyogU2hpZnQgYnkgWzk2Li5pbmYpIGJpdHMgKi8KKwl4b3JsCSVlYXgsJWVheAorCW1vdmwJKCVlc2kpLCVlYngKKwlvcmwJNCglZXNpKSwlZWJ4CisJc2V0bmUJJWFsCisJeG9ybAklZWJ4LCVlYngKKwltb3ZsCSVlYngsKCVlc2kpCisJbW92bAklZWJ4LDQoJWVzaSkKKwlwb3BsCSVlYngKKwlwb3BsCSVlc2kKKwlsZWF2ZQorCXJldApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hdGgtZW11L3dtX3NxcnQuUyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS93bV9zcXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1OGY1OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tYXRoLWVtdS93bV9zcXJ0LlMKQEAgLTAsMCArMSw0NzAgQEAKKwkuZmlsZQkid21fc3FydC5TIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgfCAgd21fc3FydC5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgRml4ZWQgcG9pbnQgYXJpdGhtZXRpYyBzcXVhcmUgcm9vdCBldmFsdWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8IENvcHlyaWdodCAoQykgMTk5MiwxOTkzLDE5OTUsMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgIFcuIE1ldHplbnRoZW4sIDIyIFBhcmtlciBTdCwgT3Jtb25kLCBWaWMgMzE2MywgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgQXVzdHJhbGlhLiAgRS1tYWlsIGJpbGxtQHN1YnVyYmlhLm5ldCAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgQ2FsbCBmcm9tIEMgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICBpbnQgd21fc3FydChGUFVfUkVHICpuLCB1bnNpZ25lZCBpbnQgY29udHJvbF93b3JkKSAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyB8ICB3bV9zcXJ0KEZQVV9SRUcgKm4sIHVuc2lnbmVkIGludCBjb250cm9sX3dvcmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorIHwgICAgcmV0dXJucyB0aGUgc3F1YXJlIHJvb3Qgb2YgbiBpbiBuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBVc2UgTmV3dG9uJ3MgbWV0aG9kIHRvIGNvbXB1dGUgdGhlIHNxdWFyZSByb290IG9mIGEgbnVtYmVyLCB3aGljaCBtdXN0ICAgfAorIHwgIGJlIGluIHRoZSByYW5nZSAgWzEuMCAuLiA0LjApLCAgdG8gNjQgYml0cyBhY2N1cmFjeS4gICAgICAgICAgICAgICAgICAgICB8CisgfCAgRG9lcyBub3QgY2hlY2sgdGhlIHNpZ24gb3IgdGFnIG9mIHRoZSBhcmd1bWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICBTZXRzIHRoZSBleHBvbmVudCwgYnV0IG5vdCB0aGUgc2lnbiBvciB0YWcgb2YgdGhlIHJlc3VsdC4gICAgICAgICAgICAgICAgfAorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgfCAgVGhlIGd1ZXNzIGlzIGtlcHQgaW4gJWVzaTolZWRpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgImV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImZwdV9lbXUuaCIKKworCisjaWZuZGVmIE5PTl9SRUVOVFJBTlRfRlBVCisvKglMb2NhbCBzdG9yYWdlIG9uIHRoZSBzdGFjazogKi8KKyNkZWZpbmUgRlBVX2FjY3VtXzMJLTQoJWVicCkJLyogbXMgd29yZCAqLworI2RlZmluZSBGUFVfYWNjdW1fMgktOCglZWJwKQorI2RlZmluZSBGUFVfYWNjdW1fMQktMTIoJWVicCkKKyNkZWZpbmUgRlBVX2FjY3VtXzAJLTE2KCVlYnApCisKKy8qCisgKiBUaGUgZGUtbm9ybWFsaXNlZCBhcmd1bWVudDoKKyAqICAgICAgICAgICAgICAgICAgc3FfMiAgICAgICAgICAgICAgICAgIHNxXzEgICAgICAgICAgICAgIHNxXzAKKyAqICAgICAgICBiIGIgYiBiIGIgYiBiIC4uLiBiIGIgYiAgIGIgYiBiIC4uLi4gYiBiIGIgICBiIDAgMCAwIC4uLiAwCisgKiAgICAgICAgICAgXiBiaW5hcnkgcG9pbnQgaGVyZQorICovCisjZGVmaW5lIEZQVV9mc3FydF9hcmdfMgktMjAoJWVicCkJLyogbXMgd29yZCAqLworI2RlZmluZSBGUFVfZnNxcnRfYXJnXzEJLTI0KCVlYnApCisjZGVmaW5lIEZQVV9mc3FydF9hcmdfMAktMjgoJWVicCkJLyogbHMgd29yZCwgYXQgbW9zdCB0aGUgbXMgYml0IGlzIHNldCAqLworCisjZWxzZQorLyoJTG9jYWwgc3RvcmFnZSBpbiBhIHN0YXRpYyBhcmVhOiAqLworLmRhdGEKKwkuYWxpZ24gNCwwCitGUFVfYWNjdW1fMzoKKwkubG9uZwkwCQkvKiBtcyB3b3JkICovCitGUFVfYWNjdW1fMjoKKwkubG9uZwkwCitGUFVfYWNjdW1fMToKKwkubG9uZwkwCitGUFVfYWNjdW1fMDoKKwkubG9uZwkwCisKKy8qIFRoZSBkZS1ub3JtYWxpc2VkIGFyZ3VtZW50OgorICAgICAgICAgICAgICAgICAgICBzcV8yICAgICAgICAgICAgICAgICAgc3FfMSAgICAgICAgICAgICAgc3FfMAorICAgICAgICAgIGIgYiBiIGIgYiBiIGIgLi4uIGIgYiBiICAgYiBiIGIgLi4uLiBiIGIgYiAgIGIgMCAwIDAgLi4uIDAKKyAgICAgICAgICAgICBeIGJpbmFyeSBwb2ludCBoZXJlCisgKi8KK0ZQVV9mc3FydF9hcmdfMjoKKwkubG9uZwkwCQkvKiBtcyB3b3JkICovCitGUFVfZnNxcnRfYXJnXzE6CisJLmxvbmcJMAorRlBVX2ZzcXJ0X2FyZ18wOgorCS5sb25nCTAJCS8qIGxzIHdvcmQsIGF0IG1vc3QgdGhlIG1zIGJpdCBpcyBzZXQgKi8KKyNlbmRpZiAvKiBOT05fUkVFTlRSQU5UX0ZQVSAqLyAKKworCisudGV4dAorRU5UUlkod21fc3FydCkKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCVlYnAKKyNpZm5kZWYgTk9OX1JFRU5UUkFOVF9GUFUKKwlzdWJsCSQyOCwlZXNwCisjZW5kaWYgLyogTk9OX1JFRU5UUkFOVF9GUFUgKi8KKwlwdXNobAklZXNpCisJcHVzaGwJJWVkaQorCXB1c2hsCSVlYngKKworCW1vdmwJUEFSQU0xLCVlc2kKKworCW1vdmwJU0lHSCglZXNpKSwlZWF4CisJbW92bAlTSUdMKCVlc2kpLCVlY3gKKwl4b3JsCSVlZHgsJWVkeAorCisvKiBXZSB1c2UgYSByb3VnaCBsaW5lYXIgZXN0aW1hdGUgZm9yIHRoZSBmaXJzdCBndWVzcy4uICovCisKKwljbXB3CUVYUF9CSUFTLEVYUCglZXNpKQorCWpueglzcXJ0X2FyZ19nZV8yCisKKwlzaHJsCSQxLCVlYXgJCQkvKiBhcmcgaXMgaW4gdGhlIHJhbmdlICBbMS4wIC4uIDIuMCkgKi8KKwlyY3JsCSQxLCVlY3gKKwlyY3JsCSQxLCVlZHgKKworc3FydF9hcmdfZ2VfMjoKKy8qIEZyb20gaGVyZSBvbiwgbiBpcyBuZXZlciBhY2Nlc3NlZCBkaXJlY3RseSBhZ2FpbiB1bnRpbCBpdCBpcworICAgcmVwbGFjZWQgYnkgdGhlIGFuc3dlci4gKi8KKworCW1vdmwJJWVheCxGUFVfZnNxcnRfYXJnXzIJCS8qIG1zIHdvcmQgb2YgbiAqLworCW1vdmwJJWVjeCxGUFVfZnNxcnRfYXJnXzEKKwltb3ZsCSVlZHgsRlBVX2ZzcXJ0X2FyZ18wCisKKy8qIE1ha2UgYSBsaW5lYXIgZmlyc3QgZXN0aW1hdGUgKi8KKwlzaHJsCSQxLCVlYXgKKwlhZGRsCSQweDQwMDAwMDAwLCVlYXgKKwltb3ZsCSQweGFhYWFhYWFhLCVlY3gKKwltdWxsCSVlY3gKKwlzaGxsCSVlZHgJCQkvKiBtYXggcmVzdWx0IHdhcyA3ZmZmLi4uICovCisJdGVzdGwJJDB4ODAwMDAwMDAsJWVkeAkvKiBidXQgbWluIHdhcyAzZmZmLi4uICovCisJam56CXNxcnRfcHJlbGltX25vX2FkanVzdAorCisJbW92bAkkMHg4MDAwMDAwMCwlZWR4CS8qIHJvdW5kIHVwICovCisKK3NxcnRfcHJlbGltX25vX2FkanVzdDoKKwltb3ZsCSVlZHgsJWVzaQkvKiBPdXIgZmlyc3QgZ3Vlc3MgKi8KKworLyogV2UgaGF2ZSBub3cgY29tcHV0ZWQgKGFwcHJveCkgICAoMiArIHgpIC8gMywgd2hpY2ggZm9ybXMgdGhlIGJhc2lzCisgICBmb3IgYSBmZXcgaXRlcmF0aW9ucyBvZiBOZXd0b24ncyBtZXRob2QgKi8KKworCW1vdmwJRlBVX2ZzcXJ0X2FyZ18yLCVlY3gJLyogbXMgd29yZCAqLworCisvKgorICogRnJvbSBvdXIgaW5pdGlhbCBlc3RpbWF0ZSwgdGhyZWUgaXRlcmF0aW9ucyBhcmUgZW5vdWdoIHRvIGdldCB1cworICogdG8gMzAgYml0cyBvciBzby4gVGhpcyB3aWxsIHRoZW4gYWxsb3cgdHdvIGl0ZXJhdGlvbnMgYXQgYmV0dGVyCisgKiBwcmVjaXNpb24gdG8gY29tcGxldGUgdGhlIHByb2Nlc3MuCisgKi8KKworLyogQ29tcHV0ZSAgKGcgKyBuL2cpLzIgIGF0IGVhY2ggaXRlcmF0aW9uIChnIGlzIHRoZSBndWVzcykuICovCisJc2hybAklZWN4CQkvKiBEb2luZyB0aGlzIGZpcnN0IHdpbGwgcHJldmVudCBhIGRpdmlkZSAqLworCQkJCS8qIG92ZXJmbG93IGxhdGVyLiAqLworCisJbW92bAklZWN4LCVlZHgJLyogbXN3IG9mIHRoZSBhcmcgLyAyICovCisJZGl2bAklZXNpCQkvKiBjdXJyZW50IGVzdGltYXRlICovCisJc2hybAklZXNpCQkvKiBkaXZpZGUgYnkgMiAqLworCWFkZGwJJWVheCwlZXNpCS8qIHRoZSBuZXcgZXN0aW1hdGUgKi8KKworCW1vdmwJJWVjeCwlZWR4CisJZGl2bAklZXNpCisJc2hybAklZXNpCisJYWRkbAklZWF4LCVlc2kKKworCW1vdmwJJWVjeCwlZWR4CisJZGl2bAklZXNpCisJc2hybAklZXNpCisJYWRkbAklZWF4LCVlc2kKKworLyoKKyAqIE5vdyB0aGF0IGFuIGVzdGltYXRlIGFjY3VyYXRlIHRvIGFib3V0IDMwIGJpdHMgaGFzIGJlZW4gb2J0YWluZWQgKGluICVlc2kpLAorICogd2UgaW1wcm92ZSBpdCB0byA2MCBiaXRzIG9yIHNvLgorICoKKyAqIFRoZSBzdHJhdGVneSBmcm9tIG5vdyBvbiBpcyB0byBjb21wdXRlIG5ldyBlc3RpbWF0ZXMgZnJvbQorICogICAgICBndWVzcyA6PSBndWVzcyArIChuIC0gZ3Vlc3NeMikgLyAoMiAqIGd1ZXNzKQorICovCisKKy8qIEZpcnN0LCBmaW5kIHRoZSBzcXVhcmUgb2YgdGhlIGd1ZXNzICovCisJbW92bAklZXNpLCVlYXgKKwltdWxsCSVlc2kKKy8qIGd1ZXNzXjIgbm93IGluICVlZHg6JWVheCAqLworCisJbW92bAlGUFVfZnNxcnRfYXJnXzEsJWVjeAorCXN1YmwJJWVjeCwlZWF4CisJbW92bAlGUFVfZnNxcnRfYXJnXzIsJWVjeAkvKiBtcyB3b3JkIG9mIG5vcm1hbGl6ZWQgbiAqLworCXNiYmwJJWVjeCwlZWR4CisJam5jCXNxcnRfc3RhZ2VfMl9wb3NpdGl2ZQorCisvKiBTdWJ0cmFjdGlvbiBnaXZlcyBhIG5lZ2F0aXZlIHJlc3VsdCwKKyAgIG5lZ2F0ZSB0aGUgcmVzdWx0IGJlZm9yZSBkaXZpc2lvbi4gKi8KKwlub3RsCSVlZHgKKwlub3RsCSVlYXgKKwlhZGRsCSQxLCVlYXgKKwlhZGNsCSQwLCVlZHgKKworCWRpdmwJJWVzaQorCW1vdmwJJWVheCwlZWN4CisKKwltb3ZsCSVlZHgsJWVheAorCWRpdmwJJWVzaQorCWptcAlzcXJ0X3N0YWdlXzJfZmluaXNoCisKK3NxcnRfc3RhZ2VfMl9wb3NpdGl2ZToKKwlkaXZsCSVlc2kKKwltb3ZsCSVlYXgsJWVjeAorCisJbW92bAklZWR4LCVlYXgKKwlkaXZsCSVlc2kKKworCW5vdGwJJWVjeAorCW5vdGwJJWVheAorCWFkZGwJJDEsJWVheAorCWFkY2wJJDAsJWVjeAorCitzcXJ0X3N0YWdlXzJfZmluaXNoOgorCXNhcmwJJDEsJWVjeAkJLyogZGl2aWRlIGJ5IDIgKi8KKwlyY3JsCSQxLCVlYXgKKworCS8qIEZvcm0gdGhlIG5ldyBlc3RpbWF0ZSBpbiAlZXNpOiVlZGkgKi8KKwltb3ZsCSVlYXgsJWVkaQorCWFkZGwJJWVjeCwlZXNpCisKKwlqbnoJc3FydF9zdGFnZV8yX2RvbmUJLyogcmVzdWx0IHNob3VsZCBiZSBbMS4uMikgKi8KKworI2lmZGVmIFBBUkFOT0lECisvKiBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gZ2V0IGhlcmUgb25seSBpZiB0aGUgYXJnIGlzIGZmZmYuLi4uZmZmZiAqLworCWNtcAkkMHhmZmZmZmZmZixGUFVfZnNxcnRfYXJnXzEKKwlqbnoJc3FydF9zdGFnZV8yX2Vycm9yCisjZW5kaWYgLyogUEFSQU5PSUQgKi8KKworLyogVGhlIGJlc3Qgcm91bmRlZCByZXN1bHQuICovCisJeG9ybAklZWF4LCVlYXgKKwlkZWNsCSVlYXgKKwltb3ZsCSVlYXgsJWVkaQorCW1vdmwJJWVheCwlZXNpCisJbW92bAkkMHg3ZmZmZmZmZiwlZWF4CisJam1wCXNxcnRfcm91bmRfcmVzdWx0CisKKyNpZmRlZiBQQVJBTk9JRAorc3FydF9zdGFnZV8yX2Vycm9yOgorCXB1c2hsCUVYX0lOVEVSTkFMfDB4MjEzCisJY2FsbAlFWENFUFRJT04KKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworc3FydF9zdGFnZV8yX2RvbmU6CisKKy8qIE5vdyB0aGUgc3F1YXJlIHJvb3QgaGFzIGJlZW4gY29tcHV0ZWQgdG8gYmV0dGVyIHRoYW4gNjAgYml0cy4gKi8KKworLyogRmluZCB0aGUgc3F1YXJlIG9mIHRoZSBndWVzcy4gKi8KKwltb3ZsCSVlZGksJWVheAkJLyogbHMgd29yZCBvZiBndWVzcyAqLworCW11bGwJJWVkaQorCW1vdmwJJWVkeCxGUFVfYWNjdW1fMQorCisJbW92bAklZXNpLCVlYXgKKwltdWxsCSVlc2kKKwltb3ZsCSVlZHgsRlBVX2FjY3VtXzMKKwltb3ZsCSVlYXgsRlBVX2FjY3VtXzIKKworCW1vdmwJJWVkaSwlZWF4CisJbXVsbAklZXNpCisJYWRkbAklZWF4LEZQVV9hY2N1bV8xCisJYWRjbAklZWR4LEZQVV9hY2N1bV8yCisJYWRjbAkkMCxGUFVfYWNjdW1fMworCisvKgltb3ZsCSVlc2ksJWVheCAqLworLyoJbXVsbAklZWRpICovCisJYWRkbAklZWF4LEZQVV9hY2N1bV8xCisJYWRjbAklZWR4LEZQVV9hY2N1bV8yCisJYWRjbAkkMCxGUFVfYWNjdW1fMworCisvKiBndWVzc14yIG5vdyBpbiBGUFVfYWNjdW1fMzpGUFVfYWNjdW1fMjpGUFVfYWNjdW1fMSAqLworCisJbW92bAlGUFVfZnNxcnRfYXJnXzAsJWVheAkJLyogZ2V0IG5vcm1hbGl6ZWQgbiAqLworCXN1YmwJJWVheCxGUFVfYWNjdW1fMQorCW1vdmwJRlBVX2ZzcXJ0X2FyZ18xLCVlYXgKKwlzYmJsCSVlYXgsRlBVX2FjY3VtXzIKKwltb3ZsCUZQVV9mc3FydF9hcmdfMiwlZWF4CQkvKiBtcyB3b3JkIG9mIG5vcm1hbGl6ZWQgbiAqLworCXNiYmwJJWVheCxGUFVfYWNjdW1fMworCWpuYwlzcXJ0X3N0YWdlXzNfcG9zaXRpdmUKKworLyogU3VidHJhY3Rpb24gZ2l2ZXMgYSBuZWdhdGl2ZSByZXN1bHQsCisgICBuZWdhdGUgdGhlIHJlc3VsdCBiZWZvcmUgZGl2aXNpb24gKi8KKwlub3RsCUZQVV9hY2N1bV8xCisJbm90bAlGUFVfYWNjdW1fMgorCW5vdGwJRlBVX2FjY3VtXzMKKwlhZGRsCSQxLEZQVV9hY2N1bV8xCisJYWRjbAkkMCxGUFVfYWNjdW1fMgorCisjaWZkZWYgUEFSQU5PSUQKKwlhZGNsCSQwLEZQVV9hY2N1bV8zCS8qIFRoaXMgbXVzdCBiZSB6ZXJvICovCisJanoJc3FydF9zdGFnZV8zX25vX2Vycm9yCisKK3NxcnRfc3RhZ2VfM19lcnJvcjoKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIwNworCWNhbGwJRVhDRVBUSU9OCisKK3NxcnRfc3RhZ2VfM19ub19lcnJvcjoKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLworCisJbW92bAlGUFVfYWNjdW1fMiwlZWR4CisJbW92bAlGUFVfYWNjdW1fMSwlZWF4CisJZGl2bAklZXNpCisJbW92bAklZWF4LCVlY3gKKworCW1vdmwJJWVkeCwlZWF4CisJZGl2bAklZXNpCisKKwlzYXJsCSQxLCVlY3gJCS8qIGRpdmlkZSBieSAyICovCisJcmNybAkkMSwlZWF4CisKKwkvKiBwcmVwYXJlIHRvIHJvdW5kIHRoZSByZXN1bHQgKi8KKworCWFkZGwJJWVjeCwlZWRpCisJYWRjbAkkMCwlZXNpCisKKwlqbXAJc3FydF9zdGFnZV8zX2ZpbmlzaGVkCisKK3NxcnRfc3RhZ2VfM19wb3NpdGl2ZToKKwltb3ZsCUZQVV9hY2N1bV8yLCVlZHgKKwltb3ZsCUZQVV9hY2N1bV8xLCVlYXgKKwlkaXZsCSVlc2kKKwltb3ZsCSVlYXgsJWVjeAorCisJbW92bAklZWR4LCVlYXgKKwlkaXZsCSVlc2kKKworCXNhcmwJJDEsJWVjeAkJLyogZGl2aWRlIGJ5IDIgKi8KKwlyY3JsCSQxLCVlYXgKKworCS8qIHByZXBhcmUgdG8gcm91bmQgdGhlIHJlc3VsdCAqLworCisJbm90bAklZWF4CQkvKiBOZWdhdGUgdGhlIGNvcnJlY3Rpb24gdGVybSAqLworCW5vdGwJJWVjeAorCWFkZGwJJDEsJWVheAorCWFkY2wJJDAsJWVjeAkJLyogY2FycnkgaGVyZSA9PT4gY29ycmVjdGlvbiA9PSAwICovCisJYWRjbAkkMHhmZmZmZmZmZiwlZXNpCisKKwlhZGRsCSVlY3gsJWVkaQorCWFkY2wJJDAsJWVzaQorCitzcXJ0X3N0YWdlXzNfZmluaXNoZWQ6CisKKy8qCisgKiBUaGUgcmVzdWx0IGluICVlc2k6JWVkaTolZXNpIHNob3VsZCBiZSBnb29kIHRvIGFib3V0IDkwIGJpdHMgaGVyZSwKKyAqIGFuZCB0aGUgcm91bmRpbmcgaW5mb3JtYXRpb24gaGVyZSBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgYWNjdXJhY3kKKyAqIGluIGEgZmV3IHJhcmUgY2FzZXMuCisgKi8KKwljbXBsCSQweGZmZmZmZmUwLCVlYXgKKwlqYQlzcXJ0X25lYXJfZXhhY3RfeAorCisJY21wbAkkMHgwMDAwMDAyMCwlZWF4CisJamIJc3FydF9uZWFyX2V4YWN0CisKKwljbXBsCSQweDdmZmZmZmUwLCVlYXgKKwlqYglzcXJ0X3JvdW5kX3Jlc3VsdAorCisJY21wbAkkMHg4MDAwMDAyMCwlZWF4CisJamIJc3FydF9nZXRfbW9yZV9wcmVjaXNpb24KKworc3FydF9yb3VuZF9yZXN1bHQ6CisvKiBTZXQgdXAgZm9yIHJvdW5kaW5nIG9wZXJhdGlvbnMgKi8KKwltb3ZsCSVlYXgsJWVkeAorCW1vdmwJJWVzaSwlZWF4CisJbW92bAklZWRpLCVlYngKKwltb3ZsCVBBUkFNMSwlZWRpCisJbW92dwlFWFBfQklBUyxFWFAoJWVkaSkJLyogUmVzdWx0IGlzIGluICBbMS4wIC4uIDIuMCkgKi8KKwlqbXAJZnB1X3JlZ19yb3VuZAorCisKK3NxcnRfbmVhcl9leGFjdF94OgorLyogRmlyc3QsIHRoZSBlc3RpbWF0ZSBtdXN0IGJlIHJvdW5kZWQgdXAuICovCisJYWRkbAkkMSwlZWRpCisJYWRjbAkkMCwlZXNpCisKK3NxcnRfbmVhcl9leGFjdDoKKy8qCisgKiBUaGlzIGlzIGFuIGVhc3kgY2FzZSBiZWNhdXNlIHheMS8yIGlzIG1vbm90b25pYy4KKyAqIFdlIG5lZWQganVzdCBmaW5kIHRoZSBzcXVhcmUgb2Ygb3VyIGVzdGltYXRlLCBjb21wYXJlIGl0CisgKiB3aXRoIHRoZSBhcmd1bWVudCwgYW5kIGRlZHVjZSB3aGV0aGVyIG91ciBlc3RpbWF0ZSBpcworICogYWJvdmUsIGJlbG93LCBvciBleGFjdC4gV2UgdXNlIHRoZSBmYWN0IHRoYXQgdGhlIGVzdGltYXRlCisgKiBpcyBrbm93biB0byBiZSBhY2N1cmF0ZSB0byBhYm91dCA5MCBiaXRzLgorICovCisJbW92bAklZWRpLCVlYXgJCS8qIGxzIHdvcmQgb2YgZ3Vlc3MgKi8KKwltdWxsCSVlZGkKKwltb3ZsCSVlZHgsJWVieAkJLyogMm5kIGxzIHdvcmQgb2Ygc3F1YXJlICovCisJbW92bAklZWF4LCVlY3gJCS8qIGxzIHdvcmQgb2Ygc3F1YXJlICovCisKKwltb3ZsCSVlZGksJWVheAorCW11bGwJJWVzaQorCWFkZGwJJWVheCwlZWJ4CisJYWRkbAklZWF4LCVlYngKKworI2lmZGVmIFBBUkFOT0lECisJY21wCSQweGZmZmZmZmIwLCVlYngKKwlqYglzcXJ0X25lYXJfZXhhY3Rfb2sKKworCWNtcAkkMHgwMDAwMDA1MCwlZWJ4CisJamEJc3FydF9uZWFyX2V4YWN0X29rCisKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIxNAorCWNhbGwJRVhDRVBUSU9OCisKK3NxcnRfbmVhcl9leGFjdF9vazoKKyNlbmRpZiAvKiBQQVJBTk9JRCAqLyAKKworCW9yCSVlYngsJWVieAorCWpzCXNxcnRfbmVhcl9leGFjdF9zbWFsbAorCisJam56CXNxcnRfbmVhcl9leGFjdF9sYXJnZQorCisJb3IJJWVieCwlZWR4CisJam56CXNxcnRfbmVhcl9leGFjdF9sYXJnZQorCisvKiBPdXIgZXN0aW1hdGUgaXMgZXhhY3RseSB0aGUgcmlnaHQgYW5zd2VyICovCisJeG9ybAklZWF4LCVlYXgKKwlqbXAJc3FydF9yb3VuZF9yZXN1bHQKKworc3FydF9uZWFyX2V4YWN0X3NtYWxsOgorLyogT3VyIGVzdGltYXRlIGlzIHRvbyBzbWFsbCAqLworCW1vdmwJJDB4MDAwMDAwZmYsJWVheAorCWptcAlzcXJ0X3JvdW5kX3Jlc3VsdAorCQorc3FydF9uZWFyX2V4YWN0X2xhcmdlOgorLyogT3VyIGVzdGltYXRlIGlzIHRvbyBsYXJnZSwgd2UgbmVlZCB0byBkZWNyZW1lbnQgaXQgKi8KKwlzdWJsCSQxLCVlZGkKKwlzYmJsCSQwLCVlc2kKKwltb3ZsCSQweGZmZmZmZjAwLCVlYXgKKwlqbXAJc3FydF9yb3VuZF9yZXN1bHQKKworCitzcXJ0X2dldF9tb3JlX3ByZWNpc2lvbjoKKy8qIFRoaXMgY2FzZSBpcyBhbG1vc3QgdGhlIHNhbWUgYXMgdGhlIGFib3ZlLCBleGNlcHQgd2Ugc3RhcnQKKyAgIHdpdGggYW4gZXh0cmEgYml0IG9mIHByZWNpc2lvbiBpbiB0aGUgZXN0aW1hdGUuICovCisJc3RjCQkJLyogVGhlIGV4dHJhIGJpdC4gKi8KKwlyY2xsCSQxLCVlZGkJCS8qIFNoaWZ0IHRoZSBlc3RpbWF0ZSBsZWZ0IG9uZSBiaXQgKi8KKwlyY2xsCSQxLCVlc2kKKworCW1vdmwJJWVkaSwlZWF4CQkvKiBscyB3b3JkIG9mIGd1ZXNzICovCisJbXVsbAklZWRpCisJbW92bAklZWR4LCVlYngJCS8qIDJuZCBscyB3b3JkIG9mIHNxdWFyZSAqLworCW1vdmwJJWVheCwlZWN4CQkvKiBscyB3b3JkIG9mIHNxdWFyZSAqLworCisJbW92bAklZWRpLCVlYXgKKwltdWxsCSVlc2kKKwlhZGRsCSVlYXgsJWVieAorCWFkZGwJJWVheCwlZWJ4CisKKy8qIFB1dCBvdXIgZXN0aW1hdGUgYmFjayB0byBpdHMgb3JpZ2luYWwgdmFsdWUgKi8KKwlzdGMJCQkvKiBUaGUgbXMgYml0LiAqLworCXJjcmwJJDEsJWVzaQkJLyogU2hpZnQgdGhlIGVzdGltYXRlIGxlZnQgb25lIGJpdCAqLworCXJjcmwJJDEsJWVkaQorCisjaWZkZWYgUEFSQU5PSUQKKwljbXAJJDB4ZmZmZmZmNjAsJWVieAorCWpiCXNxcnRfbW9yZV9wcmVjX29rCisKKwljbXAJJDB4MDAwMDAwYTAsJWVieAorCWphCXNxcnRfbW9yZV9wcmVjX29rCisKKwlwdXNobAlFWF9JTlRFUk5BTHwweDIxNQorCWNhbGwJRVhDRVBUSU9OCisKK3NxcnRfbW9yZV9wcmVjX29rOgorI2VuZGlmIC8qIFBBUkFOT0lEICovIAorCisJb3IJJWVieCwlZWJ4CisJanMJc3FydF9tb3JlX3ByZWNfc21hbGwKKworCWpueglzcXJ0X21vcmVfcHJlY19sYXJnZQorCisJb3IJJWVieCwlZWN4CisJam56CXNxcnRfbW9yZV9wcmVjX2xhcmdlCisKKy8qIE91ciBlc3RpbWF0ZSBpcyBleGFjdGx5IHRoZSByaWdodCBhbnN3ZXIgKi8KKwltb3ZsCSQweDgwMDAwMDAwLCVlYXgKKwlqbXAJc3FydF9yb3VuZF9yZXN1bHQKKworc3FydF9tb3JlX3ByZWNfc21hbGw6CisvKiBPdXIgZXN0aW1hdGUgaXMgdG9vIHNtYWxsICovCisJbW92bAkkMHg4MDAwMDBmZiwlZWF4CisJam1wCXNxcnRfcm91bmRfcmVzdWx0CisJCitzcXJ0X21vcmVfcHJlY19sYXJnZToKKy8qIE91ciBlc3RpbWF0ZSBpcyB0b28gbGFyZ2UgKi8KKwltb3ZsCSQweDdmZmZmZjAwLCVlYXgKKwlqbXAJc3FydF9yb3VuZF9yZXN1bHQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9tbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzMyNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L21tL01ha2VmaWxlCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBpMzg2LXNwZWNpZmljIHBhcnRzIG9mIHRoZSBtZW1vcnkgbWFuYWdlci4KKyMKKworb2JqLXkJOj0gaW5pdC5vIHBndGFibGUubyBmYXVsdC5vIGlvcmVtYXAubyBleHRhYmxlLm8gcGFnZWF0dHIubyBtbWFwLm8KKworb2JqLSQoQ09ORklHX0RJU0NPTlRJR01FTSkJKz0gZGlzY29udGlnLm8KK29iai0kKENPTkZJR19IVUdFVExCX1BBR0UpICs9IGh1Z2V0bGJwYWdlLm8KK29iai0kKENPTkZJR19ISUdITUVNKSArPSBoaWdobWVtLm8KK29iai0kKENPTkZJR19CT09UX0lPUkVNQVApICs9IGJvb3RfaW9yZW1hcC5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vYm9vdF9pb3JlbWFwLmMgYi9hcmNoL2kzODYvbW0vYm9vdF9pb3JlbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzYjMwNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tbS9ib290X2lvcmVtYXAuYwpAQCAtMCwwICsxLDk3IEBACisvKgorICogYXJjaC9pMzg2L21tL2Jvb3RfaW9yZW1hcC5jCisgKiAKKyAqIFJlLW1hcCBmdW5jdGlvbnMgZm9yIGVhcmx5IGJvb3QtdGltZSBiZWZvcmUgcGFnaW5nX2luaXQoKSB3aGVuIHRoZSAKKyAqIGJvb3QtdGltZSBwYWdldGFibGVzIGFyZSBzdGlsbCBpbiB1c2UKKyAqCisgKiBXcml0dGVuIGJ5IERhdmUgSGFuc2VuIDxoYXZlYmx1ZUB1cy5pYm0uY29tPgorICovCisKKworLyoKKyAqIFdlIG5lZWQgdG8gdXNlIHRoZSAyLWxldmVsIHBhZ2V0YWJsZSBmdW5jdGlvbnMsIGJ1dCBDT05GSUdfWDg2X1BBRQorICoga2VlcHMgdGhhdCBmcm9tIGhhcHBlbm5pbmcuICBJZiBhbnlvbmUgaGFzIGEgYmV0dGVyIHdheSwgSSdtIGxpc3RlbmluZy4KKyAqCisgKiBib290X3B0ZV90IGlzIGRlZmluZWQgb25seSBpZiB0aGlzIGFsbCB3b3JrcyBjb3JyZWN0bHkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjdW5kZWYgQ09ORklHX1g4Nl9QQUUKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorCisvKiAKKyAqIEknbSBjaGVhdGluZyBoZXJlLiAgSXQgaXMga25vd24gdGhhdCB0aGUgdHdvIGJvb3QgUFRFIHBhZ2VzIGFyZSAKKyAqIGFsbG9jYXRlZCBuZXh0IHRvIGVhY2ggb3RoZXIuICBJJ20gcHJldGVuZGluZyB0aGF0IHRoZXkncmUganVzdAorICogb25lIGJpZyBhcnJheS4gCisgKi8KKworI2RlZmluZSBCT09UX1BURV9QVFJTIChQVFJTX1BFUl9QVEUqMikKKyNkZWZpbmUgYm9vdF9wdGVfaW5kZXgoYWRkcmVzcykgXAorCSAgICAgKCgoYWRkcmVzcykgPj4gUEFHRV9TSElGVCkgJiAoQk9PVF9QVEVfUFRSUyAtIDEpKQorCitzdGF0aWMgaW5saW5lIGJvb3RfcHRlX3QqIGJvb3RfdmFkZHJfdG9fcHRlKHZvaWQgKmFkZHJlc3MpCit7CisJYm9vdF9wdGVfdCogYm9vdF9wZyA9IChib290X3B0ZV90KilwZzA7CisJcmV0dXJuICZib290X3BnW2Jvb3RfcHRlX2luZGV4KCh1bnNpZ25lZCBsb25nKWFkZHJlc3MpXTsKK30KKworLyoKKyAqIFRoaXMgaXMgb25seSBmb3IgYSBjYWxsZXIgd2hvIGlzIGNsZXZlciBlbm91Z2ggdG8gcGFnZS1hbGlnbgorICogcGh5c19hZGRyIGFuZCB2aXJ0dWFsX3NvdXJjZSwgYW5kIHdobyBhbHNvIGhhcyBhIHByZWZlcmVuY2UKKyAqIGFib3V0IHdoaWNoIHZpcnR1YWwgYWRkcmVzcyBmcm9tIHdoaWNoIHRvIHN0ZWFsIHB0ZXMKKyAqLworc3RhdGljIHZvaWQgX19ib290X2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgbnJwYWdlcywgCisJCSAgICB2b2lkKiB2aXJ0dWFsX3NvdXJjZSkKK3sKKwlib290X3B0ZV90KiBwdGU7CisJaW50IGk7CisJY2hhciAqdmFkZHIgPSB2aXJ0dWFsX3NvdXJjZTsKKworCXB0ZSA9IGJvb3RfdmFkZHJfdG9fcHRlKHZpcnR1YWxfc291cmNlKTsKKwlmb3IgKGk9MDsgaSA8IG5ycGFnZXM7IGkrKywgcGh5c19hZGRyICs9IFBBR0VfU0laRSwgcHRlKyspIHsKKwkJc2V0X3B0ZShwdGUsIHBmbl9wdGUocGh5c19hZGRyPj5QQUdFX1NISUZULCBQQUdFX0tFUk5FTCkpOworCQlfX2ZsdXNoX3RsYl9vbmUoJnZhZGRyW2kqUEFHRV9TSVpFXSk7CisJfQorfQorCisvKiB0aGUgdmlydHVhbCBzcGFjZSB3ZSdyZSBnb2luZyB0byByZW1hcCBjb21lcyBmcm9tIHRoaXMgYXJyYXkgKi8KKyNkZWZpbmUgQk9PVF9JT1JFTUFQX1BBR0VTIDQKKyNkZWZpbmUgQk9PVF9JT1JFTUFQX1NJWkUgKEJPT1RfSU9SRU1BUF9QQUdFUypQQUdFX1NJWkUpCitzdGF0aWMgX19pbml0ZGF0YSBjaGFyIGJvb3RfaW9yZW1hcF9zcGFjZVtCT09UX0lPUkVNQVBfU0laRV0KKwkJICAgICAgIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChQQUdFX1NJWkUpKSk7CisKKy8qCisgKiBUaGlzIG9ubHkgYXBwbGllcyB0byB0aGluZ3Mgd2hpY2ggbmVlZCB0byBpb3JlbWFwIGJlZm9yZSBwYWdpbmdfaW5pdCgpCisgKiBidF9pb3JlbWFwKCkgYW5kIHBsYWluIGlvcmVtYXAoKSBhcmUgYm90aCB1c2VsZXNzIGF0IHRoaXMgcG9pbnQuCisgKiAKKyAqIFdoZW4gdXNlZCwgd2UncmUgc3RpbGwgdXNpbmcgdGhlIGJvb3QtdGltZSBwYWdldGFibGVzLCB3aGljaCBvbmx5CisgKiBoYXZlIDIgUFRFIHBhZ2VzIG1hcHBpbmcgdGhlIGZpcnN0IDhNQgorICoKKyAqIFRoZXJlIGlzIG5vIHVubWFwLiAgVGhlIGJvb3QtdGltZSBQVEUgcGFnZXMgYXJlbid0IHVzZWQgYWZ0ZXIgYm9vdC4KKyAqIElmIHlvdSByZWFsbHkgd2FudCB0aGUgc3BhY2UgYmFjaywganVzdCByZW1hcCBpdCB5b3Vyc2VsZi4KKyAqIGJvb3RfaW9yZW1hcCgmaW9yZW1hcF9zcGFjZS1QQUdFX09GRlNFVCwgQk9PVF9JT1JFTUFQX1NJWkUpCisgKi8KK19faW5pdCB2b2lkKiBib290X2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGxhc3RfYWRkciwgb2Zmc2V0OworCXVuc2lnbmVkIGludCBucnBhZ2VzOworCQorCWxhc3RfYWRkciA9IHBoeXNfYWRkciArIHNpemUgLSAxOworCisJLyogcGFnZSBhbGlnbiB0aGUgcmVxdWVzdGVkIGFkZHJlc3MgKi8KKwlvZmZzZXQgPSBwaHlzX2FkZHIgJiB+UEFHRV9NQVNLOworCXBoeXNfYWRkciAmPSBQQUdFX01BU0s7CisJc2l6ZSA9IFBBR0VfQUxJR04obGFzdF9hZGRyKSAtIHBoeXNfYWRkcjsKKwkKKwlucnBhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCWlmIChucnBhZ2VzID4gQk9PVF9JT1JFTUFQX1BBR0VTKQorCQlyZXR1cm4gTlVMTDsKKwkKKwlfX2Jvb3RfaW9yZW1hcChwaHlzX2FkZHIsIG5ycGFnZXMsIGJvb3RfaW9yZW1hcF9zcGFjZSk7CisKKwlyZXR1cm4gJmJvb3RfaW9yZW1hcF9zcGFjZVtvZmZzZXRdOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2Rpc2NvbnRpZy5jIGIvYXJjaC9pMzg2L21tL2Rpc2NvbnRpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MjZiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbW0vZGlzY29udGlnLmMKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBXcml0dGVuIGJ5OiBQYXRyaWNpYSBHYXVnaGVuIDxnb25lQHVzLmlibS5jb20+LCBJQk0gQ29ycG9yYXRpb24KKyAqIEF1Z3VzdCAyMDAyOiBhZGRlZCByZW1vdGUgbm9kZSBLVkEgcmVtYXAgLSBNYXJ0aW4gSi4gQmxpZ2ggCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCBJQk0gQ29ycC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZSA8YXNtL2U4MjAuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbW16b25lLmg+CisjaW5jbHVkZSA8Ymlvc19lYmRhLmg+CisKK3N0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW01BWF9OVU1OT0RFU107Citib290bWVtX2RhdGFfdCBub2RlMF9iZGF0YTsKKworLyoKKyAqIG51bWEgaW50ZXJmYWNlIC0gd2UgZXhwZWN0IHRoZSBudW1hIGFyY2hpdGVjdHVyZSBzcGVjZmljIGNvZGUgdG8gaGF2ZQorICogICAgICAgICAgICAgICAgICBwb3B1bGF0ZWQgdGhlIGZvbGxvd2luZyBpbml0aWFsaXNhdGlvbi4KKyAqCisgKiAxKSBub2RlX29ubGluZV9tYXAgIC0gdGhlIG1hcCBvZiBhbGwgbm9kZXMgY29uZmlndXJlZCAob25saW5lKSBpbiB0aGUgc3lzdGVtCisgKiAyKSBwaHlzbm9kZV9tYXAgICAgIC0gdGhlIG1hcHBpbmcgYmV0d2VlbiBhIHBmbiBhbmQgb3duaW5nIG5vZGUKKyAqIDMpIG5vZGVfc3RhcnRfcGZuICAgLSB0aGUgc3RhcnRpbmcgcGFnZSBmcmFtZSBudW1iZXIgZm9yIGEgbm9kZQorICogMykgbm9kZV9lbmRfcGZuICAgICAtIHRoZSBlbmRpbmcgcGFnZSBmcmFtIG51bWJlciBmb3IgYSBub2RlCisgKi8KKworLyoKKyAqIHBoeXNub2RlX21hcCBrZWVwcyB0cmFjayBvZiB0aGUgcGh5c2ljYWwgbWVtb3J5IGxheW91dCBvZiBhIGdlbmVyaWMKKyAqIG51bWEgbm9kZSBvbiBhIDI1Nk1iIGJyZWFrIChlYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5IHdpbGwKKyAqIHJlcHJlc2VudCAyNTZNYiBvZiBtZW1vcnkgYW5kIHdpbGwgYmUgbWFya2VkIGJ5IHRoZSBub2RlIGlkLiAgc28sCisgKiBpZiB0aGUgZmlyc3QgZ2lnIGlzIG9uIG5vZGUgMCwgYW5kIHRoZSBzZWNvbmQgZ2lnIGlzIG9uIG5vZGUgMQorICogcGh5c25vZGVfbWFwIHdpbGwgY29udGFpbjoKKyAqCisgKiAgICAgcGh5c25vZGVfbWFwWzAtM10gPSAwOworICogICAgIHBoeXNub2RlX21hcFs0LTddID0gMTsKKyAqICAgICBwaHlzbm9kZV9tYXBbOC0gXSA9IC0xOworICovCitzOCBwaHlzbm9kZV9tYXBbTUFYX0VMRU1FTlRTXSA9IHsgWzAgLi4uIChNQVhfRUxFTUVOVFMgLSAxKV0gPSAtMX07CisKK3ZvaWQgbWVtb3J5X3ByZXNlbnQoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBwZm47CisKKwlwcmludGsoS0VSTl9JTkZPICJOb2RlOiAlZCwgc3RhcnRfcGZuOiAlbGQsIGVuZF9wZm46ICVsZFxuIiwKKwkJCW5pZCwgc3RhcnQsIGVuZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgU2V0dGluZyBwaHlzbm9kZV9tYXAgYXJyYXkgdG8gbm9kZSAlZCBmb3IgcGZuczpcbiIsIG5pZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgIik7CisJZm9yIChwZm4gPSBzdGFydDsgcGZuIDwgZW5kOyBwZm4gKz0gUEFHRVNfUEVSX0VMRU1FTlQpIHsKKwkJcGh5c25vZGVfbWFwW3BmbiAvIFBBR0VTX1BFUl9FTEVNRU5UXSA9IG5pZDsKKwkJcHJpbnRrKCIlbGQgIiwgcGZuKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCit1bnNpZ25lZCBsb25nIG5vZGVfbWVtbWFwX3NpemVfYnl0ZXMoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKK3sKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZW5kX3BmbiAtIHN0YXJ0X3BmbjsKKworCWlmICghbnJfcGFnZXMpCisJCXJldHVybiAwOworCisJcmV0dXJuIChucl9wYWdlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBwYWdlKTsKK30KKwordW5zaWduZWQgbG9uZyBub2RlX3N0YXJ0X3BmbltNQVhfTlVNTk9ERVNdOwordW5zaWduZWQgbG9uZyBub2RlX2VuZF9wZm5bTUFYX05VTU5PREVTXTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZmluZF9tYXhfbG93X3Bmbih2b2lkKTsKK2V4dGVybiB2b2lkIGZpbmRfbWF4X3Bmbih2b2lkKTsKK2V4dGVybiB2b2lkIG9uZV9oaWdocGFnZV9pbml0KHN0cnVjdCBwYWdlICosIGludCwgaW50KTsKKworZXh0ZXJuIHN0cnVjdCBlODIwbWFwIGU4MjA7CitleHRlcm4gdW5zaWduZWQgbG9uZyBpbml0X3BnX3RhYmxlc19lbmQ7CitleHRlcm4gdW5zaWduZWQgbG9uZyBoaWdoZW5kX3BmbiwgaGlnaHN0YXJ0X3BmbjsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdG90YWxyYW1fcGFnZXM7CitleHRlcm4gdW5zaWduZWQgbG9uZyB0b3RhbGhpZ2hfcGFnZXM7CisKKyNkZWZpbmUgTEFSR0VfUEFHRV9CWVRFUyAoUFRSU19QRVJfUFRFICogUEFHRV9TSVpFKQorCit1bnNpZ25lZCBsb25nIG5vZGVfcmVtYXBfc3RhcnRfcGZuW01BWF9OVU1OT0RFU107Cit1bnNpZ25lZCBsb25nIG5vZGVfcmVtYXBfc2l6ZVtNQVhfTlVNTk9ERVNdOwordW5zaWduZWQgbG9uZyBub2RlX3JlbWFwX29mZnNldFtNQVhfTlVNTk9ERVNdOwordm9pZCAqbm9kZV9yZW1hcF9zdGFydF92YWRkcltNQVhfTlVNTk9ERVNdOwordm9pZCBzZXRfcG1kX3Bmbih1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgZmxhZ3MpOworCisvKgorICogRkxBVCAtIHN1cHBvcnQgZm9yIGJhc2ljIFBDIG1lbW9yeSBtb2RlbCB3aXRoIGRpc2NvbnRpZyBlbmFibGVkLCBlc3NlbnRpYWxseQorICogICAgICAgIGEgc2luZ2xlIG5vZGUgd2l0aCBhbGwgYXZhaWxhYmxlIHByb2Nlc3NvcnMgaW4gaXQgd2l0aCBhIGZsYXQKKyAqICAgICAgICBtZW1vcnkgbWFwLgorICovCitpbnQgX19pbml0IGdldF9tZW1jZmdfbnVtYV9mbGF0KHZvaWQpCit7CisJcHJpbnRrKCJOVU1BIC0gc2luZ2xlIG5vZGUsIGZsYXQgbWVtb3J5IG1vZGVcbiIpOworCisJLyogUnVuIHRoZSBtZW1vcnkgY29uZmlndXJhdGlvbiBhbmQgZmluZCB0aGUgdG9wIG9mIG1lbW9yeS4gKi8KKwlmaW5kX21heF9wZm4oKTsKKwlub2RlX3N0YXJ0X3BmblswXSA9IDA7CisJbm9kZV9lbmRfcGZuWzBdID0gbWF4X3BmbjsKKwltZW1vcnlfcHJlc2VudCgwLCAwLCBtYXhfcGZuKTsKKworICAgICAgICAvKiBJbmRpY2F0ZSB0aGVyZSBpcyBvbmUgbm9kZSBhdmFpbGFibGUuICovCisJbm9kZXNfY2xlYXIobm9kZV9vbmxpbmVfbWFwKTsKKwlub2RlX3NldF9vbmxpbmUoMCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBoaWdoZXN0IHBhZ2UgZnJhbWUgbnVtYmVyIHdlIGhhdmUgYXZhaWxhYmxlIGZvciB0aGUgbm9kZQorICovCitzdGF0aWMgdm9pZCBfX2luaXQgZmluZF9tYXhfcGZuX25vZGUoaW50IG5pZCkKK3sKKwlpZiAobm9kZV9lbmRfcGZuW25pZF0gPiBtYXhfcGZuKQorCQlub2RlX2VuZF9wZm5bbmlkXSA9IG1heF9wZm47CisJLyoKKwkgKiBpZiBhIHVzZXIgaGFzIGdpdmVuIG1lbT1YWFhYLCB0aGVuIHdlIG5lZWQgdG8gbWFrZSBzdXJlIAorCSAqIHRoYXQgdGhlIG5vZGUgX3N0YXJ0c18gYmVmb3JlIHRoYXQsIHRvbywgbm90IGp1c3QgZW5kcworCSAqLworCWlmIChub2RlX3N0YXJ0X3BmbltuaWRdID4gbWF4X3BmbikKKwkJbm9kZV9zdGFydF9wZm5bbmlkXSA9IG1heF9wZm47CisJaWYgKG5vZGVfc3RhcnRfcGZuW25pZF0gPiBub2RlX2VuZF9wZm5bbmlkXSkKKwkJQlVHKCk7Cit9CisKKy8qIAorICogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcGdfZGF0YV90IGZvciB0aGlzIG5vZGUgdmlhIGEgY3J1ZGUgcHJlLWJvb3RtZW0KKyAqIG1ldGhvZC4gIEZvciBub2RlIHplcm8gdGFrZSB0aGlzIGZyb20gdGhlIGJvdHRvbSBvZiBtZW1vcnksIGZvcgorICogc3Vic2VxdWVudCBub2RlcyBwbGFjZSB0aGVtIGF0IG5vZGVfcmVtYXBfc3RhcnRfdmFkZHIgd2hpY2ggY29udGFpbnMKKyAqIG5vZGUgbG9jYWwgZGF0YSBpbiBwaHlzaWNhbGx5IG5vZGUgbG9jYWwgbWVtb3J5LiAgU2VlIHNldHVwX21lbW9yeSgpCisgKiBmb3IgZGV0YWlscy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGFsbG9jYXRlX3BnZGF0KGludCBuaWQpCit7CisJaWYgKG5pZCAmJiBub2RlX2hhc19vbmxpbmVfbWVtKG5pZCkpCisJCU5PREVfREFUQShuaWQpID0gKHBnX2RhdGFfdCAqKW5vZGVfcmVtYXBfc3RhcnRfdmFkZHJbbmlkXTsKKwllbHNlIHsKKwkJTk9ERV9EQVRBKG5pZCkgPSAocGdfZGF0YV90ICopKF9fdmEobWluX2xvd19wZm4gPDwgUEFHRV9TSElGVCkpOworCQltaW5fbG93X3BmbiArPSBQRk5fVVAoc2l6ZW9mKHBnX2RhdGFfdCkpOworCX0KK30KKwordm9pZCBfX2luaXQgcmVtYXBfbnVtYV9rdmEodm9pZCkKK3sKKwl2b2lkICp2YWRkcjsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwlpbnQgbm9kZTsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKKwkJaWYgKG5vZGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKHBmbj0wOyBwZm4gPCBub2RlX3JlbWFwX3NpemVbbm9kZV07IHBmbiArPSBQVFJTX1BFUl9QVEUpIHsKKwkJCXZhZGRyID0gbm9kZV9yZW1hcF9zdGFydF92YWRkcltub2RlXSsocGZuPDxQQUdFX1NISUZUKTsKKwkJCXNldF9wbWRfcGZuKCh1bG9uZykgdmFkZHIsIAorCQkJCW5vZGVfcmVtYXBfc3RhcnRfcGZuW25vZGVdICsgcGZuLCAKKwkJCQlQQUdFX0tFUk5FTF9MQVJHRSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGN1bGF0ZV9udW1hX3JlbWFwX3BhZ2VzKHZvaWQpCit7CisJaW50IG5pZDsKKwl1bnNpZ25lZCBsb25nIHNpemUsIHJlc2VydmVfcGFnZXMgPSAwOworCisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCWlmIChuaWQgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIW5vZGVfcmVtYXBfc2l6ZVtuaWRdKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogVGhlIGFjcGkvc3JhdCBub2RlIGluZm8gY2FuIHNob3cgaG90LWFkZCBtZW1yb3kgem9uZXMKKwkJICogd2hlcmUgbWVtb3J5IGNvdWxkIGJlIGFkZGVkIGJ1dCBub3QgY3VycmVudGx5IHByZXNlbnQuCisJCSAqLworCQlpZiAobm9kZV9zdGFydF9wZm5bbmlkXSA+IG1heF9wZm4pCisJCQljb250aW51ZTsKKwkJaWYgKG5vZGVfZW5kX3BmbltuaWRdID4gbWF4X3BmbikKKwkJCW5vZGVfZW5kX3BmbltuaWRdID0gbWF4X3BmbjsKKworCQkvKiBlbnN1cmUgdGhlIHJlbWFwIGluY2x1ZGVzIHNwYWNlIGZvciB0aGUgcGdkYXQuICovCisJCXNpemUgPSBub2RlX3JlbWFwX3NpemVbbmlkXSArIHNpemVvZihwZ19kYXRhX3QpOworCisJCS8qIGNvbnZlcnQgc2l6ZSB0byBsYXJnZSAocG1kIHNpemUpIHBhZ2VzLCByb3VuZGluZyB1cCAqLworCQlzaXplID0gKHNpemUgKyBMQVJHRV9QQUdFX0JZVEVTIC0gMSkgLyBMQVJHRV9QQUdFX0JZVEVTOworCQkvKiBub3cgdGhlIHJvdW5kdXAgaXMgY29ycmVjdCwgY29udmVydCB0byBQQUdFX1NJWkUgcGFnZXMgKi8KKwkJc2l6ZSA9IHNpemUgKiBQVFJTX1BFUl9QVEU7CisJCXByaW50aygiUmVzZXJ2aW5nICVsZCBwYWdlcyBvZiBLVkEgZm9yIGxtZW1fbWFwIG9mIG5vZGUgJWRcbiIsCisJCQkJc2l6ZSwgbmlkKTsKKwkJbm9kZV9yZW1hcF9zaXplW25pZF0gPSBzaXplOworCQlyZXNlcnZlX3BhZ2VzICs9IHNpemU7CisJCW5vZGVfcmVtYXBfb2Zmc2V0W25pZF0gPSByZXNlcnZlX3BhZ2VzOworCQlwcmludGsoIlNocmlua2luZyBub2RlICVkIGZyb20gJWxkIHBhZ2VzIHRvICVsZCBwYWdlc1xuIiwKKwkJCW5pZCwgbm9kZV9lbmRfcGZuW25pZF0sIG5vZGVfZW5kX3BmbltuaWRdIC0gc2l6ZSk7CisJCW5vZGVfZW5kX3BmbltuaWRdIC09IHNpemU7CisJCW5vZGVfcmVtYXBfc3RhcnRfcGZuW25pZF0gPSBub2RlX2VuZF9wZm5bbmlkXTsKKwl9CisJcHJpbnRrKCJSZXNlcnZpbmcgdG90YWwgb2YgJWxkIHBhZ2VzIGZvciBudW1hIEtWQSByZW1hcFxuIiwKKwkJCXJlc2VydmVfcGFnZXMpOworCXJldHVybiByZXNlcnZlX3BhZ2VzOworfQorCitleHRlcm4gdm9pZCBzZXR1cF9ib290bWVtX2FsbG9jYXRvcih2b2lkKTsKK3Vuc2lnbmVkIGxvbmcgX19pbml0IHNldHVwX21lbW9yeSh2b2lkKQoreworCWludCBuaWQ7CisJdW5zaWduZWQgbG9uZyBzeXN0ZW1fc3RhcnRfcGZuLCBzeXN0ZW1fbWF4X2xvd19wZm47CisJdW5zaWduZWQgbG9uZyByZXNlcnZlX3BhZ2VzOworCisJLyoKKwkgKiBXaGVuIG1hcHBpbmcgYSBOVU1BIG1hY2hpbmUgd2UgYWxsb2NhdGUgdGhlIG5vZGVfbWVtX21hcCBhcnJheXMKKwkgKiBmcm9tIG5vZGUgbG9jYWwgbWVtb3J5LiAgVGhleSBhcmUgdGhlbiBtYXBwZWQgZGlyZWN0bHkgaW50byBLVkEKKwkgKiBiZXR3ZWVuIHpvbmUgbm9ybWFsIGFuZCB2bWFsbG9jIHNwYWNlLiAgQ2FsY3VsYXRlIHRoZSBzaXplIG9mCisJICogdGhpcyBzcGFjZSBhbmQgdXNlIGl0IHRvIGFkanVzdCB0aGUgYm91bmRyeSBiZXR3ZWVuIFpPTkVfTk9STUFMCisJICogYW5kIFpPTkVfSElHSE1FTS4KKwkgKi8KKwlmaW5kX21heF9wZm4oKTsKKwlnZXRfbWVtY2ZnX251bWEoKTsKKworCXJlc2VydmVfcGFnZXMgPSBjYWxjdWxhdGVfbnVtYV9yZW1hcF9wYWdlcygpOworCisJLyogcGFydGlhbGx5IHVzZWQgcGFnZXMgYXJlIG5vdCB1c2FibGUgLSB0aHVzIHJvdW5kIHVwd2FyZHMgKi8KKwlzeXN0ZW1fc3RhcnRfcGZuID0gbWluX2xvd19wZm4gPSBQRk5fVVAoaW5pdF9wZ190YWJsZXNfZW5kKTsKKworCXN5c3RlbV9tYXhfbG93X3BmbiA9IG1heF9sb3dfcGZuID0gZmluZF9tYXhfbG93X3BmbigpIC0gcmVzZXJ2ZV9wYWdlczsKKwlwcmludGsoInJlc2VydmVfcGFnZXMgPSAlbGQgZmluZF9tYXhfbG93X3BmbigpIH4gJWxkXG4iLAorCQkJcmVzZXJ2ZV9wYWdlcywgbWF4X2xvd19wZm4gKyByZXNlcnZlX3BhZ2VzKTsKKwlwcmludGsoIm1heF9wZm4gPSAlbGRcbiIsIG1heF9wZm4pOworI2lmZGVmIENPTkZJR19ISUdITUVNCisJaGlnaHN0YXJ0X3BmbiA9IGhpZ2hlbmRfcGZuID0gbWF4X3BmbjsKKwlpZiAobWF4X3BmbiA+IHN5c3RlbV9tYXhfbG93X3BmbikKKwkJaGlnaHN0YXJ0X3BmbiA9IHN5c3RlbV9tYXhfbG93X3BmbjsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVsZE1CIEhJR0hNRU0gYXZhaWxhYmxlLlxuIiwKKwkgICAgICAgcGFnZXNfdG9fbWIoaGlnaGVuZF9wZm4gLSBoaWdoc3RhcnRfcGZuKSk7CisjZW5kaWYKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVsZE1CIExPV01FTSBhdmFpbGFibGUuXG4iLAorCQkJcGFnZXNfdG9fbWIoc3lzdGVtX21heF9sb3dfcGZuKSk7CisJcHJpbnRrKCJtaW5fbG93X3BmbiA9ICVsZCwgbWF4X2xvd19wZm4gPSAlbGQsIGhpZ2hzdGFydF9wZm4gPSAlbGRcbiIsIAorCQkJbWluX2xvd19wZm4sIG1heF9sb3dfcGZuLCBoaWdoc3RhcnRfcGZuKTsKKworCXByaW50aygiTG93IG1lbW9yeSBlbmRzIGF0IHZhZGRyICUwOGx4XG4iLAorCQkJKHVsb25nKSBwZm5fdG9fa2FkZHIobWF4X2xvd19wZm4pKTsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJbm9kZV9yZW1hcF9zdGFydF92YWRkcltuaWRdID0gcGZuX3RvX2thZGRyKAorCQkJKGhpZ2hzdGFydF9wZm4gKyByZXNlcnZlX3BhZ2VzKSAtIG5vZGVfcmVtYXBfb2Zmc2V0W25pZF0pOworCQlhbGxvY2F0ZV9wZ2RhdChuaWQpOworCQlwcmludGsgKCJub2RlICVkIHdpbGwgcmVtYXAgdG8gdmFkZHIgJTA4bHggLSAlMDhseFxuIiwgbmlkLAorCQkJKHVsb25nKSBub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25pZF0sCisJCQkodWxvbmcpIHBmbl90b19rYWRkcihoaWdoc3RhcnRfcGZuICsgcmVzZXJ2ZV9wYWdlcworCQkJICAgIC0gbm9kZV9yZW1hcF9vZmZzZXRbbmlkXSArIG5vZGVfcmVtYXBfc2l6ZVtuaWRdKSk7CisJfQorCXByaW50aygiSGlnaCBtZW1vcnkgc3RhcnRzIGF0IHZhZGRyICUwOGx4XG4iLAorCQkJKHVsb25nKSBwZm5fdG9fa2FkZHIoaGlnaHN0YXJ0X3BmbikpOworCXZtYWxsb2NfZWFybHlyZXNlcnZlID0gcmVzZXJ2ZV9wYWdlcyAqIFBBR0VfU0laRTsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpCisJCWZpbmRfbWF4X3Bmbl9ub2RlKG5pZCk7CisKKwltZW1zZXQoTk9ERV9EQVRBKDApLCAwLCBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisJTk9ERV9EQVRBKDApLT5iZGF0YSA9ICZub2RlMF9iZGF0YTsKKwlzZXR1cF9ib290bWVtX2FsbG9jYXRvcigpOworCXJldHVybiBtYXhfbG93X3BmbjsKK30KKwordm9pZCBfX2luaXQgem9uZV9zaXplc19pbml0KHZvaWQpCit7CisJaW50IG5pZDsKKworCS8qCisJICogSW5zZXJ0IG5vZGVzIGludG8gcGdkYXRfbGlzdCBiYWNrd2FyZCBzbyB0aGV5IGFwcGVhciBpbiBvcmRlci4KKwkgKiBDbG9iYmVyIG5vZGUgMCdzIGxpbmtzIGFuZCBOVUxMIG91dCBwZ2RhdF9saXN0IGJlZm9yZSBzdGFydGluZy4KKwkgKi8KKwlwZ2RhdF9saXN0ID0gTlVMTDsKKwlmb3IgKG5pZCA9IE1BWF9OVU1OT0RFUyAtIDE7IG5pZCA+PSAwOyBuaWQtLSkgeworCQlpZiAoIW5vZGVfb25saW5lKG5pZCkpCisJCQljb250aW51ZTsKKwkJTk9ERV9EQVRBKG5pZCktPnBnZGF0X25leHQgPSBwZ2RhdF9saXN0OworCQlwZ2RhdF9saXN0ID0gTk9ERV9EQVRBKG5pZCk7CisJfQorCisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCXVuc2lnbmVkIGxvbmcgem9uZXNfc2l6ZVtNQVhfTlJfWk9ORVNdID0gezAsIDAsIDB9OworCQl1bnNpZ25lZCBsb25nICp6aG9sZXNfc2l6ZTsKKwkJdW5zaWduZWQgaW50IG1heF9kbWE7CisKKwkJdW5zaWduZWQgbG9uZyBsb3cgPSBtYXhfbG93X3BmbjsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCA9IG5vZGVfc3RhcnRfcGZuW25pZF07CisJCXVuc2lnbmVkIGxvbmcgaGlnaCA9IG5vZGVfZW5kX3BmbltuaWRdOworCisJCW1heF9kbWEgPSB2aXJ0X3RvX3BoeXMoKGNoYXIgKilNQVhfRE1BX0FERFJFU1MpID4+IFBBR0VfU0hJRlQ7CisKKwkJaWYgKG5vZGVfaGFzX29ubGluZV9tZW0obmlkKSl7CisJCQlpZiAoc3RhcnQgPiBsb3cpIHsKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCQkJCUJVR19PTihzdGFydCA+IGhpZ2gpOworCQkJCXpvbmVzX3NpemVbWk9ORV9ISUdITUVNXSA9IGhpZ2ggLSBzdGFydDsKKyNlbmRpZgorCQkJfSBlbHNlIHsKKwkJCQlpZiAobG93IDwgbWF4X2RtYSkKKwkJCQkJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBsb3c7CisJCQkJZWxzZSB7CisJCQkJCUJVR19PTihtYXhfZG1hID4gbG93KTsKKwkJCQkJQlVHX09OKGxvdyA+IGhpZ2gpOworCQkJCQl6b25lc19zaXplW1pPTkVfRE1BXSA9IG1heF9kbWE7CisJCQkJCXpvbmVzX3NpemVbWk9ORV9OT1JNQUxdID0gbG93IC0gbWF4X2RtYTsKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCQkJCQl6b25lc19zaXplW1pPTkVfSElHSE1FTV0gPSBoaWdoIC0gbG93OworI2VuZGlmCisJCQkJfQorCQkJfQorCQl9CisKKwkJemhvbGVzX3NpemUgPSBnZXRfemhvbGVzX3NpemUobmlkKTsKKwkJLyoKKwkJICogV2UgbGV0IHRoZSBsbWVtX21hcCBmb3Igbm9kZSAwIGJlIGFsbG9jYXRlZCBmcm9tIHRoZQorCQkgKiBub3JtYWwgYm9vdG1lbSBhbGxvY2F0b3IsIGJ1dCBvdGhlciBub2RlcyBjb21lIGZyb20gdGhlCisJCSAqIHJlbWFwcGVkIEtWQSBhcmVhIC0gbWJsaWdoCisJCSAqLworCQlpZiAoIW5pZCkKKwkJCWZyZWVfYXJlYV9pbml0X25vZGUobmlkLCBOT0RFX0RBVEEobmlkKSwKKwkJCQkJem9uZXNfc2l6ZSwgc3RhcnQsIHpob2xlc19zaXplKTsKKwkJZWxzZSB7CisJCQl1bnNpZ25lZCBsb25nIGxtZW1fbWFwOworCQkJbG1lbV9tYXAgPSAodW5zaWduZWQgbG9uZylub2RlX3JlbWFwX3N0YXJ0X3ZhZGRyW25pZF07CisJCQlsbWVtX21hcCArPSBzaXplb2YocGdfZGF0YV90KSArIFBBR0VfU0laRSAtIDE7CisJCQlsbWVtX21hcCAmPSBQQUdFX01BU0s7CisJCQlOT0RFX0RBVEEobmlkKS0+bm9kZV9tZW1fbWFwID0gKHN0cnVjdCBwYWdlICopbG1lbV9tYXA7CisJCQlmcmVlX2FyZWFfaW5pdF9ub2RlKG5pZCwgTk9ERV9EQVRBKG5pZCksIHpvbmVzX3NpemUsCisJCQkJc3RhcnQsIHpob2xlc19zaXplKTsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKK3ZvaWQgX19pbml0IHNldF9oaWdobWVtX3BhZ2VzX2luaXQoaW50IGJhZF9wcHJvKSAKK3sKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCXN0cnVjdCB6b25lICp6b25lOworCisJZm9yX2VhY2hfem9uZSh6b25lKSB7CisJCXVuc2lnbmVkIGxvbmcgbm9kZV9wZm4sIG5vZGVfaGlnaF9zaXplLCB6b25lX3N0YXJ0X3BmbjsKKwkJc3RydWN0IHBhZ2UgKiB6b25lX21lbV9tYXA7CisJCQorCQlpZiAoIWlzX2hpZ2htZW0oem9uZSkpCisJCQljb250aW51ZTsKKworCQlwcmludGsoIkluaXRpYWxpemluZyAlcyBmb3Igbm9kZSAlZFxuIiwgem9uZS0+bmFtZSwKKwkJCXpvbmUtPnpvbmVfcGdkYXQtPm5vZGVfaWQpOworCisJCW5vZGVfaGlnaF9zaXplID0gem9uZS0+c3Bhbm5lZF9wYWdlczsKKwkJem9uZV9tZW1fbWFwID0gem9uZS0+em9uZV9tZW1fbWFwOworCQl6b25lX3N0YXJ0X3BmbiA9IHpvbmUtPnpvbmVfc3RhcnRfcGZuOworCisJCWZvciAobm9kZV9wZm4gPSAwOyBub2RlX3BmbiA8IG5vZGVfaGlnaF9zaXplOyBub2RlX3BmbisrKSB7CisJCQlvbmVfaGlnaHBhZ2VfaW5pdCgoc3RydWN0IHBhZ2UgKikoem9uZV9tZW1fbWFwICsgbm9kZV9wZm4pLAorCQkJCQkgIHpvbmVfc3RhcnRfcGZuICsgbm9kZV9wZm4sIGJhZF9wcHJvKTsKKwkJfQorCX0KKwl0b3RhbHJhbV9wYWdlcyArPSB0b3RhbGhpZ2hfcGFnZXM7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9leHRhYmxlLmMgYi9hcmNoL2kzODYvbW0vZXh0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDY0NDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbW0vZXh0YWJsZS5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBsaW51eC9hcmNoL2kzODYvbW0vZXh0YWJsZS5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworaW50IGZpeHVwX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpmaXh1cDsKKworI2lmZGVmIENPTkZJR19QTlBCSU9TCisJaWYgKHVubGlrZWx5KChyZWdzLT54Y3MgJiB+MTUpID09IChHRFRfRU5UUllfUE5QQklPU19CQVNFIDw8IDMpKSkKKwl7CisJCWV4dGVybiB1MzIgcG5wX2Jpb3NfZmF1bHRfZWlwLCBwbnBfYmlvc19mYXVsdF9lc3A7CisJCWV4dGVybiB1MzIgcG5wX2Jpb3NfaXNfdXR0ZXJfY3JhcDsKKwkJcG5wX2Jpb3NfaXNfdXR0ZXJfY3JhcCA9IDE7CisJCXByaW50ayhLRVJOX0NSSVQgIlBOUEJJT1MgZmF1bHQuLiBhdHRlbXB0aW5nIHJlY292ZXJ5LlxuIik7CisJCV9fYXNtX18gdm9sYXRpbGUoCisJCQkibW92bCAlMCwgJSVlc3Bcblx0IgorCQkJImptcCAqJTFcblx0IgorCQkJOiA6ICJnIiAocG5wX2Jpb3NfZmF1bHRfZXNwKSwgImciIChwbnBfYmlvc19mYXVsdF9laXApKTsKKwkJcGFuaWMoImRvX3RyYXA6IGNhbid0IGhpdCB0aGlzIik7CisJfQorI2VuZGlmCisKKwlmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHJlZ3MtPmVpcCk7CisJaWYgKGZpeHVwKSB7CisJCXJlZ3MtPmVpcCA9IGZpeHVwLT5maXh1cDsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vZmF1bHQuYyBiL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDkyMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbW0vZmF1bHQuYwpAQCAtMCwwICsxLDU1MiBAQAorLyoKKyAqICBsaW51eC9hcmNoL2kzODYvbW0vZmF1bHQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4JCS8qIEZvciB1bmJsYW5rX3NjcmVlbigpICovCisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20va2RlYnVnLmg+CisKK2V4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICosc3RydWN0IHB0X3JlZ3MgKixsb25nKTsKKworLyoKKyAqIFVubG9jayBhbnkgc3BpbmxvY2tzIHdoaWNoIHdpbGwgcHJldmVudCB1cyBmcm9tIGdldHRpbmcgdGhlCisgKiBtZXNzYWdlIG91dCAKKyAqLwordm9pZCBidXN0X3NwaW5sb2NrcyhpbnQgeWVzKQoreworCWludCBsb2dsZXZlbF9zYXZlID0gY29uc29sZV9sb2dsZXZlbDsKKworCWlmICh5ZXMpIHsKKwkJb29wc19pbl9wcm9ncmVzcyA9IDE7CisJCXJldHVybjsKKwl9CisjaWZkZWYgQ09ORklHX1ZUCisJdW5ibGFua19zY3JlZW4oKTsKKyNlbmRpZgorCW9vcHNfaW5fcHJvZ3Jlc3MgPSAwOworCS8qCisJICogT0ssIHRoZSBtZXNzYWdlIGlzIG9uIHRoZSBjb25zb2xlLiAgTm93IHdlIGNhbGwgcHJpbnRrKCkKKwkgKiB3aXRob3V0IG9vcHNfaW5fcHJvZ3Jlc3Mgc2V0IHNvIHRoYXQgcHJpbnRrIHdpbGwgZ2l2ZSBrbG9nZAorCSAqIGEgcG9rZS4gIEhvbGQgb250byB5b3VyIGhhdHMuLi4KKwkgKi8KKwljb25zb2xlX2xvZ2xldmVsID0gMTU7CQkvKiBOTUkgb29wc2VyIG1heSBoYXZlIHNodXQgdGhlIGNvbnNvbGUgdXAgKi8KKwlwcmludGsoIiAiKTsKKwljb25zb2xlX2xvZ2xldmVsID0gbG9nbGV2ZWxfc2F2ZTsKK30KKworLyoKKyAqIFJldHVybiBFSVAgcGx1cyB0aGUgQ1Mgc2VnbWVudCBiYXNlLiAgVGhlIHNlZ21lbnQgbGltaXQgaXMgYWxzbworICogYWRqdXN0ZWQsIGNsYW1wZWQgdG8gdGhlIGtlcm5lbC91c2VyIGFkZHJlc3Mgc3BhY2UgKHdoaWNoZXZlciBpcworICogYXBwcm9wcmlhdGUpLCBhbmQgcmV0dXJuZWQgaW4gKmVpcF9saW1pdC4KKyAqCisgKiBUaGUgc2VnbWVudCBpcyBjaGVja2VkLCBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IGFub3RoZXIKKyAqIHRhc2sgYmV0d2VlbiB0aGUgb3JpZ2luYWwgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24gYW5kIGhlcmUuCisgKgorICogSWYgQ1MgaXMgbm8gbG9uZ2VyIGEgdmFsaWQgY29kZSBzZWdtZW50LCBvciBpZiBFSVAgaXMgYmV5b25kIHRoZQorICogbGltaXQsIG9yIGlmIGl0IGlzIGEga2VybmVsIGFkZHJlc3Mgd2hlbiBDUyBpcyBub3QgYSBrZXJuZWwgc2VnbWVudCwKKyAqIHRoZW4gdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgZ3JlYXRlciB0aGFuICplaXBfbGltaXQuCisgKiAKKyAqIFRoaXMgaXMgc2xvdywgYnV0IGlzIHZlcnkgcmFyZWx5IGV4ZWN1dGVkLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3NlZ21lbnRfZWlwKHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyAqZWlwX2xpbWl0KQoreworCXVuc2lnbmVkIGxvbmcgZWlwID0gcmVncy0+ZWlwOworCXVuc2lnbmVkIHNlZyA9IHJlZ3MtPnhjcyAmIDB4ZmZmZjsKKwl1MzIgc2VnX2FyLCBzZWdfbGltaXQsIGJhc2UsICpkZXNjOworCisJLyogVGhlIHN0YW5kYXJkIGtlcm5lbC91c2VyIGFkZHJlc3Mgc3BhY2UgbGltaXQuICovCisJKmVpcF9saW1pdCA9IChzZWcgJiAzKSA/IFVTRVJfRFMuc2VnIDogS0VSTkVMX0RTLnNlZzsKKworCS8qIFVubGlrZWx5LCBidXQgbXVzdCBjb21lIGJlZm9yZSBzZWdtZW50IGNoZWNrcy4gKi8KKwlpZiAodW5saWtlbHkoKHJlZ3MtPmVmbGFncyAmIFZNX01BU0spICE9IDApKQorCQlyZXR1cm4gZWlwICsgKHNlZyA8PCA0KTsKKwkKKwkvKiBCeSBmYXIgdGhlIG1vc3QgY29tbW9uIGNhc2VzLiAqLworCWlmIChsaWtlbHkoc2VnID09IF9fVVNFUl9DUyB8fCBzZWcgPT0gX19LRVJORUxfQ1MpKQorCQlyZXR1cm4gZWlwOworCisJLyogQ2hlY2sgdGhlIHNlZ21lbnQgZXhpc3RzLCBpcyB3aXRoaW4gdGhlIGN1cnJlbnQgTERUL0dEVCBzaXplLAorCSAgIHRoYXQga2VybmVsL3VzZXIgKHJpbmcgMC4uMykgaGFzIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2UsCisJICAgdGhhdCBpdCdzIGEgY29kZSBzZWdtZW50LCBhbmQgZ2V0IHRoZSBsaW1pdC4gKi8KKwlfX2FzbV9fICgibGFybCAlMywlMDsgbHNsbCAlMywlMSIKKwkJIDogIj0mciIgKHNlZ19hciksICI9ciIgKHNlZ19saW1pdCkgOiAiMCIgKDApLCAicm0iIChzZWcpKTsKKwlpZiAoKH5zZWdfYXIgJiAweDk4MDApIHx8IGVpcCA+IHNlZ19saW1pdCkgeworCQkqZWlwX2xpbWl0ID0gMDsKKwkJcmV0dXJuIDE7CSAvKiBTbyB0aGF0IHJldHVybmVkIGVpcCA+ICplaXBfbGltaXQuICovCisJfQorCisJLyogR2V0IHRoZSBHRFQvTERUIGRlc2NyaXB0b3IgYmFzZS4gCisJICAgV2hlbiB5b3UgbG9vayBmb3IgcmFjZXMgaW4gdGhpcyBjb2RlIHJlbWVtYmVyIHRoYXQKKwkgICBMRFQgYW5kIG90aGVyIGhvcnJvcnMgYXJlIG9ubHkgdXNlZCBpbiB1c2VyIHNwYWNlLiAqLworCWlmIChzZWcgJiAoMTw8MikpIHsKKwkJLyogTXVzdCBsb2NrIHRoZSBMRFQgd2hpbGUgcmVhZGluZyBpdC4gKi8KKwkJZG93bigmY3VycmVudC0+bW0tPmNvbnRleHQuc2VtKTsKKwkJZGVzYyA9IGN1cnJlbnQtPm1tLT5jb250ZXh0LmxkdDsKKwkJZGVzYyA9ICh2b2lkICopZGVzYyArIChzZWcgJiB+Nyk7CisJfSBlbHNlIHsKKwkJLyogTXVzdCBkaXNhYmxlIHByZWVtcHRpb24gd2hpbGUgcmVhZGluZyB0aGUgR0RULiAqLworCQlkZXNjID0gKHUzMiAqKSZwZXJfY3B1KGNwdV9nZHRfdGFibGUsIGdldF9jcHUoKSk7CisJCWRlc2MgPSAodm9pZCAqKWRlc2MgKyAoc2VnICYgfjcpOworCX0KKworCS8qIERlY29kZSB0aGUgY29kZSBzZWdtZW50IGJhc2UgZnJvbSB0aGUgZGVzY3JpcHRvciAqLworCWJhc2UgPSBnZXRfZGVzY19iYXNlKCh1bnNpZ25lZCBsb25nICopZGVzYyk7CisKKwlpZiAoc2VnICYgKDE8PDIpKSB7IAorCQl1cCgmY3VycmVudC0+bW0tPmNvbnRleHQuc2VtKTsKKwl9IGVsc2UKKwkJcHV0X2NwdSgpOworCisJLyogQWRqdXN0IEVJUCBhbmQgc2VnbWVudCBsaW1pdCwgYW5kIGNsYW1wIGF0IHRoZSBrZXJuZWwgbGltaXQuCisJICAgSXQncyBsZWdpdGltYXRlIGZvciBzZWdtZW50cyB0byB3cmFwIGF0IDB4ZmZmZmZmZmYuICovCisJc2VnX2xpbWl0ICs9IGJhc2U7CisJaWYgKHNlZ19saW1pdCA8ICplaXBfbGltaXQgJiYgc2VnX2xpbWl0ID49IGJhc2UpCisJCSplaXBfbGltaXQgPSBzZWdfbGltaXQ7CisJcmV0dXJuIGVpcCArIGJhc2U7Cit9CisKKy8qIAorICogU29tZXRpbWVzIEFNRCBBdGhsb24vT3B0ZXJvbiBDUFVzIHJlcG9ydCBpbnZhbGlkIGV4Y2VwdGlvbnMgb24gcHJlZmV0Y2guCisgKiBDaGVjayB0aGF0IGhlcmUgYW5kIGlnbm9yZSBpdC4KKyAqLworc3RhdGljIGludCBfX2lzX3ByZWZldGNoKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7IAorCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisJdW5zaWduZWQgbG9uZyBpbnN0ciA9IGdldF9zZWdtZW50X2VpcCAocmVncywgJmxpbWl0KTsKKwlpbnQgc2Nhbl9tb3JlID0gMTsKKwlpbnQgcHJlZmV0Y2ggPSAwOyAKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHNjYW5fbW9yZSAmJiBpIDwgMTU7IGkrKykgeyAKKwkJdW5zaWduZWQgY2hhciBvcGNvZGU7CisJCXVuc2lnbmVkIGNoYXIgaW5zdHJfaGk7CisJCXVuc2lnbmVkIGNoYXIgaW5zdHJfbG87CisKKwkJaWYgKGluc3RyID4gbGltaXQpCisJCQlicmVhazsKKwkJaWYgKF9fZ2V0X3VzZXIob3Bjb2RlLCAodW5zaWduZWQgY2hhciAqKSBpbnN0cikpCisJCQlicmVhazsgCisKKwkJaW5zdHJfaGkgPSBvcGNvZGUgJiAweGYwOyAKKwkJaW5zdHJfbG8gPSBvcGNvZGUgJiAweDBmOyAKKwkJaW5zdHIrKzsKKworCQlzd2l0Y2ggKGluc3RyX2hpKSB7IAorCQljYXNlIDB4MjA6CisJCWNhc2UgMHgzMDoKKwkJCS8qIFZhbHVlcyAweDI2LDB4MkUsMHgzNiwweDNFIGFyZSB2YWxpZCB4ODYgcHJlZml4ZXMuICovCisJCQlzY2FuX21vcmUgPSAoKGluc3RyX2xvICYgNykgPT0gMHg2KTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgMHg2MDoKKwkJCS8qIDB4NjQgdGhydSAweDY3IGFyZSB2YWxpZCBwcmVmaXhlcyBpbiBhbGwgbW9kZXMuICovCisJCQlzY2FuX21vcmUgPSAoaW5zdHJfbG8gJiAweEMpID09IDB4NDsKKwkJCWJyZWFrOwkJCisJCWNhc2UgMHhGMDoKKwkJCS8qIDB4RjAsIDB4RjIsIGFuZCAweEYzIGFyZSB2YWxpZCBwcmVmaXhlcyAqLworCQkJc2Nhbl9tb3JlID0gIWluc3RyX2xvIHx8IChpbnN0cl9sbz4+MSkgPT0gMTsKKwkJCWJyZWFrOwkJCQorCQljYXNlIDB4MDA6CisJCQkvKiBQcmVmZXRjaCBpbnN0cnVjdGlvbiBpcyAweDBGMEQgb3IgMHgwRjE4ICovCisJCQlzY2FuX21vcmUgPSAwOworCQkJaWYgKGluc3RyID4gbGltaXQpCisJCQkJYnJlYWs7CisJCQlpZiAoX19nZXRfdXNlcihvcGNvZGUsICh1bnNpZ25lZCBjaGFyICopIGluc3RyKSkgCisJCQkJYnJlYWs7CisJCQlwcmVmZXRjaCA9IChpbnN0cl9sbyA9PSAweEYpICYmCisJCQkJKG9wY29kZSA9PSAweDBEIHx8IG9wY29kZSA9PSAweDE4KTsKKwkJCWJyZWFrOwkJCQorCQlkZWZhdWx0OgorCQkJc2Nhbl9tb3JlID0gMDsKKwkJCWJyZWFrOworCQl9IAorCX0KKwlyZXR1cm4gcHJlZmV0Y2g7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3ByZWZldGNoKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCit7CisJaWYgKHVubGlrZWx5KGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCAmJgorCQkgICAgIGJvb3RfY3B1X2RhdGEueDg2ID49IDYpKSB7CisJCS8qIENhdGNoIGFuIG9ic2N1cmUgY2FzZSBvZiBwcmVmZXRjaCBpbnNpZGUgYW4gTlggcGFnZS4gKi8KKwkJaWYgKG54X2VuYWJsZWQgJiYgKGVycm9yX2NvZGUgJiAxNikpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIF9faXNfcHJlZmV0Y2gocmVncywgYWRkcik7CisJfQorCXJldHVybiAwOworfSAKKworZmFzdGNhbGwgdm9pZCBkb19pbnZhbGlkX29wKHN0cnVjdCBwdF9yZWdzICosIHVuc2lnbmVkIGxvbmcpOworCisvKgorICogVGhpcyByb3V0aW5lIGhhbmRsZXMgcGFnZSBmYXVsdHMuICBJdCBkZXRlcm1pbmVzIHRoZSBhZGRyZXNzLAorICogYW5kIHRoZSBwcm9ibGVtLCBhbmQgdGhlbiBwYXNzZXMgaXQgb2ZmIHRvIG9uZSBvZiB0aGUgYXBwcm9wcmlhdGUKKyAqIHJvdXRpbmVzLgorICoKKyAqIGVycm9yX2NvZGU6CisgKgliaXQgMCA9PSAwIG1lYW5zIG5vIHBhZ2UgZm91bmQsIDEgbWVhbnMgcHJvdGVjdGlvbiBmYXVsdAorICoJYml0IDEgPT0gMCBtZWFucyByZWFkLCAxIG1lYW5zIHdyaXRlCisgKgliaXQgMiA9PSAwIG1lYW5zIGtlcm5lbCwgMSBtZWFucyB1c2VyLW1vZGUKKyAqLworZmFzdGNhbGwgdm9pZCBkb19wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJaW50IHdyaXRlOworCXNpZ2luZm9fdCBpbmZvOworCisJLyogZ2V0IHRoZSBhZGRyZXNzICovCisJX19hc21fXygibW92bCAlJWNyMiwlMCI6Ij1yIiAoYWRkcmVzcykpOworCisJaWYgKG5vdGlmeV9kaWUoRElFX1BBR0VfRkFVTFQsICJwYWdlIGZhdWx0IiwgcmVncywgZXJyb3JfY29kZSwgMTQsCisJCQkJCVNJR1NFR1YpID09IE5PVElGWV9TVE9QKQorCQlyZXR1cm47CisJLyogSXQncyBzYWZlIHRvIGFsbG93IGlycSdzIGFmdGVyIGNyMiBoYXMgYmVlbiBzYXZlZCAqLworCWlmIChyZWdzLT5lZmxhZ3MgJiAoWDg2X0VGTEFHU19JRnxWTV9NQVNLKSkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJdHNrID0gY3VycmVudDsKKworCWluZm8uc2lfY29kZSA9IFNFR1ZfTUFQRVJSOworCisJLyoKKwkgKiBXZSBmYXVsdC1pbiBrZXJuZWwtc3BhY2UgdmlydHVhbCBtZW1vcnkgb24tZGVtYW5kLiBUaGUKKwkgKiAncmVmZXJlbmNlJyBwYWdlIHRhYmxlIGlzIGluaXRfbW0ucGdkLgorCSAqCisJICogTk9URSEgV2UgTVVTVCBOT1QgdGFrZSBhbnkgbG9ja3MgZm9yIHRoaXMgY2FzZS4gV2UgbWF5CisJICogYmUgaW4gYW4gaW50ZXJydXB0IG9yIGEgY3JpdGljYWwgcmVnaW9uLCBhbmQgc2hvdWxkCisJICogb25seSBjb3B5IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtYXN0ZXIgcGFnZSB0YWJsZSwKKwkgKiBub3RoaW5nIG1vcmUuCisJICoKKwkgKiBUaGlzIHZlcmlmaWVzIHRoYXQgdGhlIGZhdWx0IGhhcHBlbnMgaW4ga2VybmVsIHNwYWNlCisJICogKGVycm9yX2NvZGUgJiA0KSA9PSAwLCBhbmQgdGhhdCB0aGUgZmF1bHQgd2FzIG5vdCBhCisJICogcHJvdGVjdGlvbiBlcnJvciAoZXJyb3JfY29kZSAmIDEpID09IDAuCisJICovCisJaWYgKHVubGlrZWx5KGFkZHJlc3MgPj0gVEFTS19TSVpFKSkgeyAKKwkJaWYgKCEoZXJyb3JfY29kZSAmIDUpKQorCQkJZ290byB2bWFsbG9jX2ZhdWx0OworCQkvKiAKKwkJICogRG9uJ3QgdGFrZSB0aGUgbW0gc2VtYXBob3JlIGhlcmUuIElmIHdlIGZpeHVwIGEgcHJlZmV0Y2gKKwkJICogZmF1bHQgd2UgY291bGQgb3RoZXJ3aXNlIGRlYWRsb2NrLgorCQkgKi8KKwkJZ290byBiYWRfYXJlYV9ub3NlbWFwaG9yZTsKKwl9IAorCisJbW0gPSB0c2stPm1tOworCisJLyoKKwkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQsIGhhdmUgbm8gdXNlciBjb250ZXh0IG9yIGFyZSBydW5uaW5nIGluIGFuCisJICogYXRvbWljIHJlZ2lvbiB0aGVuIHdlIG11c3Qgbm90IHRha2UgdGhlIGZhdWx0Li4KKwkgKi8KKwlpZiAoaW5fYXRvbWljKCkgfHwgIW1tKQorCQlnb3RvIGJhZF9hcmVhX25vc2VtYXBob3JlOworCisJLyogV2hlbiBydW5uaW5nIGluIHRoZSBrZXJuZWwgd2UgZXhwZWN0IGZhdWx0cyB0byBvY2N1ciBvbmx5IHRvCisJICogYWRkcmVzc2VzIGluIHVzZXIgc3BhY2UuICBBbGwgb3RoZXIgZmF1bHRzIHJlcHJlc2VudCBlcnJvcnMgaW4gdGhlCisJICoga2VybmVsIGFuZCBzaG91bGQgZ2VuZXJhdGUgYW4gT09QUy4gIFVuZm9ydHVuYXRseSwgaW4gdGhlIGNhc2Ugb2YgYW4KKwkgKiBlcnJvbmVvdXMgZmF1bHQgb2NjdXJpbmcgaW4gYSBjb2RlIHBhdGggd2hpY2ggYWxyZWFkeSBob2xkcyBtbWFwX3NlbQorCSAqIHdlIHdpbGwgZGVhZGxvY2sgYXR0ZW1wdGluZyB0byB2YWxpZGF0ZSB0aGUgZmF1bHQgYWdhaW5zdCB0aGUKKwkgKiBhZGRyZXNzIHNwYWNlLiAgTHVja2lseSB0aGUga2VybmVsIG9ubHkgdmFsaWRseSByZWZlcmVuY2VzIHVzZXIKKwkgKiBzcGFjZSBmcm9tIHdlbGwgZGVmaW5lZCBhcmVhcyBvZiBjb2RlLCB3aGljaCBhcmUgbGlzdGVkIGluIHRoZQorCSAqIGV4Y2VwdGlvbnMgdGFibGUuCisJICoKKwkgKiBBcyB0aGUgdmFzdCBtYWpvcml0eSBvZiBmYXVsdHMgd2lsbCBiZSB2YWxpZCB3ZSB3aWxsIG9ubHkgcGVyZm9ybQorCSAqIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGNoZWNrIHdoZW4gdGhlcmUgaXMgYSBwb3NzaWJpbHR5IG9mIGEgZGVhZGxvY2suCisJICogQXR0ZW1wdCB0byBsb2NrIHRoZSBhZGRyZXNzIHNwYWNlLCBpZiB3ZSBjYW5ub3Qgd2UgdGhlbiB2YWxpZGF0ZSB0aGUKKwkgKiBzb3VyY2UuICBJZiB0aGlzIGlzIGludmFsaWQgd2UgY2FuIHNraXAgdGhlIGFkZHJlc3Mgc3BhY2UgY2hlY2ssCisJICogdGh1cyBhdm9pZGluZyB0aGUgZGVhZGxvY2suCisJICovCisJaWYgKCFkb3duX3JlYWRfdHJ5bG9jaygmbW0tPm1tYXBfc2VtKSkgeworCQlpZiAoKGVycm9yX2NvZGUgJiA0KSA9PSAwICYmCisJCSAgICAhc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+ZWlwKSkKKwkJCWdvdG8gYmFkX2FyZWFfbm9zZW1hcGhvcmU7CisJCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwl9CisKKwl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcmVzcyk7CisJaWYgKCF2bWEpCisJCWdvdG8gYmFkX2FyZWE7CisJaWYgKHZtYS0+dm1fc3RhcnQgPD0gYWRkcmVzcykKKwkJZ290byBnb29kX2FyZWE7CisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX0dST1dTRE9XTikpCisJCWdvdG8gYmFkX2FyZWE7CisJaWYgKGVycm9yX2NvZGUgJiA0KSB7CisJCS8qCisJCSAqIGFjY2Vzc2luZyB0aGUgc3RhY2sgYmVsb3cgJWVzcCBpcyBhbHdheXMgYSBidWcuCisJCSAqIFRoZSAiKyAzMiIgaXMgdGhlcmUgZHVlIHRvIHNvbWUgaW5zdHJ1Y3Rpb25zIChsaWtlCisJCSAqIHB1c2hhKSBkb2luZyBwb3N0LWRlY3JlbWVudCBvbiB0aGUgc3RhY2sgYW5kIHRoYXQKKwkJICogZG9lc24ndCBzaG93IHVwIHVudGlsIGxhdGVyLi4KKwkJICovCisJCWlmIChhZGRyZXNzICsgMzIgPCByZWdzLT5lc3ApCisJCQlnb3RvIGJhZF9hcmVhOworCX0KKwlpZiAoZXhwYW5kX3N0YWNrKHZtYSwgYWRkcmVzcykpCisJCWdvdG8gYmFkX2FyZWE7CisvKgorICogT2ssIHdlIGhhdmUgYSBnb29kIHZtX2FyZWEgZm9yIHRoaXMgbWVtb3J5IGFjY2Vzcywgc28KKyAqIHdlIGNhbiBoYW5kbGUgaXQuLgorICovCitnb29kX2FyZWE6CisJaW5mby5zaV9jb2RlID0gU0VHVl9BQ0NFUlI7CisJd3JpdGUgPSAwOworCXN3aXRjaCAoZXJyb3JfY29kZSAmIDMpIHsKKwkJZGVmYXVsdDoJLyogMzogd3JpdGUsIHByZXNlbnQgKi8KKyNpZmRlZiBURVNUX1ZFUklGWV9BUkVBCisJCQlpZiAocmVncy0+Y3MgPT0gS0VSTkVMX0NTKQorCQkJCXByaW50aygiV1AgZmF1bHQgYXQgJTA4bHhcbiIsIHJlZ3MtPmVpcCk7CisjZW5kaWYKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIDI6CQkvKiB3cml0ZSwgbm90IHByZXNlbnQgKi8KKwkJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCQkJZ290byBiYWRfYXJlYTsKKwkJCXdyaXRlKys7CisJCQlicmVhazsKKwkJY2FzZSAxOgkJLyogcmVhZCwgcHJlc2VudCAqLworCQkJZ290byBiYWRfYXJlYTsKKwkJY2FzZSAwOgkJLyogcmVhZCwgbm90IHByZXNlbnQgKi8KKwkJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiAoVk1fUkVBRCB8IFZNX0VYRUMpKSkKKwkJCQlnb3RvIGJhZF9hcmVhOworCX0KKworIHN1cnZpdmU6CisJLyoKKwkgKiBJZiBmb3IgYW55IHJlYXNvbiBhdCBhbGwgd2UgY291bGRuJ3QgaGFuZGxlIHRoZSBmYXVsdCwKKwkgKiBtYWtlIHN1cmUgd2UgZXhpdCBncmFjZWZ1bGx5IHJhdGhlciB0aGFuIGVuZGxlc3NseSByZWRvCisJICogdGhlIGZhdWx0LgorCSAqLworCXN3aXRjaCAoaGFuZGxlX21tX2ZhdWx0KG1tLCB2bWEsIGFkZHJlc3MsIHdyaXRlKSkgeworCQljYXNlIFZNX0ZBVUxUX01JTk9SOgorCQkJdHNrLT5taW5fZmx0Kys7CisJCQlicmVhazsKKwkJY2FzZSBWTV9GQVVMVF9NQUpPUjoKKwkJCXRzay0+bWFqX2ZsdCsrOworCQkJYnJlYWs7CisJCWNhc2UgVk1fRkFVTFRfU0lHQlVTOgorCQkJZ290byBkb19zaWdidXM7CisJCWNhc2UgVk1fRkFVTFRfT09NOgorCQkJZ290byBvdXRfb2ZfbWVtb3J5OworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJfQorCisJLyoKKwkgKiBEaWQgaXQgaGl0IHRoZSBET1Mgc2NyZWVuIG1lbW9yeSBWQSBmcm9tIHZtODYgbW9kZT8KKwkgKi8KKwlpZiAocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgeworCQl1bnNpZ25lZCBsb25nIGJpdCA9IChhZGRyZXNzIC0gMHhBMDAwMCkgPj4gUEFHRV9TSElGVDsKKwkJaWYgKGJpdCA8IDMyKQorCQkJdHNrLT50aHJlYWQuc2NyZWVuX2JpdG1hcCB8PSAxIDw8IGJpdDsKKwl9CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlyZXR1cm47CisKKy8qCisgKiBTb21ldGhpbmcgdHJpZWQgdG8gYWNjZXNzIG1lbW9yeSB0aGF0IGlzbid0IGluIG91ciBtZW1vcnkgbWFwLi4KKyAqIEZpeCBpdCwgYnV0IGNoZWNrIGlmIGl0J3Mga2VybmVsIG9yIHVzZXIgZmlyc3QuLgorICovCitiYWRfYXJlYToKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCitiYWRfYXJlYV9ub3NlbWFwaG9yZToKKwkvKiBVc2VyIG1vZGUgYWNjZXNzZXMganVzdCBjYXVzZSBhIFNJR1NFR1YgKi8KKwlpZiAoZXJyb3JfY29kZSAmIDQpIHsKKwkJLyogCisJCSAqIFZhbGlkIHRvIGRvIGFub3RoZXIgcGFnZSBmYXVsdCBoZXJlIGJlY2F1c2UgdGhpcyBvbmUgY2FtZSAKKwkJICogZnJvbSB1c2VyIHNwYWNlLgorCQkgKi8KKwkJaWYgKGlzX3ByZWZldGNoKHJlZ3MsIGFkZHJlc3MsIGVycm9yX2NvZGUpKQorCQkJcmV0dXJuOworCisJCXRzay0+dGhyZWFkLmNyMiA9IGFkZHJlc3M7CisJCS8qIEtlcm5lbCBhZGRyZXNzZXMgYXJlIGFsd2F5cyBwcm90ZWN0aW9uIGZhdWx0cyAqLworCQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZSB8IChhZGRyZXNzID49IFRBU0tfU0laRSk7CisJCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxNDsKKwkJaW5mby5zaV9zaWdubyA9IFNJR1NFR1Y7CisJCWluZm8uc2lfZXJybm8gPSAwOworCQkvKiBpbmZvLnNpX2NvZGUgaGFzIGJlZW4gc2V0IGFib3ZlICovCisJCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKWFkZHJlc3M7CisJCWZvcmNlX3NpZ19pbmZvKFNJR1NFR1YsICZpbmZvLCB0c2spOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgQ09ORklHX1g4Nl9GMDBGX0JVRworCS8qCisJICogUGVudGl1bSBGMCAwRiBDNyBDOCBidWcgd29ya2Fyb3VuZC4KKwkgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS5mMDBmX2J1ZykgeworCQl1bnNpZ25lZCBsb25nIG5yOworCQkKKwkJbnIgPSAoYWRkcmVzcyAtIGlkdF9kZXNjci5hZGRyZXNzKSA+PiAzOworCisJCWlmIChuciA9PSA2KSB7CisJCQlkb19pbnZhbGlkX29wKHJlZ3MsIDApOworCQkJcmV0dXJuOworCQl9CisJfQorI2VuZGlmCisKK25vX2NvbnRleHQ6CisJLyogQXJlIHdlIHByZXBhcmVkIHRvIGhhbmRsZSB0aGlzIGtlcm5lbCBmYXVsdD8gICovCisJaWYgKGZpeHVwX2V4Y2VwdGlvbihyZWdzKSkKKwkJcmV0dXJuOworCisJLyogCisJICogVmFsaWQgdG8gZG8gYW5vdGhlciBwYWdlIGZhdWx0IGhlcmUsIGJlY2F1c2UgaWYgdGhpcyBmYXVsdAorCSAqIGhhZCBiZWVuIHRyaWdnZXJlZCBieSBpc19wcmVmZXRjaCBmaXh1cF9leGNlcHRpb24gd291bGQgaGF2ZSAKKwkgKiBoYW5kbGVkIGl0LgorCSAqLworIAlpZiAoaXNfcHJlZmV0Y2gocmVncywgYWRkcmVzcywgZXJyb3JfY29kZSkpCisgCQlyZXR1cm47CisKKy8qCisgKiBPb3BzLiBUaGUga2VybmVsIHRyaWVkIHRvIGFjY2VzcyBzb21lIGJhZCBwYWdlLiBXZSdsbCBoYXZlIHRvCisgKiB0ZXJtaW5hdGUgdGhpbmdzIHdpdGggZXh0cmVtZSBwcmVqdWRpY2UuCisgKi8KKworCWJ1c3Rfc3BpbmxvY2tzKDEpOworCisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKKwlpZiAoZXJyb3JfY29kZSAmIDE2KSB7CisJCXB0ZV90ICpwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyZXNzKTsKKworCQlpZiAocHRlICYmIHB0ZV9wcmVzZW50KCpwdGUpICYmICFwdGVfZXhlY19rZXJuZWwoKnB0ZSkpCisJCQlwcmludGsoS0VSTl9DUklUICJrZXJuZWwgdHJpZWQgdG8gZXhlY3V0ZSBOWC1wcm90ZWN0ZWQgcGFnZSAtIGV4cGxvaXQgYXR0ZW1wdD8gKHVpZDogJWQpXG4iLCBjdXJyZW50LT51aWQpOworCX0KKyNlbmRpZgorCWlmIChhZGRyZXNzIDwgUEFHRV9TSVpFKQorCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIik7CisJZWxzZQorCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QiKTsKKwlwcmludGsoIiBhdCB2aXJ0dWFsIGFkZHJlc3MgJTA4bHhcbiIsYWRkcmVzcyk7CisJcHJpbnRrKEtFUk5fQUxFUlQgIiBwcmludGluZyBlaXA6XG4iKTsKKwlwcmludGsoIiUwOGx4XG4iLCByZWdzLT5laXApOworCWFzbSgibW92bCAlJWNyMywlMCI6Ij1yIiAocGFnZSkpOworCXBhZ2UgPSAoKHVuc2lnbmVkIGxvbmcgKikgX192YShwYWdlKSlbYWRkcmVzcyA+PiAyMl07CisJcHJpbnRrKEtFUk5fQUxFUlQgIipwZGUgPSAlMDhseFxuIiwgcGFnZSk7CisJLyoKKwkgKiBXZSBtdXN0IG5vdCBkaXJlY3RseSBhY2Nlc3MgdGhlIHB0ZSBpbiB0aGUgaGlnaHB0ZQorCSAqIGNhc2UsIHRoZSBwYWdlIHRhYmxlIG1pZ2h0IGJlIGFsbG9jYXRlZCBpbiBoaWdobWVtLgorCSAqIEFuZCBsZXRzIHJhdGhlciBub3Qga21hcC1hdG9taWMgdGhlIHB0ZSwganVzdCBpbiBjYXNlCisJICogaXQncyBhbGxvY2F0ZWQgYWxyZWFkeS4KKwkgKi8KKyNpZm5kZWYgQ09ORklHX0hJR0hQVEUKKwlpZiAocGFnZSAmIDEpIHsKKwkJcGFnZSAmPSBQQUdFX01BU0s7CisJCWFkZHJlc3MgJj0gMHgwMDNmZjAwMDsKKwkJcGFnZSA9ICgodW5zaWduZWQgbG9uZyAqKSBfX3ZhKHBhZ2UpKVthZGRyZXNzID4+IFBBR0VfU0hJRlRdOworCQlwcmludGsoS0VSTl9BTEVSVCAiKnB0ZSA9ICUwOGx4XG4iLCBwYWdlKTsKKwl9CisjZW5kaWYKKwlkaWUoIk9vcHMiLCByZWdzLCBlcnJvcl9jb2RlKTsKKwlidXN0X3NwaW5sb2NrcygwKTsKKwlkb19leGl0KFNJR0tJTEwpOworCisvKgorICogV2UgcmFuIG91dCBvZiBtZW1vcnksIG9yIHNvbWUgb3RoZXIgdGhpbmcgaGFwcGVuZWQgdG8gdXMgdGhhdCBtYWRlCisgKiB1cyB1bmFibGUgdG8gaGFuZGxlIHRoZSBwYWdlIGZhdWx0IGdyYWNlZnVsbHkuCisgKi8KK291dF9vZl9tZW1vcnk6CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlpZiAodHNrLT5waWQgPT0gMSkgeworCQl5aWVsZCgpOworCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJCWdvdG8gc3Vydml2ZTsKKwl9CisJcHJpbnRrKCJWTToga2lsbGluZyBwcm9jZXNzICVzXG4iLCB0c2stPmNvbW0pOworCWlmIChlcnJvcl9jb2RlICYgNCkKKwkJZG9fZXhpdChTSUdLSUxMKTsKKwlnb3RvIG5vX2NvbnRleHQ7CisKK2RvX3NpZ2J1czoKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCisJLyogS2VybmVsIG1vZGU/IEhhbmRsZSBleGNlcHRpb25zIG9yIGRpZSAqLworCWlmICghKGVycm9yX2NvZGUgJiA0KSkKKwkJZ290byBub19jb250ZXh0OworCisJLyogVXNlciBzcGFjZSA9PiBvayB0byBkbyBhbm90aGVyIHBhZ2UgZmF1bHQgKi8KKwlpZiAoaXNfcHJlZmV0Y2gocmVncywgYWRkcmVzcywgZXJyb3JfY29kZSkpCisJCXJldHVybjsKKworCXRzay0+dGhyZWFkLmNyMiA9IGFkZHJlc3M7CisJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisJdHNrLT50aHJlYWQudHJhcF9ubyA9IDE0OworCWluZm8uc2lfc2lnbm8gPSBTSUdCVVM7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gQlVTX0FEUkVSUjsKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilhZGRyZXNzOworCWZvcmNlX3NpZ19pbmZvKFNJR0JVUywgJmluZm8sIHRzayk7CisJcmV0dXJuOworCit2bWFsbG9jX2ZhdWx0OgorCXsKKwkJLyoKKwkJICogU3luY2hyb25pemUgdGhpcyB0YXNrJ3MgdG9wIGxldmVsIHBhZ2UtdGFibGUKKwkJICogd2l0aCB0aGUgJ3JlZmVyZW5jZScgcGFnZSB0YWJsZS4KKwkJICoKKwkJICogRG8gX25vdF8gdXNlICJ0c2siIGhlcmUuIFdlIG1pZ2h0IGJlIGluc2lkZQorCQkgKiBhbiBpbnRlcnJ1cHQgaW4gdGhlIG1pZGRsZSBvZiBhIHRhc2sgc3dpdGNoLi4KKwkJICovCisJCWludCBpbmRleCA9IHBnZF9pbmRleChhZGRyZXNzKTsKKwkJdW5zaWduZWQgbG9uZyBwZ2RfcGFkZHI7CisJCXBnZF90ICpwZ2QsICpwZ2RfazsKKwkJcHVkX3QgKnB1ZCwgKnB1ZF9rOworCQlwbWRfdCAqcG1kLCAqcG1kX2s7CisJCXB0ZV90ICpwdGVfazsKKworCQlhc20oIm1vdmwgJSVjcjMsJTAiOiI9ciIgKHBnZF9wYWRkcikpOworCQlwZ2QgPSBpbmRleCArIChwZ2RfdCAqKV9fdmEocGdkX3BhZGRyKTsKKwkJcGdkX2sgPSBpbml0X21tLnBnZCArIGluZGV4OworCisJCWlmICghcGdkX3ByZXNlbnQoKnBnZF9rKSkKKwkJCWdvdG8gbm9fY29udGV4dDsKKworCQkvKgorCQkgKiBzZXRfcGdkKHBnZCwgKnBnZF9rKTsgaGVyZSB3b3VsZCBiZSB1c2VsZXNzIG9uIFBBRQorCQkgKiBhbmQgcmVkdW5kYW50IHdpdGggdGhlIHNldF9wbWQoKSBvbiBub24tUEFFLiBBcyB3b3VsZAorCQkgKiBzZXRfcHVkLgorCQkgKi8KKworCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcmVzcyk7CisJCXB1ZF9rID0gcHVkX29mZnNldChwZ2RfaywgYWRkcmVzcyk7CisJCWlmICghcHVkX3ByZXNlbnQoKnB1ZF9rKSkKKwkJCWdvdG8gbm9fY29udGV4dDsKKwkJCisJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKTsKKwkJcG1kX2sgPSBwbWRfb2Zmc2V0KHB1ZF9rLCBhZGRyZXNzKTsKKwkJaWYgKCFwbWRfcHJlc2VudCgqcG1kX2spKQorCQkJZ290byBub19jb250ZXh0OworCQlzZXRfcG1kKHBtZCwgKnBtZF9rKTsKKworCQlwdGVfayA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZF9rLCBhZGRyZXNzKTsKKwkJaWYgKCFwdGVfcHJlc2VudCgqcHRlX2spKQorCQkJZ290byBub19jb250ZXh0OworCQlyZXR1cm47CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2hpZ2htZW0uYyBiL2FyY2gvaTM4Ni9tbS9oaWdobWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0YzRjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tbS9oaWdobWVtLmMKQEAgLTAsMCArMSw4OSBAQAorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKwordm9pZCAqa21hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwltaWdodF9zbGVlcCgpOworCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpCisJCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7CisJcmV0dXJuIGttYXBfaGlnaChwYWdlKTsKK30KKwordm9pZCBrdW5tYXAoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlCVUcoKTsKKwlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKQorCQlyZXR1cm47CisJa3VubWFwX2hpZ2gocGFnZSk7Cit9CisKKy8qCisgKiBrbWFwX2F0b21pYy9rdW5tYXBfYXRvbWljIGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4ga21hcC9rdW5tYXAgYmVjYXVzZQorICogbm8gZ2xvYmFsIGxvY2sgaXMgbmVlZGVkIGFuZCBiZWNhdXNlIHRoZSBrbWFwIGNvZGUgbXVzdCBwZXJmb3JtIGEgZ2xvYmFsIFRMQgorICogaW52YWxpZGF0aW9uIHdoZW4gdGhlIGttYXAgcG9vbCB3cmFwcy4KKyAqCisgKiBIb3dldmVyIHdoZW4gaG9sZGluZyBhbiBhdG9taWMga21hcCBpcyBpcyBub3QgbGVnYWwgdG8gc2xlZXAsIHNvIGF0b21pYworICoga21hcHMgYXJlIGFwcHJvcHJpYXRlIGZvciBzaG9ydCwgdGlnaHQgY29kZSBwYXRocyBvbmx5LgorICovCit2b2lkICprbWFwX2F0b21pYyhzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBrbV90eXBlIHR5cGUpCit7CisJZW51bSBmaXhlZF9hZGRyZXNzZXMgaWR4OworCXVuc2lnbmVkIGxvbmcgdmFkZHI7CisKKwkvKiBldmVuICFDT05GSUdfUFJFRU1QVCBuZWVkcyB0aGlzLCBmb3IgaW5fYXRvbWljIGluIGRvX3BhZ2VfZmF1bHQgKi8KKwlpbmNfcHJlZW1wdF9jb3VudCgpOworCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpCisJCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwlpZHggPSB0eXBlICsgS01fVFlQRV9OUipzbXBfcHJvY2Vzc29yX2lkKCk7CisJdmFkZHIgPSBfX2ZpeF90b192aXJ0KEZJWF9LTUFQX0JFR0lOICsgaWR4KTsKKyNpZmRlZiBDT05GSUdfREVCVUdfSElHSE1FTQorCWlmICghcHRlX25vbmUoKihrbWFwX3B0ZS1pZHgpKSkKKwkJQlVHKCk7CisjZW5kaWYKKwlzZXRfcHRlKGttYXBfcHRlLWlkeCwgbWtfcHRlKHBhZ2UsIGttYXBfcHJvdCkpOworCV9fZmx1c2hfdGxiX29uZSh2YWRkcik7CisKKwlyZXR1cm4gKHZvaWQqKSB2YWRkcjsKK30KKwordm9pZCBrdW5tYXBfYXRvbWljKHZvaWQgKmt2YWRkciwgZW51bSBrbV90eXBlIHR5cGUpCit7CisjaWZkZWYgQ09ORklHX0RFQlVHX0hJR0hNRU0KKwl1bnNpZ25lZCBsb25nIHZhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGt2YWRkciAmIFBBR0VfTUFTSzsKKwllbnVtIGZpeGVkX2FkZHJlc3NlcyBpZHggPSB0eXBlICsgS01fVFlQRV9OUipzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAodmFkZHIgPCBGSVhBRERSX1NUQVJUKSB7IC8vIEZJWE1FCisJCWRlY19wcmVlbXB0X2NvdW50KCk7CisJCXByZWVtcHRfY2hlY2tfcmVzY2hlZCgpOworCQlyZXR1cm47CisJfQorCisJaWYgKHZhZGRyICE9IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4raWR4KSkKKwkJQlVHKCk7CisKKwkvKgorCSAqIGZvcmNlIG90aGVyIG1hcHBpbmdzIHRvIE9vcHMgaWYgdGhleSdsbCB0cnkgdG8gYWNjZXNzCisJICogdGhpcyBwdGUgd2l0aG91dCBmaXJzdCByZW1hcCBpdAorCSAqLworCXB0ZV9jbGVhcigmaW5pdF9tbSwgdmFkZHIsIGttYXBfcHRlLWlkeCk7CisJX19mbHVzaF90bGJfb25lKHZhZGRyKTsKKyNlbmRpZgorCisJZGVjX3ByZWVtcHRfY291bnQoKTsKKwlwcmVlbXB0X2NoZWNrX3Jlc2NoZWQoKTsKK30KKworc3RydWN0IHBhZ2UgKmttYXBfYXRvbWljX3RvX3BhZ2Uodm9pZCAqcHRyKQoreworCXVuc2lnbmVkIGxvbmcgaWR4LCB2YWRkciA9ICh1bnNpZ25lZCBsb25nKXB0cjsKKwlwdGVfdCAqcHRlOworCisJaWYgKHZhZGRyIDwgRklYQUREUl9TVEFSVCkKKwkJcmV0dXJuIHZpcnRfdG9fcGFnZShwdHIpOworCisJaWR4ID0gdmlydF90b19maXgodmFkZHIpOworCXB0ZSA9IGttYXBfcHRlIC0gKGlkeCAtIEZJWF9LTUFQX0JFR0lOKTsKKwlyZXR1cm4gcHRlX3BhZ2UoKnB0ZSk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9pMzg2L21tL2h1Z2V0bGJwYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjNDUxNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tbS9odWdldGxicGFnZS5jCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogSUEtMzIgSHVnZSBUTEIgUGFnZSBTdXBwb3J0IGZvciBLZXJuZWwuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCBSb2hpdCBTZXRoIDxyb2hpdC5zZXRoQGludGVsLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGFzbS9tbWFuLmg+CisjaW5jbHVkZSA8YXNtL3RsYi5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCitzdGF0aWMgcHRlX3QgKmh1Z2VfcHRlX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcGdkX3QgKnBnZDsKKwlwdWRfdCAqcHVkOworCXBtZF90ICpwbWQgPSBOVUxMOworCisJcGdkID0gcGdkX29mZnNldChtbSwgYWRkcik7CisJcHVkID0gcHVkX2FsbG9jKG1tLCBwZ2QsIGFkZHIpOworCXBtZCA9IHBtZF9hbGxvYyhtbSwgcHVkLCBhZGRyKTsKKwlyZXR1cm4gKHB0ZV90ICopIHBtZDsKK30KKworc3RhdGljIHB0ZV90ICpodWdlX3B0ZV9vZmZzZXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZCA9IE5VTEw7CisKKwlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKTsKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7CisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworCXJldHVybiAocHRlX3QgKikgcG1kOworfQorCitzdGF0aWMgdm9pZCBzZXRfaHVnZV9wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgcHRlX3QgKiBwYWdlX3RhYmxlLCBpbnQgd3JpdGVfYWNjZXNzKQoreworCXB0ZV90IGVudHJ5OworCisJYWRkX21tX2NvdW50ZXIobW0sIHJzcywgSFBBR0VfU0laRSAvIFBBR0VfU0laRSk7CisJaWYgKHdyaXRlX2FjY2VzcykgeworCQllbnRyeSA9CisJCSAgICBwdGVfbWt3cml0ZShwdGVfbWtkaXJ0eShta19wdGUocGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpKSk7CisJfSBlbHNlCisJCWVudHJ5ID0gcHRlX3dycHJvdGVjdChta19wdGUocGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpKTsKKwllbnRyeSA9IHB0ZV9ta3lvdW5nKGVudHJ5KTsKKwlta19wdGVfaHVnZShlbnRyeSk7CisJc2V0X3B0ZShwYWdlX3RhYmxlLCBlbnRyeSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgcHJvcGVyIGFsaWdubWVudCBvZiBpbnB1dCBhZGRyIGFuZCBsZW4gcGFyYW1ldGVycy4KKyAqLworaW50IGlzX2FsaWduZWRfaHVnZXBhZ2VfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlpZiAobGVuICYgfkhQQUdFX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCWlmIChhZGRyICYgfkhQQUdFX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitpbnQgY29weV9odWdldGxiX3BhZ2VfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqZHN0LCBzdHJ1Y3QgbW1fc3RydWN0ICpzcmMsCisJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlwdGVfdCAqc3JjX3B0ZSwgKmRzdF9wdGUsIGVudHJ5OworCXN0cnVjdCBwYWdlICpwdGVwYWdlOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBlbmQgPSB2bWEtPnZtX2VuZDsKKworCXdoaWxlIChhZGRyIDwgZW5kKSB7CisJCWRzdF9wdGUgPSBodWdlX3B0ZV9hbGxvYyhkc3QsIGFkZHIpOworCQlpZiAoIWRzdF9wdGUpCisJCQlnb3RvIG5vbWVtOworCQlzcmNfcHRlID0gaHVnZV9wdGVfb2Zmc2V0KHNyYywgYWRkcik7CisJCWVudHJ5ID0gKnNyY19wdGU7CisJCXB0ZXBhZ2UgPSBwdGVfcGFnZShlbnRyeSk7CisJCWdldF9wYWdlKHB0ZXBhZ2UpOworCQlzZXRfcHRlKGRzdF9wdGUsIGVudHJ5KTsKKwkJYWRkX21tX2NvdW50ZXIoZHN0LCByc3MsIEhQQUdFX1NJWkUgLyBQQUdFX1NJWkUpOworCQlhZGRyICs9IEhQQUdFX1NJWkU7CisJfQorCXJldHVybiAwOworCitub21lbToKKwlyZXR1cm4gLUVOT01FTTsKK30KKworaW50Citmb2xsb3dfaHVnZXRsYl9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXMsCisJCSAgICB1bnNpZ25lZCBsb25nICpwb3NpdGlvbiwgaW50ICpsZW5ndGgsIGludCBpKQoreworCXVuc2lnbmVkIGxvbmcgdnBmbiwgdmFkZHIgPSAqcG9zaXRpb247CisJaW50IHJlbWFpbmRlciA9ICpsZW5ndGg7CisKKwlXQVJOX09OKCFpc192bV9odWdldGxiX3BhZ2Uodm1hKSk7CisKKwl2cGZuID0gdmFkZHIvUEFHRV9TSVpFOworCXdoaWxlICh2YWRkciA8IHZtYS0+dm1fZW5kICYmIHJlbWFpbmRlcikgeworCisJCWlmIChwYWdlcykgeworCQkJcHRlX3QgKnB0ZTsKKwkJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCQlwdGUgPSBodWdlX3B0ZV9vZmZzZXQobW0sIHZhZGRyKTsKKworCQkJLyogaHVnZXRsYiBzaG91bGQgYmUgbG9ja2VkLCBhbmQgaGVuY2UsIHByZWZhdWx0ZWQgKi8KKwkJCVdBUk5fT04oIXB0ZSB8fCBwdGVfbm9uZSgqcHRlKSk7CisKKwkJCXBhZ2UgPSAmcHRlX3BhZ2UoKnB0ZSlbdnBmbiAlIChIUEFHRV9TSVpFL1BBR0VfU0laRSldOworCisJCQlXQVJOX09OKCFQYWdlQ29tcG91bmQocGFnZSkpOworCisJCQlnZXRfcGFnZShwYWdlKTsKKwkJCXBhZ2VzW2ldID0gcGFnZTsKKwkJfQorCisJCWlmICh2bWFzKQorCQkJdm1hc1tpXSA9IHZtYTsKKworCQl2YWRkciArPSBQQUdFX1NJWkU7CisJCSsrdnBmbjsKKwkJLS1yZW1haW5kZXI7CisJCSsraTsKKwl9CisKKwkqbGVuZ3RoID0gcmVtYWluZGVyOworCSpwb3NpdGlvbiA9IHZhZGRyOworCisJcmV0dXJuIGk7Cit9CisKKyNpZiAwCS8qIFRoaXMgaXMganVzdCBmb3IgdGVzdGluZyAqLworc3RydWN0IHBhZ2UgKgorZm9sbG93X2h1Z2VfYWRkcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgd3JpdGUpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IGFkZHJlc3M7CisJaW50IGxlbmd0aCA9IDE7CisJaW50IG5yOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCisJdm1hID0gZmluZF92bWEobW0sIGFkZHIpOworCWlmICghdm1hIHx8ICFpc192bV9odWdldGxiX3BhZ2Uodm1hKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlwdGUgPSBodWdlX3B0ZV9vZmZzZXQobW0sIGFkZHJlc3MpOworCisJLyogaHVnZXRsYiBzaG91bGQgYmUgbG9ja2VkLCBhbmQgaGVuY2UsIHByZWZhdWx0ZWQgKi8KKwlXQVJOX09OKCFwdGUgfHwgcHRlX25vbmUoKnB0ZSkpOworCisJcGFnZSA9ICZwdGVfcGFnZSgqcHRlKVt2cGZuICUgKEhQQUdFX1NJWkUvUEFHRV9TSVpFKV07CisKKwlXQVJOX09OKCFQYWdlQ29tcG91bmQocGFnZSkpOworCisJcmV0dXJuIHBhZ2U7Cit9CisKK2ludCBwbWRfaHVnZShwbWRfdCBwbWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwYWdlICoKK2ZvbGxvd19odWdlX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQlwbWRfdCAqcG1kLCBpbnQgd3JpdGUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKyNlbHNlCisKK3N0cnVjdCBwYWdlICoKK2ZvbGxvd19odWdlX2FkZHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IHdyaXRlKQoreworCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworfQorCitpbnQgcG1kX2h1Z2UocG1kX3QgcG1kKQoreworCXJldHVybiAhIShwbWRfdmFsKHBtZCkgJiBfUEFHRV9QU0UpOworfQorCitzdHJ1Y3QgcGFnZSAqCitmb2xsb3dfaHVnZV9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJcG1kX3QgKnBtZCwgaW50IHdyaXRlKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJcGFnZSA9IHB0ZV9wYWdlKCoocHRlX3QgKilwbWQpOworCWlmIChwYWdlKQorCQlwYWdlICs9ICgoYWRkcmVzcyAmIH5IUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUKTsKKwlyZXR1cm4gcGFnZTsKK30KKyNlbmRpZgorCit2b2lkIHVubWFwX2h1Z2VwYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCXB0ZV90IHB0ZSwgKnB0ZXA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlCVUdfT04oc3RhcnQgJiAoSFBBR0VfU0laRSAtIDEpKTsKKwlCVUdfT04oZW5kICYgKEhQQUdFX1NJWkUgLSAxKSk7CisKKwlmb3IgKGFkZHJlc3MgPSBzdGFydDsgYWRkcmVzcyA8IGVuZDsgYWRkcmVzcyArPSBIUEFHRV9TSVpFKSB7CisJCXB0ZXAgPSBodWdlX3B0ZV9vZmZzZXQobW0sIGFkZHJlc3MpOworCQlpZiAoIXB0ZXApCisJCQljb250aW51ZTsKKwkJcHRlID0gcHRlcF9nZXRfYW5kX2NsZWFyKG1tLCBhZGRyZXNzLCBwdGVwKTsKKwkJaWYgKHB0ZV9ub25lKHB0ZSkpCisJCQljb250aW51ZTsKKwkJcGFnZSA9IHB0ZV9wYWdlKHB0ZSk7CisJCXB1dF9wYWdlKHBhZ2UpOworCX0KKwlhZGRfbW1fY291bnRlcihtbSAscnNzLCAtKChlbmQgLSBzdGFydCkgPj4gUEFHRV9TSElGVCkpOworCWZsdXNoX3RsYl9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpOworfQorCitpbnQgaHVnZXRsYl9wcmVmYXVsdChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IHJldCA9IDA7CisKKwlCVUdfT04odm1hLT52bV9zdGFydCAmIH5IUEFHRV9NQVNLKTsKKwlCVUdfT04odm1hLT52bV9lbmQgJiB+SFBBR0VfTUFTSyk7CisKKwlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCWZvciAoYWRkciA9IHZtYS0+dm1fc3RhcnQ7IGFkZHIgPCB2bWEtPnZtX2VuZDsgYWRkciArPSBIUEFHRV9TSVpFKSB7CisJCXVuc2lnbmVkIGxvbmcgaWR4OworCQlwdGVfdCAqcHRlID0gaHVnZV9wdGVfYWxsb2MobW0sIGFkZHIpOworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQlpZiAoIXB0ZSkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKCFwdGVfbm9uZSgqcHRlKSkgeworCQkJcG1kX3QgKnBtZCA9IChwbWRfdCAqKSBwdGU7CisKKwkJCXBhZ2UgPSBwbWRfcGFnZSgqcG1kKTsKKwkJCXBtZF9jbGVhcihwbWQpOworCQkJbW0tPm5yX3B0ZXMtLTsKKwkJCWRlY19wYWdlX3N0YXRlKG5yX3BhZ2VfdGFibGVfcGFnZXMpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQl9CisKKwkJaWR4ID0gKChhZGRyIC0gdm1hLT52bV9zdGFydCkgPj4gSFBBR0VfU0hJRlQpCisJCQkrICh2bWEtPnZtX3Bnb2ZmID4+IChIUEFHRV9TSElGVCAtIFBBR0VfU0hJRlQpKTsKKwkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UobWFwcGluZywgaWR4KTsKKwkJaWYgKCFwYWdlKSB7CisJCQkvKiBjaGFyZ2UgdGhlIGZzIHF1b3RhIGZpcnN0ICovCisJCQlpZiAoaHVnZXRsYl9nZXRfcXVvdGEobWFwcGluZykpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcGFnZSA9IGFsbG9jX2h1Z2VfcGFnZSgpOworCQkJaWYgKCFwYWdlKSB7CisJCQkJaHVnZXRsYl9wdXRfcXVvdGEobWFwcGluZyk7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJldCA9IGFkZF90b19wYWdlX2NhY2hlKHBhZ2UsIG1hcHBpbmcsIGlkeCwgR0ZQX0FUT01JQyk7CisJCQlpZiAoISByZXQpIHsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCX0gZWxzZSB7CisJCQkJaHVnZXRsYl9wdXRfcXVvdGEobWFwcGluZyk7CisJCQkJZnJlZV9odWdlX3BhZ2UocGFnZSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJc2V0X2h1Z2VfcHRlKG1tLCB2bWEsIHBhZ2UsIHB0ZSwgdm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKTsKKwl9CitvdXQ6CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qIHg4Nl82NCBhbHNvIHVzZXMgdGhpcyBmaWxlICovCisKKyNpZmRlZiBIQVZFX0FSQ0hfSFVHRVRMQl9VTk1BUFBFRF9BUkVBCitzdGF0aWMgdW5zaWduZWQgbG9uZyBodWdldGxiX2dldF91bm1hcHBlZF9hcmVhX2JvdHRvbXVwKHN0cnVjdCBmaWxlICpmaWxlLAorCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQl1bnNpZ25lZCBsb25nIHBnb2ZmLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOworCisJc3RhcnRfYWRkciA9IG1tLT5mcmVlX2FyZWFfY2FjaGU7CisKK2Z1bGxfc2VhcmNoOgorCWFkZHIgPSBBTElHTihzdGFydF9hZGRyLCBIUEFHRV9TSVpFKTsKKworCWZvciAodm1hID0gZmluZF92bWEobW0sIGFkZHIpOyA7IHZtYSA9IHZtYS0+dm1fbmV4dCkgeworCQkvKiBBdCB0aGlzIHBvaW50OiAgKCF2bWEgfHwgYWRkciA8IHZtYS0+dm1fZW5kKS4gKi8KKwkJaWYgKFRBU0tfU0laRSAtIGxlbiA8IGFkZHIpIHsKKwkJCS8qCisJCQkgKiBTdGFydCBhIG5ldyBzZWFyY2ggLSBqdXN0IGluIGNhc2Ugd2UgbWlzc2VkCisJCQkgKiBzb21lIGhvbGVzLgorCQkJICovCisJCQlpZiAoc3RhcnRfYWRkciAhPSBUQVNLX1VOTUFQUEVEX0JBU0UpIHsKKwkJCQlzdGFydF9hZGRyID0gVEFTS19VTk1BUFBFRF9CQVNFOworCQkJCWdvdG8gZnVsbF9zZWFyY2g7CisJCQl9CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlpZiAoIXZtYSB8fCBhZGRyICsgbGVuIDw9IHZtYS0+dm1fc3RhcnQpIHsKKwkJCW1tLT5mcmVlX2FyZWFfY2FjaGUgPSBhZGRyICsgbGVuOworCQkJcmV0dXJuIGFkZHI7CisJCX0KKwkJYWRkciA9IEFMSUdOKHZtYS0+dm1fZW5kLCBIUEFHRV9TSVpFKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGh1Z2V0bGJfZ2V0X3VubWFwcGVkX2FyZWFfdG9wZG93bihzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdW5zaWduZWQgbG9uZyBhZGRyMCwgdW5zaWduZWQgbG9uZyBsZW4sCisJCXVuc2lnbmVkIGxvbmcgcGdvZmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgKnByZXZfdm1hOworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IG1tLT5tbWFwX2Jhc2UsIGFkZHIgPSBhZGRyMDsKKwlpbnQgZmlyc3RfdGltZSA9IDE7CisKKwkvKiBkb24ndCBhbGxvdyBhbGxvY2F0aW9ucyBhYm92ZSBjdXJyZW50IGJhc2UgKi8KKwlpZiAobW0tPmZyZWVfYXJlYV9jYWNoZSA+IGJhc2UpCisJCW1tLT5mcmVlX2FyZWFfY2FjaGUgPSBiYXNlOworCit0cnlfYWdhaW46CisJLyogbWFrZSBzdXJlIGl0IGNhbiBmaXQgaW4gdGhlIHJlbWFpbmluZyBhZGRyZXNzIHNwYWNlICovCisJaWYgKG1tLT5mcmVlX2FyZWFfY2FjaGUgPCBsZW4pCisJCWdvdG8gZmFpbDsKKworCS8qIGVpdGhlciBubyBhZGRyZXNzIHJlcXVlc3RlZCBvciBjYW50IGZpdCBpbiByZXF1ZXN0ZWQgYWRkcmVzcyBob2xlICovCisJYWRkciA9IChtbS0+ZnJlZV9hcmVhX2NhY2hlIC0gbGVuKSAmIEhQQUdFX01BU0s7CisJZG8geworCQkvKgorCQkgKiBMb29rdXAgZmFpbHVyZSBtZWFucyBubyB2bWEgaXMgYWJvdmUgdGhpcyBhZGRyZXNzLAorCQkgKiBpLmUuIHJldHVybiB3aXRoIHN1Y2Nlc3M6CisJCSAqLworCQlpZiAoISh2bWEgPSBmaW5kX3ZtYV9wcmV2KG1tLCBhZGRyLCAmcHJldl92bWEpKSkKKwkJCXJldHVybiBhZGRyOworCisJCS8qCisJCSAqIG5ldyByZWdpb24gZml0cyBiZXR3ZWVuIHByZXZfdm1hLT52bV9lbmQgYW5kCisJCSAqIHZtYS0+dm1fc3RhcnQsIHVzZSBpdDoKKwkJICovCisJCWlmIChhZGRyICsgbGVuIDw9IHZtYS0+dm1fc3RhcnQgJiYKKwkJCQkoIXByZXZfdm1hIHx8IChhZGRyID49IHByZXZfdm1hLT52bV9lbmQpKSkKKwkJCS8qIHJlbWVtYmVyIHRoZSBhZGRyZXNzIGFzIGEgaGludCBmb3IgbmV4dCB0aW1lICovCisJCQlyZXR1cm4gKG1tLT5mcmVlX2FyZWFfY2FjaGUgPSBhZGRyKTsKKwkJZWxzZQorCQkJLyogcHVsbCBmcmVlX2FyZWFfY2FjaGUgZG93biB0byB0aGUgZmlyc3QgaG9sZSAqLworCQkJaWYgKG1tLT5mcmVlX2FyZWFfY2FjaGUgPT0gdm1hLT52bV9lbmQpCisJCQkJbW0tPmZyZWVfYXJlYV9jYWNoZSA9IHZtYS0+dm1fc3RhcnQ7CisKKwkJLyogdHJ5IGp1c3QgYmVsb3cgdGhlIGN1cnJlbnQgdm1hLT52bV9zdGFydCAqLworCQlhZGRyID0gKHZtYS0+dm1fc3RhcnQgLSBsZW4pICYgSFBBR0VfTUFTSzsKKwl9IHdoaWxlIChsZW4gPD0gdm1hLT52bV9zdGFydCk7CisKK2ZhaWw6CisJLyoKKwkgKiBpZiBoaW50IGxlZnQgdXMgd2l0aCBubyBzcGFjZSBmb3IgdGhlIHJlcXVlc3RlZAorCSAqIG1hcHBpbmcgdGhlbiB0cnkgYWdhaW46CisJICovCisJaWYgKGZpcnN0X3RpbWUpIHsKKwkJbW0tPmZyZWVfYXJlYV9jYWNoZSA9IGJhc2U7CisJCWZpcnN0X3RpbWUgPSAwOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisJLyoKKwkgKiBBIGZhaWxlZCBtbWFwKCkgdmVyeSBsaWtlbHkgY2F1c2VzIGFwcGxpY2F0aW9uIGZhaWx1cmUsCisJICogc28gZmFsbCBiYWNrIHRvIHRoZSBib3R0b20tdXAgZnVuY3Rpb24gaGVyZS4gVGhpcyBzY2VuYXJpbworCSAqIGNhbiBoYXBwZW4gd2l0aCBsYXJnZSBzdGFjayBsaW1pdHMgYW5kIGxhcmdlIG1tYXAoKQorCSAqIGFsbG9jYXRpb25zLgorCSAqLworCW1tLT5mcmVlX2FyZWFfY2FjaGUgPSBUQVNLX1VOTUFQUEVEX0JBU0U7CisJYWRkciA9IGh1Z2V0bGJfZ2V0X3VubWFwcGVkX2FyZWFfYm90dG9tdXAoZmlsZSwgYWRkcjAsCisJCQlsZW4sIHBnb2ZmLCBmbGFncyk7CisKKwkvKgorCSAqIFJlc3RvcmUgdGhlIHRvcGRvd24gYmFzZToKKwkgKi8KKwltbS0+ZnJlZV9hcmVhX2NhY2hlID0gYmFzZTsKKworCXJldHVybiBhZGRyOworfQorCit1bnNpZ25lZCBsb25nCitodWdldGxiX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisKKwlpZiAobGVuICYgfkhQQUdFX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCWlmIChsZW4gPiBUQVNLX1NJWkUpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGFkZHIpIHsKKwkJYWRkciA9IEFMSUdOKGFkZHIsIEhQQUdFX1NJWkUpOworCQl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7CisJCWlmIChUQVNLX1NJWkUgLSBsZW4gPj0gYWRkciAmJgorCQkgICAgKCF2bWEgfHwgYWRkciArIGxlbiA8PSB2bWEtPnZtX3N0YXJ0KSkKKwkJCXJldHVybiBhZGRyOworCX0KKwlpZiAobW0tPmdldF91bm1hcHBlZF9hcmVhID09IGFyY2hfZ2V0X3VubWFwcGVkX2FyZWEpCisJCXJldHVybiBodWdldGxiX2dldF91bm1hcHBlZF9hcmVhX2JvdHRvbXVwKGZpbGUsIGFkZHIsIGxlbiwKKwkJCQlwZ29mZiwgZmxhZ3MpOworCWVsc2UKKwkJcmV0dXJuIGh1Z2V0bGJfZ2V0X3VubWFwcGVkX2FyZWFfdG9wZG93bihmaWxlLCBhZGRyLCBsZW4sCisJCQkJcGdvZmYsIGZsYWdzKTsKK30KKworI2VuZGlmIC8qSEFWRV9BUkNIX0hVR0VUTEJfVU5NQVBQRURfQVJFQSovCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9pbml0LmMgYi9hcmNoL2kzODYvbW0vaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhN2VhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbW0vaW5pdC5jCkBAIC0wLDAgKzEsNjk2IEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9tbS9pbml0LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1ICBMaW51cyBUb3J2YWxkcworICoKKyAqICBTdXBwb3J0IG9mIEJJR01FTSBhZGRlZCBieSBHZXJoYXJkIFdpY2hlcnQsIFNpZW1lbnMgQUcsIEp1bHkgMTk5OQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8YXNtL3RsYi5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorCit1bnNpZ25lZCBpbnQgX19WTUFMTE9DX1JFU0VSVkUgPSAxMjggPDwgMjA7CisKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBtbXVfZ2F0aGVyLCBtbXVfZ2F0aGVycyk7Cit1bnNpZ25lZCBsb25nIGhpZ2hzdGFydF9wZm4sIGhpZ2hlbmRfcGZuOworCitzdGF0aWMgaW50IG5vaW5saW5lIGRvX3Rlc3Rfd3BfYml0KHZvaWQpOworCisvKgorICogQ3JlYXRlcyBhIG1pZGRsZSBwYWdlIHRhYmxlIGFuZCBwdXRzIGEgcG9pbnRlciB0byBpdCBpbiB0aGUKKyAqIGdpdmVuIGdsb2JhbCBkaXJlY3RvcnkgZW50cnkuIFRoaXMgb25seSByZXR1cm5zIHRoZSBnZCBlbnRyeQorICogaW4gbm9uLVBBRSBjb21waWxhdGlvbiBtb2RlLCBzaW5jZSB0aGUgbWlkZGxlIGxheWVyIGlzIGZvbGRlZC4KKyAqLworc3RhdGljIHBtZF90ICogX19pbml0IG9uZV9tZF90YWJsZV9pbml0KHBnZF90ICpwZ2QpCit7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kX3RhYmxlOworCQkKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCXBtZF90YWJsZSA9IChwbWRfdCAqKSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhQQUdFX1NJWkUpOworCXNldF9wZ2QocGdkLCBfX3BnZChfX3BhKHBtZF90YWJsZSkgfCBfUEFHRV9QUkVTRU5UKSk7CisJcHVkID0gcHVkX29mZnNldChwZ2QsIDApOworCWlmIChwbWRfdGFibGUgIT0gcG1kX29mZnNldChwdWQsIDApKSAKKwkJQlVHKCk7CisjZWxzZQorCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCAwKTsKKwlwbWRfdGFibGUgPSBwbWRfb2Zmc2V0KHB1ZCwgMCk7CisjZW5kaWYKKworCXJldHVybiBwbWRfdGFibGU7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBwYWdlIHRhYmxlIGFuZCBwbGFjZSBhIHBvaW50ZXIgdG8gaXQgaW4gYSBtaWRkbGUgcGFnZQorICogZGlyZWN0b3J5IGVudHJ5LgorICovCitzdGF0aWMgcHRlX3QgKiBfX2luaXQgb25lX3BhZ2VfdGFibGVfaW5pdChwbWRfdCAqcG1kKQoreworCWlmIChwbWRfbm9uZSgqcG1kKSkgeworCQlwdGVfdCAqcGFnZV90YWJsZSA9IChwdGVfdCAqKSBhbGxvY19ib290bWVtX2xvd19wYWdlcyhQQUdFX1NJWkUpOworCQlzZXRfcG1kKHBtZCwgX19wbWQoX19wYShwYWdlX3RhYmxlKSB8IF9QQUdFX1RBQkxFKSk7CisJCWlmIChwYWdlX3RhYmxlICE9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgMCkpCisJCQlCVUcoKTsJCisKKwkJcmV0dXJuIHBhZ2VfdGFibGU7CisJfQorCQorCXJldHVybiBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIDApOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhIGNlcnRhaW4gcmFuZ2Ugb2Yga2VybmVsIHZpcnR1YWwgbWVtb3J5IAorICogd2l0aCBuZXcgYm9vdG1lbSBwYWdlIHRhYmxlcywgZXZlcnl3aGVyZSBwYWdlIHRhYmxlcyBhcmUgbWlzc2luZyBpbgorICogdGhlIGdpdmVuIHJhbmdlLgorICovCisKKy8qCisgKiBOT1RFOiBUaGUgcGFnZXRhYmxlcyBhcmUgYWxsb2NhdGVkIGNvbnRpZ3VvdXMgb24gdGhlIHBoeXNpY2FsIHNwYWNlIAorICogc28gd2UgY2FuIGNhY2hlIHRoZSBwbGFjZSBvZiB0aGUgZmlyc3Qgb25lIGFuZCBtb3ZlIGFyb3VuZCB3aXRob3V0IAorICogY2hlY2tpbmcgdGhlIHBnZCBldmVyeSB0aW1lLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGFnZV90YWJsZV9yYW5nZV9pbml0ICh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgcGdkX3QgKnBnZF9iYXNlKQoreworCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCWludCBwZ2RfaWR4LCBwbWRfaWR4OworCXVuc2lnbmVkIGxvbmcgdmFkZHI7CisKKwl2YWRkciA9IHN0YXJ0OworCXBnZF9pZHggPSBwZ2RfaW5kZXgodmFkZHIpOworCXBtZF9pZHggPSBwbWRfaW5kZXgodmFkZHIpOworCXBnZCA9IHBnZF9iYXNlICsgcGdkX2lkeDsKKworCWZvciAoIDsgKHBnZF9pZHggPCBQVFJTX1BFUl9QR0QpICYmICh2YWRkciAhPSBlbmQpOyBwZ2QrKywgcGdkX2lkeCsrKSB7CisJCWlmIChwZ2Rfbm9uZSgqcGdkKSkgCisJCQlvbmVfbWRfdGFibGVfaW5pdChwZ2QpOworCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgdmFkZHIpOworCQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgdmFkZHIpOworCQlmb3IgKDsgKHBtZF9pZHggPCBQVFJTX1BFUl9QTUQpICYmICh2YWRkciAhPSBlbmQpOyBwbWQrKywgcG1kX2lkeCsrKSB7CisJCQlpZiAocG1kX25vbmUoKnBtZCkpIAorCQkJCW9uZV9wYWdlX3RhYmxlX2luaXQocG1kKTsKKworCQkJdmFkZHIgKz0gUE1EX1NJWkU7CisJCX0KKwkJcG1kX2lkeCA9IDA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBpc19rZXJuZWxfdGV4dCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaWYgKGFkZHIgPj0gUEFHRV9PRkZTRVQgJiYgYWRkciA8PSAodW5zaWduZWQgbG9uZylfX2luaXRfZW5kKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgbWFwcyB0aGUgcGh5c2ljYWwgbWVtb3J5IHRvIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UsIGEgdG90YWwgCisgKiBvZiBtYXhfbG93X3BmbiBwYWdlcywgYnkgY3JlYXRpbmcgcGFnZSB0YWJsZXMgc3RhcnRpbmcgZnJvbSBhZGRyZXNzIAorICogUEFHRV9PRkZTRVQuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBrZXJuZWxfcGh5c2ljYWxfbWFwcGluZ19pbml0KHBnZF90ICpwZ2RfYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwlwZ2RfdCAqcGdkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKwlpbnQgcGdkX2lkeCwgcG1kX2lkeCwgcHRlX29mczsKKworCXBnZF9pZHggPSBwZ2RfaW5kZXgoUEFHRV9PRkZTRVQpOworCXBnZCA9IHBnZF9iYXNlICsgcGdkX2lkeDsKKwlwZm4gPSAwOworCisJZm9yICg7IHBnZF9pZHggPCBQVFJTX1BFUl9QR0Q7IHBnZCsrLCBwZ2RfaWR4KyspIHsKKwkJcG1kID0gb25lX21kX3RhYmxlX2luaXQocGdkKTsKKwkJaWYgKHBmbiA+PSBtYXhfbG93X3BmbikKKwkJCWNvbnRpbnVlOworCQlmb3IgKHBtZF9pZHggPSAwOyBwbWRfaWR4IDwgUFRSU19QRVJfUE1EICYmIHBmbiA8IG1heF9sb3dfcGZuOyBwbWQrKywgcG1kX2lkeCsrKSB7CisJCQl1bnNpZ25lZCBpbnQgYWRkcmVzcyA9IHBmbiAqIFBBR0VfU0laRSArIFBBR0VfT0ZGU0VUOworCisJCQkvKiBNYXAgd2l0aCBiaWcgcGFnZXMgaWYgcG9zc2libGUsIG90aGVyd2lzZSBjcmVhdGUgbm9ybWFsIHBhZ2UgdGFibGVzLiAqLworCQkJaWYgKGNwdV9oYXNfcHNlKSB7CisJCQkJdW5zaWduZWQgaW50IGFkZHJlc3MyID0gKHBmbiArIFBUUlNfUEVSX1BURSAtIDEpICogUEFHRV9TSVpFICsgUEFHRV9PRkZTRVQgKyBQQUdFX1NJWkUtMTsKKworCQkJCWlmIChpc19rZXJuZWxfdGV4dChhZGRyZXNzKSB8fCBpc19rZXJuZWxfdGV4dChhZGRyZXNzMikpCisJCQkJCXNldF9wbWQocG1kLCBwZm5fcG1kKHBmbiwgUEFHRV9LRVJORUxfTEFSR0VfRVhFQykpOworCQkJCWVsc2UKKwkJCQkJc2V0X3BtZChwbWQsIHBmbl9wbWQocGZuLCBQQUdFX0tFUk5FTF9MQVJHRSkpOworCQkJCXBmbiArPSBQVFJTX1BFUl9QVEU7CisJCQl9IGVsc2UgeworCQkJCXB0ZSA9IG9uZV9wYWdlX3RhYmxlX2luaXQocG1kKTsKKworCQkJCWZvciAocHRlX29mcyA9IDA7IHB0ZV9vZnMgPCBQVFJTX1BFUl9QVEUgJiYgcGZuIDwgbWF4X2xvd19wZm47IHB0ZSsrLCBwZm4rKywgcHRlX29mcysrKSB7CisJCQkJCQlpZiAoaXNfa2VybmVsX3RleHQoYWRkcmVzcykpCisJCQkJCQkJc2V0X3B0ZShwdGUsIHBmbl9wdGUocGZuLCBQQUdFX0tFUk5FTF9FWEVDKSk7CisJCQkJCQllbHNlCisJCQkJCQkJc2V0X3B0ZShwdGUsIHBmbl9wdGUocGZuLCBQQUdFX0tFUk5FTCkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgcGFnZV9raWxsc19wcHJvKHVuc2lnbmVkIGxvbmcgcGFnZW5yKQoreworCWlmIChwYWdlbnIgPj0gMHg3MDAwMCAmJiBwYWdlbnIgPD0gMHg3MDAzRikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbnQgaXNfYXZhaWxhYmxlX21lbW9yeShlZmlfbWVtb3J5X2Rlc2NfdCAqKTsKKworc3RhdGljIGlubGluZSBpbnQgcGFnZV9pc19yYW0odW5zaWduZWQgbG9uZyBwYWdlbnIpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBlbmQ7CisKKwlpZiAoZWZpX2VuYWJsZWQpIHsKKwkJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCisJCWZvciAoaSA9IDA7IGkgPCBtZW1tYXAubnJfbWFwOyBpKyspIHsKKwkJCW1kID0gJm1lbW1hcC5tYXBbaV07CisJCQlpZiAoIWlzX2F2YWlsYWJsZV9tZW1vcnkobWQpKQorCQkJCWNvbnRpbnVlOworCQkJYWRkciA9IChtZC0+cGh5c19hZGRyK1BBR0VfU0laRS0xKSA+PiBQQUdFX1NISUZUOworCQkJZW5kID0gKG1kLT5waHlzX2FkZHIgKyAobWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkpID4+IFBBR0VfU0hJRlQ7CisKKwkJCWlmICgocGFnZW5yID49IGFkZHIpICYmIChwYWdlbnIgPCBlbmQpKQorCQkJCXJldHVybiAxOworCQl9CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisKKwkJaWYgKGU4MjAubWFwW2ldLnR5cGUgIT0gRTgyMF9SQU0pCS8qIG5vdCB1c2FibGUgbWVtb3J5ICovCisJCQljb250aW51ZTsKKwkJLyoKKwkJICoJISEhRklYTUUhISEgU29tZSBCSU9TZW4gcmVwb3J0IGFyZWFzIGFzIFJBTSB0aGF0CisJCSAqCWFyZSBub3QuIE5vdGFibHkgdGhlIDY0MC0+MU1iIGFyZWEuIFdlIG5lZWQgYSBzYW5pdHkKKwkJICoJY2hlY2sgaGVyZS4KKwkJICovCisJCWFkZHIgPSAoZTgyMC5tYXBbaV0uYWRkcitQQUdFX1NJWkUtMSkgPj4gUEFHRV9TSElGVDsKKwkJZW5kID0gKGU4MjAubWFwW2ldLmFkZHIrZTgyMC5tYXBbaV0uc2l6ZSkgPj4gUEFHRV9TSElGVDsKKwkJaWYgICgocGFnZW5yID49IGFkZHIpICYmIChwYWdlbnIgPCBlbmQpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0hJR0hNRU0KK3B0ZV90ICprbWFwX3B0ZTsKK3BncHJvdF90IGttYXBfcHJvdDsKKworI2RlZmluZSBrbWFwX2dldF9maXhtYXBfcHRlKHZhZGRyKQkJCQkJXAorCXB0ZV9vZmZzZXRfa2VybmVsKHBtZF9vZmZzZXQocHVkX29mZnNldChwZ2Rfb2Zmc2V0X2sodmFkZHIpLCB2YWRkciksICh2YWRkcikpLCAodmFkZHIpKQorCitzdGF0aWMgdm9pZCBfX2luaXQga21hcF9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBrbWFwX3ZzdGFydDsKKworCS8qIGNhY2hlIHRoZSBmaXJzdCBrbWFwIHB0ZSAqLworCWttYXBfdnN0YXJ0ID0gX19maXhfdG9fdmlydChGSVhfS01BUF9CRUdJTik7CisJa21hcF9wdGUgPSBrbWFwX2dldF9maXhtYXBfcHRlKGttYXBfdnN0YXJ0KTsKKworCWttYXBfcHJvdCA9IFBBR0VfS0VSTkVMOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcGVybWFuZW50X2ttYXBzX2luaXQocGdkX3QgKnBnZF9iYXNlKQoreworCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGU7CisJdW5zaWduZWQgbG9uZyB2YWRkcjsKKworCXZhZGRyID0gUEtNQVBfQkFTRTsKKwlwYWdlX3RhYmxlX3JhbmdlX2luaXQodmFkZHIsIHZhZGRyICsgUEFHRV9TSVpFKkxBU1RfUEtNQVAsIHBnZF9iYXNlKTsKKworCXBnZCA9IHN3YXBwZXJfcGdfZGlyICsgcGdkX2luZGV4KHZhZGRyKTsKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgdmFkZHIpOworCXBtZCA9IHBtZF9vZmZzZXQocHVkLCB2YWRkcik7CisJcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCB2YWRkcik7CisJcGttYXBfcGFnZV90YWJsZSA9IHB0ZTsJCit9CisKK3ZvaWQgX19pbml0IG9uZV9oaWdocGFnZV9pbml0KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcGZuLCBpbnQgYmFkX3Bwcm8pCit7CisJaWYgKHBhZ2VfaXNfcmFtKHBmbikgJiYgIShiYWRfcHBybyAmJiBwYWdlX2tpbGxzX3Bwcm8ocGZuKSkpIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCXNldF9iaXQoUEdfaGlnaG1lbSwgJnBhZ2UtPmZsYWdzKTsKKwkJc2V0X3BhZ2VfY291bnQocGFnZSwgMSk7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQl0b3RhbGhpZ2hfcGFnZXMrKzsKKwl9IGVsc2UKKwkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworfQorCisjaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfaGlnaG1lbV9wYWdlc19pbml0KGludCBiYWRfcHBybykKK3sKKwlpbnQgcGZuOworCWZvciAocGZuID0gaGlnaHN0YXJ0X3BmbjsgcGZuIDwgaGlnaGVuZF9wZm47IHBmbisrKQorCQlvbmVfaGlnaHBhZ2VfaW5pdChwZm5fdG9fcGFnZShwZm4pLCBwZm4sIGJhZF9wcHJvKTsKKwl0b3RhbHJhbV9wYWdlcyArPSB0b3RhbGhpZ2hfcGFnZXM7Cit9CisjZWxzZQorZXh0ZXJuIHZvaWQgc2V0X2hpZ2htZW1fcGFnZXNfaW5pdChpbnQpOworI2VuZGlmIC8qICFDT05GSUdfRElTQ09OVElHTUVNICovCisKKyNlbHNlCisjZGVmaW5lIGttYXBfaW5pdCgpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcGVybWFuZW50X2ttYXBzX2luaXQocGdkX2Jhc2UpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc2V0X2hpZ2htZW1fcGFnZXNfaW5pdChiYWRfcHBybykgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIENPTkZJR19ISUdITUVNICovCisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBfX1BBR0VfS0VSTkVMID0gX1BBR0VfS0VSTkVMOwordW5zaWduZWQgbG9uZyBsb25nIF9fUEFHRV9LRVJORUxfRVhFQyA9IF9QQUdFX0tFUk5FTF9FWEVDOworCisjaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KKyNkZWZpbmUgcmVtYXBfbnVtYV9rdmEoKSBkbyB7fSB3aGlsZSAoMCkKKyNlbHNlCitleHRlcm4gdm9pZCBfX2luaXQgcmVtYXBfbnVtYV9rdmEodm9pZCk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IHBhZ2V0YWJsZV9pbml0ICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdmFkZHI7CisJcGdkX3QgKnBnZF9iYXNlID0gc3dhcHBlcl9wZ19kaXI7CisKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCWludCBpOworCS8qIEluaXQgZW50cmllcyBvZiB0aGUgZmlyc3QtbGV2ZWwgcGFnZSB0YWJsZSB0byB0aGUgemVybyBwYWdlICovCisJZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX1BHRDsgaSsrKQorCQlzZXRfcGdkKHBnZF9iYXNlICsgaSwgX19wZ2QoX19wYShlbXB0eV96ZXJvX3BhZ2UpIHwgX1BBR0VfUFJFU0VOVCkpOworI2VuZGlmCisKKwkvKiBFbmFibGUgUFNFIGlmIGF2YWlsYWJsZSAqLworCWlmIChjcHVfaGFzX3BzZSkgeworCQlzZXRfaW5fY3I0KFg4Nl9DUjRfUFNFKTsKKwl9CisKKwkvKiBFbmFibGUgUEdFIGlmIGF2YWlsYWJsZSAqLworCWlmIChjcHVfaGFzX3BnZSkgeworCQlzZXRfaW5fY3I0KFg4Nl9DUjRfUEdFKTsKKwkJX19QQUdFX0tFUk5FTCB8PSBfUEFHRV9HTE9CQUw7CisJCV9fUEFHRV9LRVJORUxfRVhFQyB8PSBfUEFHRV9HTE9CQUw7CisJfQorCisJa2VybmVsX3BoeXNpY2FsX21hcHBpbmdfaW5pdChwZ2RfYmFzZSk7CisJcmVtYXBfbnVtYV9rdmEoKTsKKworCS8qCisJICogRml4ZWQgbWFwcGluZ3MsIG9ubHkgdGhlIHBhZ2UgdGFibGUgc3RydWN0dXJlIGhhcyB0byBiZQorCSAqIGNyZWF0ZWQgLSBtYXBwaW5ncyB3aWxsIGJlIHNldCBieSBzZXRfZml4bWFwKCk6CisJICovCisJdmFkZHIgPSBfX2ZpeF90b192aXJ0KF9fZW5kX29mX2ZpeGVkX2FkZHJlc3NlcyAtIDEpICYgUE1EX01BU0s7CisJcGFnZV90YWJsZV9yYW5nZV9pbml0KHZhZGRyLCAwLCBwZ2RfYmFzZSk7CisKKwlwZXJtYW5lbnRfa21hcHNfaW5pdChwZ2RfYmFzZSk7CisKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCS8qCisJICogQWRkIGxvdyBtZW1vcnkgaWRlbnRpdHktbWFwcGluZ3MgLSBTTVAgbmVlZHMgaXQgd2hlbgorCSAqIHN0YXJ0aW5nIHVwIG9uIGFuIEFQIGZyb20gcmVhbC1tb2RlLiBJbiB0aGUgbm9uLVBBRQorCSAqIGNhc2Ugd2UgYWxyZWFkeSBoYXZlIHRoZXNlIG1hcHBpbmdzIHRocm91Z2ggaGVhZC5TLgorCSAqIEFsbCB1c2VyLXNwYWNlIG1hcHBpbmdzIGFyZSBleHBsaWNpdGx5IGNsZWFyZWQgYWZ0ZXIKKwkgKiBTTVAgc3RhcnR1cC4KKwkgKi8KKwlwZ2RfYmFzZVswXSA9IHBnZF9iYXNlW1VTRVJfUFRSU19QRVJfUEdEXTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChDT05GSUdfUE1fRElTSykgfHwgZGVmaW5lZChDT05GSUdfU09GVFdBUkVfU1VTUEVORCkKKy8qCisgKiBTd2FwIHN1c3BlbmQgJiBmcmllbmRzIG5lZWQgdGhpcyBmb3IgcmVzdW1lIGJlY2F1c2UgdGhpbmdzIGxpa2UgdGhlIGludGVsLWFncAorICogZHJpdmVyIG1pZ2h0IGhhdmUgc3BsaXQgdXAgYSBrZXJuZWwgNE1CIG1hcHBpbmcuCisgKi8KK2NoYXIgX19ub3NhdmVkYXRhIHN3c3VzcF9wZ19kaXJbUEFHRV9TSVpFXQorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChQQUdFX1NJWkUpKSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX3BnX2Rpcih2b2lkKQoreworCW1lbWNweShzd3N1c3BfcGdfZGlyLCBzd2FwcGVyX3BnX2RpciwgUEFHRV9TSVpFKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9wZ19kaXIodm9pZCkKK3sKK30KKyNlbmRpZgorCit2b2lkIHphcF9sb3dfbWFwcGluZ3MgKHZvaWQpCit7CisJaW50IGk7CisKKwlzYXZlX3BnX2RpcigpOworCisJLyoKKwkgKiBaYXAgaW5pdGlhbCBsb3ctbWVtb3J5IG1hcHBpbmdzLgorCSAqCisJICogTm90ZSB0aGF0ICJwZ2RfY2xlYXIoKSIgZG9lc24ndCBkbyBpdCBmb3IKKwkgKiB1cywgYmVjYXVzZSBwZ2RfY2xlYXIoKSBpcyBhIG5vLW9wIG9uIGkzODYuCisJICovCisJZm9yIChpID0gMDsgaSA8IFVTRVJfUFRSU19QRVJfUEdEOyBpKyspCisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKKwkJc2V0X3BnZChzd2FwcGVyX3BnX2RpcitpLCBfX3BnZCgxICsgX19wYShlbXB0eV96ZXJvX3BhZ2UpKSk7CisjZWxzZQorCQlzZXRfcGdkKHN3YXBwZXJfcGdfZGlyK2ksIF9fcGdkKDApKTsKKyNlbmRpZgorCWZsdXNoX3RsYl9hbGwoKTsKK30KKworc3RhdGljIGludCBkaXNhYmxlX254IF9faW5pdGRhdGEgPSAwOwordTY0IF9fc3VwcG9ydGVkX3B0ZV9tYXNrID0gfl9QQUdFX05YOworCisvKgorICogbm9leGVjID0gb258b2ZmCisgKgorICogQ29udHJvbCBub24gZXhlY3V0YWJsZSBtYXBwaW5ncy4KKyAqCisgKiBvbiAgICAgIEVuYWJsZQorICogb2ZmICAgICBEaXNhYmxlCisgKi8KK3ZvaWQgX19pbml0IG5vZXhlY19zZXR1cChjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKCFzdHJuY21wKHN0ciwgIm9uIiwyKSAmJiBjcHVfaGFzX254KSB7CisJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrIHw9IF9QQUdFX05YOworCQlkaXNhYmxlX254ID0gMDsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKHN0ciwib2ZmIiwzKSkgeworCQlkaXNhYmxlX254ID0gMTsKKwkJX19zdXBwb3J0ZWRfcHRlX21hc2sgJj0gfl9QQUdFX05YOworCX0KK30KKworaW50IG54X2VuYWJsZWQgPSAwOworI2lmZGVmIENPTkZJR19YODZfUEFFCisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfbngodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdls0XSwgbCwgaDsKKworCWlmIChjcHVfaGFzX3BhZSAmJiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApID4gMHg4MDAwMDAwMSkpIHsKKwkJY3B1aWQoMHg4MDAwMDAwMSwgJnZbMF0sICZ2WzFdLCAmdlsyXSwgJnZbM10pOworCQlpZiAoKHZbM10gJiAoMSA8PCAyMCkpICYmICFkaXNhYmxlX254KSB7CisJCQlyZG1zcihNU1JfRUZFUiwgbCwgaCk7CisJCQlsIHw9IEVGRVJfTlg7CisJCQl3cm1zcihNU1JfRUZFUiwgbCwgaCk7CisJCQlueF9lbmFibGVkID0gMTsKKwkJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrIHw9IF9QQUdFX05YOworCQl9CisJfQorfQorCisvKgorICogRW5hYmxlcy9kaXNhYmxlcyBleGVjdXRhYmlsaXR5IG9mIGEgZ2l2ZW4ga2VybmVsIHBhZ2UgYW5kCisgKiByZXR1cm5zIHRoZSBwcmV2aW91cyBzZXR0aW5nLgorICovCitpbnQgX19pbml0IHNldF9rZXJuZWxfZXhlYyh1bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgZW5hYmxlKQoreworCXB0ZV90ICpwdGU7CisJaW50IHJldCA9IDE7CisKKwlpZiAoIW54X2VuYWJsZWQpCisJCWdvdG8gb3V0OworCisJcHRlID0gbG9va3VwX2FkZHJlc3ModmFkZHIpOworCUJVR19PTighcHRlKTsKKworCWlmICghcHRlX2V4ZWNfa2VybmVsKCpwdGUpKQorCQlyZXQgPSAwOworCisJaWYgKGVuYWJsZSkKKwkJcHRlLT5wdGVfaGlnaCAmPSB+KDEgPDwgKF9QQUdFX0JJVF9OWCAtIDMyKSk7CisJZWxzZQorCQlwdGUtPnB0ZV9oaWdoIHw9IDEgPDwgKF9QQUdFX0JJVF9OWCAtIDMyKTsKKwlfX2ZsdXNoX3RsYl9hbGwoKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKworLyoKKyAqIHBhZ2luZ19pbml0KCkgc2V0cyB1cCB0aGUgcGFnZSB0YWJsZXMgLSBub3RlIHRoYXQgdGhlIGZpcnN0IDhNQiBhcmUKKyAqIGFscmVhZHkgbWFwcGVkIGJ5IGhlYWQuUy4KKyAqCisgKiBUaGlzIHJvdXRpbmVzIGFsc28gdW5tYXBzIHRoZSBwYWdlIGF0IHZpcnR1YWwga2VybmVsIGFkZHJlc3MgMCwgc28KKyAqIHRoYXQgd2UgY2FuIHRyYXAgdGhvc2UgcGVza3kgTlVMTC1yZWZlcmVuY2UgZXJyb3JzIGluIHRoZSBrZXJuZWwuCisgKi8KK3ZvaWQgX19pbml0IHBhZ2luZ19pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKKwlzZXRfbngoKTsKKwlpZiAobnhfZW5hYmxlZCkKKwkJcHJpbnRrKCJOWCAoRXhlY3V0ZSBEaXNhYmxlKSBwcm90ZWN0aW9uOiBhY3RpdmVcbiIpOworI2VuZGlmCisKKwlwYWdldGFibGVfaW5pdCgpOworCisJbG9hZF9jcjMoc3dhcHBlcl9wZ19kaXIpOworCisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKKwkvKgorCSAqIFdlIHdpbGwgYmFpbCBvdXQgbGF0ZXIgLSBwcmludGsgZG9lc24ndCB3b3JrIHJpZ2h0IG5vdyBzbworCSAqIHRoZSB1c2VyIHdvdWxkIGp1c3Qgc2VlIGEgaGFuZ2luZyBrZXJuZWwuCisJICovCisJaWYgKGNwdV9oYXNfcGFlKQorCQlzZXRfaW5fY3I0KFg4Nl9DUjRfUEFFKTsKKyNlbmRpZgorCV9fZmx1c2hfdGxiX2FsbCgpOworCisJa21hcF9pbml0KCk7Cit9CisKKy8qCisgKiBUZXN0IGlmIHRoZSBXUCBiaXQgd29ya3MgaW4gc3VwZXJ2aXNvciBtb2RlLiBJdCBpc24ndCBzdXBwb3J0ZWQgb24gMzg2J3MKKyAqIGFuZCBhbHNvIG9uIHNvbWUgc3RyYW5nZSA0ODYncyAoTmV4R2VuIGV0Yy4pLiBBbGwgNTg2KydzIGFyZSBPSy4gVGhpcworICogdXNlZCB0byBpbnZvbHZlIGJsYWNrIG1hZ2ljIGp1bXBzIHRvIHdvcmsgYXJvdW5kIHNvbWUgbmFzdHkgQ1BVIGJ1Z3MsCisgKiBidXQgZm9ydHVuYXRlbHkgdGhlIHN3aXRjaCB0byB1c2luZyBleGNlcHRpb25zIGdvdCByaWQgb2YgYWxsIHRoYXQuCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0IHRlc3Rfd3BfYml0KHZvaWQpCit7CisJcHJpbnRrKCJDaGVja2luZyBpZiB0aGlzIHByb2Nlc3NvciBob25vdXJzIHRoZSBXUCBiaXQgZXZlbiBpbiBzdXBlcnZpc29yIG1vZGUuLi4gIik7CisKKwkvKiBBbnkgcGFnZS1hbGlnbmVkIGFkZHJlc3Mgd2lsbCBkbywgdGhlIHRlc3QgaXMgbm9uLWRlc3RydWN0aXZlICovCisJX19zZXRfZml4bWFwKEZJWF9XUF9URVNULCBfX3BhKCZzd2FwcGVyX3BnX2RpciksIFBBR0VfUkVBRE9OTFkpOworCWJvb3RfY3B1X2RhdGEud3Bfd29ya3Nfb2sgPSBkb190ZXN0X3dwX2JpdCgpOworCWNsZWFyX2ZpeG1hcChGSVhfV1BfVEVTVCk7CisKKwlpZiAoIWJvb3RfY3B1X2RhdGEud3Bfd29ya3Nfb2spIHsKKwkJcHJpbnRrKCJOby5cbiIpOworI2lmZGVmIENPTkZJR19YODZfV1BfV09SS1NfT0sKKwkJcGFuaWMoIlRoaXMga2VybmVsIGRvZXNuJ3Qgc3VwcG9ydCBDUFUncyB3aXRoIGJyb2tlbiBXUC4gUmVjb21waWxlIGl0IGZvciBhIDM4NiEiKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXByaW50aygiT2suXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfbWF4X21hcG5yX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCW51bV9waHlzcGFnZXMgPSBoaWdoZW5kX3BmbjsKKyNlbHNlCisJbnVtX3BoeXNwYWdlcyA9IG1heF9sb3dfcGZuOworI2VuZGlmCisjaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KKwltYXhfbWFwbnIgPSBudW1fcGh5c3BhZ2VzOworI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3Qga2NvcmVfbGlzdCBrY29yZV9tZW0sIGtjb3JlX3ZtYWxsb2M7IAorCit2b2lkIF9faW5pdCBtZW1faW5pdCh2b2lkKQoreworCWV4dGVybiBpbnQgcHByb193aXRoX3JhbV9idWcodm9pZCk7CisJaW50IGNvZGVzaXplLCByZXNlcnZlZHBhZ2VzLCBkYXRhc2l6ZSwgaW5pdHNpemU7CisJaW50IHRtcDsKKwlpbnQgYmFkX3Bwcm87CisKKyNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTQorCWlmICghbWVtX21hcCkKKwkJQlVHKCk7CisjZW5kaWYKKwkKKwliYWRfcHBybyA9IHBwcm9fd2l0aF9yYW1fYnVnKCk7CisKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCS8qIGNoZWNrIHRoYXQgZml4bWFwIGFuZCBwa21hcCBkbyBub3Qgb3ZlcmxhcCAqLworCWlmIChQS01BUF9CQVNFK0xBU1RfUEtNQVAqUEFHRV9TSVpFID49IEZJWEFERFJfU1RBUlQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmaXhtYXAgYW5kIGttYXAgYXJlYXMgb3ZlcmxhcCAtIHRoaXMgd2lsbCBjcmFzaFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAicGtzdGFydDogJWx4aCBwa2VuZDogJWx4aCBmaXhzdGFydCAlbHhoXG4iLAorCQkJCVBLTUFQX0JBU0UsIFBLTUFQX0JBU0UrTEFTVF9QS01BUCpQQUdFX1NJWkUsIEZJWEFERFJfU1RBUlQpOworCQlCVUcoKTsKKwl9CisjZW5kaWYKKyAKKwlzZXRfbWF4X21hcG5yX2luaXQoKTsKKworI2lmZGVmIENPTkZJR19ISUdITUVNCisJaGlnaF9tZW1vcnkgPSAodm9pZCAqKSBfX3ZhKGhpZ2hzdGFydF9wZm4gKiBQQUdFX1NJWkUgLSAxKSArIDE7CisjZWxzZQorCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKikgX192YShtYXhfbG93X3BmbiAqIFBBR0VfU0laRSAtIDEpICsgMTsKKyNlbmRpZgorCisJLyogdGhpcyB3aWxsIHB1dCBhbGwgbG93IG1lbW9yeSBvbnRvIHRoZSBmcmVlbGlzdHMgKi8KKwl0b3RhbHJhbV9wYWdlcyArPSBmcmVlX2FsbF9ib290bWVtKCk7CisKKwlyZXNlcnZlZHBhZ2VzID0gMDsKKwlmb3IgKHRtcCA9IDA7IHRtcCA8IG1heF9sb3dfcGZuOyB0bXArKykKKwkJLyoKKwkJICogT25seSBjb3VudCByZXNlcnZlZCBSQU0gcGFnZXMKKwkJICovCisJCWlmIChwYWdlX2lzX3JhbSh0bXApICYmIFBhZ2VSZXNlcnZlZChwZm5fdG9fcGFnZSh0bXApKSkKKwkJCXJlc2VydmVkcGFnZXMrKzsKKworCXNldF9oaWdobWVtX3BhZ2VzX2luaXQoYmFkX3Bwcm8pOworCisJY29kZXNpemUgPSAgKHVuc2lnbmVkIGxvbmcpICZfZXRleHQgLSAodW5zaWduZWQgbG9uZykgJl90ZXh0OworCWRhdGFzaXplID0gICh1bnNpZ25lZCBsb25nKSAmX2VkYXRhIC0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQ7CisJaW5pdHNpemUgPSAgKHVuc2lnbmVkIGxvbmcpICZfX2luaXRfZW5kIC0gKHVuc2lnbmVkIGxvbmcpICZfX2luaXRfYmVnaW47CisKKwlrY2xpc3RfYWRkKCZrY29yZV9tZW0sIF9fdmEoMCksIG1heF9sb3dfcGZuIDw8IFBBR0VfU0hJRlQpOyAKKwlrY2xpc3RfYWRkKCZrY29yZV92bWFsbG9jLCAodm9pZCAqKVZNQUxMT0NfU1RBUlQsIAorCQkgICBWTUFMTE9DX0VORC1WTUFMTE9DX1NUQVJUKTsKKworCXByaW50ayhLRVJOX0lORk8gIk1lbW9yeTogJWx1ay8lbHVrIGF2YWlsYWJsZSAoJWRrIGtlcm5lbCBjb2RlLCAlZGsgcmVzZXJ2ZWQsICVkayBkYXRhLCAlZGsgaW5pdCwgJWxkayBoaWdobWVtKVxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpIG5yX2ZyZWVfcGFnZXMoKSA8PCAoUEFHRV9TSElGVC0xMCksCisJCW51bV9waHlzcGFnZXMgPDwgKFBBR0VfU0hJRlQtMTApLAorCQljb2Rlc2l6ZSA+PiAxMCwKKwkJcmVzZXJ2ZWRwYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCisJCWRhdGFzaXplID4+IDEwLAorCQlpbml0c2l6ZSA+PiAxMCwKKwkJKHVuc2lnbmVkIGxvbmcpICh0b3RhbGhpZ2hfcGFnZXMgPDwgKFBBR0VfU0hJRlQtMTApKQorCSAgICAgICApOworCisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKKwlpZiAoIWNwdV9oYXNfcGFlKQorCQlwYW5pYygiY2Fubm90IGV4ZWN1dGUgYSBQQUUtZW5hYmxlZCBrZXJuZWwgb24gYSBQQUUtbGVzcyBDUFUhIik7CisjZW5kaWYKKwlpZiAoYm9vdF9jcHVfZGF0YS53cF93b3Jrc19vayA8IDApCisJCXRlc3Rfd3BfYml0KCk7CisKKwkvKgorCSAqIFN1YnRsZS4gU01QIGlzIGRvaW5nIGl0J3MgYm9vdCBzdHVmZiBsYXRlIChiZWNhdXNlIGl0IGhhcyB0bworCSAqIGZvcmsgaWRsZSB0aHJlYWRzKSAtIGJ1dCBpdCBhbHNvIG5lZWRzIGxvdyBtYXBwaW5ncyBmb3IgdGhlCisJICogcHJvdGVjdGVkLW1vZGUgZW50cnkgdG8gd29yay4gV2UgemFwIHRoZXNlIGVudHJpZXMgb25seSBhZnRlcgorCSAqIHRoZSBXUC1iaXQgaGFzIGJlZW4gdGVzdGVkLgorCSAqLworI2lmbmRlZiBDT05GSUdfU01QCisJemFwX2xvd19tYXBwaW5ncygpOworI2VuZGlmCit9CisKK2ttZW1fY2FjaGVfdCAqcGdkX2NhY2hlOwora21lbV9jYWNoZV90ICpwbWRfY2FjaGU7CisKK3ZvaWQgX19pbml0IHBndGFibGVfY2FjaGVfaW5pdCh2b2lkKQoreworCWlmIChQVFJTX1BFUl9QTUQgPiAxKSB7CisJCXBtZF9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJwbWQiLAorCQkJCQlQVFJTX1BFUl9QTUQqc2l6ZW9mKHBtZF90KSwKKwkJCQkJUFRSU19QRVJfUE1EKnNpemVvZihwbWRfdCksCisJCQkJCTAsCisJCQkJCXBtZF9jdG9yLAorCQkJCQlOVUxMKTsKKwkJaWYgKCFwbWRfY2FjaGUpCisJCQlwYW5pYygicGd0YWJsZV9jYWNoZV9pbml0KCk6IGNhbm5vdCBjcmVhdGUgcG1kIGNhY2hlIik7CisJfQorCXBnZF9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJwZ2QiLAorCQkJCVBUUlNfUEVSX1BHRCpzaXplb2YocGdkX3QpLAorCQkJCVBUUlNfUEVSX1BHRCpzaXplb2YocGdkX3QpLAorCQkJCTAsCisJCQkJcGdkX2N0b3IsCisJCQkJUFRSU19QRVJfUE1EID09IDEgPyBwZ2RfZHRvciA6IE5VTEwpOworCWlmICghcGdkX2NhY2hlKQorCQlwYW5pYygicGd0YWJsZV9jYWNoZV9pbml0KCk6IENhbm5vdCBjcmVhdGUgcGdkIGNhY2hlIik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBfX2luaXQsIHNpbmNlIGV4Y2VwdGlvbnMgZG9uJ3Qgd29yayBpbiB0aGF0CisgKiBzZWN0aW9uLiAgUHV0IHRoaXMgYWZ0ZXIgdGhlIGNhbGxlcnMsIHNvIHRoYXQgaXQgY2Fubm90IGJlIGlubGluZWQuCisgKi8KK3N0YXRpYyBpbnQgbm9pbmxpbmUgZG9fdGVzdF93cF9iaXQodm9pZCkKK3sKKwljaGFyIHRtcF9yZWc7CisJaW50IGZsYWc7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIgltb3ZiICUwLCUxCVxuIgorCQkiMToJbW92YiAlMSwlMAlcbiIKKwkJIgl4b3JsICUyLCUyCVxuIgorCQkiMjoJCQlcbiIKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJIgkuYWxpZ24gNAlcbiIKKwkJIgkubG9uZyAxYiwyYglcbiIKKwkJIi5wcmV2aW91cwkJXG4iCisJCToiPW0iICgqKGNoYXIgKilmaXhfdG9fdmlydChGSVhfV1BfVEVTVCkpLAorCQkgIj1xIiAodG1wX3JlZyksCisJCSAiPXIiIChmbGFnKQorCQk6IjIiICgxKQorCQk6Im1lbW9yeSIpOworCQorCXJldHVybiBmbGFnOworfQorCit2b2lkIGZyZWVfaW5pdG1lbSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCWFkZHIgPSAodW5zaWduZWQgbG9uZykoJl9faW5pdF9iZWdpbik7CisJZm9yICg7IGFkZHIgPCAodW5zaWduZWQgbG9uZykoJl9faW5pdF9lbmQpOyBhZGRyICs9IFBBR0VfU0laRSkgeworCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpOworCQlzZXRfcGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2UoYWRkciksIDEpOworCQltZW1zZXQoKHZvaWQgKilhZGRyLCAweGNjLCBQQUdFX1NJWkUpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXRvdGFscmFtX3BhZ2VzKys7CisJfQorCXByaW50ayAoS0VSTl9JTkZPICJGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiAlZGsgZnJlZWRcbiIsIChfX2luaXRfZW5kIC0gX19pbml0X2JlZ2luKSA+PiAxMCk7Cit9CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKK3ZvaWQgZnJlZV9pbml0cmRfbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCWlmIChzdGFydCA8IGVuZCkKKwkJcHJpbnRrIChLRVJOX0lORk8gIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWxkayBmcmVlZFxuIiwgKGVuZCAtIHN0YXJ0KSA+PiAxMCk7CisJZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSBQQUdFX1NJWkUpIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHN0YXJ0KSk7CisJCXNldF9wYWdlX2NvdW50KHZpcnRfdG9fcGFnZShzdGFydCksIDEpOworCQlmcmVlX3BhZ2Uoc3RhcnQpOworCQl0b3RhbHJhbV9wYWdlcysrOworCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2lvcmVtYXAuYyBiL2FyY2gvaTM4Ni9tbS9pb3JlbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwNmY3MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tbS9pb3JlbWFwLmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBhcmNoL2kzODYvbW0vaW9yZW1hcC5jCisgKgorICogUmUtbWFwIElPIG1lbW9yeSB0byBrZXJuZWwgYWRkcmVzcyBzcGFjZSBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgaXQuCisgKiBUaGlzIGlzIG5lZWRlZCBmb3IgaGlnaCBQQ0kgYWRkcmVzc2VzIHRoYXQgYXJlbid0IG1hcHBlZCBpbiB0aGUKKyAqIDY0MGstMU1CIElPIG1lbW9yeSBhcmVhIG9uIFBDJ3MKKyAqCisgKiAoQykgQ29weXJpZ2h0IDE5OTUgMTk5NiBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjZGVmaW5lIElTQV9TVEFSVF9BRERSRVNTCTB4YTAwMDAKKyNkZWZpbmUgSVNBX0VORF9BRERSRVNTCQkweDEwMDAwMAorCitzdGF0aWMgaW50IGlvcmVtYXBfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXB0ZV90ICpwdGU7CisJdW5zaWduZWQgbG9uZyBwZm47CisKKwlwZm4gPSBwaHlzX2FkZHIgPj4gUEFHRV9TSElGVDsKKwlwdGUgPSBwdGVfYWxsb2Nfa2VybmVsKCZpbml0X21tLCBwbWQsIGFkZHIpOworCWlmICghcHRlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkbyB7CisJCUJVR19PTighcHRlX25vbmUoKnB0ZSkpOworCQlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwZm4sIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVyB8IAorCQkJCQlfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEIHwgZmxhZ3MpKSk7CisJCXBmbisrOworCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpb3JlbWFwX3BtZF9yYW5nZShwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCXVuc2lnbmVkIGxvbmcgZW5kLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlwbWRfdCAqcG1kOworCXVuc2lnbmVkIGxvbmcgbmV4dDsKKworCXBoeXNfYWRkciAtPSBhZGRyOworCXBtZCA9IHBtZF9hbGxvYygmaW5pdF9tbSwgcHVkLCBhZGRyKTsKKwlpZiAoIXBtZCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZG8geworCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChpb3JlbWFwX3B0ZV9yYW5nZShwbWQsIGFkZHIsIG5leHQsIHBoeXNfYWRkciArIGFkZHIsIGZsYWdzKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0gd2hpbGUgKHBtZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpb3JlbWFwX3B1ZF9yYW5nZShwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCXVuc2lnbmVkIGxvbmcgZW5kLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlwdWRfdCAqcHVkOworCXVuc2lnbmVkIGxvbmcgbmV4dDsKKworCXBoeXNfYWRkciAtPSBhZGRyOworCXB1ZCA9IHB1ZF9hbGxvYygmaW5pdF9tbSwgcGdkLCBhZGRyKTsKKwlpZiAoIXB1ZCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZG8geworCQluZXh0ID0gcHVkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChpb3JlbWFwX3BtZF9yYW5nZShwdWQsIGFkZHIsIG5leHQsIHBoeXNfYWRkciArIGFkZHIsIGZsYWdzKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0gd2hpbGUgKHB1ZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvcmVtYXBfcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsCisJCXVuc2lnbmVkIGxvbmcgZW5kLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlwZ2RfdCAqcGdkOworCXVuc2lnbmVkIGxvbmcgbmV4dDsKKwlpbnQgZXJyOworCisJQlVHX09OKGFkZHIgPj0gZW5kKTsKKwlmbHVzaF9jYWNoZV9hbGwoKTsKKwlwaHlzX2FkZHIgLT0gYWRkcjsKKwlwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcik7CisJc3Bpbl9sb2NrKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jayk7CisJZG8geworCQluZXh0ID0gcGdkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWVyciA9IGlvcmVtYXBfcHVkX3JhbmdlKHBnZCwgYWRkciwgbmV4dCwgcGh5c19hZGRyK2FkZHIsIGZsYWdzKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0gd2hpbGUgKHBnZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOworCXNwaW5fdW5sb2NrKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jayk7CisJZmx1c2hfdGxiX2FsbCgpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBHZW5lcmljIG1hcHBpbmcgZnVuY3Rpb24gKG5vdCB2aXNpYmxlIG91dHNpZGUpOgorICovCisKKy8qCisgKiBSZW1hcCBhbiBhcmJpdHJhcnkgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBpbnRvIHRoZSBrZXJuZWwgdmlydHVhbAorICogYWRkcmVzcyBzcGFjZS4gTmVlZGVkIHdoZW4gdGhlIGtlcm5lbCB3YW50cyB0byBhY2Nlc3MgaGlnaCBhZGRyZXNzZXMKKyAqIGRpcmVjdGx5LgorICoKKyAqIE5PVEUhIFdlIG5lZWQgdG8gYWxsb3cgbm9uLXBhZ2UtYWxpZ25lZCBtYXBwaW5ncyB0b286IHdlIHdpbGwgb2J2aW91c2x5CisgKiBoYXZlIHRvIGNvbnZlcnQgdGhlbSBpbnRvIGFuIG9mZnNldCBpbiBhIHBhZ2UtYWxpZ25lZCBtYXBwaW5nLCBidXQgdGhlCisgKiBjYWxsZXIgc2hvdWxkbid0IG5lZWQgdG8ga25vdyB0aGF0IHNtYWxsIGRldGFpbC4KKyAqLwordm9pZCBfX2lvbWVtICogX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJdm9pZCBfX2lvbWVtICogYWRkcjsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICogYXJlYTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgbGFzdF9hZGRyOworCisJLyogRG9uJ3QgYWxsb3cgd3JhcGFyb3VuZCBvciB6ZXJvIHNpemUgKi8KKwlsYXN0X2FkZHIgPSBwaHlzX2FkZHIgKyBzaXplIC0gMTsKKwlpZiAoIXNpemUgfHwgbGFzdF9hZGRyIDwgcGh5c19hZGRyKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogRG9uJ3QgcmVtYXAgdGhlIGxvdyBQQ0kvSVNBIGFyZWEsIGl0J3MgYWx3YXlzIG1hcHBlZC4uCisJICovCisJaWYgKHBoeXNfYWRkciA+PSBJU0FfU1RBUlRfQUREUkVTUyAmJiBsYXN0X2FkZHIgPCBJU0FfRU5EX0FERFJFU1MpCisJCXJldHVybiAodm9pZCBfX2lvbWVtICopIHBoeXNfdG9fdmlydChwaHlzX2FkZHIpOworCisJLyoKKwkgKiBEb24ndCBhbGxvdyBhbnlib2R5IHRvIHJlbWFwIG5vcm1hbCBSQU0gdGhhdCB3ZSdyZSB1c2luZy4uCisJICovCisJaWYgKHBoeXNfYWRkciA8PSB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkgLSAxKSkgeworCQljaGFyICp0X2FkZHIsICp0X2VuZDsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJdF9hZGRyID0gX192YShwaHlzX2FkZHIpOworCQl0X2VuZCA9IHRfYWRkciArIChzaXplIC0gMSk7CisJICAgCisJCWZvcihwYWdlID0gdmlydF90b19wYWdlKHRfYWRkcik7IHBhZ2UgPD0gdmlydF90b19wYWdlKHRfZW5kKTsgcGFnZSsrKQorCQkJaWYoIVBhZ2VSZXNlcnZlZChwYWdlKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIE1hcHBpbmdzIGhhdmUgdG8gYmUgcGFnZS1hbGlnbmVkCisJICovCisJb2Zmc2V0ID0gcGh5c19hZGRyICYgflBBR0VfTUFTSzsKKwlwaHlzX2FkZHIgJj0gUEFHRV9NQVNLOworCXNpemUgPSBQQUdFX0FMSUdOKGxhc3RfYWRkcisxKSAtIHBoeXNfYWRkcjsKKworCS8qCisJICogT2ssIGdvIGZvciBpdC4uCisJICovCisJYXJlYSA9IGdldF92bV9hcmVhKHNpemUsIFZNX0lPUkVNQVAgfCAoZmxhZ3MgPDwgMjApKTsKKwlpZiAoIWFyZWEpCisJCXJldHVybiBOVUxMOworCWFyZWEtPnBoeXNfYWRkciA9IHBoeXNfYWRkcjsKKwlhZGRyID0gKHZvaWQgX19pb21lbSAqKSBhcmVhLT5hZGRyOworCWlmIChpb3JlbWFwX3BhZ2VfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIGFkZHIsCisJCQkodW5zaWduZWQgbG9uZykgYWRkciArIHNpemUsIHBoeXNfYWRkciwgZmxhZ3MpKSB7CisJCXZ1bm1hcCgodm9pZCBfX2ZvcmNlICopIGFkZHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuICh2b2lkIF9faW9tZW0gKikgKG9mZnNldCArIChjaGFyIF9faW9tZW0gKilhZGRyKTsKK30KKworCisvKioKKyAqIGlvcmVtYXBfbm9jYWNoZSAgICAgLSAgIG1hcCBidXMgbWVtb3J5IGludG8gQ1BVIHNwYWNlCisgKiBAb2Zmc2V0OiAgICBidXMgYWRkcmVzcyBvZiB0aGUgbWVtb3J5CisgKiBAc2l6ZTogICAgICBzaXplIG9mIHRoZSByZXNvdXJjZSB0byBtYXAKKyAqCisgKiBpb3JlbWFwX25vY2FjaGUgcGVyZm9ybXMgYSBwbGF0Zm9ybSBzcGVjaWZpYyBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIHRvCisgKiBtYWtlIGJ1cyBtZW1vcnkgQ1BVIGFjY2Vzc2libGUgdmlhIHRoZSByZWFkYi9yZWFkdy9yZWFkbC93cml0ZWIvCisgKiB3cml0ZXcvd3JpdGVsIGZ1bmN0aW9ucyBhbmQgdGhlIG90aGVyIG1taW8gaGVscGVycy4gVGhlIHJldHVybmVkCisgKiBhZGRyZXNzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHVzYWJsZSBkaXJlY3RseSBhcyBhIHZpcnR1YWwKKyAqIGFkZHJlc3MuIAorICoKKyAqIFRoaXMgdmVyc2lvbiBvZiBpb3JlbWFwIGVuc3VyZXMgdGhhdCB0aGUgbWVtb3J5IGlzIG1hcmtlZCB1bmNhY2hhYmxlCisgKiBvbiB0aGUgQ1BVIGFzIHdlbGwgYXMgaG9ub3VyaW5nIGV4aXN0aW5nIGNhY2hpbmcgcnVsZXMgZnJvbSB0aGluZ3MgbGlrZQorICogdGhlIFBDSSBidXMuIE5vdGUgdGhhdCB0aGVyZSBhcmUgb3RoZXIgY2FjaGVzIGFuZCBidWZmZXJzIG9uIG1hbnkgCisgKiBidXNzZXMuIEluIHBhcnRpY3VsYXIgZHJpdmVyIGF1dGhvcnMgc2hvdWxkIHJlYWQgdXAgb24gUENJIHdyaXRlcworICoKKyAqIEl0J3MgdXNlZnVsIGlmIHNvbWUgY29udHJvbCByZWdpc3RlcnMgYXJlIGluIHN1Y2ggYW4gYXJlYSBhbmQKKyAqIHdyaXRlIGNvbWJpbmluZyBvciByZWFkIGNhY2hpbmcgaXMgbm90IGRlc2lyYWJsZToKKyAqIAorICogTXVzdCBiZSBmcmVlZCB3aXRoIGlvdW5tYXAuCisgKi8KKwordm9pZCBfX2lvbWVtICppb3JlbWFwX25vY2FjaGUgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBsYXN0X2FkZHI7CisJdm9pZCBfX2lvbWVtICpwID0gX19pb3JlbWFwKHBoeXNfYWRkciwgc2l6ZSwgX1BBR0VfUENEKTsKKwlpZiAoIXApIAorCQlyZXR1cm4gcDsgCisKKwkvKiBHdWFyYW50ZWVkIHRvIGJlID4gcGh5c19hZGRyLCBhcyBwZXIgX19pb3JlbWFwKCkgKi8KKwlsYXN0X2FkZHIgPSBwaHlzX2FkZHIgKyBzaXplIC0gMTsKKworCWlmIChsYXN0X2FkZHIgPCB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkpIC0gMSkgeworCQlzdHJ1Y3QgcGFnZSAqcHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoX192YShwaHlzX2FkZHIpKTsJCQorCQl1bnNpZ25lZCBsb25nIG5wYWdlczsKKworCQlwaHlzX2FkZHIgJj0gUEFHRV9NQVNLOworCisJCS8qIFRoaXMgbWlnaHQgb3ZlcmZsb3cgYW5kIGJlY29tZSB6ZXJvLi4gKi8KKwkJbGFzdF9hZGRyID0gUEFHRV9BTElHTihsYXN0X2FkZHIpOworCisJCS8qIC4uIGJ1dCB0aGF0J3Mgb2ssIGJlY2F1c2UgbW9kdWxvLTIqKm4gYXJpdGhtZXRpYyB3aWxsIG1ha2UKKwkgCSogdGhlIHBhZ2UtYWxpZ25lZCAibGFzdCAtIGZpcnN0IiBjb21lIG91dCByaWdodC4KKwkgCSovCisJCW5wYWdlcyA9IChsYXN0X2FkZHIgLSBwaHlzX2FkZHIpID4+IFBBR0VfU0hJRlQ7CisKKwkJaWYgKGNoYW5nZV9wYWdlX2F0dHIocHBhZ2UsIG5wYWdlcywgUEFHRV9LRVJORUxfTk9DQUNIRSkgPCAwKSB7IAorCQkJaW91bm1hcChwKTsgCisJCQlwID0gTlVMTDsKKwkJfQorCQlnbG9iYWxfZmx1c2hfdGxiKCk7CisJfQorCisJcmV0dXJuIHA7CQkJCQkKK30KKwordm9pZCBpb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlzdHJ1Y3Qgdm1fc3RydWN0ICpwOworCWlmICgodm9pZCBfX2ZvcmNlICopIGFkZHIgPD0gaGlnaF9tZW1vcnkpIAorCQlyZXR1cm47CisKKwkvKgorCSAqIF9faW9yZW1hcCBzcGVjaWFsLWNhc2VzIHRoZSBQQ0kvSVNBIHJhbmdlIGJ5IG5vdCBpbnN0YW50aWF0aW5nIGEKKwkgKiB2bV9hcmVhIGFuZCBieSBzaW1wbHkgcmV0dXJuaW5nIGFuIGFkZHJlc3MgaW50byB0aGUga2VybmVsIG1hcHBpbmcKKwkgKiBvZiBJU0Egc3BhY2UuICAgU28gaGFuZGxlIHRoYXQgaGVyZS4KKwkgKi8KKwlpZiAoYWRkciA+PSBwaHlzX3RvX3ZpcnQoSVNBX1NUQVJUX0FERFJFU1MpICYmCisJCQlhZGRyIDwgcGh5c190b192aXJ0KElTQV9FTkRfQUREUkVTUykpCisJCXJldHVybjsKKworCXAgPSByZW1vdmVfdm1fYXJlYSgodm9pZCAqKSAoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSkgYWRkcikpOworCWlmICghcCkgeyAKKwkJcHJpbnRrKCJfX2lvdW5tYXA6IGJhZCBhZGRyZXNzICVwXG4iLCBhZGRyKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgocC0+ZmxhZ3MgPj4gMjApICYmIHAtPnBoeXNfYWRkciA8IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSkgLSAxKSB7CisJCS8qIHAtPnNpemUgaW5jbHVkZXMgdGhlIGd1YXJkIHBhZ2UsIGJ1dCBjcGEgZG9lc24ndCBsaWtlIHRoYXQgKi8KKwkJY2hhbmdlX3BhZ2VfYXR0cih2aXJ0X3RvX3BhZ2UoX192YShwLT5waHlzX2FkZHIpKSwKKwkJCQkgcC0+c2l6ZSA+PiBQQUdFX1NISUZULAorCQkJCSBQQUdFX0tFUk5FTCk7CisJCWdsb2JhbF9mbHVzaF90bGIoKTsKKwl9IAorCWtmcmVlKHApOyAKK30KKwordm9pZCBfX2luaXQgKmJ0X2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgbGFzdF9hZGRyOworCXVuc2lnbmVkIGludCBucnBhZ2VzOworCWVudW0gZml4ZWRfYWRkcmVzc2VzIGlkeDsKKworCS8qIERvbid0IGFsbG93IHdyYXBhcm91bmQgb3IgemVybyBzaXplICovCisJbGFzdF9hZGRyID0gcGh5c19hZGRyICsgc2l6ZSAtIDE7CisJaWYgKCFzaXplIHx8IGxhc3RfYWRkciA8IHBoeXNfYWRkcikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIERvbid0IHJlbWFwIHRoZSBsb3cgUENJL0lTQSBhcmVhLCBpdCdzIGFsd2F5cyBtYXBwZWQuLgorCSAqLworCWlmIChwaHlzX2FkZHIgPj0gSVNBX1NUQVJUX0FERFJFU1MgJiYgbGFzdF9hZGRyIDwgSVNBX0VORF9BRERSRVNTKQorCQlyZXR1cm4gcGh5c190b192aXJ0KHBoeXNfYWRkcik7CisKKwkvKgorCSAqIE1hcHBpbmdzIGhhdmUgdG8gYmUgcGFnZS1hbGlnbmVkCisJICovCisJb2Zmc2V0ID0gcGh5c19hZGRyICYgflBBR0VfTUFTSzsKKwlwaHlzX2FkZHIgJj0gUEFHRV9NQVNLOworCXNpemUgPSBQQUdFX0FMSUdOKGxhc3RfYWRkcikgLSBwaHlzX2FkZHI7CisKKwkvKgorCSAqIE1hcHBpbmdzIGhhdmUgdG8gZml0IGluIHRoZSBGSVhfQlRNQVAgYXJlYS4KKwkgKi8KKwlucnBhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCWlmIChucnBhZ2VzID4gTlJfRklYX0JUTUFQUykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIE9rLCBnbyBmb3IgaXQuLgorCSAqLworCWlkeCA9IEZJWF9CVE1BUF9CRUdJTjsKKwl3aGlsZSAobnJwYWdlcyA+IDApIHsKKwkJc2V0X2ZpeG1hcChpZHgsIHBoeXNfYWRkcik7CisJCXBoeXNfYWRkciArPSBQQUdFX1NJWkU7CisJCS0taWR4OworCQktLW5ycGFnZXM7CisJfQorCXJldHVybiAodm9pZCopIChvZmZzZXQgKyBmaXhfdG9fdmlydChGSVhfQlRNQVBfQkVHSU4pKTsKK30KKwordm9pZCBfX2luaXQgYnRfaW91bm1hcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHI7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgaW50IG5ycGFnZXM7CisJZW51bSBmaXhlZF9hZGRyZXNzZXMgaWR4OworCisJdmlydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKKwlpZiAodmlydF9hZGRyIDwgZml4X3RvX3ZpcnQoRklYX0JUTUFQX0JFR0lOKSkKKwkJcmV0dXJuOworCW9mZnNldCA9IHZpcnRfYWRkciAmIH5QQUdFX01BU0s7CisJbnJwYWdlcyA9IFBBR0VfQUxJR04ob2Zmc2V0ICsgc2l6ZSAtIDEpID4+IFBBR0VfU0hJRlQ7CisKKwlpZHggPSBGSVhfQlRNQVBfQkVHSU47CisJd2hpbGUgKG5ycGFnZXMgPiAwKSB7CisJCWNsZWFyX2ZpeG1hcChpZHgpOworCQktLWlkeDsKKwkJLS1ucnBhZ2VzOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9tbWFwLmMgYi9hcmNoL2kzODYvbW0vbW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NzMwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbW0vbW1hcC5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiAgbGludXgvYXJjaC9pMzg2L21tL21tYXAuYworICoKKyAqICBmbGV4aWJsZSBtbWFwIGxheW91dCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNCBSZWQgSGF0IEluYy4sIER1cmhhbSwgTm9ydGggQ2Fyb2xpbmEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKgorICogU3RhcnRlZCBieSBJbmdvIE1vbG5hciA8bWluZ29AZWx0ZS5odT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorCisvKgorICogVG9wIG9mIG1tYXAgYXJlYSAoanVzdCBiZWxvdyB0aGUgcHJvY2VzcyBzdGFjaykuCisgKgorICogTGVhdmUgYW4gYXQgbGVhc3QgfjEyOCBNQiBob2xlLgorICovCisjZGVmaW5lIE1JTl9HQVAgKDEyOCoxMDI0KjEwMjQpCisjZGVmaW5lIE1BWF9HQVAgKFRBU0tfU0laRS82KjUpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbWFwX2Jhc2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJdW5zaWduZWQgbG9uZyBnYXAgPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX1NUQUNLXS5ybGltX2N1cjsKKwl1bnNpZ25lZCBsb25nIHJhbmRvbV9mYWN0b3IgPSAwOworCisJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKQorCQlyYW5kb21fZmFjdG9yID0gZ2V0X3JhbmRvbV9pbnQoKSAlICgxMDI0KjEwMjQpOworCisJaWYgKGdhcCA8IE1JTl9HQVApCisJCWdhcCA9IE1JTl9HQVA7CisJZWxzZSBpZiAoZ2FwID4gTUFYX0dBUCkKKwkJZ2FwID0gTUFYX0dBUDsKKworCXJldHVybiBQQUdFX0FMSUdOKFRBU0tfU0laRSAtIGdhcCAtIHJhbmRvbV9mYWN0b3IpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiwgY2FsbGVkIHZlcnkgZWFybHkgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiBhIG5ldworICogcHJvY2VzcyBWTSBpbWFnZSwgc2V0cyB1cCB3aGljaCBWTSBsYXlvdXQgZnVuY3Rpb24gdG8gdXNlOgorICovCit2b2lkIGFyY2hfcGlja19tbWFwX2xheW91dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwkvKgorCSAqIEZhbGwgYmFjayB0byB0aGUgc3RhbmRhcmQgbGF5b3V0IGlmIHRoZSBwZXJzb25hbGl0eQorCSAqIGJpdCBpcyBzZXQsIG9yIGlmIHRoZSBleHBlY3RlZCBzdGFjayBncm93dGggaXMgdW5saW1pdGVkOgorCSAqLworCWlmIChzeXNjdGxfbGVnYWN5X3ZhX2xheW91dCB8fAorCQkJKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9DT01QQVRfTEFZT1VUKSB8fAorCQkJY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9TVEFDS10ucmxpbV9jdXIgPT0gUkxJTV9JTkZJTklUWSkgeworCQltbS0+bW1hcF9iYXNlID0gVEFTS19VTk1BUFBFRF9CQVNFOworCQltbS0+Z2V0X3VubWFwcGVkX2FyZWEgPSBhcmNoX2dldF91bm1hcHBlZF9hcmVhOworCQltbS0+dW5tYXBfYXJlYSA9IGFyY2hfdW5tYXBfYXJlYTsKKwl9IGVsc2UgeworCQltbS0+bW1hcF9iYXNlID0gbW1hcF9iYXNlKG1tKTsKKwkJbW0tPmdldF91bm1hcHBlZF9hcmVhID0gYXJjaF9nZXRfdW5tYXBwZWRfYXJlYV90b3Bkb3duOworCQltbS0+dW5tYXBfYXJlYSA9IGFyY2hfdW5tYXBfYXJlYV90b3Bkb3duOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9wYWdlYXR0ci5jIGIvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzZGE2YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9tbS9wYWdlYXR0ci5jCkBAIC0wLDAgKzEsMjIxIEBACisvKiAKKyAqIENvcHlyaWdodCAyMDAyIEFuZGkgS2xlZW4sIFN1U0UgTGFicy4gCisgKiBUaGFua3MgdG8gQmVuIExhSGFpc2UgZm9yIHByZWNpb3VzIGZlZWRiYWNrLgorICovIAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3BhX2xvY2spOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgZGZfbGlzdCA9IExJU1RfSEVBRF9JTklUKGRmX2xpc3QpOworCisKK3B0ZV90ICpsb29rdXBfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpIAoreyAKKwlwZ2RfdCAqcGdkID0gcGdkX29mZnNldF9rKGFkZHJlc3MpOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZDsKKwlpZiAocGdkX25vbmUoKnBnZCkpCisJCXJldHVybiBOVUxMOworCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyZXNzKTsKKwlpZiAocHVkX25vbmUoKnB1ZCkpCisJCXJldHVybiBOVUxMOworCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKTsKKwlpZiAocG1kX25vbmUoKnBtZCkpCisJCXJldHVybiBOVUxMOworCWlmIChwbWRfbGFyZ2UoKnBtZCkpCisJCXJldHVybiAocHRlX3QgKilwbWQ7CisgICAgICAgIHJldHVybiBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHJlc3MpOworfSAKKworc3RhdGljIHN0cnVjdCBwYWdlICpzcGxpdF9sYXJnZV9wYWdlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcGdwcm90X3QgcHJvdCkKK3sgCisJaW50IGk7IAorCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlzdHJ1Y3QgcGFnZSAqYmFzZTsKKwlwdGVfdCAqcGJhc2U7CisKKwlzcGluX3VubG9ja19pcnEoJmNwYV9sb2NrKTsKKwliYXNlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7CisJc3Bpbl9sb2NrX2lycSgmY3BhX2xvY2spOworCWlmICghYmFzZSkgCisJCXJldHVybiBOVUxMOworCisJYWRkcmVzcyA9IF9fcGEoYWRkcmVzcyk7CisJYWRkciA9IGFkZHJlc3MgJiBMQVJHRV9QQUdFX01BU0s7IAorCXBiYXNlID0gKHB0ZV90ICopcGFnZV9hZGRyZXNzKGJhc2UpOworCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QVEU7IGkrKywgYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJcGJhc2VbaV0gPSBwZm5fcHRlKGFkZHIgPj4gUEFHRV9TSElGVCwgCisJCQkJICAgYWRkciA9PSBhZGRyZXNzID8gcHJvdCA6IFBBR0VfS0VSTkVMKTsKKwl9CisJcmV0dXJuIGJhc2U7Cit9IAorCitzdGF0aWMgdm9pZCBmbHVzaF9rZXJuZWxfbWFwKHZvaWQgKmR1bW15KSAKK3sgCisJLyogQ291bGQgdXNlIENMRkxVU0ggaGVyZSBpZiB0aGUgQ1BVIHN1cHBvcnRzIGl0IChIYW1tZXIsUDQpICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID49IDQpIAorCQlhc20gdm9sYXRpbGUoIndiaW52ZCI6OjoibWVtb3J5Iik7IAorCS8qIEZsdXNoIGFsbCB0byB3b3JrIGFyb3VuZCBFcnJhdGEgaW4gZWFybHkgYXRobG9ucyByZWdhcmRpbmcgCisJICogbGFyZ2UgcGFnZSBmbHVzaGluZy4gCisJICovCisJX19mbHVzaF90bGJfYWxsKCk7IAkKK30KKworc3RhdGljIHZvaWQgc2V0X3BtZF9wdGUocHRlX3QgKmtwdGUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgcHRlKSAKK3sgCisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNldF9wdGVfYXRvbWljKGtwdGUsIHB0ZSk7IAkvKiBjaGFuZ2UgaW5pdF9tbSAqLworCWlmIChQVFJTX1BFUl9QTUQgPiAxKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGdkX2xvY2ssIGZsYWdzKTsKKwlmb3IgKHBhZ2UgPSBwZ2RfbGlzdDsgcGFnZTsgcGFnZSA9IChzdHJ1Y3QgcGFnZSAqKXBhZ2UtPmluZGV4KSB7CisJCXBnZF90ICpwZ2Q7CisJCXB1ZF90ICpwdWQ7CisJCXBtZF90ICpwbWQ7CisJCXBnZCA9IChwZ2RfdCAqKXBhZ2VfYWRkcmVzcyhwYWdlKSArIHBnZF9pbmRleChhZGRyZXNzKTsKKwkJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHJlc3MpOworCQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcmVzcyk7CisJCXNldF9wdGVfYXRvbWljKChwdGVfdCAqKXBtZCwgcHRlKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGdkX2xvY2ssIGZsYWdzKTsKK30KKworLyogCisgKiBObyBtb3JlIHNwZWNpYWwgcHJvdGVjdGlvbnMgaW4gdGhpcyAyLzRNQiBhcmVhIC0gcmV2ZXJ0IHRvIGEKKyAqIGxhcmdlIHBhZ2UgYWdhaW4uIAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmV2ZXJ0X3BhZ2Uoc3RydWN0IHBhZ2UgKmtwdGVfcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXB0ZV90ICpsaW5lYXIgPSAocHRlX3QgKikgCisJCXBtZF9vZmZzZXQocHVkX29mZnNldChwZ2Rfb2Zmc2V0X2soYWRkcmVzcyksIGFkZHJlc3MpLCBhZGRyZXNzKTsKKwlzZXRfcG1kX3B0ZShsaW5lYXIsICBhZGRyZXNzLAorCQkgICAgcGZuX3B0ZSgoX19wYShhZGRyZXNzKSAmIExBUkdFX1BBR0VfTUFTSykgPj4gUEFHRV9TSElGVCwKKwkJCSAgICBQQUdFX0tFUk5FTF9MQVJHRSkpOworfQorCitzdGF0aWMgaW50CitfX2NoYW5nZV9wYWdlX2F0dHIoc3RydWN0IHBhZ2UgKnBhZ2UsIHBncHJvdF90IHByb3QpCit7IAorCXB0ZV90ICprcHRlOyAKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJc3RydWN0IHBhZ2UgKmtwdGVfcGFnZTsKKworCUJVR19PTihQYWdlSGlnaE1lbShwYWdlKSk7CisJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKworCWtwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyZXNzKTsKKwlpZiAoIWtwdGUpCisJCXJldHVybiAtRUlOVkFMOworCWtwdGVfcGFnZSA9IHZpcnRfdG9fcGFnZShrcHRlKTsKKwlpZiAocGdwcm90X3ZhbChwcm90KSAhPSBwZ3Byb3RfdmFsKFBBR0VfS0VSTkVMKSkgeyAKKwkJaWYgKChwdGVfdmFsKCprcHRlKSAmIF9QQUdFX1BTRSkgPT0gMCkgeyAKKwkJCXNldF9wdGVfYXRvbWljKGtwdGUsIG1rX3B0ZShwYWdlLCBwcm90KSk7IAorCQl9IGVsc2UgeworCQkJc3RydWN0IHBhZ2UgKnNwbGl0ID0gc3BsaXRfbGFyZ2VfcGFnZShhZGRyZXNzLCBwcm90KTsgCisJCQlpZiAoIXNwbGl0KQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJc2V0X3BtZF9wdGUoa3B0ZSxhZGRyZXNzLG1rX3B0ZShzcGxpdCwgUEFHRV9LRVJORUwpKTsKKwkJCWtwdGVfcGFnZSA9IHNwbGl0OworCQl9CQorCQlnZXRfcGFnZShrcHRlX3BhZ2UpOworCX0gZWxzZSBpZiAoKHB0ZV92YWwoKmtwdGUpICYgX1BBR0VfUFNFKSA9PSAwKSB7IAorCQlzZXRfcHRlX2F0b21pYyhrcHRlLCBta19wdGUocGFnZSwgUEFHRV9LRVJORUwpKTsKKwkJX19wdXRfcGFnZShrcHRlX3BhZ2UpOworCX0gZWxzZQorCQlCVUcoKTsKKworCS8qCisJICogSWYgdGhlIHB0ZSB3YXMgcmVzZXJ2ZWQsIGl0IG1lYW5zIGl0IHdhcyBjcmVhdGVkIGF0IGJvb3QKKwkgKiB0aW1lIChub3QgdmlhIHNwbGl0X2xhcmdlX3BhZ2UpIGFuZCBpbiB0dXJuIHdlIG11c3Qgbm90CisJICogcmVwbGFjZSBpdCB3aXRoIGEgbGFyZ2VwYWdlLgorCSAqLworCWlmICghUGFnZVJlc2VydmVkKGtwdGVfcGFnZSkpIHsKKwkJLyogbWVtbGVhayBhbmQgcG90ZW50aWFsIGZhaWxlZCAyTSBwYWdlIHJlZ2VuZXJhdGlvbiAqLworCQlCVUdfT04oIXBhZ2VfY291bnQoa3B0ZV9wYWdlKSk7CisKKwkJaWYgKGNwdV9oYXNfcHNlICYmIChwYWdlX2NvdW50KGtwdGVfcGFnZSkgPT0gMSkpIHsKKwkJCWxpc3RfYWRkKCZrcHRlX3BhZ2UtPmxydSwgJmRmX2xpc3QpOworCQkJcmV2ZXJ0X3BhZ2Uoa3B0ZV9wYWdlLCBhZGRyZXNzKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30gCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9tYXAodm9pZCkKK3sKKwlvbl9lYWNoX2NwdShmbHVzaF9rZXJuZWxfbWFwLCBOVUxMLCAxLCAxKTsKK30KKworLyoKKyAqIENoYW5nZSB0aGUgcGFnZSBhdHRyaWJ1dGVzIG9mIGFuIHBhZ2UgaW4gdGhlIGxpbmVhciBtYXBwaW5nLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBhIHBhZ2UgaXMgbWFwcGVkIHdpdGggYSBkaWZmZXJlbnQgY2FjaGluZyBwb2xpY3kKKyAqIHRoYW4gd3JpdGUtYmFjayBzb21ld2hlcmUgLSBzb21lIENQVXMgZG8gbm90IGxpa2UgaXQgd2hlbiBtYXBwaW5ncyB3aXRoCisgKiBkaWZmZXJlbnQgY2FjaGluZyBwb2xpY2llcyBleGlzdC4gVGhpcyBjaGFuZ2VzIHRoZSBwYWdlIGF0dHJpYnV0ZXMgb2YgdGhlCisgKiBpbiBrZXJuZWwgbGluZWFyIG1hcHBpbmcgdG9vLgorICogCisgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBjb25mbGljdGluZyBtYXBwaW5ncyBlbHNld2hlcmUuCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgZGVhbHMgd2l0aCB0aGUga2VybmVsIGxpbmVhciBtYXAuCisgKiAKKyAqIENhbGxlciBtdXN0IGNhbGwgZ2xvYmFsX2ZsdXNoX3RsYigpIGFmdGVyIHRoaXMuCisgKi8KK2ludCBjaGFuZ2VfcGFnZV9hdHRyKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnVtcGFnZXMsIHBncHJvdF90IHByb3QpCit7CisJaW50IGVyciA9IDA7IAorCWludCBpOyAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwYV9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG51bXBhZ2VzOyBpKyssIHBhZ2UrKykgeyAKKwkJZXJyID0gX19jaGFuZ2VfcGFnZV9hdHRyKHBhZ2UsIHByb3QpOworCQlpZiAoZXJyKSAKKwkJCWJyZWFrOyAKKwl9IAkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcGFfbG9jaywgZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgZ2xvYmFsX2ZsdXNoX3RsYih2b2lkKQoreyAKKwlMSVNUX0hFQUQobCk7CisJc3RydWN0IHBhZ2UgKnBnLCAqbmV4dDsKKworCUJVR19PTihpcnFzX2Rpc2FibGVkKCkpOworCisJc3Bpbl9sb2NrX2lycSgmY3BhX2xvY2spOworCWxpc3Rfc3BsaWNlX2luaXQoJmRmX2xpc3QsICZsKTsKKwlzcGluX3VubG9ja19pcnEoJmNwYV9sb2NrKTsKKwlmbHVzaF9tYXAoKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGcsIG5leHQsICZsLCBscnUpCisJCV9fZnJlZV9wYWdlKHBnKTsKK30gCisKKyNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCit2b2lkIGtlcm5lbF9tYXBfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBudW1wYWdlcywgaW50IGVuYWJsZSkKK3sKKwlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCisJCXJldHVybjsKKwkvKiB0aGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQgLSB0aGUgY2FsbHMgY2Fubm90IGZhaWwsCisJICogbGFyZ2UgcGFnZXMgYXJlIGRpc2FibGVkIGF0IGJvb3QgdGltZS4KKwkgKi8KKwljaGFuZ2VfcGFnZV9hdHRyKHBhZ2UsIG51bXBhZ2VzLCBlbmFibGUgPyBQQUdFX0tFUk5FTCA6IF9fcGdwcm90KDApKTsKKwkvKiB3ZSBzaG91bGQgcGVyZm9ybSBhbiBJUEkgYW5kIGZsdXNoIGFsbCB0bGJzLAorCSAqIGJ1dCB0aGF0IGNhbiBkZWFkbG9jay0+Zmx1c2ggb25seSBjdXJyZW50IGNwdS4KKwkgKi8KKwlfX2ZsdXNoX3RsYl9hbGwoKTsKK30KKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKGNoYW5nZV9wYWdlX2F0dHIpOworRVhQT1JUX1NZTUJPTChnbG9iYWxfZmx1c2hfdGxiKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9wZ3RhYmxlLmMgYi9hcmNoL2kzODYvbW0vcGd0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDJkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvbW0vcGd0YWJsZS5jCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogIGxpbnV4L2FyY2gvaTM4Ni9tbS9wZ3RhYmxlLmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKwordm9pZCBzaG93X21lbSh2b2lkKQoreworCWludCB0b3RhbCA9IDAsIHJlc2VydmVkID0gMDsKKwlpbnQgc2hhcmVkID0gMCwgY2FjaGVkID0gMDsKKwlpbnQgaGlnaG1lbSA9IDA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJcGdfZGF0YV90ICpwZ2RhdDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlwcmludGsoIk1lbS1pbmZvOlxuIik7CisJc2hvd19mcmVlX2FyZWFzKCk7CisJcHJpbnRrKCJGcmVlIHN3YXA6ICAgICAgICU2bGRrQlxuIiwgbnJfc3dhcF9wYWdlczw8KFBBR0VfU0hJRlQtMTApKTsKKwlmb3JfZWFjaF9wZ2RhdChwZ2RhdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsgKytpKSB7CisJCQlwYWdlID0gcGdkYXQtPm5vZGVfbWVtX21hcCArIGk7CisJCQl0b3RhbCsrOworCQkJaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpKQorCQkJCWhpZ2htZW0rKzsKKwkJCWlmIChQYWdlUmVzZXJ2ZWQocGFnZSkpCisJCQkJcmVzZXJ2ZWQrKzsKKwkJCWVsc2UgaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpCisJCQkJY2FjaGVkKys7CisJCQllbHNlIGlmIChwYWdlX2NvdW50KHBhZ2UpKQorCQkJCXNoYXJlZCArPSBwYWdlX2NvdW50KHBhZ2UpIC0gMTsKKwkJfQorCX0KKwlwcmludGsoIiVkIHBhZ2VzIG9mIFJBTVxuIiwgdG90YWwpOworCXByaW50aygiJWQgcGFnZXMgb2YgSElHSE1FTVxuIixoaWdobWVtKTsKKwlwcmludGsoIiVkIHJlc2VydmVkIHBhZ2VzXG4iLHJlc2VydmVkKTsKKwlwcmludGsoIiVkIHBhZ2VzIHNoYXJlZFxuIixzaGFyZWQpOworCXByaW50aygiJWQgcGFnZXMgc3dhcCBjYWNoZWRcbiIsY2FjaGVkKTsKK30KKworLyoKKyAqIEFzc29jaWF0ZSBhIHZpcnR1YWwgcGFnZSBmcmFtZSB3aXRoIGEgZ2l2ZW4gcGh5c2ljYWwgcGFnZSBmcmFtZSAKKyAqIGFuZCBwcm90ZWN0aW9uIGZsYWdzIGZvciB0aGF0IGZyYW1lLgorICovIAorc3RhdGljIHZvaWQgc2V0X3B0ZV9wZm4odW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IGZsYWdzKQoreworCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGU7CisKKwlwZ2QgPSBzd2FwcGVyX3BnX2RpciArIHBnZF9pbmRleCh2YWRkcik7CisJaWYgKHBnZF9ub25lKCpwZ2QpKSB7CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCB2YWRkcik7CisJaWYgKHB1ZF9ub25lKCpwdWQpKSB7CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCXBtZCA9IHBtZF9vZmZzZXQocHVkLCB2YWRkcik7CisJaWYgKHBtZF9ub25lKCpwbWQpKSB7CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgdmFkZHIpOworCS8qIDxwZm4sZmxhZ3M+IHN0b3JlZCBhcy1pcywgdG8gcGVybWl0IGNsZWFyaW5nIGVudHJpZXMgKi8KKwlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwZm4sIGZsYWdzKSk7CisKKwkvKgorCSAqIEl0J3MgZW5vdWdoIHRvIGZsdXNoIHRoaXMgb25lIG1hcHBpbmcuCisJICogKFBHRSBtYXBwaW5ncyBnZXQgZmx1c2hlZCBhcyB3ZWxsKQorCSAqLworCV9fZmx1c2hfdGxiX29uZSh2YWRkcik7Cit9CisKKy8qCisgKiBBc3NvY2lhdGUgYSBsYXJnZSB2aXJ0dWFsIHBhZ2UgZnJhbWUgd2l0aCBhIGdpdmVuIHBoeXNpY2FsIHBhZ2UgZnJhbWUgCisgKiBhbmQgcHJvdGVjdGlvbiBmbGFncyBmb3IgdGhhdCBmcmFtZS4gcGZuIGlzIGZvciB0aGUgYmFzZSBvZiB0aGUgcGFnZSwKKyAqIHZhZGRyIGlzIHdoYXQgdGhlIHBhZ2UgZ2V0cyBtYXBwZWQgdG8gLSBib3RoIG11c3QgYmUgcHJvcGVybHkgYWxpZ25lZC4gCisgKiBUaGUgcG1kIG11c3QgYWxyZWFkeSBiZSBpbnN0YW50aWF0ZWQuIEFzc3VtZXMgUEFFIG1vZGUuCisgKi8gCit2b2lkIHNldF9wbWRfcGZuKHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVuc2lnbmVkIGxvbmcgcGZuLCBwZ3Byb3RfdCBmbGFncykKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZDsKKworCWlmICh2YWRkciAmIChQTURfU0laRS0xKSkgewkJLyogdmFkZHIgaXMgbWlzYWxpZ25lZCAqLworCQlwcmludGsgKCJzZXRfcG1kX3BmbjogdmFkZHIgbWlzYWxpZ25lZFxuIik7CisJCXJldHVybjsgLyogQlVHKCk7ICovCisJfQorCWlmIChwZm4gJiAoUFRSU19QRVJfUFRFLTEpKSB7CQkvKiBwZm4gaXMgbWlzYWxpZ25lZCAqLworCQlwcmludGsgKCJzZXRfcG1kX3BmbjogcGZuIG1pc2FsaWduZWRcbiIpOworCQlyZXR1cm47IC8qIEJVRygpOyAqLworCX0KKwlwZ2QgPSBzd2FwcGVyX3BnX2RpciArIHBnZF9pbmRleCh2YWRkcik7CisJaWYgKHBnZF9ub25lKCpwZ2QpKSB7CisJCXByaW50ayAoInNldF9wbWRfcGZuOiBwZ2Rfbm9uZVxuIik7CisJCXJldHVybjsgLyogQlVHKCk7ICovCisJfQorCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCB2YWRkcik7CisJcG1kID0gcG1kX29mZnNldChwdWQsIHZhZGRyKTsKKwlzZXRfcG1kKHBtZCwgcGZuX3BtZChwZm4sIGZsYWdzKSk7CisJLyoKKwkgKiBJdCdzIGVub3VnaCB0byBmbHVzaCB0aGlzIG9uZSBtYXBwaW5nLgorCSAqIChQR0UgbWFwcGluZ3MgZ2V0IGZsdXNoZWQgYXMgd2VsbCkKKwkgKi8KKwlfX2ZsdXNoX3RsYl9vbmUodmFkZHIpOworfQorCit2b2lkIF9fc2V0X2ZpeG1hcCAoZW51bSBmaXhlZF9hZGRyZXNzZXMgaWR4LCB1bnNpZ25lZCBsb25nIHBoeXMsIHBncHJvdF90IGZsYWdzKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IF9fZml4X3RvX3ZpcnQoaWR4KTsKKworCWlmIChpZHggPj0gX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzKSB7CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCXNldF9wdGVfcGZuKGFkZHJlc3MsIHBoeXMgPj4gUEFHRV9TSElGVCwgZmxhZ3MpOworfQorCitwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlyZXR1cm4gKHB0ZV90ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUfF9fR0ZQX1pFUk8pOworfQorCitzdHJ1Y3QgcGFnZSAqcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBwYWdlICpwdGU7CisKKyNpZmRlZiBDT05GSUdfSElHSFBURQorCXB0ZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfSElHSE1FTXxfX0dGUF9SRVBFQVR8X19HRlBfWkVSTywgMCk7CisjZWxzZQorCXB0ZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUfF9fR0ZQX1pFUk8sIDApOworI2VuZGlmCisJcmV0dXJuIHB0ZTsKK30KKwordm9pZCBwbWRfY3Rvcih2b2lkICpwbWQsIGttZW1fY2FjaGVfdCAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJbWVtc2V0KHBtZCwgMCwgUFRSU19QRVJfUE1EKnNpemVvZihwbWRfdCkpOworfQorCisvKgorICogTGlzdCBvZiBhbGwgcGdkJ3MgbmVlZGVkIGZvciBub24tUEFFIHNvIGl0IGNhbiBpbnZhbGlkYXRlIGVudHJpZXMKKyAqIGluIGJvdGggY2FjaGVkIGFuZCB1bmNhY2hlZCBwZ2Qnczsgbm90IG5lZWRlZCBmb3IgUEFFIHNpbmNlIHRoZQorICoga2VybmVsIHBtZCBpcyBzaGFyZWQuIElmIFBBRSB3ZXJlIG5vdCB0byBzaGFyZSB0aGUgcG1kIGEgc2ltaWxhcgorICogdGFjdGljIHdvdWxkIGJlIG5lZWRlZC4gVGhpcyBpcyBlc3NlbnRpYWxseSBjb2RlcGF0aC1iYXNlZCBsb2NraW5nCisgKiBhZ2FpbnN0IHBhZ2VhdHRyLmM7IGl0IGlzIHRoZSB1bmlxdWUgY2FzZSBpbiB3aGljaCBhIHZhbGlkIGNoYW5nZQorICogb2Yga2VybmVsIHBhZ2V0YWJsZXMgY2FuJ3QgYmUgbGF6aWx5IHN5bmNocm9uaXplZCBieSB2bWFsbG9jIGZhdWx0cy4KKyAqIHZtYWxsb2MgZmF1bHRzIHdvcmsgYmVjYXVzZSBhdHRhY2hlZCBwYWdldGFibGVzIGFyZSBuZXZlciBmcmVlZC4KKyAqIFRoZSBsb2NraW5nIHNjaGVtZSB3YXMgY2hvc2VuIG9uIHRoZSBiYXNpcyBvZiBtYW5mcmVkJ3MKKyAqIHJlY29tbWVuZGF0aW9ucyBhbmQgaGF2aW5nIG5vIGNvcmUgaW1wYWN0IHdoYXRzb2V2ZXIuCisgKiAtLSB3bGkKKyAqLworREVGSU5FX1NQSU5MT0NLKHBnZF9sb2NrKTsKK3N0cnVjdCBwYWdlICpwZ2RfbGlzdDsKKworc3RhdGljIGlubGluZSB2b2lkIHBnZF9saXN0X2FkZChwZ2RfdCAqcGdkKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKHBnZCk7CisJcGFnZS0+aW5kZXggPSAodW5zaWduZWQgbG9uZylwZ2RfbGlzdDsKKwlpZiAocGdkX2xpc3QpCisJCXBnZF9saXN0LT5wcml2YXRlID0gKHVuc2lnbmVkIGxvbmcpJnBhZ2UtPmluZGV4OworCXBnZF9saXN0ID0gcGFnZTsKKwlwYWdlLT5wcml2YXRlID0gKHVuc2lnbmVkIGxvbmcpJnBnZF9saXN0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGdkX2xpc3RfZGVsKHBnZF90ICpwZ2QpCit7CisJc3RydWN0IHBhZ2UgKm5leHQsICoqcHByZXYsICpwYWdlID0gdmlydF90b19wYWdlKHBnZCk7CisJbmV4dCA9IChzdHJ1Y3QgcGFnZSAqKXBhZ2UtPmluZGV4OworCXBwcmV2ID0gKHN0cnVjdCBwYWdlICoqKXBhZ2UtPnByaXZhdGU7CisJKnBwcmV2ID0gbmV4dDsKKwlpZiAobmV4dCkKKwkJbmV4dC0+cHJpdmF0ZSA9ICh1bnNpZ25lZCBsb25nKXBwcmV2OworfQorCit2b2lkIHBnZF9jdG9yKHZvaWQgKnBnZCwga21lbV9jYWNoZV90ICpjYWNoZSwgdW5zaWduZWQgbG9uZyB1bnVzZWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChQVFJTX1BFUl9QTUQgPT0gMSkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBnZF9sb2NrLCBmbGFncyk7CisKKwltZW1jcHkoKHBnZF90ICopcGdkICsgVVNFUl9QVFJTX1BFUl9QR0QsCisJCQlzd2FwcGVyX3BnX2RpciArIFVTRVJfUFRSU19QRVJfUEdELAorCQkJKFBUUlNfUEVSX1BHRCAtIFVTRVJfUFRSU19QRVJfUEdEKSAqIHNpemVvZihwZ2RfdCkpOworCisJaWYgKFBUUlNfUEVSX1BNRCA+IDEpCisJCXJldHVybjsKKworCXBnZF9saXN0X2FkZChwZ2QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBnZF9sb2NrLCBmbGFncyk7CisJbWVtc2V0KHBnZCwgMCwgVVNFUl9QVFJTX1BFUl9QR0Qqc2l6ZW9mKHBnZF90KSk7Cit9CisKKy8qIG5ldmVyIGNhbGxlZCB3aGVuIFBUUlNfUEVSX1BNRCA+IDEgKi8KK3ZvaWQgcGdkX2R0b3Iodm9pZCAqcGdkLCBrbWVtX2NhY2hlX3QgKmNhY2hlLCB1bnNpZ25lZCBsb25nIHVudXNlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOyAvKiBjYW4gYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZ2RfbG9jaywgZmxhZ3MpOworCXBnZF9saXN0X2RlbChwZ2QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBnZF9sb2NrLCBmbGFncyk7Cit9CisKK3BnZF90ICpwZ2RfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJaW50IGk7CisJcGdkX3QgKnBnZCA9IGttZW1fY2FjaGVfYWxsb2MocGdkX2NhY2hlLCBHRlBfS0VSTkVMKTsKKworCWlmIChQVFJTX1BFUl9QTUQgPT0gMSB8fCAhcGdkKQorCQlyZXR1cm4gcGdkOworCisJZm9yIChpID0gMDsgaSA8IFVTRVJfUFRSU19QRVJfUEdEOyArK2kpIHsKKwkJcG1kX3QgKnBtZCA9IGttZW1fY2FjaGVfYWxsb2MocG1kX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwbWQpCisJCQlnb3RvIG91dF9vb207CisJCXNldF9wZ2QoJnBnZFtpXSwgX19wZ2QoMSArIF9fcGEocG1kKSkpOworCX0KKwlyZXR1cm4gcGdkOworCitvdXRfb29tOgorCWZvciAoaS0tOyBpID49IDA7IGktLSkKKwkJa21lbV9jYWNoZV9mcmVlKHBtZF9jYWNoZSwgKHZvaWQgKilfX3ZhKHBnZF92YWwocGdkW2ldKS0xKSk7CisJa21lbV9jYWNoZV9mcmVlKHBnZF9jYWNoZSwgcGdkKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBwZ2RfZnJlZShwZ2RfdCAqcGdkKQoreworCWludCBpOworCisJLyogaW4gdGhlIFBBRSBjYXNlIHVzZXIgcGdkIGVudHJpZXMgYXJlIG92ZXJ3cml0dGVuIGJlZm9yZSB1c2FnZSAqLworCWlmIChQVFJTX1BFUl9QTUQgPiAxKQorCQlmb3IgKGkgPSAwOyBpIDwgVVNFUl9QVFJTX1BFUl9QR0Q7ICsraSkKKwkJCWttZW1fY2FjaGVfZnJlZShwbWRfY2FjaGUsICh2b2lkICopX192YShwZ2RfdmFsKHBnZFtpXSktMSkpOworCS8qIGluIHRoZSBub24tUEFFIGNhc2UsIGNsZWFyX3BhZ2VfcmFuZ2UoKSBjbGVhcnMgdXNlciBwZ2QgZW50cmllcyAqLworCWttZW1fY2FjaGVfZnJlZShwZ2RfY2FjaGUsIHBnZCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvS2NvbmZpZyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZGUxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvb3Byb2ZpbGUvS2NvbmZpZwpAQCAtMCwwICsxLDIzIEBACisKK21lbnUgIlByb2ZpbGluZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisKK2NvbmZpZyBQUk9GSUxJTkcKKwlib29sICJQcm9maWxpbmcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgZXh0ZW5kZWQgcHJvZmlsaW5nIHN1cHBvcnQgbWVjaGFuaXNtcyB1c2VkCisJICBieSBwcm9maWxlcnMgc3VjaCBhcyBPUHJvZmlsZS4KKwkgIAorCitjb25maWcgT1BST0ZJTEUKKwl0cmlzdGF0ZSAiT1Byb2ZpbGUgc3lzdGVtIHByb2ZpbGluZyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBST0ZJTElORworCWhlbHAKKwkgIE9Qcm9maWxlIGlzIGEgcHJvZmlsaW5nIHN5c3RlbSBjYXBhYmxlIG9mIHByb2ZpbGluZyB0aGUKKwkgIHdob2xlIHN5c3RlbSwgaW5jbHVkZSB0aGUga2VybmVsLCBrZXJuZWwgbW9kdWxlcywgbGlicmFyaWVzLAorCSAgYW5kIGFwcGxpY2F0aW9ucy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvTWFrZWZpbGUgYi9hcmNoL2kzODYvb3Byb2ZpbGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmM2ViMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACitvYmotJChDT05GSUdfT1BST0ZJTEUpICs9IG9wcm9maWxlLm8KKworRFJJVkVSX09CSlMgPSAkKGFkZHByZWZpeCAuLi8uLi8uLi9kcml2ZXJzL29wcm9maWxlLywgXAorCQlvcHJvZi5vIGNwdV9idWZmZXIubyBidWZmZXJfc3luYy5vIFwKKwkJZXZlbnRfYnVmZmVyLm8gb3Byb2ZpbGVfZmlsZXMubyBcCisJCW9wcm9maWxlZnMubyBvcHJvZmlsZV9zdGF0cy5vICBcCisJCXRpbWVyX2ludC5vICkKKworb3Byb2ZpbGUteQkJCQk6PSAkKERSSVZFUl9PQkpTKSBpbml0Lm8gYmFja3RyYWNlLm8KK29wcm9maWxlLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKSAJKz0gbm1pX2ludC5vIG9wX21vZGVsX2F0aGxvbi5vIFwKKwkJCQkJICAgb3BfbW9kZWxfcHByby5vIG9wX21vZGVsX3A0Lm8KK29wcm9maWxlLSQoQ09ORklHX1g4Nl9JT19BUElDKQkJKz0gbm1pX3RpbWVyX2ludC5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvYmFja3RyYWNlLmMgYi9hcmNoL2kzODYvb3Byb2ZpbGUvYmFja3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkNzJlMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9iYWNrdHJhY2UuYwpAQCAtMCwwICsxLDExMSBAQAorLyoqCisgKiBAZmlsZSBiYWNrdHJhY2UuYworICoKKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDIgT1Byb2ZpbGUgYXV0aG9ycworICogQHJlbWFyayBSZWFkIHRoZSBmaWxlIENPUFlJTkcKKyAqCisgKiBAYXV0aG9yIEpvaG4gTGV2b24KKyAqIEBhdXRob3IgRGF2aWQgU21pdGgKKyAqLworCisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorCitzdHJ1Y3QgZnJhbWVfaGVhZCB7CisJc3RydWN0IGZyYW1lX2hlYWQgKiBlYnA7CisJdW5zaWduZWQgbG9uZyByZXQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgc3RydWN0IGZyYW1lX2hlYWQgKgorZHVtcF9iYWNrdHJhY2Uoc3RydWN0IGZyYW1lX2hlYWQgKiBoZWFkKQoreworCW9wcm9maWxlX2FkZF90cmFjZShoZWFkLT5yZXQpOworCisJLyogZnJhbWUgcG9pbnRlcnMgc2hvdWxkIHN0cmljdGx5IHByb2dyZXNzIGJhY2sgdXAgdGhlIHN0YWNrCisJICogKHRvd2FyZHMgaGlnaGVyIGFkZHJlc3NlcykgKi8KKwlpZiAoaGVhZCA+PSBoZWFkLT5lYnApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGhlYWQtPmVicDsKK30KKworLyogY2hlY2sgdGhhdCB0aGUgcGFnZShzKSBjb250YWluaW5nIHRoZSBmcmFtZSBoZWFkIGFyZSBwcmVzZW50ICovCitzdGF0aWMgaW50IHBhZ2VzX3ByZXNlbnQoc3RydWN0IGZyYW1lX2hlYWQgKiBoZWFkKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSA9IGN1cnJlbnQtPm1tOworCisJLyogRklYTUU6IG9ubHkgbmVjZXNzYXJ5IG9uY2UgcGVyIHBhZ2UgKi8KKwlpZiAoIWNoZWNrX3VzZXJfcGFnZV9yZWFkYWJsZShtbSwgKHVuc2lnbmVkIGxvbmcpaGVhZCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGNoZWNrX3VzZXJfcGFnZV9yZWFkYWJsZShtbSwgKHVuc2lnbmVkIGxvbmcpKGhlYWQgKyAxKSk7Cit9CisKKy8qCisgKiB8ICAgICAgICAgICAgIHwgL1wgSGlnaGVyIGFkZHJlc3NlcworICogfCAgICAgICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0gc3RhY2sgYmFzZSAoYWRkcmVzcyBvZiBjdXJyZW50X3RocmVhZF9pbmZvKQorICogfCB0aHJlYWQgaW5mbyB8CisgKiAuICAgICAgICAgICAgIC4KKyAqIHwgICAgc3RhY2sgICAgfAorICogLS0tLS0tLS0tLS0tLS0tIHNhdmVkIHJlZ3MtPmVicCB2YWx1ZSBpZiB2YWxpZCAoZnJhbWVfaGVhZCBhZGRyZXNzKQorICogLiAgICAgICAgICAgICAuCisgKiAtLS0tLS0tLS0tLS0tLS0gc3RydWN0IHB0X3JlZ3Mgc3RvcmVkIG9uIHN0YWNrIChzdHJ1Y3QgcHRfcmVncyAqKQorICogfCAgICAgICAgICAgICB8CisgKiAuICAgICAgICAgICAgIC4KKyAqIHwgICAgICAgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tICVlc3AKKyAqIHwgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICB8IFwvIExvd2VyIGFkZHJlc3NlcworICoKKyAqIFRodXMsICZwdF9yZWdzIDwtPiBzdGFjayBiYXNlIHJlc3RyaWN0cyB0aGUgdmFsaWQoaXNoKSBlYnAgdmFsdWVzCisgKi8KKyNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgorc3RhdGljIGludCB2YWxpZF9rZXJuZWxfc3RhY2soc3RydWN0IGZyYW1lX2hlYWQgKiBoZWFkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBoZWFkYWRkciA9ICh1bnNpZ25lZCBsb25nKWhlYWQ7CisJdW5zaWduZWQgbG9uZyBzdGFjayA9ICh1bnNpZ25lZCBsb25nKXJlZ3M7CisJdW5zaWduZWQgbG9uZyBzdGFja19iYXNlID0gKHN0YWNrICYgfihUSFJFQURfU0laRSAtIDEpKSArIFRIUkVBRF9TSVpFOworCisJcmV0dXJuIGhlYWRhZGRyID4gc3RhY2sgJiYgaGVhZGFkZHIgPCBzdGFja19iYXNlOworfQorI2Vsc2UKKy8qIHdpdGhvdXQgZnAsIGl0J3MganVzdCBqdW5rICovCitzdGF0aWMgaW50IHZhbGlkX2tlcm5lbF9zdGFjayhzdHJ1Y3QgZnJhbWVfaGVhZCAqIGhlYWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisKK3ZvaWQKK3g4Nl9iYWNrdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLCB1bnNpZ25lZCBpbnQgZGVwdGgpCit7CisJc3RydWN0IGZyYW1lX2hlYWQgKmhlYWQ7CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJaGVhZCA9IChzdHJ1Y3QgZnJhbWVfaGVhZCAqKXJlZ3MtPnJicDsKKyNlbHNlCisJaGVhZCA9IChzdHJ1Y3QgZnJhbWVfaGVhZCAqKXJlZ3MtPmVicDsKKyNlbmRpZgorCisJaWYgKCF1c2VyX21vZGUocmVncykpIHsKKwkJd2hpbGUgKGRlcHRoLS0gJiYgdmFsaWRfa2VybmVsX3N0YWNrKGhlYWQsIHJlZ3MpKQorCQkJaGVhZCA9IGR1bXBfYmFja3RyYWNlKGhlYWQpOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgQ09ORklHX1NNUAorCWlmICghc3Bpbl90cnlsb2NrKCZjdXJyZW50LT5tbS0+cGFnZV90YWJsZV9sb2NrKSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwl3aGlsZSAoZGVwdGgtLSAmJiBoZWFkICYmIHBhZ2VzX3ByZXNlbnQoaGVhZCkpCisJCWhlYWQgPSBkdW1wX2JhY2t0cmFjZShoZWFkKTsKKworI2lmZGVmIENPTkZJR19TTVAKKwlzcGluX3VubG9jaygmY3VycmVudC0+bW0tPnBhZ2VfdGFibGVfbG9jayk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9pbml0LmMgYi9hcmNoL2kzODYvb3Byb2ZpbGUvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MDMzMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvb3Byb2ZpbGUvaW5pdC5jCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogQGZpbGUgaW5pdC5jCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMiBPUHJvZmlsZSBhdXRob3JzCisgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORworICoKKyAqIEBhdXRob3IgSm9obiBMZXZvbiA8bGV2b25AbW92ZW1lbnRhcmlhbi5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisgCisvKiBXZSBzdXBwb3J0IENQVXMgdGhhdCBoYXZlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGxpa2UgdGhlIFBlbnRpdW0gUHJvCisgKiB3aXRoIHRoZSBOTUkgbW9kZSBkcml2ZXIuCisgKi8KKyAKK2V4dGVybiBpbnQgbm1pX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKiBvcHMpOworZXh0ZXJuIGludCBubWlfdGltZXJfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqIG9wcyk7CitleHRlcm4gdm9pZCBubWlfZXhpdCh2b2lkKTsKK2V4dGVybiB2b2lkIHg4Nl9iYWNrdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLCB1bnNpZ25lZCBpbnQgZGVwdGgpOworCisKK2ludCBfX2luaXQgb3Byb2ZpbGVfYXJjaF9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICogb3BzKQoreworCWludCByZXQ7CisKKwlyZXQgPSAtRU5PREVWOworCisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJcmV0ID0gbm1pX2luaXQob3BzKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCWlmIChyZXQgPCAwKQorCQlyZXQgPSBubWlfdGltZXJfaW5pdChvcHMpOworI2VuZGlmCisJb3BzLT5iYWNrdHJhY2UgPSB4ODZfYmFja3RyYWNlOworCisJcmV0dXJuIHJldDsKK30KKworCit2b2lkIG9wcm9maWxlX2FyY2hfZXhpdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCW5taV9leGl0KCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfaW50LmMgYi9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTJkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX2ludC5jCkBAIC0wLDAgKzEsNDI3IEBACisvKioKKyAqIEBmaWxlIG5taV9pbnQuYworICoKKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDIgT1Byb2ZpbGUgYXV0aG9ycworICogQHJlbWFyayBSZWFkIHRoZSBmaWxlIENPUFlJTkcKKyAqCisgKiBAYXV0aG9yIEpvaG4gTGV2b24gPGxldm9uQG1vdmVtZW50YXJpYW4ub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9hcGljLmg+CisgCisjaW5jbHVkZSAib3BfY291bnRlci5oIgorI2luY2x1ZGUgIm9wX3g4Nl9tb2RlbC5oIgorIAorc3RhdGljIHN0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCAqIG1vZGVsOworc3RhdGljIHN0cnVjdCBvcF9tc3JzIGNwdV9tc3JzW05SX0NQVVNdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2F2ZWRfbHZ0cGNbTlJfQ1BVU107CisgCitzdGF0aWMgaW50IG5taV9zdGFydCh2b2lkKTsKK3N0YXRpYyB2b2lkIG5taV9zdG9wKHZvaWQpOworCisvKiAwID09IHJlZ2lzdGVyZWQgYnV0IG9mZiwgMSA9PSByZWdpc3RlcmVkIGFuZCBvbiAqLworc3RhdGljIGludCBubWlfZW5hYmxlZCA9IDA7CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBubWlfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCB1MzIgc3RhdGUpCit7CisJaWYgKG5taV9lbmFibGVkID09IDEpCisJCW5taV9zdG9wKCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBubWlfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJaWYgKG5taV9lbmFibGVkID09IDEpCisJCW5taV9zdGFydCgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIG9wcm9maWxlX3N5c2NsYXNzID0geworCXNldF9rc2V0X25hbWUoIm9wcm9maWxlIiksCisJLnJlc3VtZQkJPSBubWlfcmVzdW1lLAorCS5zdXNwZW5kCT0gbm1pX3N1c3BlbmQsCit9OworCisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2Vfb3Byb2ZpbGUgPSB7CisJLmlkCT0gMCwKKwkuY2xzCT0gJm9wcm9maWxlX3N5c2NsYXNzLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2RyaXZlcmZzKHZvaWQpCit7CisJaW50IGVycm9yOworCWlmICghKGVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZvcHJvZmlsZV9zeXNjbGFzcykpKQorCQllcnJvciA9IHN5c2Rldl9yZWdpc3RlcigmZGV2aWNlX29wcm9maWxlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIHZvaWQgZXhpdF9kcml2ZXJmcyh2b2lkKQoreworCXN5c2Rldl91bnJlZ2lzdGVyKCZkZXZpY2Vfb3Byb2ZpbGUpOworCXN5c2Rldl9jbGFzc191bnJlZ2lzdGVyKCZvcHJvZmlsZV9zeXNjbGFzcyk7Cit9CisKKyNlbHNlCisjZGVmaW5lIGluaXRfZHJpdmVyZnMoKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGV4aXRfZHJpdmVyZnMoKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKworc3RhdGljIGludCBubWlfY2FsbGJhY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBpbnQgY3B1KQoreworCXJldHVybiBtb2RlbC0+Y2hlY2tfY3RycyhyZWdzLCAmY3B1X21zcnNbY3B1XSk7Cit9CisgCisgCitzdGF0aWMgdm9pZCBubWlfY3B1X3NhdmVfcmVnaXN0ZXJzKHN0cnVjdCBvcF9tc3JzICogbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgY29uc3QgbnJfY3RycyA9IG1vZGVsLT5udW1fY291bnRlcnM7CisJdW5zaWduZWQgaW50IGNvbnN0IG5yX2N0cmxzID0gbW9kZWwtPm51bV9jb250cm9sczsgCisJc3RydWN0IG9wX21zciAqIGNvdW50ZXJzID0gbXNycy0+Y291bnRlcnM7CisJc3RydWN0IG9wX21zciAqIGNvbnRyb2xzID0gbXNycy0+Y29udHJvbHM7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfY3RyczsgKytpKSB7CisJCXJkbXNyKGNvdW50ZXJzW2ldLmFkZHIsCisJCQljb3VudGVyc1tpXS5zYXZlZC5sb3csCisJCQljb3VudGVyc1tpXS5zYXZlZC5oaWdoKTsKKwl9CisgCisJZm9yIChpID0gMDsgaSA8IG5yX2N0cmxzOyArK2kpIHsKKwkJcmRtc3IoY29udHJvbHNbaV0uYWRkciwKKwkJCWNvbnRyb2xzW2ldLnNhdmVkLmxvdywKKwkJCWNvbnRyb2xzW2ldLnNhdmVkLmhpZ2gpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBubWlfc2F2ZV9yZWdpc3RlcnModm9pZCAqIGR1bW15KQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IG9wX21zcnMgKiBtc3JzID0gJmNwdV9tc3JzW2NwdV07CisJbW9kZWwtPmZpbGxfaW5fYWRkcmVzc2VzKG1zcnMpOworCW5taV9jcHVfc2F2ZV9yZWdpc3RlcnMobXNycyk7Cit9CisKKworc3RhdGljIHZvaWQgZnJlZV9tc3JzKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7ICsraSkgeworCQlrZnJlZShjcHVfbXNyc1tpXS5jb3VudGVycyk7CisJCWNwdV9tc3JzW2ldLmNvdW50ZXJzID0gTlVMTDsKKwkJa2ZyZWUoY3B1X21zcnNbaV0uY29udHJvbHMpOworCQljcHVfbXNyc1tpXS5jb250cm9scyA9IE5VTEw7CisJfQorfQorCisKK3N0YXRpYyBpbnQgYWxsb2NhdGVfbXNycyh2b2lkKQoreworCWludCBzdWNjZXNzID0gMTsKKwlzaXplX3QgY29udHJvbHNfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgb3BfbXNyKSAqIG1vZGVsLT5udW1fY29udHJvbHM7CisJc2l6ZV90IGNvdW50ZXJzX3NpemUgPSBzaXplb2Yoc3RydWN0IG9wX21zcikgKiBtb2RlbC0+bnVtX2NvdW50ZXJzOworCisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7ICsraSkgeworCQlpZiAoIWNwdV9vbmxpbmUoaSkpCisJCQljb250aW51ZTsKKworCQljcHVfbXNyc1tpXS5jb3VudGVycyA9IGttYWxsb2MoY291bnRlcnNfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY3B1X21zcnNbaV0uY291bnRlcnMpIHsKKwkJCXN1Y2Nlc3MgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJY3B1X21zcnNbaV0uY29udHJvbHMgPSBrbWFsbG9jKGNvbnRyb2xzX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWNwdV9tc3JzW2ldLmNvbnRyb2xzKSB7CisJCQlzdWNjZXNzID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFzdWNjZXNzKQorCQlmcmVlX21zcnMoKTsKKworCXJldHVybiBzdWNjZXNzOworfQorCisKK3N0YXRpYyB2b2lkIG5taV9jcHVfc2V0dXAodm9pZCAqIGR1bW15KQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IG9wX21zcnMgKiBtc3JzID0gJmNwdV9tc3JzW2NwdV07CisJc3Bpbl9sb2NrKCZvcHJvZmlsZWZzX2xvY2spOworCW1vZGVsLT5zZXR1cF9jdHJzKG1zcnMpOworCXNwaW5fdW5sb2NrKCZvcHJvZmlsZWZzX2xvY2spOworCXNhdmVkX2x2dHBjW2NwdV0gPSBhcGljX3JlYWQoQVBJQ19MVlRQQyk7CisJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7Cit9CisKKworc3RhdGljIGludCBubWlfc2V0dXAodm9pZCkKK3sKKwlpZiAoIWFsbG9jYXRlX21zcnMoKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBXZSB3YWxrIGEgdGhpbiBsaW5lIGJldHdlZW4gbGF3IGFuZCByYXBlIGhlcmUuCisJICogV2UgbmVlZCB0byBiZSBjYXJlZnVsIHRvIGluc3RhbGwgb3VyIE5NSSBoYW5kbGVyCisJICogd2l0aG91dCBhY3R1YWxseSB0cmlnZ2VyaW5nIGFueSBOTUlzIGFzIHRoaXMgd2lsbAorCSAqIGJyZWFrIHRoZSBjb3JlIGNvZGUgaG9ycmlmaWNhbGx5LgorCSAqLworCWlmIChyZXNlcnZlX2xhcGljX25taSgpIDwgMCkgeworCQlmcmVlX21zcnMoKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyogV2UgbmVlZCB0byBzZXJpYWxpemUgc2F2ZSBhbmQgc2V0dXAgZm9yIEhUIGJlY2F1c2UgdGhlIHN1YnNldAorCSAqIG9mIG1zcnMgYXJlIGRpc3RpbmN0IGZvciBzYXZlIGFuZCBzZXR1cCBvcGVyYXRpb25zCisJICovCisJb25fZWFjaF9jcHUobm1pX3NhdmVfcmVnaXN0ZXJzLCBOVUxMLCAwLCAxKTsKKwlvbl9lYWNoX2NwdShubWlfY3B1X3NldHVwLCBOVUxMLCAwLCAxKTsKKwlzZXRfbm1pX2NhbGxiYWNrKG5taV9jYWxsYmFjayk7CisJbm1pX2VuYWJsZWQgPSAxOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIG5taV9yZXN0b3JlX3JlZ2lzdGVycyhzdHJ1Y3Qgb3BfbXNycyAqIG1zcnMpCit7CisJdW5zaWduZWQgaW50IGNvbnN0IG5yX2N0cnMgPSBtb2RlbC0+bnVtX2NvdW50ZXJzOworCXVuc2lnbmVkIGludCBjb25zdCBucl9jdHJscyA9IG1vZGVsLT5udW1fY29udHJvbHM7IAorCXN0cnVjdCBvcF9tc3IgKiBjb3VudGVycyA9IG1zcnMtPmNvdW50ZXJzOworCXN0cnVjdCBvcF9tc3IgKiBjb250cm9scyA9IG1zcnMtPmNvbnRyb2xzOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2N0cmxzOyArK2kpIHsKKwkJd3Jtc3IoY29udHJvbHNbaV0uYWRkciwKKwkJCWNvbnRyb2xzW2ldLnNhdmVkLmxvdywKKwkJCWNvbnRyb2xzW2ldLnNhdmVkLmhpZ2gpOworCX0KKyAKKwlmb3IgKGkgPSAwOyBpIDwgbnJfY3RyczsgKytpKSB7CisJCXdybXNyKGNvdW50ZXJzW2ldLmFkZHIsCisJCQljb3VudGVyc1tpXS5zYXZlZC5sb3csCisJCQljb3VudGVyc1tpXS5zYXZlZC5oaWdoKTsKKwl9Cit9CisgCisKK3N0YXRpYyB2b2lkIG5taV9jcHVfc2h1dGRvd24odm9pZCAqIGR1bW15KQoreworCXVuc2lnbmVkIGludCB2OworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IG9wX21zcnMgKiBtc3JzID0gJmNwdV9tc3JzW2NwdV07CisgCisJLyogcmVzdG9yaW5nIEFQSUNfTFZUUEMgY2FuIHRyaWdnZXIgYW4gYXBpYyBlcnJvciBiZWNhdXNlIHRoZSBkZWxpdmVyeQorCSAqIG1vZGUgYW5kIHZlY3RvciBuciBjb21iaW5hdGlvbiBjYW4gYmUgaWxsZWdhbC4gVGhhdCdzIGJ5IGRlc2lnbjogb24KKwkgKiBwb3dlciBvbiBhcGljIGx2dCBjb250YWluIGEgemVybyB2ZWN0b3IgbnIgd2hpY2ggYXJlIGxlZ2FsIG9ubHkgZm9yCisJICogTk1JIGRlbGl2ZXJ5IG1vZGUuIFNvIGluaGliaXQgYXBpYyBlcnIgYmVmb3JlIHJlc3RvcmluZyBsdnRwYworCSAqLworCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRFUlIpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRFUlIsIHYgfCBBUElDX0xWVF9NQVNLRUQpOworCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgc2F2ZWRfbHZ0cGNbY3B1XSk7CisJYXBpY193cml0ZShBUElDX0xWVEVSUiwgdik7CisJbm1pX3Jlc3RvcmVfcmVnaXN0ZXJzKG1zcnMpOworfQorCisgCitzdGF0aWMgdm9pZCBubWlfc2h1dGRvd24odm9pZCkKK3sKKwlubWlfZW5hYmxlZCA9IDA7CisJb25fZWFjaF9jcHUobm1pX2NwdV9zaHV0ZG93biwgTlVMTCwgMCwgMSk7CisJdW5zZXRfbm1pX2NhbGxiYWNrKCk7CisJcmVsZWFzZV9sYXBpY19ubWkoKTsKKwlmcmVlX21zcnMoKTsKK30KKworIAorc3RhdGljIHZvaWQgbm1pX2NwdV9zdGFydCh2b2lkICogZHVtbXkpCit7CisJc3RydWN0IG9wX21zcnMgY29uc3QgKiBtc3JzID0gJmNwdV9tc3JzW3NtcF9wcm9jZXNzb3JfaWQoKV07CisJbW9kZWwtPnN0YXJ0KG1zcnMpOworfQorIAorCitzdGF0aWMgaW50IG5taV9zdGFydCh2b2lkKQoreworCW9uX2VhY2hfY3B1KG5taV9jcHVfc3RhcnQsIE5VTEwsIDAsIDEpOworCXJldHVybiAwOworfQorIAorIAorc3RhdGljIHZvaWQgbm1pX2NwdV9zdG9wKHZvaWQgKiBkdW1teSkKK3sKKwlzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIG1zcnMgPSAmY3B1X21zcnNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwltb2RlbC0+c3RvcChtc3JzKTsKK30KKyAKKyAKK3N0YXRpYyB2b2lkIG5taV9zdG9wKHZvaWQpCit7CisJb25fZWFjaF9jcHUobm1pX2NwdV9zdG9wLCBOVUxMLCAwLCAxKTsKK30KKworCitzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgY291bnRlcl9jb25maWdbT1BfTUFYX0NPVU5URVJdOworCitzdGF0aWMgaW50IG5taV9jcmVhdGVfZmlsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBkZW50cnkgKiByb290KQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1vZGVsLT5udW1fY291bnRlcnM7ICsraSkgeworCQlzdHJ1Y3QgZGVudHJ5ICogZGlyOworCQljaGFyIGJ1ZlsyXTsKKyAKKwkJc25wcmludGYoYnVmLCAyLCAiJWQiLCBpKTsKKwkJZGlyID0gb3Byb2ZpbGVmc19ta2RpcihzYiwgcm9vdCwgYnVmKTsKKwkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImVuYWJsZWQiLCAmY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCk7IAorCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiZXZlbnQiLCAmY291bnRlcl9jb25maWdbaV0uZXZlbnQpOyAKKwkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImNvdW50IiwgJmNvdW50ZXJfY29uZmlnW2ldLmNvdW50KTsgCisJCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJ1bml0X21hc2siLCAmY291bnRlcl9jb25maWdbaV0udW5pdF9tYXNrKTsgCisJCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJrZXJuZWwiLCAmY291bnRlcl9jb25maWdbaV0ua2VybmVsKTsgCisJCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJ1c2VyIiwgJmNvdW50ZXJfY29uZmlnW2ldLnVzZXIpOyAKKwl9CisKKwlyZXR1cm4gMDsKK30KKyAKKyAKK3N0YXRpYyBpbnQgX19pbml0IHA0X2luaXQoY2hhciAqKiBjcHVfdHlwZSkKK3sKKwlfX3U4IGNwdV9tb2RlbCA9IGJvb3RfY3B1X2RhdGEueDg2X21vZGVsOworCisJaWYgKGNwdV9tb2RlbCA+IDQpCisJCXJldHVybiAwOworCisjaWZuZGVmIENPTkZJR19TTVAKKwkqY3B1X3R5cGUgPSAiaTM4Ni9wNCI7CisJbW9kZWwgPSAmb3BfcDRfc3BlYzsKKwlyZXR1cm4gMTsKKyNlbHNlCisJc3dpdGNoIChzbXBfbnVtX3NpYmxpbmdzKSB7CisJCWNhc2UgMToKKwkJCSpjcHVfdHlwZSA9ICJpMzg2L3A0IjsKKwkJCW1vZGVsID0gJm9wX3A0X3NwZWM7CisJCQlyZXR1cm4gMTsKKworCQljYXNlIDI6CisJCQkqY3B1X3R5cGUgPSAiaTM4Ni9wNC1odCI7CisJCQltb2RlbCA9ICZvcF9wNF9odDJfc3BlYzsKKwkJCXJldHVybiAxOworCX0KKyNlbmRpZgorCisJcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IFA0IEh5cGVyVGhyZWFkaW5nIGRldGVjdGVkIHdpdGggPiAyIHRocmVhZHNcbiIpOworCXByaW50ayhLRVJOX0lORk8gIm9wcm9maWxlOiBSZXZlcnRpbmcgdG8gdGltZXIgbW9kZS5cbiIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHBwcm9faW5pdChjaGFyICoqIGNwdV90eXBlKQoreworCV9fdTggY3B1X21vZGVsID0gYm9vdF9jcHVfZGF0YS54ODZfbW9kZWw7CisKKwlpZiAoY3B1X21vZGVsID4gMHhkKQorCQlyZXR1cm4gMDsKKworCWlmIChjcHVfbW9kZWwgPT0gOSkgeworCQkqY3B1X3R5cGUgPSAiaTM4Ni9wNl9tb2JpbGUiOworCX0gZWxzZSBpZiAoY3B1X21vZGVsID4gNSkgeworCQkqY3B1X3R5cGUgPSAiaTM4Ni9waWlpIjsKKwl9IGVsc2UgaWYgKGNwdV9tb2RlbCA+IDIpIHsKKwkJKmNwdV90eXBlID0gImkzODYvcGlpIjsKKwl9IGVsc2UgeworCQkqY3B1X3R5cGUgPSAiaTM4Ni9wcHJvIjsKKwl9CisKKwltb2RlbCA9ICZvcF9wcHJvX3NwZWM7CisJcmV0dXJuIDE7Cit9CisKKy8qIGluIG9yZGVyIHRvIGdldCBkcml2ZXJmcyByaWdodCAqLworc3RhdGljIGludCB1c2luZ19ubWk7CisKK2ludCBfX2luaXQgbm1pX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcykKK3sKKwlfX3U4IHZlbmRvciA9IGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcjsKKwlfX3U4IGZhbWlseSA9IGJvb3RfY3B1X2RhdGEueDg2OworCWNoYXIgKmNwdV90eXBlOworCisJaWYgKCFjcHVfaGFzX2FwaWMpCisJCXJldHVybiAtRU5PREVWOworIAorCXN3aXRjaCAodmVuZG9yKSB7CisJCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCQkvKiBOZWVkcyB0byBiZSBhdCBsZWFzdCBhbiBBdGhsb24gKG9yIGhhbW1lciBpbiAzMmJpdCBtb2RlKSAqLworCisJCQlzd2l0Y2ggKGZhbWlseSkgeworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWNhc2UgNjoKKwkJCQltb2RlbCA9ICZvcF9hdGhsb25fc3BlYzsKKwkJCQljcHVfdHlwZSA9ICJpMzg2L2F0aGxvbiI7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4ZjoKKwkJCQltb2RlbCA9ICZvcF9hdGhsb25fc3BlYzsKKwkJCQkvKiBBY3R1YWxseSBpdCBjb3VsZCBiZSBpMzg2L2hhbW1lciB0b28sIGJ1dCBnaXZlCisJCQkJICAgdXNlciBzcGFjZSBhbiBjb25zaXN0ZW50IG5hbWUuICovCisJCQkJY3B1X3R5cGUgPSAieDg2LTY0L2hhbW1lciI7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKyAKKwkJY2FzZSBYODZfVkVORE9SX0lOVEVMOgorCQkJc3dpdGNoIChmYW1pbHkpIHsKKwkJCQkvKiBQZW50aXVtIElWICovCisJCQkJY2FzZSAweGY6CisJCQkJCWlmICghcDRfaW5pdCgmY3B1X3R5cGUpKQorCQkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJCWJyZWFrOworCisJCQkJLyogQSBQNi1jbGFzcyBwcm9jZXNzb3IgKi8KKwkJCQljYXNlIDY6CisJCQkJCWlmICghcHByb19pbml0KCZjcHVfdHlwZSkpCisJCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbml0X2RyaXZlcmZzKCk7CisJdXNpbmdfbm1pID0gMTsKKwlvcHMtPmNyZWF0ZV9maWxlcyA9IG5taV9jcmVhdGVfZmlsZXM7CisJb3BzLT5zZXR1cCA9IG5taV9zZXR1cDsKKwlvcHMtPnNodXRkb3duID0gbm1pX3NodXRkb3duOworCW9wcy0+c3RhcnQgPSBubWlfc3RhcnQ7CisJb3BzLT5zdG9wID0gbm1pX3N0b3A7CisJb3BzLT5jcHVfdHlwZSA9IGNwdV90eXBlOworCXByaW50ayhLRVJOX0lORk8gIm9wcm9maWxlOiB1c2luZyBOTUkgaW50ZXJydXB0LlxuIik7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBubWlfZXhpdCh2b2lkKQoreworCWlmICh1c2luZ19ubWkpCisJCWV4aXRfZHJpdmVyZnMoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMgYi9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX3RpbWVyX2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTQ2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX3RpbWVyX2ludC5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qKgorICogQGZpbGUgbm1pX3RpbWVyX2ludC5jCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMyBPUHJvZmlsZSBhdXRob3JzCisgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORworICoKKyAqIEBhdXRob3IgWndhbmUgTXdhaWthbWJvIDx6d2FuZUBsaW51eHBvd2VyLmNhPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorCisKKyNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisgCitzdGF0aWMgaW50IG5taV90aW1lcl9jYWxsYmFjayhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGludCBjcHUpCit7CisJb3Byb2ZpbGVfYWRkX3NhbXBsZShyZWdzLCAwKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0aW1lcl9zdGFydCh2b2lkKQoreworCWRpc2FibGVfdGltZXJfbm1pX3dhdGNoZG9nKCk7CisJc2V0X25taV9jYWxsYmFjayhubWlfdGltZXJfY2FsbGJhY2spOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHRpbWVyX3N0b3Aodm9pZCkKK3sKKwllbmFibGVfdGltZXJfbm1pX3dhdGNoZG9nKCk7CisJdW5zZXRfbm1pX2NhbGxiYWNrKCk7CisJc3luY2hyb25pemVfa2VybmVsKCk7Cit9CisKKworaW50IF9faW5pdCBubWlfdGltZXJfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqIG9wcykKK3sKKwlleHRlcm4gaW50IG5taV9hY3RpdmU7CisKKwlpZiAobm1pX2FjdGl2ZSA8PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9wcy0+c3RhcnQgPSB0aW1lcl9zdGFydDsKKwlvcHMtPnN0b3AgPSB0aW1lcl9zdG9wOworCW9wcy0+Y3B1X3R5cGUgPSAidGltZXIiOworCXByaW50ayhLRVJOX0lORk8gIm9wcm9maWxlOiB1c2luZyBOTUkgdGltZXIgaW50ZXJydXB0LlxuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfY291bnRlci5oIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX2NvdW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODgwYjE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX2NvdW50ZXIuaApAQCAtMCwwICsxLDI5IEBACisvKioKKyAqIEBmaWxlIG9wX2NvdW50ZXIuaAorICoKKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDIgT1Byb2ZpbGUgYXV0aG9ycworICogQHJlbWFyayBSZWFkIHRoZSBmaWxlIENPUFlJTkcKKyAqCisgKiBAYXV0aG9yIEpvaG4gTGV2b24KKyAqLworIAorI2lmbmRlZiBPUF9DT1VOVEVSX0gKKyNkZWZpbmUgT1BfQ09VTlRFUl9ICisgCisjZGVmaW5lIE9QX01BWF9DT1VOVEVSIDgKKyAKKy8qIFBlci1wZXJmY3RyIGNvbmZpZ3VyYXRpb24gYXMgc2V0IHZpYQorICogb3Byb2ZpbGVmcy4KKyAqLworc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBlbmFibGVkOworICAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50OworICAgICAgICB1bnNpZ25lZCBsb25nIGtlcm5lbDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB1c2VyOworICAgICAgICB1bnNpZ25lZCBsb25nIHVuaXRfbWFzazsKK307CisKK2V4dGVybiBzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgY291bnRlcl9jb25maWdbXTsKKworI2VuZGlmIC8qIE9QX0NPVU5URVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX2F0aGxvbi5jIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX2F0aGxvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDlhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfYXRobG9uLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qKgorICogQGZpbGUgb3BfbW9kZWxfYXRobG9uLmgKKyAqIGF0aGxvbiAvIEs3IG1vZGVsLXNwZWNpZmljIE1TUiBvcGVyYXRpb25zCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMiBPUHJvZmlsZSBhdXRob3JzCisgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORworICoKKyAqIEBhdXRob3IgSm9obiBMZXZvbgorICogQGF1dGhvciBQaGlsaXBwZSBFbGllCisgKiBAYXV0aG9yIEdyYXlkb24gSG9hcmUKKyAqLworCisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorIAorI2luY2x1ZGUgIm9wX3g4Nl9tb2RlbC5oIgorI2luY2x1ZGUgIm9wX2NvdW50ZXIuaCIKKworI2RlZmluZSBOVU1fQ09VTlRFUlMgNAorI2RlZmluZSBOVU1fQ09OVFJPTFMgNAorCisjZGVmaW5lIENUUl9SRUFEKGwsaCxtc3JzLGMpIGRvIHtyZG1zcihtc3JzLT5jb3VudGVyc1soYyldLmFkZHIsIChsKSwgKGgpKTt9IHdoaWxlICgwKQorI2RlZmluZSBDVFJfV1JJVEUobCxtc3JzLGMpIGRvIHt3cm1zcihtc3JzLT5jb3VudGVyc1soYyldLmFkZHIsIC0odW5zaWduZWQgaW50KShsKSwgLTEpO30gd2hpbGUgKDApCisjZGVmaW5lIENUUl9PVkVSRkxPV0VEKG4pICghKChuKSAmICgxVTw8MzEpKSkKKworI2RlZmluZSBDVFJMX1JFQUQobCxoLG1zcnMsYykgZG8ge3JkbXNyKG1zcnMtPmNvbnRyb2xzWyhjKV0uYWRkciwgKGwpLCAoaCkpO30gd2hpbGUgKDApCisjZGVmaW5lIENUUkxfV1JJVEUobCxoLG1zcnMsYykgZG8ge3dybXNyKG1zcnMtPmNvbnRyb2xzWyhjKV0uYWRkciwgKGwpLCAoaCkpO30gd2hpbGUgKDApCisjZGVmaW5lIENUUkxfU0VUX0FDVElWRShuKSAobiB8PSAoMTw8MjIpKQorI2RlZmluZSBDVFJMX1NFVF9JTkFDVElWRShuKSAobiAmPSB+KDE8PDIyKSkKKyNkZWZpbmUgQ1RSTF9DTEVBUih4KSAoeCAmPSAoMTw8MjEpKQorI2RlZmluZSBDVFJMX1NFVF9FTkFCTEUodmFsKSAodmFsIHw9IDE8PDIwKQorI2RlZmluZSBDVFJMX1NFVF9VU1IodmFsLHUpICh2YWwgfD0gKCh1ICYgMSkgPDwgMTYpKQorI2RlZmluZSBDVFJMX1NFVF9LRVJOKHZhbCxrKSAodmFsIHw9ICgoayAmIDEpIDw8IDE3KSkKKyNkZWZpbmUgQ1RSTF9TRVRfVU0odmFsLCBtKSAodmFsIHw9IChtIDw8IDgpKQorI2RlZmluZSBDVFJMX1NFVF9FVkVOVCh2YWwsIGUpICh2YWwgfD0gZSkKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzZXRfdmFsdWVbTlVNX0NPVU5URVJTXTsKKyAKK3N0YXRpYyB2b2lkIGF0aGxvbl9maWxsX2luX2FkZHJlc3NlcyhzdHJ1Y3Qgb3BfbXNycyAqIGNvbnN0IG1zcnMpCit7CisJbXNycy0+Y291bnRlcnNbMF0uYWRkciA9IE1TUl9LN19QRVJGQ1RSMDsKKwltc3JzLT5jb3VudGVyc1sxXS5hZGRyID0gTVNSX0s3X1BFUkZDVFIxOworCW1zcnMtPmNvdW50ZXJzWzJdLmFkZHIgPSBNU1JfSzdfUEVSRkNUUjI7CisJbXNycy0+Y291bnRlcnNbM10uYWRkciA9IE1TUl9LN19QRVJGQ1RSMzsKKworCW1zcnMtPmNvbnRyb2xzWzBdLmFkZHIgPSBNU1JfSzdfRVZOVFNFTDA7CisJbXNycy0+Y29udHJvbHNbMV0uYWRkciA9IE1TUl9LN19FVk5UU0VMMTsKKwltc3JzLT5jb250cm9sc1syXS5hZGRyID0gTVNSX0s3X0VWTlRTRUwyOworCW1zcnMtPmNvbnRyb2xzWzNdLmFkZHIgPSBNU1JfSzdfRVZOVFNFTDM7Cit9CisKKyAKK3N0YXRpYyB2b2lkIGF0aGxvbl9zZXR1cF9jdHJzKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOworCWludCBpOworIAorCS8qIGNsZWFyIGFsbCBjb3VudGVycyAqLworCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPTlRST0xTOyArK2kpIHsKKwkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7CisJCUNUUkxfQ0xFQVIobG93KTsKKwkJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIGkpOworCX0KKwkKKwkvKiBhdm9pZCBhIGZhbHNlIGRldGVjdGlvbiBvZiBjdHIgb3ZlcmZsb3dzIGluIE5NSSBoYW5kbGVyICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9DT1VOVEVSUzsgKytpKSB7CisJCUNUUl9XUklURSgxLCBtc3JzLCBpKTsKKwl9CisKKwkvKiBlbmFibGUgYWN0aXZlIGNvdW50ZXJzICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9DT1VOVEVSUzsgKytpKSB7CisJCWlmIChjb3VudGVyX2NvbmZpZ1tpXS5lbmFibGVkKSB7CisJCQlyZXNldF92YWx1ZVtpXSA9IGNvdW50ZXJfY29uZmlnW2ldLmNvdW50OworCisJCQlDVFJfV1JJVEUoY291bnRlcl9jb25maWdbaV0uY291bnQsIG1zcnMsIGkpOworCisJCQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJCUNUUkxfQ0xFQVIobG93KTsKKwkJCUNUUkxfU0VUX0VOQUJMRShsb3cpOworCQkJQ1RSTF9TRVRfVVNSKGxvdywgY291bnRlcl9jb25maWdbaV0udXNlcik7CisJCQlDVFJMX1NFVF9LRVJOKGxvdywgY291bnRlcl9jb25maWdbaV0ua2VybmVsKTsKKwkJCUNUUkxfU0VUX1VNKGxvdywgY291bnRlcl9jb25maWdbaV0udW5pdF9tYXNrKTsKKwkJCUNUUkxfU0VUX0VWRU5UKGxvdywgY291bnRlcl9jb25maWdbaV0uZXZlbnQpOworCQkJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIGkpOworCQl9IGVsc2UgeworCQkJcmVzZXRfdmFsdWVbaV0gPSAwOworCQl9CisJfQorfQorCisgCitzdGF0aWMgaW50IGF0aGxvbl9jaGVja19jdHJzKHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywKKwkJCSAgICAgc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IE5VTV9DT1VOVEVSUzsgKytpKSB7CisJCUNUUl9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7CisJCWlmIChDVFJfT1ZFUkZMT1dFRChsb3cpKSB7CisJCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIGkpOworCQkJQ1RSX1dSSVRFKHJlc2V0X3ZhbHVlW2ldLCBtc3JzLCBpKTsKKwkJfQorCX0KKworCS8qIFNlZSBvcF9tb2RlbF9wcHJvLmMgKi8KKwlyZXR1cm4gMTsKK30KKworIAorc3RhdGljIHZvaWQgYXRobG9uX3N0YXJ0KHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOworCWludCBpOworCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPVU5URVJTIDsgKytpKSB7CisJCWlmIChyZXNldF92YWx1ZVtpXSkgeworCQkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7CisJCQlDVFJMX1NFVF9BQ1RJVkUobG93KTsKKwkJCUNUUkxfV1JJVEUobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBhdGhsb25fc3RvcChzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCit7CisJdW5zaWduZWQgaW50IGxvdyxoaWdoOworCWludCBpOworCisJLyogU3VidGxlOiBzdG9wIG9uIGFsbCBjb3VudGVycyB0byBhdm9pZCByYWNlIHdpdGgKKwkgKiBzZXR0aW5nIG91ciBwbSBjYWxsYmFjayAqLworCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPVU5URVJTIDsgKytpKSB7CisJCUNUUkxfUkVBRChsb3csIGhpZ2gsIG1zcnMsIGkpOworCQlDVFJMX1NFVF9JTkFDVElWRShsb3cpOworCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7CisJfQorfQorCisKK3N0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCBvcF9hdGhsb25fc3BlYyA9IHsKKwkubnVtX2NvdW50ZXJzID0gTlVNX0NPVU5URVJTLAorCS5udW1fY29udHJvbHMgPSBOVU1fQ09OVFJPTFMsCisJLmZpbGxfaW5fYWRkcmVzc2VzID0gJmF0aGxvbl9maWxsX2luX2FkZHJlc3NlcywKKwkuc2V0dXBfY3RycyA9ICZhdGhsb25fc2V0dXBfY3RycywKKwkuY2hlY2tfY3RycyA9ICZhdGhsb25fY2hlY2tfY3RycywKKwkuc3RhcnQgPSAmYXRobG9uX3N0YXJ0LAorCS5zdG9wID0gJmF0aGxvbl9zdG9wCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX3A0LmMgYi9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfcDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzhhMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX3A0LmMKQEAgLTAsMCArMSw3MjUgQEAKKy8qKgorICogQGZpbGUgb3BfbW9kZWxfcDQuYworICogUDQgbW9kZWwtc3BlY2lmaWMgTVNSIG9wZXJhdGlvbnMKKyAqCisgKiBAcmVtYXJrIENvcHlyaWdodCAyMDAyIE9Qcm9maWxlIGF1dGhvcnMKKyAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCisgKgorICogQGF1dGhvciBHcmF5ZG9uIEhvYXJlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKworI2luY2x1ZGUgIm9wX3g4Nl9tb2RlbC5oIgorI2luY2x1ZGUgIm9wX2NvdW50ZXIuaCIKKworI2RlZmluZSBOVU1fRVZFTlRTIDM5CisKKyNkZWZpbmUgTlVNX0NPVU5URVJTX05PTl9IVCA4CisjZGVmaW5lIE5VTV9FU0NSU19OT05fSFQgNDUKKyNkZWZpbmUgTlVNX0NDQ1JTX05PTl9IVCAxOAorI2RlZmluZSBOVU1fQ09OVFJPTFNfTk9OX0hUIChOVU1fRVNDUlNfTk9OX0hUICsgTlVNX0NDQ1JTX05PTl9IVCkKKworI2RlZmluZSBOVU1fQ09VTlRFUlNfSFQyIDQKKyNkZWZpbmUgTlVNX0VTQ1JTX0hUMiAyMworI2RlZmluZSBOVU1fQ0NDUlNfSFQyIDkKKyNkZWZpbmUgTlVNX0NPTlRST0xTX0hUMiAoTlVNX0VTQ1JTX0hUMiArIE5VTV9DQ0NSU19IVDIpCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzID0gTlVNX0NPVU5URVJTX05PTl9IVDsKKworCisvKiB0aGlzIGhhcyB0byBiZSBjaGVja2VkIGR5bmFtaWNhbGx5IHNpbmNlIHRoZQorICAgaHlwZXItdGhyZWFkZWRuZXNzIG9mIGEgY2hpcCBpcyBkaXNjb3ZlcmVkIGF0CisgICBrZXJuZWwgYm9vdC10aW1lLiAqLworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX251bV9jb3VudGVycyh2b2lkKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlpZiAoc21wX251bV9zaWJsaW5ncyA9PSAyKQorCQludW1fY291bnRlcnMgPSBOVU1fQ09VTlRFUlNfSFQyOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgaW5saW5lIGFkZHJfaW5jcmVtZW50KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCXJldHVybiBzbXBfbnVtX3NpYmxpbmdzID09IDIgPyAyIDogMTsKKyNlbHNlCisJcmV0dXJuIDE7CisjZW5kaWYKK30KKworCisvKiB0YWJsZXMgdG8gc2ltdWxhdGUgc2ltcGxpZmllZCBoYXJkd2FyZSB2aWV3IG9mIHA0IHJlZ2lzdGVycyAqLworc3RydWN0IHA0X2NvdW50ZXJfYmluZGluZyB7CisJaW50IHZpcnRfY291bnRlcjsKKwlpbnQgY291bnRlcl9hZGRyZXNzOworCWludCBjY2NyX2FkZHJlc3M7Cit9OworCitzdHJ1Y3QgcDRfZXZlbnRfYmluZGluZyB7CisJaW50IGVzY3Jfc2VsZWN0OyAgLyogdmFsdWUgdG8gcHV0IGluIENDQ1IgKi8KKwlpbnQgZXZlbnRfc2VsZWN0OyAvKiB2YWx1ZSB0byBwdXQgaW4gRVNDUiAqLworCXN0cnVjdCB7CisJCWludCB2aXJ0X2NvdW50ZXI7IC8qIGZvciB0aGlzIGNvdW50ZXIuLi4gKi8KKwkJaW50IGVzY3JfYWRkcmVzczsgLyogdXNlIHRoaXMgRVNDUiAgICAgICAqLworCX0gYmluZGluZ3NbMl07Cit9OworCisvKiBuYjogdGhlc2UgQ1RSXyogZGVmaW5lcyBhcmUgYSBkdXBsaWNhdGUgb2YgZGVmaW5lcyBpbgorICAgZXZlbnQvaTM4Ni5wNCpldmVudHMuICovCisKKworI2RlZmluZSBDVFJfQlBVXzAgICAgICAoMSA8PCAwKQorI2RlZmluZSBDVFJfTVNfMCAgICAgICAoMSA8PCAxKQorI2RlZmluZSBDVFJfRkxBTUVfMCAgICAoMSA8PCAyKQorI2RlZmluZSBDVFJfSVFfNCAgICAgICAoMSA8PCAzKQorI2RlZmluZSBDVFJfQlBVXzIgICAgICAoMSA8PCA0KQorI2RlZmluZSBDVFJfTVNfMiAgICAgICAoMSA8PCA1KQorI2RlZmluZSBDVFJfRkxBTUVfMiAgICAoMSA8PCA2KQorI2RlZmluZSBDVFJfSVFfNSAgICAgICAoMSA8PCA3KQorCitzdGF0aWMgc3RydWN0IHA0X2NvdW50ZXJfYmluZGluZyBwNF9jb3VudGVycyBbTlVNX0NPVU5URVJTX05PTl9IVF0gPSB7CisJeyBDVFJfQlBVXzAsICAgTVNSX1A0X0JQVV9QRVJGQ1RSMCwgICBNU1JfUDRfQlBVX0NDQ1IwIH0sCisJeyBDVFJfTVNfMCwgICAgTVNSX1A0X01TX1BFUkZDVFIwLCAgICBNU1JfUDRfTVNfQ0NDUjAgfSwKKwl7IENUUl9GTEFNRV8wLCBNU1JfUDRfRkxBTUVfUEVSRkNUUjAsIE1TUl9QNF9GTEFNRV9DQ0NSMCB9LAorCXsgQ1RSX0lRXzQsICAgIE1TUl9QNF9JUV9QRVJGQ1RSNCwgICAgTVNSX1A0X0lRX0NDQ1I0IH0sCisJeyBDVFJfQlBVXzIsICAgTVNSX1A0X0JQVV9QRVJGQ1RSMiwgICBNU1JfUDRfQlBVX0NDQ1IyIH0sCisJeyBDVFJfTVNfMiwgICAgTVNSX1A0X01TX1BFUkZDVFIyLCAgICBNU1JfUDRfTVNfQ0NDUjIgfSwKKwl7IENUUl9GTEFNRV8yLCBNU1JfUDRfRkxBTUVfUEVSRkNUUjIsIE1TUl9QNF9GTEFNRV9DQ0NSMiB9LAorCXsgQ1RSX0lRXzUsICAgIE1TUl9QNF9JUV9QRVJGQ1RSNSwgICAgTVNSX1A0X0lRX0NDQ1I1IH0KK307CisKKyNkZWZpbmUgTlVNX1VOVVNFRF9DQ0NSUwlOVU1fQ0NDUlNfTk9OX0hUIC0gTlVNX0NPVU5URVJTX05PTl9IVAorCisvKiBBbGwgY2NjciB3ZSBkb24ndCB1c2UuICovCitzdGF0aWMgaW50IHA0X3VudXNlZF9jY2NyW05VTV9VTlVTRURfQ0NDUlNdID0geworCU1TUl9QNF9CUFVfQ0NDUjEsCU1TUl9QNF9CUFVfQ0NDUjMsCisJTVNSX1A0X01TX0NDQ1IxLAlNU1JfUDRfTVNfQ0NDUjMsCisJTVNSX1A0X0ZMQU1FX0NDQ1IxLAlNU1JfUDRfRkxBTUVfQ0NDUjMsCisJTVNSX1A0X0lRX0NDQ1IwLAlNU1JfUDRfSVFfQ0NDUjEsCisJTVNSX1A0X0lRX0NDQ1IyLAlNU1JfUDRfSVFfQ0NDUjMKK307CisKKy8qIHA0IGV2ZW50IGNvZGVzIGluIGxpYm9wL29wX2V2ZW50LmggYXJlIGluZGljZXMgaW50byB0aGlzIHRhYmxlLiAqLworCitzdGF0aWMgc3RydWN0IHA0X2V2ZW50X2JpbmRpbmcgcDRfZXZlbnRzW05VTV9FVkVOVFNdID0geworCQorCXsgLyogQlJBTkNIX1JFVElSRUQgKi8KKwkJMHgwNSwgMHgwNiwgCisJCXsge0NUUl9JUV80LCBNU1JfUDRfQ1JVX0VTQ1IyfSwKKwkJICB7Q1RSX0lRXzUsIE1TUl9QNF9DUlVfRVNDUjN9IH0KKwl9LAorCQorCXsgLyogTUlTUFJFRF9CUkFOQ0hfUkVUSVJFRCAqLworCQkweDA0LCAweDAzLCAKKwkJeyB7IENUUl9JUV80LCBNU1JfUDRfQ1JVX0VTQ1IwfSwKKwkJICB7IENUUl9JUV81LCBNU1JfUDRfQ1JVX0VTQ1IxfSB9CisJfSwKKwkKKwl7IC8qIFRDX0RFTElWRVJfTU9ERSAqLworCQkweDAxLCAweDAxLAorCQl7IHsgQ1RSX01TXzAsIE1TUl9QNF9UQ19FU0NSMH0sICAKKwkJICB7IENUUl9NU18yLCBNU1JfUDRfVENfRVNDUjF9IH0KKwl9LAorCQorCXsgLyogQlBVX0ZFVENIX1JFUVVFU1QgKi8KKwkJMHgwMCwgMHgwMywgCisJCXsgeyBDVFJfQlBVXzAsIE1TUl9QNF9CUFVfRVNDUjB9LAorCQkgIHsgQ1RSX0JQVV8yLCBNU1JfUDRfQlBVX0VTQ1IxfSB9CisJfSwKKworCXsgLyogSVRMQl9SRUZFUkVOQ0UgKi8KKwkJMHgwMywgMHgxOCwKKwkJeyB7IENUUl9CUFVfMCwgTVNSX1A0X0lUTEJfRVNDUjB9LAorCQkgIHsgQ1RSX0JQVV8yLCBNU1JfUDRfSVRMQl9FU0NSMX0gfQorCX0sCisKKwl7IC8qIE1FTU9SWV9DQU5DRUwgKi8KKwkJMHgwNSwgMHgwMiwKKwkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfREFDX0VTQ1IwfSwKKwkJICB7IENUUl9GTEFNRV8yLCBNU1JfUDRfREFDX0VTQ1IxfSB9CisJfSwKKworCXsgLyogTUVNT1JZX0NPTVBMRVRFICovCisJCTB4MDIsIDB4MDgsCisJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X1NBQVRfRVNDUjB9LAorCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9TQUFUX0VTQ1IxfSB9CisJfSwKKworCXsgLyogTE9BRF9QT1JUX1JFUExBWSAqLworCQkweDAyLCAweDA0LCAKKwkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfU0FBVF9FU0NSMH0sCisJCSAgeyBDVFJfRkxBTUVfMiwgTVNSX1A0X1NBQVRfRVNDUjF9IH0KKwl9LAorCisJeyAvKiBTVE9SRV9QT1JUX1JFUExBWSAqLworCQkweDAyLCAweDA1LAorCQl7IHsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9TQUFUX0VTQ1IwfSwKKwkJICB7IENUUl9GTEFNRV8yLCBNU1JfUDRfU0FBVF9FU0NSMX0gfQorCX0sCisKKwl7IC8qIE1PQl9MT0FEX1JFUExBWSAqLworCQkweDAyLCAweDAzLAorCQl7IHsgQ1RSX0JQVV8wLCBNU1JfUDRfTU9CX0VTQ1IwfSwKKwkJICB7IENUUl9CUFVfMiwgTVNSX1A0X01PQl9FU0NSMX0gfQorCX0sCisKKwl7IC8qIFBBR0VfV0FMS19UWVBFICovCisJCTB4MDQsIDB4MDEsCisJCXsgeyBDVFJfQlBVXzAsIE1TUl9QNF9QTUhfRVNDUjB9LAorCQkgIHsgQ1RSX0JQVV8yLCBNU1JfUDRfUE1IX0VTQ1IxfSB9CisJfSwKKworCXsgLyogQlNRX0NBQ0hFX1JFRkVSRU5DRSAqLworCQkweDA3LCAweDBjLCAKKwkJeyB7IENUUl9CUFVfMCwgTVNSX1A0X0JTVV9FU0NSMH0sCisJCSAgeyBDVFJfQlBVXzIsIE1TUl9QNF9CU1VfRVNDUjF9IH0KKwl9LAorCisJeyAvKiBJT1FfQUxMT0NBVElPTiAqLworCQkweDA2LCAweDAzLCAKKwkJeyB7IENUUl9CUFVfMCwgTVNSX1A0X0ZTQl9FU0NSMH0sCisJCSAgeyAwLCAwIH0gfQorCX0sCisKKwl7IC8qIElPUV9BQ1RJVkVfRU5UUklFUyAqLworCQkweDA2LCAweDFhLCAKKwkJeyB7IENUUl9CUFVfMiwgTVNSX1A0X0ZTQl9FU0NSMX0sCisJCSAgeyAwLCAwIH0gfQorCX0sCisKKwl7IC8qIEZTQl9EQVRBX0FDVElWSVRZICovCisJCTB4MDYsIDB4MTcsIAorCQl7IHsgQ1RSX0JQVV8wLCBNU1JfUDRfRlNCX0VTQ1IwfSwKKwkJICB7IENUUl9CUFVfMiwgTVNSX1A0X0ZTQl9FU0NSMX0gfQorCX0sCisKKwl7IC8qIEJTUV9BTExPQ0FUSU9OICovCisJCTB4MDcsIDB4MDUsIAorCQl7IHsgQ1RSX0JQVV8wLCBNU1JfUDRfQlNVX0VTQ1IwfSwKKwkJICB7IDAsIDAgfSB9CisJfSwKKworCXsgLyogQlNRX0FDVElWRV9FTlRSSUVTICovCisJCTB4MDcsIDB4MDYsCisJCXsgeyBDVFJfQlBVXzIsIE1TUl9QNF9CU1VfRVNDUjEgLyogZ3Vlc3MgKi99LCAgCisJCSAgeyAwLCAwIH0gfQorCX0sCisKKwl7IC8qIFg4N19BU1NJU1QgKi8KKwkJMHgwNSwgMHgwMywgCisJCXsgeyBDVFJfSVFfNCwgTVNSX1A0X0NSVV9FU0NSMn0sCisJCSAgeyBDVFJfSVFfNSwgTVNSX1A0X0NSVV9FU0NSM30gfQorCX0sCisKKwl7IC8qIFNTRV9JTlBVVF9BU1NJU1QgKi8KKwkJMHgwMSwgMHgzNCwKKwkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfRklSTV9FU0NSMH0sCisJCSAgeyBDVFJfRkxBTUVfMiwgTVNSX1A0X0ZJUk1fRVNDUjF9IH0KKwl9LAorICAKKwl7IC8qIFBBQ0tFRF9TUF9VT1AgKi8KKwkJMHgwMSwgMHgwOCwgCisJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X0ZJUk1fRVNDUjB9LAorCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9GSVJNX0VTQ1IxfSB9CisJfSwKKyAgCisJeyAvKiBQQUNLRURfRFBfVU9QICovCisJCTB4MDEsIDB4MGMsIAorCQl7IHsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9GSVJNX0VTQ1IwfSwKKwkJICB7IENUUl9GTEFNRV8yLCBNU1JfUDRfRklSTV9FU0NSMX0gfQorCX0sCisKKwl7IC8qIFNDQUxBUl9TUF9VT1AgKi8KKwkJMHgwMSwgMHgwYSwgCisJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X0ZJUk1fRVNDUjB9LAorCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9GSVJNX0VTQ1IxfSB9CisJfSwKKworCXsgLyogU0NBTEFSX0RQX1VPUCAqLworCQkweDAxLCAweDBlLAorCQl7IHsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9GSVJNX0VTQ1IwfSwKKwkJICB7IENUUl9GTEFNRV8yLCBNU1JfUDRfRklSTV9FU0NSMX0gfQorCX0sCisKKwl7IC8qIDY0QklUX01NWF9VT1AgKi8KKwkJMHgwMSwgMHgwMiwgCisJCXsgeyBDVFJfRkxBTUVfMCwgTVNSX1A0X0ZJUk1fRVNDUjB9LAorCQkgIHsgQ1RSX0ZMQU1FXzIsIE1TUl9QNF9GSVJNX0VTQ1IxfSB9CisJfSwKKyAgCisJeyAvKiAxMjhCSVRfTU1YX1VPUCAqLworCQkweDAxLCAweDFhLCAKKwkJeyB7IENUUl9GTEFNRV8wLCBNU1JfUDRfRklSTV9FU0NSMH0sCisJCSAgeyBDVFJfRkxBTUVfMiwgTVNSX1A0X0ZJUk1fRVNDUjF9IH0KKwl9LAorCisJeyAvKiBYODdfRlBfVU9QICovCisJCTB4MDEsIDB4MDQsIAorCQl7IHsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9GSVJNX0VTQ1IwfSwKKwkJICB7IENUUl9GTEFNRV8yLCBNU1JfUDRfRklSTV9FU0NSMX0gfQorCX0sCisgIAorCXsgLyogWDg3X1NJTURfTU9WRVNfVU9QICovCisJCTB4MDEsIDB4MmUsIAorCQl7IHsgQ1RSX0ZMQU1FXzAsIE1TUl9QNF9GSVJNX0VTQ1IwfSwKKwkJICB7IENUUl9GTEFNRV8yLCBNU1JfUDRfRklSTV9FU0NSMX0gfQorCX0sCisgIAorCXsgLyogTUFDSElORV9DTEVBUiAqLworCQkweDA1LCAweDAyLCAKKwkJeyB7IENUUl9JUV80LCBNU1JfUDRfQ1JVX0VTQ1IyfSwKKwkJICB7IENUUl9JUV81LCBNU1JfUDRfQ1JVX0VTQ1IzfSB9CisJfSwKKworCXsgLyogR0xPQkFMX1BPV0VSX0VWRU5UUyAqLworCQkweDA2LCAweDEzIC8qIG9sZGVyIG1hbnVhbCBzYXlzIDB4MDUsIG5ld2VyIDB4MTMgKi8sCisJCXsgeyBDVFJfQlBVXzAsIE1TUl9QNF9GU0JfRVNDUjB9LAorCQkgIHsgQ1RSX0JQVV8yLCBNU1JfUDRfRlNCX0VTQ1IxfSB9CisJfSwKKyAgCisJeyAvKiBUQ19NU19YRkVSICovCisJCTB4MDAsIDB4MDUsIAorCQl7IHsgQ1RSX01TXzAsIE1TUl9QNF9NU19FU0NSMH0sCisJCSAgeyBDVFJfTVNfMiwgTVNSX1A0X01TX0VTQ1IxfSB9CisJfSwKKworCXsgLyogVU9QX1FVRVVFX1dSSVRFUyAqLworCQkweDAwLCAweDA5LAorCQl7IHsgQ1RSX01TXzAsIE1TUl9QNF9NU19FU0NSMH0sCisJCSAgeyBDVFJfTVNfMiwgTVNSX1A0X01TX0VTQ1IxfSB9CisJfSwKKworCXsgLyogRlJPTlRfRU5EX0VWRU5UICovCisJCTB4MDUsIDB4MDgsCisJCXsgeyBDVFJfSVFfNCwgTVNSX1A0X0NSVV9FU0NSMn0sCisJCSAgeyBDVFJfSVFfNSwgTVNSX1A0X0NSVV9FU0NSM30gfQorCX0sCisKKwl7IC8qIEVYRUNVVElPTl9FVkVOVCAqLworCQkweDA1LCAweDBjLAorCQl7IHsgQ1RSX0lRXzQsIE1TUl9QNF9DUlVfRVNDUjJ9LAorCQkgIHsgQ1RSX0lRXzUsIE1TUl9QNF9DUlVfRVNDUjN9IH0KKwl9LAorCisJeyAvKiBSRVBMQVlfRVZFTlQgKi8KKwkJMHgwNSwgMHgwOSwKKwkJeyB7IENUUl9JUV80LCBNU1JfUDRfQ1JVX0VTQ1IyfSwKKwkJICB7IENUUl9JUV81LCBNU1JfUDRfQ1JVX0VTQ1IzfSB9CisJfSwKKworCXsgLyogSU5TVFJfUkVUSVJFRCAqLworCQkweDA0LCAweDAyLCAKKwkJeyB7IENUUl9JUV80LCBNU1JfUDRfQ1JVX0VTQ1IwfSwKKwkJICB7IENUUl9JUV81LCBNU1JfUDRfQ1JVX0VTQ1IxfSB9CisJfSwKKworCXsgLyogVU9QU19SRVRJUkVEICovCisJCTB4MDQsIDB4MDEsCisJCXsgeyBDVFJfSVFfNCwgTVNSX1A0X0NSVV9FU0NSMH0sCisJCSAgeyBDVFJfSVFfNSwgTVNSX1A0X0NSVV9FU0NSMX0gfQorCX0sCisKKwl7IC8qIFVPUF9UWVBFICovICAgIAorCQkweDAyLCAweDAyLCAKKwkJeyB7IENUUl9JUV80LCBNU1JfUDRfUkFUX0VTQ1IwfSwKKwkJICB7IENUUl9JUV81LCBNU1JfUDRfUkFUX0VTQ1IxfSB9CisJfSwKKworCXsgLyogUkVUSVJFRF9NSVNQUkVEX0JSQU5DSF9UWVBFICovCisJCTB4MDIsIDB4MDUsIAorCQl7IHsgQ1RSX01TXzAsIE1TUl9QNF9UQlBVX0VTQ1IwfSwKKwkJICB7IENUUl9NU18yLCBNU1JfUDRfVEJQVV9FU0NSMX0gfQorCX0sCisKKwl7IC8qIFJFVElSRURfQlJBTkNIX1RZUEUgKi8KKwkJMHgwMiwgMHgwNCwKKwkJeyB7IENUUl9NU18wLCBNU1JfUDRfVEJQVV9FU0NSMH0sCisJCSAgeyBDVFJfTVNfMiwgTVNSX1A0X1RCUFVfRVNDUjF9IH0KKwl9Cit9OworCisKKyNkZWZpbmUgTUlTQ19QTUNfRU5BQkxFRF9QKHgpICgoeCkgJiAxIDw8IDcpCisKKyNkZWZpbmUgRVNDUl9SRVNFUlZFRF9CSVRTIDB4ODAwMDAwMDMKKyNkZWZpbmUgRVNDUl9DTEVBUihlc2NyKSAoKGVzY3IpICY9IEVTQ1JfUkVTRVJWRURfQklUUykKKyNkZWZpbmUgRVNDUl9TRVRfVVNSXzAoZXNjciwgdXNyKSAoKGVzY3IpIHw9ICgoKHVzcikgJiAxKSA8PCAyKSkKKyNkZWZpbmUgRVNDUl9TRVRfT1NfMChlc2NyLCBvcykgKChlc2NyKSB8PSAoKChvcykgJiAxKSA8PCAzKSkKKyNkZWZpbmUgRVNDUl9TRVRfVVNSXzEoZXNjciwgdXNyKSAoKGVzY3IpIHw9ICgoKHVzcikgJiAxKSkpCisjZGVmaW5lIEVTQ1JfU0VUX09TXzEoZXNjciwgb3MpICgoZXNjcikgfD0gKCgob3MpICYgMSkgPDwgMSkpCisjZGVmaW5lIEVTQ1JfU0VUX0VWRU5UX1NFTEVDVChlc2NyLCBzZWwpICgoZXNjcikgfD0gKCgoc2VsKSAmIDB4M2YpIDw8IDI1KSkKKyNkZWZpbmUgRVNDUl9TRVRfRVZFTlRfTUFTSyhlc2NyLCBtYXNrKSAoKGVzY3IpIHw9ICgoKG1hc2spICYgMHhmZmZmKSA8PCA5KSkKKyNkZWZpbmUgRVNDUl9SRUFEKGVzY3IsaGlnaCxldixpKSBkbyB7cmRtc3IoZXYtPmJpbmRpbmdzWyhpKV0uZXNjcl9hZGRyZXNzLCAoZXNjciksIChoaWdoKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgRVNDUl9XUklURShlc2NyLGhpZ2gsZXYsaSkgZG8ge3dybXNyKGV2LT5iaW5kaW5nc1soaSldLmVzY3JfYWRkcmVzcywgKGVzY3IpLCAoaGlnaCkpO30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0NDUl9SRVNFUlZFRF9CSVRTIDB4MzgwMzBGRkYKKyNkZWZpbmUgQ0NDUl9DTEVBUihjY2NyKSAoKGNjY3IpICY9IENDQ1JfUkVTRVJWRURfQklUUykKKyNkZWZpbmUgQ0NDUl9TRVRfUkVRVUlSRURfQklUUyhjY2NyKSAoKGNjY3IpIHw9IDB4MDAwMzAwMDApCisjZGVmaW5lIENDQ1JfU0VUX0VTQ1JfU0VMRUNUKGNjY3IsIHNlbCkgKChjY2NyKSB8PSAoKChzZWwpICYgMHgwNykgPDwgMTMpKQorI2RlZmluZSBDQ0NSX1NFVF9QTUlfT1ZGXzAoY2NjcikgKChjY2NyKSB8PSAoMTw8MjYpKQorI2RlZmluZSBDQ0NSX1NFVF9QTUlfT1ZGXzEoY2NjcikgKChjY2NyKSB8PSAoMTw8MjcpKQorI2RlZmluZSBDQ0NSX1NFVF9FTkFCTEUoY2NjcikgKChjY2NyKSB8PSAoMTw8MTIpKQorI2RlZmluZSBDQ0NSX1NFVF9ESVNBQkxFKGNjY3IpICgoY2NjcikgJj0gfigxPDwxMikpCisjZGVmaW5lIENDQ1JfUkVBRChsb3csIGhpZ2gsIGkpIGRvIHtyZG1zcihwNF9jb3VudGVyc1soaSldLmNjY3JfYWRkcmVzcywgKGxvdyksIChoaWdoKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ0NDUl9XUklURShsb3csIGhpZ2gsIGkpIGRvIHt3cm1zcihwNF9jb3VudGVyc1soaSldLmNjY3JfYWRkcmVzcywgKGxvdyksIChoaWdoKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ0NDUl9PVkZfUChjY2NyKSAoKGNjY3IpICYgKDFVPDwzMSkpCisjZGVmaW5lIENDQ1JfQ0xFQVJfT1ZGKGNjY3IpICgoY2NjcikgJj0gKH4oMVU8PDMxKSkpCisKKyNkZWZpbmUgQ1RSX1JFQUQobCxoLGkpIGRvIHtyZG1zcihwNF9jb3VudGVyc1soaSldLmNvdW50ZXJfYWRkcmVzcywgKGwpLCAoaCkpO30gd2hpbGUgKDApCisjZGVmaW5lIENUUl9XUklURShsLGkpIGRvIHt3cm1zcihwNF9jb3VudGVyc1soaSldLmNvdW50ZXJfYWRkcmVzcywgLSh1MzIpKGwpLCAtMSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ1RSX09WRVJGTE9XX1AoY3RyKSAoISgoY3RyKSAmIDB4ODAwMDAwMDApKQorCisKKy8qIHRoaXMgYXNzaWducyBhICJzdGFnZ2VyIiB0byB0aGUgY3VycmVudCBDUFUsIHdoaWNoIGlzIHVzZWQgdGhyb3VnaG91dAorICAgdGhlIGNvZGUgaW4gdGhpcyBtb2R1bGUgYXMgYW4gZXh0cmEgYXJyYXkgb2Zmc2V0LCB0byBzZWxlY3QgdGhlICJldmVuIgorICAgb3IgIm9kZCIgcGFydCBvZiBhbGwgdGhlIGRpdmlkZWQgcmVzb3VyY2VzLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfc3RhZ2dlcih2b2lkKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXJldHVybiAoY3B1ICE9IGZpcnN0X2NwdShjcHVfc2libGluZ19tYXBbY3B1XSkpOworI2VuZGlmCQorCXJldHVybiAwOworfQorCisKKy8qIGZpbmFsbHksIG1lZGlhdGUgYWNjZXNzIHRvIGEgcmVhbCBoYXJkd2FyZSBjb3VudGVyCisgICBieSBwYXNzaW5nIGEgInZpcnR1YWwiIGNvdW50ZXIgbnVtZXIgdG8gdGhpcyBtYWNybywKKyAgIGFsb25nIHdpdGggeW91ciBzdGFnZ2VyIHNldHRpbmcuICovCisjZGVmaW5lIFZJUlRfQ1RSKHN0YWdnZXIsIGkpICgoaSkgKyAoKG51bV9jb3VudGVycykgKiAoc3RhZ2dlcikpKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZXNldF92YWx1ZVtOVU1fQ09VTlRFUlNfTk9OX0hUXTsKKworCitzdGF0aWMgdm9pZCBwNF9maWxsX2luX2FkZHJlc3NlcyhzdHJ1Y3Qgb3BfbXNycyAqIGNvbnN0IG1zcnMpCit7CisJdW5zaWduZWQgaW50IGk7IAorCXVuc2lnbmVkIGludCBhZGRyLCBzdGFnOworCisJc2V0dXBfbnVtX2NvdW50ZXJzKCk7CisJc3RhZyA9IGdldF9zdGFnZ2VyKCk7CisKKwkvKiB0aGUgY291bnRlciByZWdpc3RlcnMgd2UgcGF5IGF0dGVudGlvbiB0byAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgeworCQltc3JzLT5jb3VudGVyc1tpXS5hZGRyID0gCisJCQlwNF9jb3VudGVyc1tWSVJUX0NUUihzdGFnLCBpKV0uY291bnRlcl9hZGRyZXNzOworCX0KKworCS8qIEZJWE1FOiBiYWQgZmVlbGluZywgd2UgZG9uJ3Qgc2F2ZSB0aGUgMTAgY291bnRlcnMgd2UgZG9uJ3QgdXNlLiAqLworCisJLyogMTggQ0NDUiByZWdpc3RlcnMgKi8KKwlmb3IgKGkgPSAwLCBhZGRyID0gTVNSX1A0X0JQVV9DQ0NSMCArIHN0YWc7CisJICAgICBhZGRyIDw9IE1TUl9QNF9JUV9DQ0NSNTsgKytpLCBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsKKwkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CisJfQorCQorCS8qIDQzIEVTQ1IgcmVnaXN0ZXJzIGluIHRocmVlIG9yIGZvdXIgZGlzY29udGlndW91cyBncm91cCAqLworCWZvciAoYWRkciA9IE1TUl9QNF9CU1VfRVNDUjAgKyBzdGFnOworCSAgICAgYWRkciA8IE1TUl9QNF9JUV9FU0NSMDsgKytpLCBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsKKwkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CisJfQorCisJLyogbm8gSVFfRVNDUjAvMSBvbiBzb21lIG1vZGVscywgd2Ugc2F2ZSBhIHNlY29uZGUgdGltZSBCU1VfRVNDUjAvMQorCSAqIHRvIGF2b2lkIHNwZWNpYWwgY2FzZSBpbiBubWlfe3NhdmV8cmVzdG9yZX1fcmVnaXN0ZXJzKCkgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPj0gMHgzKSB7CisJCWZvciAoYWRkciA9IE1TUl9QNF9CU1VfRVNDUjAgKyBzdGFnOworCQkgICAgIGFkZHIgPD0gTVNSX1A0X0JTVV9FU0NSMTsgKytpLCBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsKKwkJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChhZGRyID0gTVNSX1A0X0lRX0VTQ1IwICsgc3RhZzsKKwkJICAgICBhZGRyIDw9IE1TUl9QNF9JUV9FU0NSMTsgKytpLCBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsKKwkJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOworCQl9CisJfQorCisJZm9yIChhZGRyID0gTVNSX1A0X1JBVF9FU0NSMCArIHN0YWc7CisJICAgICBhZGRyIDw9IE1TUl9QNF9TU1VfRVNDUjA7ICsraSwgYWRkciArPSBhZGRyX2luY3JlbWVudCgpKSB7CisJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOworCX0KKwkKKwlmb3IgKGFkZHIgPSBNU1JfUDRfTVNfRVNDUjAgKyBzdGFnOworCSAgICAgYWRkciA8PSBNU1JfUDRfVENfRVNDUjE7ICsraSwgYWRkciArPSBhZGRyX2luY3JlbWVudCgpKSB7IAorCQltc3JzLT5jb250cm9sc1tpXS5hZGRyID0gYWRkcjsKKwl9CisJCisJZm9yIChhZGRyID0gTVNSX1A0X0lYX0VTQ1IwICsgc3RhZzsKKwkgICAgIGFkZHIgPD0gTVNSX1A0X0NSVV9FU0NSMzsgKytpLCBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsgCisJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOworCX0KKworCS8qIHRoZXJlIGFyZSAyIHJlbWFpbmluZyBub24tY29udGlndW91c2x5IGxvY2F0ZWQgRVNDUnMgKi8KKworCWlmIChudW1fY291bnRlcnMgPT0gTlVNX0NPVU5URVJTX05PTl9IVCkgewkJCisJCS8qIHN0YW5kYXJkIG5vbi1IVCBDUFVzIGhhbmRsZSBib3RoIHJlbWFpbmluZyBFU0NScyovCisJCW1zcnMtPmNvbnRyb2xzW2krK10uYWRkciA9IE1TUl9QNF9DUlVfRVNDUjU7CisJCW1zcnMtPmNvbnRyb2xzW2krK10uYWRkciA9IE1TUl9QNF9DUlVfRVNDUjQ7CisKKwl9IGVsc2UgaWYgKHN0YWcgPT0gMCkgeworCQkvKiBIVCBDUFVzIGdpdmUgdGhlIGZpcnN0IHJlbWFpbmRlciB0byB0aGUgZXZlbiB0aHJlYWQsIGFzCisJCSAgIHRoZSAzMm5kIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJbXNycy0+Y29udHJvbHNbaSsrXS5hZGRyID0gTVNSX1A0X0NSVV9FU0NSNDsKKworCX0gZWxzZSB7CisJCS8qIGFuZCB0d28gY29waWVzIG9mIHRoZSBzZWNvbmQgdG8gdGhlIG9kZCB0aHJlYWQsCisJCSAgIGZvciB0aGUgMjJzdCBhbmQgMjNuZCBjb250cm9sIHJlZ2lzdGVycyAqLworCQltc3JzLT5jb250cm9sc1tpKytdLmFkZHIgPSBNU1JfUDRfQ1JVX0VTQ1I1OworCQltc3JzLT5jb250cm9sc1tpKytdLmFkZHIgPSBNU1JfUDRfQ1JVX0VTQ1I1OworCX0KK30KKworCitzdGF0aWMgdm9pZCBwbWNfc2V0dXBfb25lX3A0X2NvdW50ZXIodW5zaWduZWQgaW50IGN0cikKK3sKKwlpbnQgaTsKKwlpbnQgY29uc3QgbWF4YmluZCA9IDI7CisJdW5zaWduZWQgaW50IGNjY3IgPSAwOworCXVuc2lnbmVkIGludCBlc2NyID0gMDsKKwl1bnNpZ25lZCBpbnQgaGlnaCA9IDA7CisJdW5zaWduZWQgaW50IGNvdW50ZXJfYml0OworCXN0cnVjdCBwNF9ldmVudF9iaW5kaW5nICpldiA9IE5VTEw7CisJdW5zaWduZWQgaW50IHN0YWc7CisKKwlzdGFnID0gZ2V0X3N0YWdnZXIoKTsKKwkKKwkvKiBjb252ZXJ0IGZyb20gY291bnRlciAqbnVtYmVyKiB0byBjb3VudGVyICpiaXQqICovCisJY291bnRlcl9iaXQgPSAxIDw8IFZJUlRfQ1RSKHN0YWcsIGN0cik7CisJCisJLyogZmluZCBvdXIgZXZlbnQgYmluZGluZyBzdHJ1Y3R1cmUuICovCisJaWYgKGNvdW50ZXJfY29uZmlnW2N0cl0uZXZlbnQgPD0gMCB8fCBjb3VudGVyX2NvbmZpZ1tjdHJdLmV2ZW50ID4gTlVNX0VWRU5UUykgeworCQlwcmludGsoS0VSTl9FUlIgCisJCSAgICAgICAib3Byb2ZpbGU6IFA0IGV2ZW50IGNvZGUgMHglbHggb3V0IG9mIHJhbmdlXG4iLCAKKwkJICAgICAgIGNvdW50ZXJfY29uZmlnW2N0cl0uZXZlbnQpOworCQlyZXR1cm47CisJfQorCQorCWV2ID0gJihwNF9ldmVudHNbY291bnRlcl9jb25maWdbY3RyXS5ldmVudCAtIDFdKTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgbWF4YmluZDsgaSsrKSB7CisJCWlmIChldi0+YmluZGluZ3NbaV0udmlydF9jb3VudGVyICYgY291bnRlcl9iaXQpIHsKKworCQkJLyogbW9kaWZ5IEVTQ1IgKi8KKwkJCUVTQ1JfUkVBRChlc2NyLCBoaWdoLCBldiwgaSk7CisJCQlFU0NSX0NMRUFSKGVzY3IpOworCQkJaWYgKHN0YWcgPT0gMCkgeworCQkJCUVTQ1JfU0VUX1VTUl8wKGVzY3IsIGNvdW50ZXJfY29uZmlnW2N0cl0udXNlcik7CisJCQkJRVNDUl9TRVRfT1NfMChlc2NyLCBjb3VudGVyX2NvbmZpZ1tjdHJdLmtlcm5lbCk7CisJCQl9IGVsc2UgeworCQkJCUVTQ1JfU0VUX1VTUl8xKGVzY3IsIGNvdW50ZXJfY29uZmlnW2N0cl0udXNlcik7CisJCQkJRVNDUl9TRVRfT1NfMShlc2NyLCBjb3VudGVyX2NvbmZpZ1tjdHJdLmtlcm5lbCk7CisJCQl9CisJCQlFU0NSX1NFVF9FVkVOVF9TRUxFQ1QoZXNjciwgZXYtPmV2ZW50X3NlbGVjdCk7CisJCQlFU0NSX1NFVF9FVkVOVF9NQVNLKGVzY3IsIGNvdW50ZXJfY29uZmlnW2N0cl0udW5pdF9tYXNrKTsJCQkKKwkJCUVTQ1JfV1JJVEUoZXNjciwgaGlnaCwgZXYsIGkpOworCQkgICAgICAgCisJCQkvKiBtb2RpZnkgQ0NDUiAqLworCQkJQ0NDUl9SRUFEKGNjY3IsIGhpZ2gsIFZJUlRfQ1RSKHN0YWcsIGN0cikpOworCQkJQ0NDUl9DTEVBUihjY2NyKTsKKwkJCUNDQ1JfU0VUX1JFUVVJUkVEX0JJVFMoY2Njcik7CisJCQlDQ0NSX1NFVF9FU0NSX1NFTEVDVChjY2NyLCBldi0+ZXNjcl9zZWxlY3QpOworCQkJaWYgKHN0YWcgPT0gMCkgeworCQkJCUNDQ1JfU0VUX1BNSV9PVkZfMChjY2NyKTsKKwkJCX0gZWxzZSB7CisJCQkJQ0NDUl9TRVRfUE1JX09WRl8xKGNjY3IpOworCQkJfQorCQkJQ0NDUl9XUklURShjY2NyLCBoaWdoLCBWSVJUX0NUUihzdGFnLCBjdHIpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0VSUiAKKwkgICAgICAgIm9wcm9maWxlOiBQNCBldmVudCBjb2RlIDB4JWx4IG5vIGJpbmRpbmcsIHN0YWcgJWQgY3RyICVkXG4iLAorCSAgICAgICBjb3VudGVyX2NvbmZpZ1tjdHJdLmV2ZW50LCBzdGFnLCBjdHIpOworfQorCisKK3N0YXRpYyB2b2lkIHA0X3NldHVwX2N0cnMoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CisJdW5zaWduZWQgaW50IGFkZHI7CisJdW5zaWduZWQgaW50IHN0YWc7CisKKwlzdGFnID0gZ2V0X3N0YWdnZXIoKTsKKworCXJkbXNyKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBsb3csIGhpZ2gpOworCWlmICghIE1JU0NfUE1DX0VOQUJMRURfUChsb3cpKSB7CisJCXByaW50ayhLRVJOX0VSUiAib3Byb2ZpbGU6IFA0IFBNQyBub3QgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNsZWFyIHRoZSBjY2NycyB3ZSB3aWxsIHVzZSAqLworCWZvciAoaSA9IDAgOyBpIDwgbnVtX2NvdW50ZXJzIDsgaSsrKSB7CisJCXJkbXNyKHA0X2NvdW50ZXJzW1ZJUlRfQ1RSKHN0YWcsIGkpXS5jY2NyX2FkZHJlc3MsIGxvdywgaGlnaCk7CisJCUNDQ1JfQ0xFQVIobG93KTsKKwkJQ0NDUl9TRVRfUkVRVUlSRURfQklUUyhsb3cpOworCQl3cm1zcihwNF9jb3VudGVyc1tWSVJUX0NUUihzdGFnLCBpKV0uY2Njcl9hZGRyZXNzLCBsb3csIGhpZ2gpOworCX0KKworCS8qIGNsZWFyIGNjY3JzIG91dHNpZGUgb3VyIGNvbmNlcm4gKi8KKwlmb3IgKGkgPSBzdGFnIDsgaSA8IE5VTV9VTlVTRURfQ0NDUlMgOyBpICs9IGFkZHJfaW5jcmVtZW50KCkpIHsKKwkJcmRtc3IocDRfdW51c2VkX2NjY3JbaV0sIGxvdywgaGlnaCk7CisJCUNDQ1JfQ0xFQVIobG93KTsKKwkJQ0NDUl9TRVRfUkVRVUlSRURfQklUUyhsb3cpOworCQl3cm1zcihwNF91bnVzZWRfY2NjcltpXSwgbG93LCBoaWdoKTsKKwl9CisKKwkvKiBjbGVhciBhbGwgZXNjcnMgKGluY2x1ZGluZyB0aG9zZSBvdXRzaWRlIG91ciBjb25jZXJuKSAqLworCWZvciAoYWRkciA9IE1TUl9QNF9CU1VfRVNDUjAgKyBzdGFnOworCSAgICAgYWRkciA8ICBNU1JfUDRfSVFfRVNDUjA7IGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSkgeworCQl3cm1zcihhZGRyLCAwLCAwKTsKKwl9CisKKwkvKiBPbiBvbGRlciBtb2RlbHMgY2xlYXIgYWxzbyBNU1JfUDRfSVFfRVNDUjAvMSAqLworCWlmIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA8IDB4MykgeworCQl3cm1zcihNU1JfUDRfSVFfRVNDUjAsIDAsIDApOworCQl3cm1zcihNU1JfUDRfSVFfRVNDUjEsIDAsIDApOworCX0KKworCWZvciAoYWRkciA9IE1TUl9QNF9SQVRfRVNDUjAgKyBzdGFnOworCSAgICAgYWRkciA8PSBNU1JfUDRfU1NVX0VTQ1IwOyArK2ksIGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSkgeworCQl3cm1zcihhZGRyLCAwLCAwKTsKKwl9CisJCisJZm9yIChhZGRyID0gTVNSX1A0X01TX0VTQ1IwICsgc3RhZzsKKwkgICAgIGFkZHIgPD0gTVNSX1A0X1RDX0VTQ1IxOyBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpeyAKKwkJd3Jtc3IoYWRkciwgMCwgMCk7CisJfQorCQorCWZvciAoYWRkciA9IE1TUl9QNF9JWF9FU0NSMCArIHN0YWc7CisJICAgICBhZGRyIDw9IE1TUl9QNF9DUlVfRVNDUjM7IGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSl7IAorCQl3cm1zcihhZGRyLCAwLCAwKTsKKwl9CisKKwlpZiAobnVtX2NvdW50ZXJzID09IE5VTV9DT1VOVEVSU19OT05fSFQpIHsJCQorCQl3cm1zcihNU1JfUDRfQ1JVX0VTQ1I0LCAwLCAwKTsKKwkJd3Jtc3IoTVNSX1A0X0NSVV9FU0NSNSwgMCwgMCk7CisJfSBlbHNlIGlmIChzdGFnID09IDApIHsKKwkJd3Jtc3IoTVNSX1A0X0NSVV9FU0NSNCwgMCwgMCk7CisJfSBlbHNlIHsKKwkJd3Jtc3IoTVNSX1A0X0NSVV9FU0NSNSwgMCwgMCk7CisJfQkJCisJCisJLyogc2V0dXAgYWxsIGNvdW50ZXJzICovCisJZm9yIChpID0gMCA7IGkgPCBudW1fY291bnRlcnMgOyArK2kpIHsKKwkJaWYgKGNvdW50ZXJfY29uZmlnW2ldLmVuYWJsZWQpIHsKKwkJCXJlc2V0X3ZhbHVlW2ldID0gY291bnRlcl9jb25maWdbaV0uY291bnQ7CisJCQlwbWNfc2V0dXBfb25lX3A0X2NvdW50ZXIoaSk7CisJCQlDVFJfV1JJVEUoY291bnRlcl9jb25maWdbaV0uY291bnQsIFZJUlRfQ1RSKHN0YWcsIGkpKTsKKwkJfSBlbHNlIHsKKwkJCXJlc2V0X3ZhbHVlW2ldID0gMDsKKwkJfQorCX0KK30KKworCitzdGF0aWMgaW50IHA0X2NoZWNrX2N0cnMoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAorCQkJIHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwl1bnNpZ25lZCBsb25nIGN0ciwgbG93LCBoaWdoLCBzdGFnLCByZWFsOworCWludCBpOworCisJc3RhZyA9IGdldF9zdGFnZ2VyKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKKwkJCisJCWlmICghcmVzZXRfdmFsdWVbaV0pIAorCQkJY29udGludWU7CisKKwkJLyogCisJCSAqIHRoZXJlIGlzIHNvbWUgZWNjZW50cmljaXR5IGluIHRoZSBoYXJkd2FyZSB3aGljaAorCQkgKiByZXF1aXJlcyB0aGF0IHdlIHBlcmZvcm0gMiBleHRyYSBjb3JyZWN0aW9uczoKKwkJICoKKwkJICogLSBjaGVjayBib3RoIHRoZSBDQ0NSOk9WRiBmbGFnIGZvciBvdmVyZmxvdyBhbmQgdGhlCisJCSAqICAgY291bnRlciBoaWdoIGJpdCBmb3IgdW4tZmxhZ2dlZCBvdmVyZmxvd3MuCisJCSAqCisJCSAqIC0gd3JpdGUgdGhlIGNvdW50ZXIgYmFjayB0d2ljZSB0byBlbnN1cmUgaXQgZ2V0cworCQkgKiAgIHVwZGF0ZWQgcHJvcGVybHkuCisJCSAqIAorCQkgKiB0aGUgZm9ybWVyIHNlZW1zIHRvIGJlIHJlbGF0ZWQgdG8gZXh0cmEgTk1JcyBoYXBwZW5pbmcKKwkJICogZHVyaW5nIHRoZSBjdXJyZW50IE5NSTsgdGhlIGxhdHRlciBpcyByZXBvcnRlZCBhcyBlcnJhdGEKKwkJICogTjE1IGluIGludGVsIGRvYyAyNDkxOTktMDI5LCBwZW50aXVtIDQgc3BlY2lmaWNhdGlvbgorCQkgKiB1cGRhdGUsIHRob3VnaCB0aGVpciBzdWdnZXN0ZWQgd29yay1hcm91bmQgZG9lcyBub3QKKwkJICogYXBwZWFyIHRvIHNvbHZlIHRoZSBwcm9ibGVtLgorCQkgKi8KKwkJCisJCXJlYWwgPSBWSVJUX0NUUihzdGFnLCBpKTsKKworCQlDQ0NSX1JFQUQobG93LCBoaWdoLCByZWFsKTsKKyAJCUNUUl9SRUFEKGN0ciwgaGlnaCwgcmVhbCk7CisJCWlmIChDQ0NSX09WRl9QKGxvdykgfHwgQ1RSX09WRVJGTE9XX1AoY3RyKSkgeworCQkJb3Byb2ZpbGVfYWRkX3NhbXBsZShyZWdzLCBpKTsKKyAJCQlDVFJfV1JJVEUocmVzZXRfdmFsdWVbaV0sIHJlYWwpOworCQkJQ0NDUl9DTEVBUl9PVkYobG93KTsKKwkJCUNDQ1JfV1JJVEUobG93LCBoaWdoLCByZWFsKTsKKyAJCQlDVFJfV1JJVEUocmVzZXRfdmFsdWVbaV0sIHJlYWwpOworCQl9CisJfQorCisJLyogUDQgcXVpcms6IHlvdSBoYXZlIHRvIHJlLXVubWFzayB0aGUgYXBpYyB2ZWN0b3IgKi8KKwlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIGFwaWNfcmVhZChBUElDX0xWVFBDKSAmIH5BUElDX0xWVF9NQVNLRUQpOworCisJLyogU2VlIG9wX21vZGVsX3Bwcm8uYyAqLworCXJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIHA0X3N0YXJ0KHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgbG93LCBoaWdoLCBzdGFnOworCWludCBpOworCisJc3RhZyA9IGdldF9zdGFnZ2VyKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKKwkJaWYgKCFyZXNldF92YWx1ZVtpXSkKKwkJCWNvbnRpbnVlOworCQlDQ0NSX1JFQUQobG93LCBoaWdoLCBWSVJUX0NUUihzdGFnLCBpKSk7CisJCUNDQ1JfU0VUX0VOQUJMRShsb3cpOworCQlDQ0NSX1dSSVRFKGxvdywgaGlnaCwgVklSVF9DVFIoc3RhZywgaSkpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBwNF9zdG9wKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgbG93LCBoaWdoLCBzdGFnOworCWludCBpOworCisJc3RhZyA9IGdldF9zdGFnZ2VyKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKKwkJQ0NDUl9SRUFEKGxvdywgaGlnaCwgVklSVF9DVFIoc3RhZywgaSkpOworCQlDQ0NSX1NFVF9ESVNBQkxFKGxvdyk7CisJCUNDQ1JfV1JJVEUobG93LCBoaWdoLCBWSVJUX0NUUihzdGFnLCBpKSk7CisJfQorfQorCisKKyNpZmRlZiBDT05GSUdfU01QCitzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3Qgb3BfcDRfaHQyX3NwZWMgPSB7CisJLm51bV9jb3VudGVycyA9IE5VTV9DT1VOVEVSU19IVDIsCisJLm51bV9jb250cm9scyA9IE5VTV9DT05UUk9MU19IVDIsCisJLmZpbGxfaW5fYWRkcmVzc2VzID0gJnA0X2ZpbGxfaW5fYWRkcmVzc2VzLAorCS5zZXR1cF9jdHJzID0gJnA0X3NldHVwX2N0cnMsCisJLmNoZWNrX2N0cnMgPSAmcDRfY2hlY2tfY3RycywKKwkuc3RhcnQgPSAmcDRfc3RhcnQsCisJLnN0b3AgPSAmcDRfc3RvcAorfTsKKyNlbmRpZgorCitzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3Qgb3BfcDRfc3BlYyA9IHsKKwkubnVtX2NvdW50ZXJzID0gTlVNX0NPVU5URVJTX05PTl9IVCwKKwkubnVtX2NvbnRyb2xzID0gTlVNX0NPTlRST0xTX05PTl9IVCwKKwkuZmlsbF9pbl9hZGRyZXNzZXMgPSAmcDRfZmlsbF9pbl9hZGRyZXNzZXMsCisJLnNldHVwX2N0cnMgPSAmcDRfc2V0dXBfY3RycywKKwkuY2hlY2tfY3RycyA9ICZwNF9jaGVja19jdHJzLAorCS5zdGFydCA9ICZwNF9zdGFydCwKKwkuc3RvcCA9ICZwNF9zdG9wCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX3Bwcm8uYyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wcHJvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcxOTAxNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wcHJvLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qKgorICogQGZpbGUgb3BfbW9kZWxfcHByby5oCisgKiBwZW50aXVtIHBybyAvIFA2IG1vZGVsLXNwZWNpZmljIE1TUiBvcGVyYXRpb25zCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMiBPUHJvZmlsZSBhdXRob3JzCisgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORworICoKKyAqIEBhdXRob3IgSm9obiBMZXZvbgorICogQGF1dGhvciBQaGlsaXBwZSBFbGllCisgKiBAYXV0aG9yIEdyYXlkb24gSG9hcmUKKyAqLworCisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgPGFzbS9hcGljLmg+CisgCisjaW5jbHVkZSAib3BfeDg2X21vZGVsLmgiCisjaW5jbHVkZSAib3BfY291bnRlci5oIgorCisjZGVmaW5lIE5VTV9DT1VOVEVSUyAyCisjZGVmaW5lIE5VTV9DT05UUk9MUyAyCisKKyNkZWZpbmUgQ1RSX1JFQUQobCxoLG1zcnMsYykgZG8ge3JkbXNyKG1zcnMtPmNvdW50ZXJzWyhjKV0uYWRkciwgKGwpLCAoaCkpO30gd2hpbGUgKDApCisjZGVmaW5lIENUUl9XUklURShsLG1zcnMsYykgZG8ge3dybXNyKG1zcnMtPmNvdW50ZXJzWyhjKV0uYWRkciwgLSh1MzIpKGwpLCAtMSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQ1RSX09WRVJGTE9XRUQobikgKCEoKG4pICYgKDFVPDwzMSkpKQorCisjZGVmaW5lIENUUkxfUkVBRChsLGgsbXNycyxjKSBkbyB7cmRtc3IoKG1zcnMtPmNvbnRyb2xzWyhjKV0uYWRkciksIChsKSwgKGgpKTt9IHdoaWxlICgwKQorI2RlZmluZSBDVFJMX1dSSVRFKGwsaCxtc3JzLGMpIGRvIHt3cm1zcigobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyKSwgKGwpLCAoaCkpO30gd2hpbGUgKDApCisjZGVmaW5lIENUUkxfU0VUX0FDVElWRShuKSAobiB8PSAoMTw8MjIpKQorI2RlZmluZSBDVFJMX1NFVF9JTkFDVElWRShuKSAobiAmPSB+KDE8PDIyKSkKKyNkZWZpbmUgQ1RSTF9DTEVBUih4KSAoeCAmPSAoMTw8MjEpKQorI2RlZmluZSBDVFJMX1NFVF9FTkFCTEUodmFsKSAodmFsIHw9IDE8PDIwKQorI2RlZmluZSBDVFJMX1NFVF9VU1IodmFsLHUpICh2YWwgfD0gKCh1ICYgMSkgPDwgMTYpKQorI2RlZmluZSBDVFJMX1NFVF9LRVJOKHZhbCxrKSAodmFsIHw9ICgoayAmIDEpIDw8IDE3KSkKKyNkZWZpbmUgQ1RSTF9TRVRfVU0odmFsLCBtKSAodmFsIHw9IChtIDw8IDgpKQorI2RlZmluZSBDVFJMX1NFVF9FVkVOVCh2YWwsIGUpICh2YWwgfD0gZSkKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzZXRfdmFsdWVbTlVNX0NPVU5URVJTXTsKKyAKK3N0YXRpYyB2b2lkIHBwcm9fZmlsbF9pbl9hZGRyZXNzZXMoc3RydWN0IG9wX21zcnMgKiBjb25zdCBtc3JzKQoreworCW1zcnMtPmNvdW50ZXJzWzBdLmFkZHIgPSBNU1JfUDZfUEVSRkNUUjA7CisJbXNycy0+Y291bnRlcnNbMV0uYWRkciA9IE1TUl9QNl9QRVJGQ1RSMTsKKwkKKwltc3JzLT5jb250cm9sc1swXS5hZGRyID0gTVNSX1A2X0VWTlRTRUwwOworCW1zcnMtPmNvbnRyb2xzWzFdLmFkZHIgPSBNU1JfUDZfRVZOVFNFTDE7Cit9CisKKworc3RhdGljIHZvaWQgcHByb19zZXR1cF9jdHJzKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOworCWludCBpOworCisJLyogY2xlYXIgYWxsIGNvdW50ZXJzICovCisJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09OVFJPTFM7ICsraSkgeworCQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJQ1RSTF9DTEVBUihsb3cpOworCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7CisJfQorCQorCS8qIGF2b2lkIGEgZmFsc2UgZGV0ZWN0aW9uIG9mIGN0ciBvdmVyZmxvd3MgaW4gTk1JIGhhbmRsZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPVU5URVJTOyArK2kpIHsKKwkJQ1RSX1dSSVRFKDEsIG1zcnMsIGkpOworCX0KKworCS8qIGVuYWJsZSBhY3RpdmUgY291bnRlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPVU5URVJTOyArK2kpIHsKKwkJaWYgKGNvdW50ZXJfY29uZmlnW2ldLmVuYWJsZWQpIHsKKwkJCXJlc2V0X3ZhbHVlW2ldID0gY291bnRlcl9jb25maWdbaV0uY291bnQ7CisKKwkJCUNUUl9XUklURShjb3VudGVyX2NvbmZpZ1tpXS5jb3VudCwgbXNycywgaSk7CisKKwkJCUNUUkxfUkVBRChsb3csIGhpZ2gsIG1zcnMsIGkpOworCQkJQ1RSTF9DTEVBUihsb3cpOworCQkJQ1RSTF9TRVRfRU5BQkxFKGxvdyk7CisJCQlDVFJMX1NFVF9VU1IobG93LCBjb3VudGVyX2NvbmZpZ1tpXS51c2VyKTsKKwkJCUNUUkxfU0VUX0tFUk4obG93LCBjb3VudGVyX2NvbmZpZ1tpXS5rZXJuZWwpOworCQkJQ1RSTF9TRVRfVU0obG93LCBjb3VudGVyX2NvbmZpZ1tpXS51bml0X21hc2spOworCQkJQ1RSTF9TRVRfRVZFTlQobG93LCBjb3VudGVyX2NvbmZpZ1tpXS5ldmVudCk7CisJCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7CisJCX0KKwl9Cit9CisKKyAKK3N0YXRpYyBpbnQgcHByb19jaGVja19jdHJzKHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywKKwkJCSAgIHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOworCWludCBpOworIAorCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPVU5URVJTOyArK2kpIHsKKwkJQ1RSX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJaWYgKENUUl9PVkVSRkxPV0VEKGxvdykpIHsKKwkJCW9wcm9maWxlX2FkZF9zYW1wbGUocmVncywgaSk7CisJCQlDVFJfV1JJVEUocmVzZXRfdmFsdWVbaV0sIG1zcnMsIGkpOworCQl9CisJfQorCisJLyogT25seSBQNiBiYXNlZCBQZW50aXVtIE0gbmVlZCB0byByZS11bm1hc2sgdGhlIGFwaWMgdmVjdG9yIGJ1dCBpdAorCSAqIGRvZXNuJ3QgaHVydCBvdGhlciBQNiB2YXJpYW50ICovCisJYXBpY193cml0ZShBUElDX0xWVFBDLCBhcGljX3JlYWQoQVBJQ19MVlRQQykgJiB+QVBJQ19MVlRfTUFTS0VEKTsKKworCS8qIFdlIGNhbid0IHdvcmsgb3V0IGlmIHdlIHJlYWxseSBoYW5kbGVkIGFuIGludGVycnVwdC4gV2UKKwkgKiBtaWdodCBoYXZlIGNhdWdodCBhICpzZWNvbmQqIGNvdW50ZXIganVzdCBhZnRlciBvdmVyZmxvd2luZworCSAqIHRoZSBpbnRlcnJ1cHQgZm9yIHRoaXMgY291bnRlciB0aGVuIGFycml2ZXMKKwkgKiBhbmQgd2UgZG9uJ3QgZmluZCBhIGNvdW50ZXIgdGhhdCdzIG92ZXJmbG93ZWQsIHNvIHdlCisJICogd291bGQgcmV0dXJuIDAgYW5kIGdldCBkYXplZCArIGNvbmZ1c2VkLiBJbnN0ZWFkIHdlIGFsd2F5cworCSAqIGFzc3VtZSB3ZSBmb3VuZCBhbiBvdmVyZmxvdy4gVGhpcyBzdWNrcy4KKwkgKi8KKwlyZXR1cm4gMTsKK30KKworIAorc3RhdGljIHZvaWQgcHByb19zdGFydChzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCit7CisJdW5zaWduZWQgaW50IGxvdyxoaWdoOworCUNUUkxfUkVBRChsb3csIGhpZ2gsIG1zcnMsIDApOworCUNUUkxfU0VUX0FDVElWRShsb3cpOworCUNUUkxfV1JJVEUobG93LCBoaWdoLCBtc3JzLCAwKTsKK30KKworCitzdGF0aWMgdm9pZCBwcHJvX3N0b3Aoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQoreworCXVuc2lnbmVkIGludCBsb3csaGlnaDsKKwlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCAwKTsKKwlDVFJMX1NFVF9JTkFDVElWRShsb3cpOworCUNUUkxfV1JJVEUobG93LCBoaWdoLCBtc3JzLCAwKTsKK30KKworCitzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3Qgb3BfcHByb19zcGVjID0geworCS5udW1fY291bnRlcnMgPSBOVU1fQ09VTlRFUlMsCisJLm51bV9jb250cm9scyA9IE5VTV9DT05UUk9MUywKKwkuZmlsbF9pbl9hZGRyZXNzZXMgPSAmcHByb19maWxsX2luX2FkZHJlc3NlcywKKwkuc2V0dXBfY3RycyA9ICZwcHJvX3NldHVwX2N0cnMsCisJLmNoZWNrX2N0cnMgPSAmcHByb19jaGVja19jdHJzLAorCS5zdGFydCA9ICZwcHJvX3N0YXJ0LAorCS5zdG9wID0gJnBwcm9fc3RvcAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF94ODZfbW9kZWwuaCBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF94ODZfbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjNiN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX3g4Nl9tb2RlbC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICogQGZpbGUgb3BfeDg2X21vZGVsLmgKKyAqIGludGVyZmFjZSB0byB4ODYgbW9kZWwtc3BlY2lmaWMgTVNSIG9wZXJhdGlvbnMKKyAqCisgKiBAcmVtYXJrIENvcHlyaWdodCAyMDAyIE9Qcm9maWxlIGF1dGhvcnMKKyAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCisgKgorICogQGF1dGhvciBHcmF5ZG9uIEhvYXJlCisgKi8KKworI2lmbmRlZiBPUF9YODZfTU9ERUxfSAorI2RlZmluZSBPUF9YODZfTU9ERUxfSAorCitzdHJ1Y3Qgb3Bfc2F2ZWRfbXNyIHsKKwl1bnNpZ25lZCBpbnQgaGlnaDsKKwl1bnNpZ25lZCBpbnQgbG93OworfTsKKworc3RydWN0IG9wX21zciB7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXN0cnVjdCBvcF9zYXZlZF9tc3Igc2F2ZWQ7Cit9OworCitzdHJ1Y3Qgb3BfbXNycyB7CisJc3RydWN0IG9wX21zciAqIGNvdW50ZXJzOworCXN0cnVjdCBvcF9tc3IgKiBjb250cm9sczsKK307CisKK3N0cnVjdCBwdF9yZWdzOworCisvKiBUaGUgbW9kZWwgdnRhYmxlIGFic3RyYWN0cyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbgorICogdmFyaW91cyB4ODYgQ1BVIG1vZGVsJ3MgcGVyZmN0ciBzdXBwb3J0LgorICovCitzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgeworCXVuc2lnbmVkIGludCBjb25zdCBudW1fY291bnRlcnM7CisJdW5zaWduZWQgaW50IGNvbnN0IG51bV9jb250cm9sczsKKwl2b2lkICgqZmlsbF9pbl9hZGRyZXNzZXMpKHN0cnVjdCBvcF9tc3JzICogY29uc3QgbXNycyk7CisJdm9pZCAoKnNldHVwX2N0cnMpKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycyk7CisJaW50ICgqY2hlY2tfY3Rycykoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAorCQlzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpOworCXZvaWQgKCpzdGFydCkoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKTsKKwl2b2lkICgqc3RvcCkoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKTsKK307CisKK2V4dGVybiBzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3Qgb3BfcHByb19zcGVjOworZXh0ZXJuIHN0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCBvcF9wNF9zcGVjOworZXh0ZXJuIHN0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCBvcF9wNF9odDJfc3BlYzsKK2V4dGVybiBzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3Qgb3BfYXRobG9uX3NwZWM7CisKKyNlbmRpZiAvKiBPUF9YODZfTU9ERUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9wY2kvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZjAzZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9wY2kvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorb2JqLXkJCQkJOj0gaTM4Ni5vCisKK29iai0kKENPTkZJR19QQ0lfQklPUykJCSs9IHBjYmlvcy5vCitvYmotJChDT05GSUdfUENJX01NQ09ORklHKQkrPSBtbWNvbmZpZy5vCitvYmotJChDT05GSUdfUENJX0RJUkVDVCkJKz0gZGlyZWN0Lm8KKworcGNpLXkJCQkJOj0gZml4dXAubworcGNpLSQoQ09ORklHX0FDUElfUENJKQkJKz0gYWNwaS5vCitwY2kteQkJCQkrPSBsZWdhY3kubyBpcnEubworCitwY2ktJChDT05GSUdfWDg2X1ZJU1dTKQkJOj0gdmlzd3MubyBmaXh1cC5vCitwY2ktJChDT05GSUdfWDg2X05VTUFRKQkJOj0gbnVtYS5vIGlycS5vCisKK29iai15CQkJCSs9ICQocGNpLXkpIGNvbW1vbi5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2FjcGkuYyBiL2FyY2gvaTM4Ni9wY2kvYWNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjY1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvcGNpL2FjcGkuYwpAQCAtMCwwICsxLDUzIEBACisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CisjaW5jbHVkZSAicGNpLmgiCisKK3N0cnVjdCBwY2lfYnVzICogX19kZXZpbml0IHBjaV9hY3BpX3NjYW5fcm9vdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IGRvbWFpbiwgaW50IGJ1c251bSkKK3sKKwlpZiAoZG9tYWluICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBNdWx0aXBsZSBkb21haW5zIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcGNpYmlvc19zY2FuX3Jvb3QoYnVzbnVtKTsKK30KKworZXh0ZXJuIGludCBwY2lfcm91dGVpcnE7CitzdGF0aWMgaW50IF9faW5pdCBwY2lfYWNwaV9pbml0KHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisKKwlpZiAocGNpYmlvc19zY2FubmVkKQorCQlyZXR1cm4gMDsKKworCWlmIChhY3BpX25vaXJxKQorCQlyZXR1cm4gMDsKKworCXByaW50ayhLRVJOX0lORk8gIlBDSTogVXNpbmcgQUNQSSBmb3IgSVJRIHJvdXRpbmdcbiIpOworCWFjcGlfaXJxX3BlbmFsdHlfaW5pdCgpOworCXBjaWJpb3Nfc2Nhbm5lZCsrOworCXBjaWJpb3NfZW5hYmxlX2lycSA9IGFjcGlfcGNpX2lycV9lbmFibGU7CisKKwlpZiAocGNpX3JvdXRlaXJxKSB7CisJCS8qCisJCSAqIFBDSSBJUlEgcm91dGluZyBpcyBzZXQgdXAgYnkgcGNpX2VuYWJsZV9kZXZpY2UoKSwgYnV0IHdlCisJCSAqIGFsc28gZG8gaXQgaGVyZSBpbiBjYXNlIHRoZXJlIGFyZSBzdGlsbCBicm9rZW4gZHJpdmVycyB0aGF0CisJCSAqIGRvbid0IHVzZSBwY2lfZW5hYmxlX2RldmljZSgpLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBSb3V0aW5nIFBDSSBpbnRlcnJ1cHRzIGZvciBhbGwgZGV2aWNlcyBiZWNhdXNlIFwicGNpPXJvdXRlaXJxXCIgc3BlY2lmaWVkXG4iKTsKKwkJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKQorCQkJYWNwaV9wY2lfaXJxX2VuYWJsZShkZXYpOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IElmIGEgZGV2aWNlIGRvZXNuJ3Qgd29yaywgdHJ5IFwicGNpPXJvdXRlaXJxXCIuICBJZiBpdCBoZWxwcywgcG9zdCBhIHJlcG9ydFxuIik7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwlpZiAoYWNwaV9pb2FwaWMpCisJCXByaW50X0lPX0FQSUMoKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwocGNpX2FjcGlfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2NvbW1vbi5jIGIvYXJjaC9pMzg2L3BjaS9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjA5NzVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3BjaS9jb21tb24uYwpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqCUxvdy1MZXZlbCBQQ0kgU3VwcG9ydCBmb3IgUEMKKyAqCisgKgkoYykgMTk5OS0tMjAwMCBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorCisjaW5jbHVkZSAicGNpLmgiCisKKyNpZmRlZiBDT05GSUdfUENJX0JJT1MKK2V4dGVybiAgdm9pZCBwY2liaW9zX3NvcnQodm9pZCk7CisjZW5kaWYKKwordW5zaWduZWQgaW50IHBjaV9wcm9iZSA9IFBDSV9QUk9CRV9CSU9TIHwgUENJX1BST0JFX0NPTkYxIHwgUENJX1BST0JFX0NPTkYyIHwKKwkJCQlQQ0lfUFJPQkVfTU1DT05GOworCitpbnQgcGNpX3JvdXRlaXJxOworaW50IHBjaWJpb3NfbGFzdF9idXMgPSAtMTsKK3N0cnVjdCBwY2lfYnVzICpwY2lfcm9vdF9idXMgPSBOVUxMOworc3RydWN0IHBjaV9yYXdfb3BzICpyYXdfcGNpX29wczsKKworc3RhdGljIGludCBwY2lfcmVhZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsdWUpCit7CisJcmV0dXJuIHJhd19wY2lfb3BzLT5yZWFkKDAsIGJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUsIHNpemUsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBwY2lfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsdWUpCit7CisJcmV0dXJuIHJhd19wY2lfb3BzLT53cml0ZSgwLCBidXMtPm51bWJlciwgZGV2Zm4sIHdoZXJlLCBzaXplLCB2YWx1ZSk7Cit9CisKK3N0cnVjdCBwY2lfb3BzIHBjaV9yb290X29wcyA9IHsKKwkucmVhZCA9IHBjaV9yZWFkLAorCS53cml0ZSA9IHBjaV93cml0ZSwKK307CisKKy8qCisgKiBsZWdhY3ksIG51bWEsIGFuZCBhY3BpIGFsbCB3YW50IHRvIGNhbGwgcGNpYmlvc19zY2FuX3Jvb3QKKyAqIGZyb20gdGhlaXIgaW5pdGNhbGxzLiBUaGlzIGZsYWcgcHJldmVudHMgdGhhdC4KKyAqLworaW50IHBjaWJpb3Nfc2Nhbm5lZDsKKworLyoKKyAqIFRoaXMgaW50ZXJydXB0LXNhZmUgc3BpbmxvY2sgcHJvdGVjdHMgYWxsIGFjY2Vzc2VzIHRvIFBDSQorICogY29uZmlndXJhdGlvbiBzcGFjZS4KKyAqLworREVGSU5FX1NQSU5MT0NLKHBjaV9jb25maWdfbG9jayk7CisKKy8qCisgKiBTZXZlcmFsIGJ1Z2d5IG1vdGhlcmJvYXJkcyBhZGRyZXNzIG9ubHkgMTYgZGV2aWNlcyBhbmQgbWlycm9yCisgKiB0aGVtIHRvIG5leHQgMTYgSURzLiBXZSB0cnkgdG8gZGV0ZWN0IHRoaXMgYGZlYXR1cmUnIG9uIGFsbAorICogcHJpbWFyeSBidXNlcyAodGhvc2UgY29udGFpbmluZyBob3N0IGJyaWRnZXMgYXMgdGhleSBhcmUKKyAqIGV4cGVjdGVkIHRvIGJlIHVuaXF1ZSkgYW5kIHJlbW92ZSB0aGUgZ2hvc3QgZGV2aWNlcy4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpYmlvc19maXh1cF9naG9zdHMoc3RydWN0IHBjaV9idXMgKmIpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbG4sICptbjsKKwlzdHJ1Y3QgcGNpX2RldiAqZCwgKmU7CisJaW50IG1pcnJvciA9IFBDSV9ERVZGTigxNiwwKTsKKwlpbnQgc2Vlbl9ob3N0X2JyaWRnZSA9IDA7CisJaW50IGk7CisKKwlEQkcoIlBDSTogU2Nhbm5pbmcgZm9yIGdob3N0IGRldmljZXMgb24gYnVzICVkXG4iLCBiLT5udW1iZXIpOworCWxpc3RfZm9yX2VhY2gobG4sICZiLT5kZXZpY2VzKSB7CisJCWQgPSBwY2lfZGV2X2IobG4pOworCQlpZiAoKGQtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19CUklER0VfSE9TVCkKKwkJCXNlZW5faG9zdF9icmlkZ2UrKzsKKwkJZm9yIChtbj1sbi0+bmV4dDsgbW4gIT0gJmItPmRldmljZXM7IG1uPW1uLT5uZXh0KSB7CisJCQllID0gcGNpX2Rldl9iKG1uKTsKKwkJCWlmIChlLT5kZXZmbiAhPSBkLT5kZXZmbiArIG1pcnJvciB8fAorCQkJICAgIGUtPnZlbmRvciAhPSBkLT52ZW5kb3IgfHwKKwkJCSAgICBlLT5kZXZpY2UgIT0gZC0+ZGV2aWNlIHx8CisJCQkgICAgZS0+Y2xhc3MgIT0gZC0+Y2xhc3MpCisJCQkJY29udGludWU7CisJCQlmb3IoaT0wOyBpPFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspCisJCQkJaWYgKGUtPnJlc291cmNlW2ldLnN0YXJ0ICE9IGQtPnJlc291cmNlW2ldLnN0YXJ0IHx8CisJCQkJICAgIGUtPnJlc291cmNlW2ldLmVuZCAhPSBkLT5yZXNvdXJjZVtpXS5lbmQgfHwKKwkJCQkgICAgZS0+cmVzb3VyY2VbaV0uZmxhZ3MgIT0gZC0+cmVzb3VyY2VbaV0uZmxhZ3MpCisJCQkJCWNvbnRpbnVlOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG1uID09ICZiLT5kZXZpY2VzKQorCQkJcmV0dXJuOworCX0KKwlpZiAoIXNlZW5faG9zdF9icmlkZ2UpCisJCXJldHVybjsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IElnbm9yaW5nIGdob3N0IGRldmljZXMgb24gYnVzICUwMnhcbiIsIGItPm51bWJlcik7CisKKwlsbiA9ICZiLT5kZXZpY2VzOworCXdoaWxlIChsbi0+bmV4dCAhPSAmYi0+ZGV2aWNlcykgeworCQlkID0gcGNpX2Rldl9iKGxuLT5uZXh0KTsKKwkJaWYgKGQtPmRldmZuID49IG1pcnJvcikgeworCQkJbGlzdF9kZWwoJmQtPmdsb2JhbF9saXN0KTsKKwkJCWxpc3RfZGVsKCZkLT5idXNfbGlzdCk7CisJCQlrZnJlZShkKTsKKwkJfSBlbHNlCisJCQlsbiA9IGxuLT5uZXh0OworCX0KK30KKworLyoKKyAqICBDYWxsZWQgYWZ0ZXIgZWFjaCBidXMgaXMgcHJvYmVkLCBidXQgYmVmb3JlIGl0cyBjaGlsZHJlbgorICogIGFyZSBleGFtaW5lZC4KKyAqLworCit2b2lkIF9fZGV2aW5pdCAgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmIpCit7CisJcGNpYmlvc19maXh1cF9naG9zdHMoYik7CisJcGNpX3JlYWRfYnJpZGdlX2Jhc2VzKGIpOworfQorCisKK3N0cnVjdCBwY2lfYnVzICogX19kZXZpbml0IHBjaWJpb3Nfc2Nhbl9yb290KGludCBidXNudW0pCit7CisJc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CisKKwl3aGlsZSAoKGJ1cyA9IHBjaV9maW5kX25leHRfYnVzKGJ1cykpICE9IE5VTEwpIHsKKwkJaWYgKGJ1cy0+bnVtYmVyID09IGJ1c251bSkgeworCQkJLyogQWxyZWFkeSBzY2FubmVkICovCisJCQlyZXR1cm4gYnVzOworCQl9CisJfQorCisJcHJpbnRrKCJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIChidXMgJTAyeClcbiIsIGJ1c251bSk7CisKKwlyZXR1cm4gcGNpX3NjYW5fYnVzKGJ1c251bSwgJnBjaV9yb290X29wcywgTlVMTCk7Cit9CisKK2V4dGVybiB1OCBwY2lfY2FjaGVfbGluZV9zaXplOworCitzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmYm9vdF9jcHVfZGF0YTsKKworCWlmICghcmF3X3BjaV9vcHMpIHsKKwkJcHJpbnRrKCJQQ0k6IFN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFBDSVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQXNzdW1lIFBDSSBjYWNoZWxpbmUgc2l6ZSBvZiAzMiBieXRlcyBmb3IgYWxsIHg4NnMgZXhjZXB0IEs3L0s4CisJICogYW5kIFA0LiBJdCdzIGFsc28gZ29vZCBmb3IgMzg2LzQ4NnMgKHdoaWNoIGFjdHVhbGx5IGhhdmUgMTYpCisJICogYXMgcXVpdGUgYSBmZXcgUENJIGRldmljZXMgZG8gbm90IHN1cHBvcnQgc21hbGxlciB2YWx1ZXMuCisJICovCisJcGNpX2NhY2hlX2xpbmVfc2l6ZSA9IDMyID4+IDI7CisJaWYgKGMtPng4NiA+PSA2ICYmIGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpCisJCXBjaV9jYWNoZV9saW5lX3NpemUgPSA2NCA+PiAyOwkvKiBLNyAmIEs4ICovCisJZWxzZSBpZiAoYy0+eDg2ID4gNiAmJiBjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpCisJCXBjaV9jYWNoZV9saW5lX3NpemUgPSAxMjggPj4gMjsJLyogUDQgKi8KKworCXBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KCk7CisKKyNpZmRlZiBDT05GSUdfUENJX0JJT1MKKwlpZiAoKHBjaV9wcm9iZSAmIFBDSV9CSU9TX1NPUlQpICYmICEocGNpX3Byb2JlICYgUENJX05PX1NPUlQpKQorCQlwY2liaW9zX3NvcnQoKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwocGNpYmlvc19pbml0KTsKKworY2hhciAqIF9fZGV2aW5pdCAgcGNpYmlvc19zZXR1cChjaGFyICpzdHIpCit7CisJaWYgKCFzdHJjbXAoc3RyLCAib2ZmIikpIHsKKwkJcGNpX3Byb2JlID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorI2lmZGVmIENPTkZJR19QQ0lfQklPUworCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYmlvcyIpKSB7CisJCXBjaV9wcm9iZSA9IFBDSV9QUk9CRV9CSU9TOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibm9iaW9zIikpIHsKKwkJcGNpX3Byb2JlICY9IH5QQ0lfUFJPQkVfQklPUzsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm5vc29ydCIpKSB7CisJCXBjaV9wcm9iZSB8PSBQQ0lfTk9fU09SVDsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgImJpb3NpcnEiKSkgeworCQlwY2lfcHJvYmUgfD0gUENJX0JJT1NfSVJRX1NDQU47CisJCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0lfRElSRUNUCisJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJjb25mMSIpKSB7CisJCXBjaV9wcm9iZSA9IFBDSV9QUk9CRV9DT05GMSB8IFBDSV9OT19DSEVDS1M7CisJCXJldHVybiBOVUxMOworCX0KKwllbHNlIGlmICghc3RyY21wKHN0ciwgImNvbmYyIikpIHsKKwkJcGNpX3Byb2JlID0gUENJX1BST0JFX0NPTkYyIHwgUENJX05PX0NIRUNLUzsKKwkJcmV0dXJuIE5VTEw7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSV9NTUNPTkZJRworCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibm9tbWNvbmYiKSkgeworCQlwY2lfcHJvYmUgJj0gflBDSV9QUk9CRV9NTUNPTkY7CisJCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgorCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibm9hY3BpIikpIHsKKwkJYWNwaV9ub2lycV9zZXQoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorI2lmbmRlZiBDT05GSUdfWDg2X1ZJU1dTCisJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJ1c2VwaXJxbWFzayIpKSB7CisJCXBjaV9wcm9iZSB8PSBQQ0lfVVNFX1BJUlFfTUFTSzsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJpcnFtYXNrPSIsIDgpKSB7CisJCXBjaWJpb3NfaXJxX21hc2sgPSBzaW1wbGVfc3RydG9sKHN0cis4LCBOVUxMLCAwKTsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJsYXN0YnVzPSIsIDgpKSB7CisJCXBjaWJpb3NfbGFzdF9idXMgPSBzaW1wbGVfc3RydG9sKHN0cis4LCBOVUxMLCAwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorI2VuZGlmCisJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJyb20iKSkgeworCQlwY2lfcHJvYmUgfD0gUENJX0FTU0lHTl9ST01TOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYXNzaWduLWJ1c3NlcyIpKSB7CisJCXBjaV9wcm9iZSB8PSBQQ0lfQVNTSUdOX0FMTF9CVVNTRVM7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJyb3V0ZWlycSIpKSB7CisJCXBjaV9yb3V0ZWlycSA9IDE7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gc3RyOworfQorCit1bnNpZ25lZCBpbnQgcGNpYmlvc19hc3NpZ25fYWxsX2J1c3Nlcyh2b2lkKQoreworCXJldHVybiAocGNpX3Byb2JlICYgUENJX0FTU0lHTl9BTExfQlVTU0VTKSA/IDEgOiAwOworfQorCitpbnQgcGNpYmlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHBjaWJpb3NfZW5hYmxlX3Jlc291cmNlcyhkZXYsIG1hc2spKSA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gcGNpYmlvc19lbmFibGVfaXJxKGRldik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2RpcmVjdC5jIGIvYXJjaC9pMzg2L3BjaS9kaXJlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGI3ZTliCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3BjaS9kaXJlY3QuYwpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIGRpcmVjdC5jIC0gTG93LWxldmVsIGRpcmVjdCBQQ0kgY29uZmlnIHNwYWNlIGFjY2VzcworICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSAicGNpLmgiCisKKy8qCisgKiBGdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB3aXRoIHR5cGUgMSBhY2Nlc3NlcworICovCisKKyNkZWZpbmUgUENJX0NPTkYxX0FERFJFU1MoYnVzLCBkZXZmbiwgcmVnKSBcCisJKDB4ODAwMDAwMDAgfCAoYnVzIDw8IDE2KSB8IChkZXZmbiA8PCA4KSB8IChyZWcgJiB+MykpCisKK3N0YXRpYyBpbnQgcGNpX2NvbmYxX3JlYWQodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKKwkJCSAgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuLCB1MzIgKnZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXZhbHVlIHx8IChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDI1NSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJb3V0bChQQ0lfQ09ORjFfQUREUkVTUyhidXMsIGRldmZuLCByZWcpLCAweENGOCk7CisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKnZhbHVlID0gaW5iKDB4Q0ZDICsgKHJlZyAmIDMpKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqdmFsdWUgPSBpbncoMHhDRkMgKyAocmVnICYgMikpOworCQlicmVhazsKKwljYXNlIDQ6CisJCSp2YWx1ZSA9IGlubCgweENGQyk7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpX2NvbmYxX3dyaXRlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCisJCQkgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDI1NSkpIAorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKKworCW91dGwoUENJX0NPTkYxX0FERFJFU1MoYnVzLCBkZXZmbiwgcmVnKSwgMHhDRjgpOworCisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCW91dGIoKHU4KXZhbHVlLCAweENGQyArIChyZWcgJiAzKSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb3V0dygodTE2KXZhbHVlLCAweENGQyArIChyZWcgJiAyKSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJb3V0bCgodTMyKXZhbHVlLCAweENGQyk7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKyN1bmRlZiBQQ0lfQ09ORjFfQUREUkVTUworCitzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2RpcmVjdF9jb25mMSA9IHsKKwkucmVhZCA9CQlwY2lfY29uZjFfcmVhZCwKKwkud3JpdGUgPQlwY2lfY29uZjFfd3JpdGUsCit9OworCisKKy8qCisgKiBGdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB3aXRoIHR5cGUgMiBhY2Nlc3NlcworICovCisKKyNkZWZpbmUgUENJX0NPTkYyX0FERFJFU1MoZGV2LCByZWcpCSh1MTYpKDB4QzAwMCB8IChkZXYgPDwgOCkgfCByZWcpCisKK3N0YXRpYyBpbnQgcGNpX2NvbmYyX3JlYWQodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKKwkJCSAgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuLCB1MzIgKnZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGRldiwgZm47CisKKwlpZiAoIXZhbHVlIHx8IChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDI1NSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2ID0gUENJX1NMT1QoZGV2Zm4pOworCWZuID0gUENJX0ZVTkMoZGV2Zm4pOworCisJaWYgKGRldiAmIDB4MTApIAorCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJb3V0YigodTgpKDB4RjAgfCAoZm4gPDwgMSkpLCAweENGOCk7CisJb3V0YigodTgpYnVzLCAweENGQSk7CisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKnZhbHVlID0gaW5iKFBDSV9DT05GMl9BRERSRVNTKGRldiwgcmVnKSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKnZhbHVlID0gaW53KFBDSV9DT05GMl9BRERSRVNTKGRldiwgcmVnKSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKnZhbHVlID0gaW5sKFBDSV9DT05GMl9BRERSRVNTKGRldiwgcmVnKSk7CisJCWJyZWFrOworCX0KKworCW91dGIoMCwgMHhDRjgpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lfY29uZjJfd3JpdGUodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKKwkJCSAgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdTMyIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGRldiwgZm47CisKKwlpZiAoKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gMjU1KSkgCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2ID0gUENJX1NMT1QoZGV2Zm4pOworCWZuID0gUENJX0ZVTkMoZGV2Zm4pOworCisJaWYgKGRldiAmIDB4MTApIAorCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJb3V0YigodTgpKDB4RjAgfCAoZm4gPDwgMSkpLCAweENGOCk7CisJb3V0YigodTgpYnVzLCAweENGQSk7CisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJb3V0YigodTgpdmFsdWUsIFBDSV9DT05GMl9BRERSRVNTKGRldiwgcmVnKSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb3V0dygodTE2KXZhbHVlLCBQQ0lfQ09ORjJfQUREUkVTUyhkZXYsIHJlZykpOworCQlicmVhazsKKwljYXNlIDQ6CisJCW91dGwoKHUzMil2YWx1ZSwgUENJX0NPTkYyX0FERFJFU1MoZGV2LCByZWcpKTsKKwkJYnJlYWs7CisJfQorCisJb3V0YigwLCAweENGOCk7ICAgIAorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI3VuZGVmIFBDSV9DT05GMl9BRERSRVNTCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX3Jhd19vcHMgcGNpX2RpcmVjdF9jb25mMiA9IHsKKwkucmVhZCA9CQlwY2lfY29uZjJfcmVhZCwKKwkud3JpdGUgPQlwY2lfY29uZjJfd3JpdGUsCit9OworCisKKy8qCisgKiBCZWZvcmUgd2UgZGVjaWRlIHRvIHVzZSBkaXJlY3QgaGFyZHdhcmUgYWNjZXNzIG1lY2hhbmlzbXMsIHdlIHRyeSB0byBkbyBzb21lCisgKiB0cml2aWFsIGNoZWNrcyB0byBlbnN1cmUgaXQgYXQgbGVhc3QgX3NlZW1zXyB0byBiZSB3b3JraW5nIC0tIHdlIGp1c3QgdGVzdAorICogd2hldGhlciBidXMgMDAgY29udGFpbnMgYSBob3N0IGJyaWRnZSAodGhpcyBpcyBzaW1pbGFyIHRvIGNoZWNraW5nCisgKiB0ZWNobmlxdWVzIHVzZWQgaW4gWEZyZWU4NiwgYnV0IG91cnMgc2hvdWxkIGJlIG1vcmUgcmVsaWFibGUgc2luY2Ugd2UKKyAqIGF0dGVtcHQgdG8gbWFrZSB1c2Ugb2YgZGlyZWN0IGFjY2VzcyBoaW50cyBwcm92aWRlZCBieSB0aGUgUENJIEJJT1MpLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGNsb3NlIHRvIHRyaXZpYWwsIGJ1dCBpdCBpc24ndCwgYmVjYXVzZSB0aGVyZSBhcmUgYnVnZ3kKKyAqIGNoaXBzZXRzICh5ZXMsIHlvdSBndWVzc2VkIGl0LCBieSBJbnRlbCBhbmQgQ29tcGFxKSB0aGF0IGhhdmUgbm8gY2xhc3MgSUQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBjaV9zYW5pdHlfY2hlY2soc3RydWN0IHBjaV9yYXdfb3BzICpvKQoreworCXUzMiB4ID0gMDsKKwlpbnQgZGV2Zm47CisKKwlpZiAocGNpX3Byb2JlICYgUENJX05PX0NIRUNLUykKKwkJcmV0dXJuIDE7CisKKwlmb3IgKGRldmZuID0gMDsgZGV2Zm4gPCAweDEwMDsgZGV2Zm4rKykgeworCQlpZiAoby0+cmVhZCgwLCAwLCBkZXZmbiwgUENJX0NMQVNTX0RFVklDRSwgMiwgJngpKQorCQkJY29udGludWU7CisJCWlmICh4ID09IFBDSV9DTEFTU19CUklER0VfSE9TVCB8fCB4ID09IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSkKKwkJCXJldHVybiAxOworCisJCWlmIChvLT5yZWFkKDAsIDAsIGRldmZuLCBQQ0lfVkVORE9SX0lELCAyLCAmeCkpCisJCQljb250aW51ZTsKKwkJaWYgKHggPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCB8fCB4ID09IFBDSV9WRU5ET1JfSURfQ09NUEFRKQorCQkJcmV0dXJuIDE7CisJfQorCisJREJHKCJQQ0k6IFNhbml0eSBjaGVjayBmYWlsZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwY2lfY2hlY2tfdHlwZTEodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB0bXA7CisJaW50IHdvcmtzID0gMDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCW91dGIoMHgwMSwgMHhDRkIpOworCXRtcCA9IGlubCgweENGOCk7CisJb3V0bCgweDgwMDAwMDAwLCAweENGOCk7CisJaWYgKGlubCgweENGOCkgPT0gMHg4MDAwMDAwMCAmJiBwY2lfc2FuaXR5X2NoZWNrKCZwY2lfZGlyZWN0X2NvbmYxKSkgeworCQl3b3JrcyA9IDE7CisJfQorCW91dGwodG1wLCAweENGOCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHdvcmtzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwY2lfY2hlY2tfdHlwZTIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB3b3JrcyA9IDA7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlvdXRiKDB4MDAsIDB4Q0ZCKTsKKwlvdXRiKDB4MDAsIDB4Q0Y4KTsKKwlvdXRiKDB4MDAsIDB4Q0ZBKTsKKwlpZiAoaW5iKDB4Q0Y4KSA9PSAweDAwICYmIGluYigweENGQSkgPT0gMHgwMCAmJgorCSAgICBwY2lfc2FuaXR5X2NoZWNrKCZwY2lfZGlyZWN0X2NvbmYyKSkgeworCQl3b3JrcyA9IDE7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHdvcmtzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwY2lfZGlyZWN0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ2lvbiwgKnJlZ2lvbjI7CisKKwlpZiAoKHBjaV9wcm9iZSAmIFBDSV9QUk9CRV9DT05GMSkgPT0gMCkKKwkJZ290byB0eXBlMjsKKwlyZWdpb24gPSByZXF1ZXN0X3JlZ2lvbigweENGOCwgOCwgIlBDSSBjb25mMSIpOworCWlmICghcmVnaW9uKQorCQlnb3RvIHR5cGUyOworCisJaWYgKHBjaV9jaGVja190eXBlMSgpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlBDSTogVXNpbmcgY29uZmlndXJhdGlvbiB0eXBlIDFcbiIpOworCQlyYXdfcGNpX29wcyA9ICZwY2lfZGlyZWN0X2NvbmYxOworCQlyZXR1cm4gMDsKKwl9CisJcmVsZWFzZV9yZXNvdXJjZShyZWdpb24pOworCisgdHlwZTI6CisJaWYgKChwY2lfcHJvYmUgJiBQQ0lfUFJPQkVfQ09ORjIpID09IDApCisJCWdvdG8gb3V0OworCXJlZ2lvbiA9IHJlcXVlc3RfcmVnaW9uKDB4Q0Y4LCA0LCAiUENJIGNvbmYyIik7CisJaWYgKCFyZWdpb24pCisJCWdvdG8gb3V0OworCXJlZ2lvbjIgPSByZXF1ZXN0X3JlZ2lvbigweEMwMDAsIDB4MTAwMCwgIlBDSSBjb25mMiIpOworCWlmICghcmVnaW9uMikKKwkJZ290byBmYWlsMjsKKworCWlmIChwY2lfY2hlY2tfdHlwZTIoKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFVzaW5nIGNvbmZpZ3VyYXRpb24gdHlwZSAyXG4iKTsKKwkJcmF3X3BjaV9vcHMgPSAmcGNpX2RpcmVjdF9jb25mMjsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVsZWFzZV9yZXNvdXJjZShyZWdpb24yKTsKKyBmYWlsMjoKKwlyZWxlYXNlX3Jlc291cmNlKHJlZ2lvbik7CisKKyBvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwocGNpX2RpcmVjdF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvZml4dXAuYyBiL2FyY2gvaTM4Ni9wY2kvZml4dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTUyYzVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3BjaS9maXh1cC5jCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogRXhjZXB0aW9ucyBmb3Igc3BlY2lmaWMgZGV2aWNlcy4gVXN1YWxseSB3b3JrLWFyb3VuZHMgZm9yIGZhdGFsIGRlc2lnbiBmbGF3cy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgInBjaS5oIgorCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfZml4dXBfaTQ1MG54KHN0cnVjdCBwY2lfZGV2ICpkKQoreworCS8qCisJICogaTQ1ME5YIC0tIEZpbmQgYW5kIHNjYW4gYWxsIHNlY29uZGFyeSBidXNlcyBvbiBhbGwgUFhCJ3MuCisJICovCisJaW50IHB4YiwgcmVnOworCXU4IGJ1c25vLCBzdWJhLCBzdWJiOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBTZWFyY2hpbmcgZm9yIGk0NTBOWCBob3N0IGJyaWRnZXMgb24gJXNcbiIsIHBjaV9uYW1lKGQpKTsKKwlyZWcgPSAweGQwOworCWZvcihweGI9MDsgcHhiPDI7IHB4YisrKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIHJlZysrLCAmYnVzbm8pOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkLCByZWcrKywgJnN1YmEpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkLCByZWcrKywgJnN1YmIpOworCQlEQkcoImk0NTBOWCBQWEIgJWQ6ICUwMngvJTAyeC8lMDJ4XG4iLCBweGIsIGJ1c25vLCBzdWJhLCBzdWJiKTsKKwkJaWYgKGJ1c25vKQorCQkJcGNpX3NjYW5fYnVzKGJ1c25vLCAmcGNpX3Jvb3Rfb3BzLCBOVUxMKTsJLyogQnVzIEEgKi8KKwkJaWYgKHN1YmEgPCBzdWJiKQorCQkJcGNpX3NjYW5fYnVzKHN1YmErMSwgJnBjaV9yb290X29wcywgTlVMTCk7CS8qIEJ1cyBCICovCisJfQorCXBjaWJpb3NfbGFzdF9idXMgPSAtMTsKK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDUxTlgsIHBjaV9maXh1cF9pNDUwbngpOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX2ZpeHVwX2k0NTBneChzdHJ1Y3QgcGNpX2RldiAqZCkKK3sKKwkvKgorCSAqIGk0NTBHWCBhbmQgaTQ1MEtYIC0tIEZpbmQgYW5kIHNjYW4gYWxsIHNlY29uZGFyeSBidXNlcy4KKwkgKiAoY2FsbGVkIHNlcGFyYXRlbHkgZm9yIGVhY2ggUENJIGJyaWRnZSBmb3VuZCkKKwkgKi8KKwl1OCBidXNubzsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkLCAweDRhLCAmYnVzbm8pOworCXByaW50ayhLRVJOX0lORk8gIlBDSTogaTQ0MEtYL0dYIGhvc3QgYnJpZGdlICVzOiBzZWNvbmRhcnkgYnVzICUwMnhcbiIsIHBjaV9uYW1lKGQpLCBidXNubyk7CisJcGNpX3NjYW5fYnVzKGJ1c25vLCAmcGNpX3Jvb3Rfb3BzLCBOVUxMKTsKKwlwY2liaW9zX2xhc3RfYnVzID0gLTE7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ1NEdYLCBwY2lfZml4dXBfaTQ1MGd4KTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0ICBwY2lfZml4dXBfdW1jX2lkZShzdHJ1Y3QgcGNpX2RldiAqZCkKK3sKKwkvKgorCSAqIFVNODg4NkJGIElERSBjb250cm9sbGVyIHNldHMgcmVnaW9uIHR5cGUgYml0cyBpbmNvcnJlY3RseSwKKwkgKiB0aGVyZWZvcmUgdGhleSBsb29rIGxpa2UgbWVtb3J5IGRlc3BpdGUgb2YgdGhlbSBiZWluZyBJL08uCisJICovCisJaW50IGk7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IEZpeGluZyBiYXNlIGFkZHJlc3MgZmxhZ3MgZm9yIGRldmljZSAlc1xuIiwgcGNpX25hbWUoZCkpOworCWZvcihpPTA7IGk8NDsgaSsrKQorCQlkLT5yZXNvdXJjZVtpXS5mbGFncyB8PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfVU1DLCBQQ0lfREVWSUNFX0lEX1VNQ19VTTg4ODZCRiwgcGNpX2ZpeHVwX3VtY19pZGUpOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgIHBjaV9maXh1cF9uY3I1M2M4MTAoc3RydWN0IHBjaV9kZXYgKmQpCit7CisJLyoKKwkgKiBOQ1IgNTNDODEwIHJldHVybnMgY2xhc3MgY29kZSAwIChhdCBsZWFzdCBvbiBzb21lIHN5c3RlbXMpLgorCSAqIEZpeCBjbGFzcyB0byBiZSBQQ0lfQ0xBU1NfU1RPUkFHRV9TQ1NJCisJICovCisJaWYgKCFkLT5jbGFzcykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IGZpeGluZyBOQ1IgNTNDODEwIGNsYXNzIGNvZGUgZm9yICVzXG4iLCBwY2lfbmFtZShkKSk7CisJCWQtPmNsYXNzID0gUENJX0NMQVNTX1NUT1JBR0VfU0NTSSA8PCA4OworCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX05DUiwgUENJX0RFVklDRV9JRF9OQ1JfNTNDODEwLCBwY2lfZml4dXBfbmNyNTNjODEwKTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF9pZGVfYmFzZXMoc3RydWN0IHBjaV9kZXYgKmQpCit7CisJaW50IGk7CisKKwkvKgorCSAqIFBDSSBJREUgY29udHJvbGxlcnMgdXNlIG5vbi1zdGFuZGFyZCBJL08gcG9ydCBkZWNvZGluZywgcmVzcGVjdCBpdC4KKwkgKi8KKwlpZiAoKGQtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19TVE9SQUdFX0lERSkKKwkJcmV0dXJuOworCURCRygiUENJOiBJREUgYmFzZSBhZGRyZXNzIGZpeHVwIGZvciAlc1xuIiwgcGNpX25hbWUoZCkpOworCWZvcihpPTA7IGk8NDsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkLT5yZXNvdXJjZVtpXTsKKwkJaWYgKChyLT5zdGFydCAmIH4weDgwKSA9PSAweDM3NCkgeworCQkJci0+c3RhcnQgfD0gMjsKKwkJCXItPmVuZCA9IHItPnN0YXJ0OworCQl9CisJfQorfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9maXh1cF9pZGVfYmFzZXMpOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgIHBjaV9maXh1cF9pZGVfdHJhc2goc3RydWN0IHBjaV9kZXYgKmQpCit7CisJaW50IGk7CisKKwkvKgorCSAqIFJ1bnMgdGhlIGZpeHVwIG9ubHkgZm9yIHRoZSBmaXJzdCBJREUgY29udHJvbGxlcgorCSAqIChTaGFpIEZ1bHRoZWltIC0gc2hhaUBmdGNvbi5jb20pCisJICovCisJc3RhdGljIGludCBjYWxsZWQgPSAwOworCWlmIChjYWxsZWQpCisJCXJldHVybjsKKwljYWxsZWQgPSAxOworCisJLyoKKwkgKiBUaGVyZSBleGlzdCBQQ0kgSURFIGNvbnRyb2xsZXJzIHdoaWNoIGhhdmUgdXR0ZXIgZ2FyYmFnZQorCSAqIGluIGZpcnN0IGZvdXIgYmFzZSByZWdpc3RlcnMuIElnbm9yZSB0aGF0LgorCSAqLworCURCRygiUENJOiBJREUgYmFzZSBhZGRyZXNzIHRyYXNoIGNsZWFyZWQgZm9yICVzXG4iLCBwY2lfbmFtZShkKSk7CisJZm9yKGk9MDsgaTw0OyBpKyspCisJCWQtPnJlc291cmNlW2ldLnN0YXJ0ID0gZC0+cmVzb3VyY2VbaV0uZW5kID0gZC0+cmVzb3VyY2VbaV0uZmxhZ3MgPSAwOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNTUxMywgcGNpX2ZpeHVwX2lkZV90cmFzaCk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEwLCBwY2lfZml4dXBfaWRlX3RyYXNoKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTEsIHBjaV9maXh1cF9pZGVfdHJhc2gpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl85LCBwY2lfZml4dXBfaWRlX3RyYXNoKTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0ICBwY2lfZml4dXBfbGF0ZW5jeShzdHJ1Y3QgcGNpX2RldiAqZCkKK3sKKwkvKgorCSAqICBTaVMgNTU5NyBhbmQgNTU5OCBjaGlwc2V0cyByZXF1aXJlIGxhdGVuY3kgdGltZXIgc2V0IHRvCisJICogIGF0IG1vc3QgMzIgdG8gYXZvaWQgbG9ja3Vwcy4KKwkgKi8KKwlEQkcoIlBDSTogU2V0dGluZyBtYXggbGF0ZW5jeSB0byAzMlxuIik7CisJcGNpYmlvc19tYXhfbGF0ZW5jeSA9IDMyOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNTU5NywgcGNpX2ZpeHVwX2xhdGVuY3kpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNTU5OCwgcGNpX2ZpeHVwX2xhdGVuY3kpOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX2ZpeHVwX3BpaXg0X2FjcGkoc3RydWN0IHBjaV9kZXYgKmQpCit7CisJLyoKKwkgKiBQSUlYNCBBQ1BJIGRldmljZTogaGFyZHdpcmVkIElSUTkKKwkgKi8KKwlkLT5pcnEgPSA5OworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLCBwY2lfZml4dXBfcGlpeDRfYWNwaSk7CisKKy8qCisgKiBBZGRyZXNzZXMgaXNzdWVzIHdpdGggcHJvYmxlbXMgaW4gdGhlIG1lbW9yeSB3cml0ZSBxdWV1ZSB0aW1lciBpbgorICogY2VydGFpbiBWSUEgTm9ydGhicmlkZ2VzLiAgVGhpcyBidWdmaXggaXMgcGVyIFZJQSdzIHNwZWNpZmljYXRpb25zLAorICogZXhjZXB0IGZvciB0aGUgS0wxMzMvS00xMzM6IGNsZWFyaW5nIGJpdCA1IG9uIHRob3NlIE5vcnRoYnJpZGdlcyBzZWVtcworICogdG8gdHJpZ2dlciBhIGJ1ZyBpbiBpdHMgaW50ZWdyYXRlZCBQcm9TYXZhZ2UgdmlkZW8gY2FyZCwgd2hpY2gKKyAqIGNhdXNlcyBzY3JlZW4gY29ycnVwdGlvbi4gIFdlIG9ubHkgY2xlYXIgYml0cyA2IGFuZCA3IGZvciB0aGF0IGNoaXBzZXQsCisgKiB1bnRpbCBWSUEgY2FuIHByb3ZpZGUgdXMgd2l0aCBkZWZpbml0aXZlIGluZm9ybWF0aW9uIG9uIHdoeSBzY3JlZW4KKyAqIGNvcnJ1cHRpb24gb2NjdXJzLCBhbmQgd2hhdCBleGFjdGx5IHRob3NlIGJpdHMgZG8uCisgKgorICogVklBIDgzNjMsODYyMiw4MzYxIE5vcnRoYnJpZGdlczoKKyAqICAtIGJpdHMgIDUsIDYsIDcgYXQgb2Zmc2V0IDB4NTUgbmVlZCB0byBiZSB0dXJuZWQgb2ZmCisgKiBWSUEgODM2NyAoS1QyNjZ4KSBOb3J0aGJyaWRnZXM6CisgKiAgLSBiaXRzICA1LCA2LCA3IGF0IG9mZnNldCAweDk1IG5lZWQgdG8gYmUgdHVybmVkIG9mZgorICogVklBIDgzNjMgcmV2IDB4ODEvMHg4NCAoS0wxMzMvS00xMzMpIE5vcnRoYnJpZGdlczoKKyAqICAtIGJpdHMgICAgIDYsIDcgYXQgb2Zmc2V0IDB4NTUgbmVlZCB0byBiZSB0dXJuZWQgb2ZmCisgKi8KKworI2RlZmluZSBWSUFfODM2M19LTDEzM19SRVZJU0lPTl9JRCAweDgxCisjZGVmaW5lIFZJQV84MzYzX0tNMTMzX1JFVklTSU9OX0lEIDB4ODQKKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF92aWFfbm9ydGhicmlkZ2VfYnVnKHN0cnVjdCBwY2lfZGV2ICpkKQoreworCXU4IHY7CisJdTggcmV2aXNpb247CisJaW50IHdoZXJlID0gMHg1NTsKKwlpbnQgbWFzayA9IDB4MWY7IC8qIGNsZWFyIGJpdHMgNSwgNiwgNyBieSBkZWZhdWx0ICovCisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkLCBQQ0lfUkVWSVNJT05fSUQsICZyZXZpc2lvbik7CisKKwlpZiAoZC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVklBXzgzNjdfMCkgeworCQkvKiBmaXggcGNpIGJ1cyBsYXRlbmN5IGlzc3VlcyByZXN1bHRlZCBieSBOQiBiaW9zIGVycm9yCisJCSAgIGl0IGFwcGVhcnMgb24gYnVnIGZyZWVeV3JlZHVjZWQga3QyNjZ4J3MgYmlvcyBmb3JjZXMKKwkJICAgTkIgbGF0ZW5jeSB0byB6ZXJvICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkLCBQQ0lfTEFURU5DWV9USU1FUiwgMCk7CisKKwkJd2hlcmUgPSAweDk1OyAvKiB0aGUgbWVtb3J5IHdyaXRlIHF1ZXVlIHRpbWVyIHJlZ2lzdGVyIGlzIAorCQkJCWRpZmZlcmVudCBmb3IgdGhlIEtUMjY2eCdzOiAweDk1IG5vdCAweDU1ICovCisJfSBlbHNlIGlmIChkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9WSUFfODM2M18wICYmCisJCQkocmV2aXNpb24gPT0gVklBXzgzNjNfS0wxMzNfUkVWSVNJT05fSUQgfHwgCisJCQlyZXZpc2lvbiA9PSBWSUFfODM2M19LTTEzM19SRVZJU0lPTl9JRCkpIHsKKwkJCW1hc2sgPSAweDNmOyAvKiBjbGVhciBvbmx5IGJpdHMgNiBhbmQgNzsgY2xlYXJpbmcgYml0IDUKKwkJCQkJY2F1c2VzIHNjcmVlbiBjb3JydXB0aW9uIG9uIHRoZSBLTDEzMy9LTTEzMyAqLworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIHdoZXJlLCAmdik7CisJaWYgKHYgJiB+bWFzaykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJEaXNhYmxpbmcgVklBIG1lbW9yeSB3cml0ZSBxdWV1ZSAoUENJIElEICUwNHgsIHJldiAlMDJ4KTogWyUwMnhdICUwMnggJiAlMDJ4IC0+ICUwMnhcbiIsIFwKKwkJCWQtPmRldmljZSwgcmV2aXNpb24sIHdoZXJlLCB2LCBtYXNrLCB2ICYgbWFzayk7CisJCXYgJj0gbWFzazsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGQsIHdoZXJlLCB2KTsKKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgzNjNfMCwgcGNpX2ZpeHVwX3ZpYV9ub3J0aGJyaWRnZV9idWcpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84NjIyLCBwY2lfZml4dXBfdmlhX25vcnRoYnJpZGdlX2J1Zyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgzNjEsIHBjaV9maXh1cF92aWFfbm9ydGhicmlkZ2VfYnVnKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODM2N18wLCBwY2lfZml4dXBfdmlhX25vcnRoYnJpZGdlX2J1Zyk7CisKKy8qCisgKiBGb3Igc29tZSByZWFzb25zIEludGVsIGRlY2lkZWQgdGhhdCBjZXJ0YWluIHBhcnRzIG9mIHRoZWlyCisgKiA4MTUsIDg0NSBhbmQgc29tZSBvdGhlciBjaGlwc2V0cyBtdXN0IGxvb2sgbGlrZSBQQ0ktdG8tUENJIGJyaWRnZXMKKyAqIHdoaWxlIHRoZXkgYXJlIG9idmlvdXNseSBub3QuIFRoZSA4MjgwMSBmYW1pbHkgKEFBLCBBQiwgQkFNL0NBTSwKKyAqIEJBL0NBL0RCIGFuZCBFKSBQQ0kgYnJpZGdlcyBhcmUgYWN0dWFsbHkgSFVCLXRvLVBDSSBvbmVzLCBhY2NvcmRpbmcKKyAqIHRvIEludGVsIHRlcm1pbm9sb2d5LiBUaGVzZSBkZXZpY2VzIGRvIGZvcndhcmQgYWxsIGFkZHJlc3NlcyBmcm9tCisgKiBzeXN0ZW0gdG8gUENJIGJ1cyBubyBtYXR0ZXIgd2hhdCBhcmUgdGhlaXIgd2luZG93IHNldHRpbmdzLCBzbyB0aGV5IGFyZQorICogInRyYW5zcGFyZW50IiAob3Igc3VidHJhY3RpdmUgZGVjb2RpbmcpIGZyb20gcHJvZ3JhbW1lcnMgcG9pbnQgb2Ygdmlldy4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF90cmFuc3BhcmVudF9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAoKGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9QQ0kgJiYKKwkgICAgKGRldi0+ZGV2aWNlICYgMHhmZjAwKSA9PSAweDI0MDApCisJCWRldi0+dHJhbnNwYXJlbnQgPSAxOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9BTllfSUQsIHBjaV9maXh1cF90cmFuc3BhcmVudF9icmlkZ2UpOworCisvKgorICogRml4dXAgZm9yIEMxIEhhbHQgRGlzY29ubmVjdCBwcm9ibGVtIG9uIG5Gb3JjZTIgc3lzdGVtcy4KKyAqCisgKiBGcm9tIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5ICJBbGxlbiBNYXJ0aW4iIDxBTWFydGluQG52aWRpYS5jb20+OgorICoKKyAqIEEgaGFuZyBpcyBjYXVzZWQgd2hlbiB0aGUgQ1BVIGdlbmVyYXRlcyBhIHZlcnkgZmFzdCBDT05ORUNUL0hBTFQgY3ljbGUKKyAqIHNlcXVlbmNlLiAgV29ya2Fyb3VuZCBpcyB0byBzZXQgdGhlIFNZU1RFTV9JRExFX1RJTUVPVVQgdG8gODAgbnMuCisgKiBUaGlzIGFsbG93cyB0aGUgc3RhdGUtbWFjaGluZSBhbmQgdGltZXIgdG8gcmV0dXJuIHRvIGEgcHJvcGVyIHN0YXRlIHdpdGhpbgorICogODAgbnMgb2YgdGhlIENPTk5FQ1QgYW5kIHByb2JlIGFwcGVhcmluZyB0b2dldGhlci4gIFNpbmNlIHRoZSBDUFUgd2lsbCBub3QKKyAqIGlzc3VlIGFub3RoZXIgSEFMVCB3aXRoaW4gODAgbnMgb2YgdGhlIGluaXRpYWwgSEFMVCwgdGhlIGZhaWx1cmUgY29uZGl0aW9uCisgKiBpcyBhdm9pZGVkLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGNpX2ZpeHVwX25mb3JjZTIoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MzIgdmFsOworCisJLyoKKwkgKiBDaGlwICBPbGQgdmFsdWUgICBOZXcgdmFsdWUKKwkgKiBDMTcgICAweDFGMEZGRjAxICAweDFGMDFGRjAxCisJICogQzE4RCAgMHg5RjBGRkYwMSAgMHg5RjAxRkYwMQorCSAqCisJICogTm9ydGhicmlkZ2UgY2hpcCB2ZXJzaW9uIG1heSBiZSBkZXRlcm1pbmVkIGJ5CisJICogcmVhZGluZyB0aGUgUENJIHJldmlzaW9uIElEICgweEMxIG9yIGdyZWF0ZXIgaXMgQzE4RCkuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg2YywgJnZhbCk7CisKKwkvKgorCSAqIEFwcGx5IGZpeHVwIGlmIG5lZWRlZCwgYnV0IGRvbid0IHRvdWNoIGRpc2Nvbm5lY3Qgc3RhdGUKKwkgKi8KKwlpZiAoKHZhbCAmIDB4MDBGRjAwMDApICE9IDB4MDAwMTAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBuRm9yY2UyIEMxIEhhbHQgRGlzY29ubmVjdCBmaXh1cFxuIik7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDZjLCAodmFsICYgMHhGRjAwRkZGRikgfCAweDAwMDEwMDAwKTsKKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTIsIHBjaV9maXh1cF9uZm9yY2UyKTsKKworLyogTWF4IFBDSSBFeHByZXNzIHJvb3QgcG9ydHMgKi8KKyNkZWZpbmUgTUFYX1BDSUVST09UCTYKK3N0YXRpYyBpbnQgcXVpcmtfYXNwbV9vZmZzZXRbTUFYX1BDSUVST09UIDw8IDNdOworCisjZGVmaW5lIEdFVF9JTkRFWChhLCBiKSAoKChhIC0gUENJX0RFVklDRV9JRF9JTlRFTF9NQ0hfUEEpIDw8IDMpICsgYikKKworc3RhdGljIGludCBxdWlya19wY2llX2FzcG1fcmVhZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsdWUpCit7CisJcmV0dXJuIHJhd19wY2lfb3BzLT5yZWFkKDAsIGJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUsIHNpemUsIHZhbHVlKTsKK30KKworLyoKKyAqIFJlcGxhY2UgdGhlIG9yaWdpbmFsIHBjaSBidXMgb3BzIGZvciB3cml0ZSB3aXRoIGEgbmV3IG9uZSB0aGF0IHdpbGwgZmlsdGVyCisgKiB0aGUgcmVxdWVzdCB0byBpbnN1cmUgQVNQTSBjYW5ub3QgYmUgZW5hYmxlZC4KKyAqLworc3RhdGljIGludCBxdWlya19wY2llX2FzcG1fd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsdWUpCit7CisJdTggb2Zmc2V0OworCisJb2Zmc2V0ID0gcXVpcmtfYXNwbV9vZmZzZXRbR0VUX0lOREVYKGJ1cy0+c2VsZi0+ZGV2aWNlLCBkZXZmbildOworCisJaWYgKChvZmZzZXQpICYmICh3aGVyZSA9PSBvZmZzZXQpKQorCQl2YWx1ZSA9IHZhbHVlICYgMHhmZmZmZmZmYzsKKwkKKwlyZXR1cm4gcmF3X3BjaV9vcHMtPndyaXRlKDAsIGJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUsIHNpemUsIHZhbHVlKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIHF1aXJrX3BjaWVfYXNwbV9vcHMgPSB7CisJLnJlYWQgPSBxdWlya19wY2llX2FzcG1fcmVhZCwKKwkud3JpdGUgPSBxdWlya19wY2llX2FzcG1fd3JpdGUsCit9OworCisvKgorICogUHJldmVudHMgUENJIEV4cHJlc3MgQVNQTSAoQWN0aXZlIFN0YXRlIFBvd2VyIE1hbmFnZW1lbnQpIGJlaW5nIGVuYWJsZWQuCisgKgorICogU2F2ZSB0aGUgcmVnaXN0ZXIgb2Zmc2V0LCB3aGVyZSB0aGUgQVNQTSBjb250cm9sIGJpdHMgYXJlIGxvY2F0ZWQsCisgKiBmb3IgZWFjaCBQQ0kgRXhwcmVzcyBkZXZpY2UgdGhhdCBpcyBpbiB0aGUgZGV2aWNlIGxpc3Qgb2YKKyAqIHRoZSByb290IHBvcnQgaW4gYW4gYXJyYXkgZm9yIGZhc3QgaW5kZXhpbmcuIFJlcGxhY2UgdGhlIGJ1cyBvcHMKKyAqIHdpdGggdGhlIG1vZGlmaWVkIG9uZS4KKyAqLworc3RhdGljIHZvaWQgcGNpZV9yb290cG9ydF9hc3BtX3F1aXJrKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBjYXBfYmFzZSwgaTsKKwlzdHJ1Y3QgcGNpX2J1cyAgKnBidXM7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCWlmICgocGJ1cyA9IHBkZXYtPnN1Ym9yZGluYXRlKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBESUQgb2YgcGRldiBtYXRjaGVzIG9uZSBvZiB0aGUgc2l4IHJvb3QgcG9ydHMuIFRoaXMKKwkgKiBjaGVjayBpcyBuZWVkZWQgaW4gdGhlIGNhc2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlCisJICogaG90LXBsdWcgZHJpdmVyLgorCSAqLworCWlmICgocGRldi0+ZGV2aWNlIDwgUENJX0RFVklDRV9JRF9JTlRFTF9NQ0hfUEEpIHx8CisJICAgIChwZGV2LT5kZXZpY2UgPiBQQ0lfREVWSUNFX0lEX0lOVEVMX01DSF9QQzEpKQorCQlyZXR1cm47CisKKwlpZiAobGlzdF9lbXB0eSgmcGJ1cy0+ZGV2aWNlcykpIHsKKwkJLyoKKwkJICogSWYgbm8gZGV2aWNlIGlzIGF0dGFjaGVkIHRvIHRoZSByb290IHBvcnQgYXQgcG93ZXItdXAgb3IKKwkJICogYWZ0ZXIgaG90LXJlbW92ZSwgdGhlIHBidXMtPmRldmljZXMgaXMgZW1wdHkgYW5kIHRoaXMgY29kZQorCQkgKiB3aWxsIHNldCB0aGUgb2Zmc2V0cyB0byB6ZXJvIGFuZCB0aGUgYnVzIG9wcyB0byBwYXJlbnQncyBidXMKKwkJICogb3BzLCB3aGljaCBpcyB1bm1vZGlmaWVkLgorCSAJICovCisJCWZvciAoaT0gR0VUX0lOREVYKHBkZXYtPmRldmljZSwgMCk7IGkgPD0gR0VUX0lOREVYKHBkZXYtPmRldmljZSwgNyk7ICsraSkKKwkJCXF1aXJrX2FzcG1fb2Zmc2V0W2ldID0gMDsKKworCQlwYnVzLT5vcHMgPSBwYnVzLT5wYXJlbnQtPm9wczsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJZiBkZXZpY2VzIGFyZSBhdHRhY2hlZCB0byB0aGUgcm9vdCBwb3J0IGF0IHBvd2VyLXVwIG9yCisJCSAqIGFmdGVyIGhvdC1hZGQsIHRoZSBjb2RlIGxvb3BzIHRocm91Z2ggdGhlIGRldmljZSBsaXN0IG9mCisJCSAqIGVhY2ggcm9vdCBwb3J0IHRvIHNhdmUgdGhlIHJlZ2lzdGVyIG9mZnNldHMgYW5kIHJlcGxhY2UgdGhlCisJCSAqIGJ1cyBvcHMuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnBidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCQkvKiBUaGVyZSBhcmUgMCB0byA4IGRldmljZXMgYXR0YWNoZWQgdG8gdGhpcyBidXMgKi8KKwkJCWNhcF9iYXNlID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwkJCXF1aXJrX2FzcG1fb2Zmc2V0W0dFVF9JTkRFWChwZGV2LT5kZXZpY2UsIGRldi0+ZGV2Zm4pXT0gY2FwX2Jhc2UgKyAweDEwOworCQl9CisJCXBidXMtPm9wcyA9ICZxdWlya19wY2llX2FzcG1fb3BzOworCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfTUNIX1BBLAlwY2llX3Jvb3Rwb3J0X2FzcG1fcXVpcmsgKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfTUNIX1BBMSwJcGNpZV9yb290cG9ydF9hc3BtX3F1aXJrICk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX01DSF9QQiwJcGNpZV9yb290cG9ydF9hc3BtX3F1aXJrICk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX01DSF9QQjEsCXBjaWVfcm9vdHBvcnRfYXNwbV9xdWlyayApOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9NQ0hfUEMsCXBjaWVfcm9vdHBvcnRfYXNwbV9xdWlyayApOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9NQ0hfUEMxLAlwY2llX3Jvb3Rwb3J0X2FzcG1fcXVpcmsgKTsKKworLyoKKyAqIEZpeHVwIHRvIG1hcmsgYm9vdCBCSU9TIHZpZGVvIHNlbGVjdGVkIGJ5IEJJT1MgYmVmb3JlIGl0IGNoYW5nZXMKKyAqCisgKiBGcm9tIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5ICJKb24gU21pcmwiIDxqb25zbWlybEBnbWFpbC5jb20+CisgKgorICogVGhlIHN0YW5kYXJkIGJvb3QgUk9NIHNlcXVlbmNlIGZvciBhbiB4ODYgbWFjaGluZSB1c2VzIHRoZSBCSU9TCisgKiB0byBzZWxlY3QgYW4gaW5pdGlhbCB2aWRlbyBjYXJkIGZvciBib290IGRpc3BsYXkuIFRoaXMgYm9vdCB2aWRlbyAKKyAqIGNhcmQgd2lsbCBoYXZlIGl0J3MgQklPUyBjb3BpZWQgdG8gQzAwMDAgaW4gc3lzdGVtIFJBTS4gCisgKiBJT1JFU09VUkNFX1JPTV9TSEFET1cgaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlIGJvb3QgdmlkZW8KKyAqIGNhcmQgd2l0aCB0aGlzIGNvcHkuIE9uIGxhcHRvcHMgdGhpcyBjb3B5IGhhcyB0byBiZSB1c2VkIHNpbmNlCisgKiB0aGUgbWFpbiBST00gbWF5IGJlIGNvbXByZXNzZWQgb3IgY29tYmluZWQgd2l0aCBhbm90aGVyIGltYWdlLgorICogU2VlIHBjaV9tYXBfcm9tKCkgZm9yIHVzZSBvZiB0aGlzIGZsYWcuIElPUkVTT1VSQ0VfUk9NX1NIQURPVworICogaXMgbWFya2VkIGhlcmUgc2luY2UgdGhlIGJvb3QgdmlkZW8gZGV2aWNlIHdpbGwgYmUgdGhlIG9ubHkgZW5hYmxlZAorICogdmlkZW8gZGV2aWNlIGF0IHRoaXMgcG9pbnQuCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9maXh1cF92aWRlbyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlOworCXN0cnVjdCBwY2lfYnVzICpidXM7CisJdTE2IGNvbmZpZzsKKworCWlmICgocGRldi0+Y2xhc3MgPj4gOCkgIT0gUENJX0NMQVNTX0RJU1BMQVlfVkdBKQorCQlyZXR1cm47CisKKwkvKiBJcyBWR0Egcm91dGVkIHRvIHVzPyAqLworCWJ1cyA9IHBkZXYtPmJ1czsKKwl3aGlsZSAoYnVzKSB7CisJCWJyaWRnZSA9IGJ1cy0+c2VsZjsKKwkJaWYgKGJyaWRnZSkgeworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfQlJJREdFX0NPTlRST0wsCisJCQkJCQkmY29uZmlnKTsKKwkJCWlmICghKGNvbmZpZyAmIFBDSV9CUklER0VfQ1RMX1ZHQSkpCisJCQkJcmV0dXJuOworCQl9CisJCWJ1cyA9IGJ1cy0+cGFyZW50OworCX0KKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNvbmZpZyk7CisJaWYgKGNvbmZpZyAmIChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHsKKwkJcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fU0hBRE9XOworCQlwcmludGsoS0VSTl9ERUJVRyAiQm9vdCB2aWRlbyBkZXZpY2UgaXMgJXNcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2ZpeHVwX3ZpZGVvKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jIGIvYXJjaC9pMzg2L3BjaS9pMzg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwNWVhNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICoJTG93LUxldmVsIFBDSSBBY2Nlc3MgZm9yIGkzODYgbWFjaGluZXMKKyAqCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NCBEcmV3IEVja2hhcmR0CisgKiAgICAgIFZpc2lvbmFyeSBDb21wdXRpbmcKKyAqICAgICAgKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKKyAqICAgICAgRHJld0BDb2xvcmFkby5FRFUKKyAqICAgICAgKzEgKDMwMykgNzg2LTc5NzUKKyAqCisgKiBEcmV3J3Mgd29yayB3YXMgc3BvbnNvcmVkIGJ5OgorICoJaVggTXVsdGl1c2VyIE11bHRpdGFza2luZyBNYWdhemluZQorICoJSGFubm92ZXIsIEdlcm1hbnkKKyAqCWhtQGl4LmRlCisgKgorICogQ29weXJpZ2h0IDE5OTctLTIwMDAgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+CisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IHRoZSBmb2xsb3dpbmcgbWFudWFscyAobG9vayBhdAorICogaHR0cDovL3d3dy5wY2lzaWcuY29tLyBmb3IgaG93IHRvIGdldCB0aGVtKToKKyAqCisgKiBQQ0kgQklPUyBTcGVjaWZpY2F0aW9uCisgKiBQQ0kgTG9jYWwgQnVzIFNwZWNpZmljYXRpb24KKyAqIFBDSSB0byBQQ0kgQnJpZGdlIFNwZWNpZmljYXRpb24KKyAqIFBDSSBTeXN0ZW0gRGVzaWduIEd1aWRlCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSAicGNpLmgiCisKKy8qCisgKiBXZSBuZWVkIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBgbWlycm9yZWQnIFZHQSBwb3J0cworICogYW5kIG90aGVyIHN0cmFuZ2UgSVNBIGhhcmR3YXJlLCBzbyB3ZSBhbHdheXMgd2FudCB0aGUKKyAqIGFkZHJlc3NlcyB0byBiZSBhbGxvY2F0ZWQgaW4gdGhlIDB4MDAwLTB4MGZmIHJlZ2lvbgorICogbW9kdWxvIDB4NDAwLgorICoKKyAqIFdoeT8gQmVjYXVzZSBzb21lIHNpbGx5IGV4dGVybmFsIElPIGNhcmRzIG9ubHkgZGVjb2RlCisgKiB0aGUgbG93IDEwIGJpdHMgb2YgdGhlIElPIGFkZHJlc3MuIFRoZSAweDAwLTB4ZmYgcmVnaW9uCisgKiBpcyByZXNlcnZlZCBmb3IgbW90aGVyYm9hcmQgZGV2aWNlcyB0aGF0IGRlY29kZSBhbGwgMTYKKyAqIGJpdHMsIHNvIGl0J3Mgb2sgdG8gYWxsb2NhdGUgYXQsIHNheSwgMHgyODAwLTB4MjhmZiwKKyAqIGJ1dCB3ZSB3YW50IHRvIHRyeSB0byBhdm9pZCBhbGxvY2F0aW5nIGF0IDB4MjkwMC0weDJiZmYKKyAqIHdoaWNoIG1pZ2h0IGhhdmUgYmUgbWlycm9yZWQgYXQgMHgwMTAwLTB4MDNmZi4uCisgKi8KK3ZvaWQKK3BjaWJpb3NfYWxpZ25fcmVzb3VyY2Uodm9pZCAqZGF0YSwgc3RydWN0IHJlc291cmNlICpyZXMsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24pCit7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSByZXMtPnN0YXJ0OworCisJCWlmIChzdGFydCAmIDB4MzAwKSB7CisJCQlzdGFydCA9IChzdGFydCArIDB4M2ZmKSAmIH4weDNmZjsKKwkJCXJlcy0+c3RhcnQgPSBzdGFydDsKKwkJfQorCX0KK30KKworCisvKgorICogIEhhbmRsZSByZXNvdXJjZXMgb2YgUENJIGRldmljZXMuICBJZiB0aGUgd29ybGQgd2VyZSBwZXJmZWN0LCB3ZSBjb3VsZAorICogIGp1c3QgYWxsb2NhdGUgYWxsIHRoZSByZXNvdXJjZSByZWdpb25zIGFuZCBkbyBub3RoaW5nIG1vcmUuICBJdCBpc24ndC4KKyAqICBPbiB0aGUgb3RoZXIgaGFuZCwgd2UgY2Fubm90IGp1c3QgcmUtYWxsb2NhdGUgYWxsIGRldmljZXMsIGFzIGl0IHdvdWxkCisgKiAgcmVxdWlyZSB1cyB0byBrbm93IGxvdHMgb2YgaG9zdCBicmlkZ2UgaW50ZXJuYWxzLiAgU28gd2UgYXR0ZW1wdCB0bworICogIGtlZXAgYXMgbXVjaCBvZiB0aGUgb3JpZ2luYWwgY29uZmlndXJhdGlvbiBhcyBwb3NzaWJsZSwgYnV0IHR3ZWFrIGl0CisgKiAgd2hlbiBpdCdzIGZvdW5kIHRvIGJlIHdyb25nLgorICoKKyAqICBLbm93biBCSU9TIHByb2JsZW1zIHdlIGhhdmUgdG8gd29yayBhcm91bmQ6CisgKgktIEkvTyBvciBtZW1vcnkgcmVnaW9ucyBub3QgY29uZmlndXJlZAorICoJLSByZWdpb25zIGNvbmZpZ3VyZWQsIGJ1dCBub3QgZW5hYmxlZCBpbiB0aGUgY29tbWFuZCByZWdpc3RlcgorICoJLSBib2d1cyBJL08gYWRkcmVzc2VzIGFib3ZlIDY0SyB1c2VkCisgKgktIGV4cGFuc2lvbiBST01zIGxlZnQgZW5hYmxlZCAodGhpcyBtYXkgc291bmQgaGFybWxlc3MsIGJ1dCBnaXZlbgorICoJICB0aGUgZmFjdCB0aGUgUENJIHNwZWNzIGV4cGxpY2l0bHkgYWxsb3cgYWRkcmVzcyBkZWNvZGVycyB0byBiZQorICoJICBzaGFyZWQgYmV0d2VlbiBleHBhbnNpb24gUk9NcyBhbmQgb3RoZXIgcmVzb3VyY2UgcmVnaW9ucywgaXQncworICoJICBhdCBsZWFzdCBkYW5nZXJvdXMpCisgKgorICogIE91ciBzb2x1dGlvbjoKKyAqCSgxKSBBbGxvY2F0ZSByZXNvdXJjZXMgZm9yIGFsbCBidXNlcyBiZWhpbmQgUENJLXRvLVBDSSBicmlkZ2VzLgorICoJICAgIFRoaXMgZ2l2ZXMgdXMgZml4ZWQgYmFycmllcnMgb24gd2hlcmUgd2UgY2FuIGFsbG9jYXRlLgorICoJKDIpIEFsbG9jYXRlIHJlc291cmNlcyBmb3IgYWxsIGVuYWJsZWQgZGV2aWNlcy4gIElmIHRoZXJlIGlzCisgKgkgICAgYSBjb2xsaXNpb24sIGp1c3QgbWFyayB0aGUgcmVzb3VyY2UgYXMgdW5hbGxvY2F0ZWQuIEFsc28KKyAqCSAgICBkaXNhYmxlIGV4cGFuc2lvbiBST01zIGR1cmluZyB0aGlzIHN0ZXAuCisgKgkoMykgVHJ5IHRvIGFsbG9jYXRlIHJlc291cmNlcyBmb3IgZGlzYWJsZWQgZGV2aWNlcy4gIElmIHRoZQorICoJICAgIHJlc291cmNlcyB3ZXJlIGFzc2lnbmVkIGNvcnJlY3RseSwgZXZlcnl0aGluZyBnb2VzIHdlbGwsCisgKgkgICAgaWYgdGhleSB3ZXJlbid0LCB0aGV5IHdvbid0IGRpc3R1cmIgYWxsb2NhdGlvbiBvZiBvdGhlcgorICoJICAgIHJlc291cmNlcy4KKyAqCSg0KSBBc3NpZ24gbmV3IGFkZHJlc3NlcyB0byByZXNvdXJjZXMgd2hpY2ggd2VyZSBlaXRoZXIKKyAqCSAgICBub3QgY29uZmlndXJlZCBhdCBhbGwgb3IgbWlzY29uZmlndXJlZC4gIElmIGV4cGxpY2l0bHkKKyAqCSAgICByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIsIGNvbmZpZ3VyZSBleHBhbnNpb24gUk9NIGFkZHJlc3MKKyAqCSAgICBhcyB3ZWxsLgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2liaW9zX2FsbG9jYXRlX2J1c19yZXNvdXJjZXMoc3RydWN0IGxpc3RfaGVhZCAqYnVzX2xpc3QpCit7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCWludCBpZHg7CisJc3RydWN0IHJlc291cmNlICpyLCAqcHI7CisKKwkvKiBEZXB0aC1GaXJzdCBTZWFyY2ggb24gYnVzIHRyZWUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1cywgYnVzX2xpc3QsIG5vZGUpIHsKKwkJaWYgKChkZXYgPSBidXMtPnNlbGYpKSB7CisJCQlmb3IgKGlkeCA9IFBDSV9CUklER0VfUkVTT1VSQ0VTOyBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKKwkJCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKwkJCQlpZiAoIXItPnN0YXJ0KQorCQkJCQljb250aW51ZTsKKwkJCQlwciA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHIpOworCQkJCWlmICghcHIgfHwgcmVxdWVzdF9yZXNvdXJjZShwciwgcikgPCAwKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQ2Fubm90IGFsbG9jYXRlIHJlc291cmNlIHJlZ2lvbiAlZCBvZiBicmlkZ2UgJXNcbiIsIGlkeCwgcGNpX25hbWUoZGV2KSk7CisJCQl9CisJCX0KKwkJcGNpYmlvc19hbGxvY2F0ZV9idXNfcmVzb3VyY2VzKCZidXMtPmNoaWxkcmVuKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2liaW9zX2FsbG9jYXRlX3Jlc291cmNlcyhpbnQgcGFzcykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwlpbnQgaWR4LCBkaXNhYmxlZDsKKwl1MTYgY29tbWFuZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIsICpwcjsKKworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjb21tYW5kKTsKKwkJZm9yKGlkeCA9IDA7IGlkeCA8IDY7IGlkeCsrKSB7CisJCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKwkJCWlmIChyLT5wYXJlbnQpCQkvKiBBbHJlYWR5IGFsbG9jYXRlZCAqLworCQkJCWNvbnRpbnVlOworCQkJaWYgKCFyLT5zdGFydCkJCS8qIEFkZHJlc3Mgbm90IGFzc2lnbmVkIGF0IGFsbCAqLworCQkJCWNvbnRpbnVlOworCQkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCQlkaXNhYmxlZCA9ICEoY29tbWFuZCAmIFBDSV9DT01NQU5EX0lPKTsKKwkJCWVsc2UKKwkJCQlkaXNhYmxlZCA9ICEoY29tbWFuZCAmIFBDSV9DT01NQU5EX01FTU9SWSk7CisJCQlpZiAocGFzcyA9PSBkaXNhYmxlZCkgeworCQkJCURCRygiUENJOiBSZXNvdXJjZSAlMDhseC0lMDhseCAoZj0lbHgsIGQ9JWQsIHA9JWQpXG4iLAorCQkJCSAgICByLT5zdGFydCwgci0+ZW5kLCByLT5mbGFncywgZGlzYWJsZWQsIHBhc3MpOworCQkJCXByID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcik7CisJCQkJaWYgKCFwciB8fCByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IENhbm5vdCBhbGxvY2F0ZSByZXNvdXJjZSByZWdpb24gJWQgb2YgZGV2aWNlICVzXG4iLCBpZHgsIHBjaV9uYW1lKGRldikpOworCQkJCQkvKiBXZSdsbCBhc3NpZ24gYSBuZXcgYWRkcmVzcyBsYXRlciAqLworCQkJCQlyLT5lbmQgLT0gci0+c3RhcnQ7CisJCQkJCXItPnN0YXJ0ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFwYXNzKSB7CisJCQlyID0gJmRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV07CisJCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9FTkFCTEUpIHsKKwkJCQkvKiBUdXJuIHRoZSBST00gb2ZmLCBsZWF2ZSB0aGUgcmVzb3VyY2UgcmVnaW9uLCBidXQga2VlcCBpdCB1bnJlZ2lzdGVyZWQuICovCisJCQkJdTMyIHJlZzsKKwkJCQlEQkcoIlBDSTogU3dpdGNoaW5nIG9mZiBST00gb2YgJXNcbiIsIHBjaV9uYW1lKGRldikpOworCQkJCXItPmZsYWdzICY9IH5JT1JFU09VUkNFX1JPTV9FTkFCTEU7CisJCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgZGV2LT5yb21fYmFzZV9yZWcsICZyZWcpOworCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBkZXYtPnJvbV9iYXNlX3JlZywgcmVnICYgflBDSV9ST01fQUREUkVTU19FTkFCTEUpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2Fzc2lnbl9yZXNvdXJjZXModm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwlpbnQgaWR4OworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CisJCWludCBjbGFzcyA9IGRldi0+Y2xhc3MgPj4gODsKKworCQkvKiBEb24ndCB0b3VjaCBjbGFzc2xlc3MgZGV2aWNlcyBhbmQgaG9zdCBicmlkZ2VzICovCisJCWlmICghY2xhc3MgfHwgY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUKQorCQkJY29udGludWU7CisKKwkJZm9yKGlkeD0wOyBpZHg8NjsgaWR4KyspIHsKKwkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOworCisJCQkvKgorCQkJICogIERvbid0IHRvdWNoIElERSBjb250cm9sbGVycyBhbmQgSS9PIHBvcnRzIG9mIHZpZGVvIGNhcmRzIQorCQkJICovCisJCQlpZiAoKGNsYXNzID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSAmJiBpZHggPCA0KSB8fAorCQkJICAgIChjbGFzcyA9PSBQQ0lfQ0xBU1NfRElTUExBWV9WR0EgJiYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogIFdlIHNoYWxsIGFzc2lnbiBhIG5ldyBhZGRyZXNzIHRvIHRoaXMgcmVzb3VyY2UsIGVpdGhlciBiZWNhdXNlCisJCQkgKiAgdGhlIEJJT1MgZm9yZ290IHRvIGRvIHNvIG9yIGJlY2F1c2Ugd2UgaGF2ZSBkZWNpZGVkIHRoZSBvbGQKKwkJCSAqICBhZGRyZXNzIHdhcyB1bnVzYWJsZSBmb3Igc29tZSByZWFzb24uCisJCQkgKi8KKwkJCWlmICghci0+c3RhcnQgJiYgci0+ZW5kKQorCQkJCXBjaV9hc3NpZ25fcmVzb3VyY2UoZGV2LCBpZHgpOworCQl9CisKKwkJaWYgKHBjaV9wcm9iZSAmIFBDSV9BU1NJR05fUk9NUykgeworCQkJciA9ICZkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOworCQkJci0+ZW5kIC09IHItPnN0YXJ0OworCQkJci0+c3RhcnQgPSAwOworCQkJaWYgKHItPmVuZCkKKwkJCQlwY2lfYXNzaWduX3Jlc291cmNlKGRldiwgUENJX1JPTV9SRVNPVVJDRSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IHBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KHZvaWQpCit7CisJREJHKCJQQ0k6IEFsbG9jYXRpbmcgcmVzb3VyY2VzXG4iKTsKKwlwY2liaW9zX2FsbG9jYXRlX2J1c19yZXNvdXJjZXMoJnBjaV9yb290X2J1c2VzKTsKKwlwY2liaW9zX2FsbG9jYXRlX3Jlc291cmNlcygwKTsKKwlwY2liaW9zX2FsbG9jYXRlX3Jlc291cmNlcygxKTsKK30KKworLyoqCisgKiBjYWxsZWQgaW4gZnNfaW5pdGNhbGwgKG9uZSBiZWxvdyBzdWJzeXNfaW5pdGNhbGwpLAorICogZ2l2ZSBhIGNoYW5jZSBmb3IgbW90aGVyYm9hcmQgcmVzZXJ2ZSByZXNvdXJjZXMKKyAqLworZnNfaW5pdGNhbGwocGNpYmlvc19hc3NpZ25fcmVzb3VyY2VzKTsKKworaW50IHBjaWJpb3NfZW5hYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKK3sKKwl1MTYgY21kLCBvbGRfY21kOworCWludCBpZHg7CisJc3RydWN0IHJlc291cmNlICpyOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisJb2xkX2NtZCA9IGNtZDsKKwlmb3IoaWR4PTA7IGlkeDw2OyBpZHgrKykgeworCQkvKiBPbmx5IHNldCB1cCB0aGUgcmVxdWVzdGVkIHN0dWZmICovCisJCWlmICghKG1hc2sgJiAoMTw8aWR4KSkpCisJCQljb250aW51ZTsKKworCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKwkJaWYgKCFyLT5zdGFydCAmJiByLT5lbmQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBEZXZpY2UgJXMgbm90IGF2YWlsYWJsZSBiZWNhdXNlIG9mIHJlc291cmNlIGNvbGxpc2lvbnNcbiIsIHBjaV9uYW1lKGRldikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCWNtZCB8PSBQQ0lfQ09NTUFORF9JTzsKKwkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOworCX0KKwlpZiAoZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCkKKwkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKKwlpZiAoY21kICE9IG9sZF9jbWQpIHsKKwkJcHJpbnRrKCJQQ0k6IEVuYWJsaW5nIGRldmljZSAlcyAoJTA0eCAtPiAlMDR4KVxuIiwgcGNpX25hbWUoZGV2KSwgb2xkX2NtZCwgY21kKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogIElmIHdlIHNldCB1cCBhIGRldmljZSBmb3IgYnVzIG1hc3RlcmluZywgd2UgbmVlZCB0byBjaGVjayB0aGUgbGF0ZW5jeQorICogIHRpbWVyIGFzIGNlcnRhaW4gY3JhcHB5IEJJT1NlcyBmb3JnZXQgdG8gc2V0IGl0IHByb3Blcmx5LgorICovCit1bnNpZ25lZCBpbnQgcGNpYmlvc19tYXhfbGF0ZW5jeSA9IDI1NTsKKwordm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1OCBsYXQ7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJmxhdCk7CisJaWYgKGxhdCA8IDE2KQorCQlsYXQgPSAoNjQgPD0gcGNpYmlvc19tYXhfbGF0ZW5jeSkgPyA2NCA6IHBjaWJpb3NfbWF4X2xhdGVuY3k7CisJZWxzZSBpZiAobGF0ID4gcGNpYmlvc19tYXhfbGF0ZW5jeSkKKwkJbGF0ID0gcGNpYmlvc19tYXhfbGF0ZW5jeTsKKwllbHNlCisJCXJldHVybjsKKwlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBTZXR0aW5nIGxhdGVuY3kgdGltZXIgb2YgZGV2aWNlICVzIHRvICVkXG4iLCBwY2lfbmFtZShkZXYpLCBsYXQpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCBsYXQpOworfQorCitpbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpCit7CisJdW5zaWduZWQgbG9uZyBwcm90OworCisJLyogSS9PIHNwYWNlIGNhbm5vdCBiZSBhY2Nlc3NlZCB2aWEgbm9ybWFsIHByb2Nlc3NvciBsb2FkcyBhbmQKKwkgKiBzdG9yZXMgb24gdGhpcyBwbGF0Zm9ybS4KKwkgKi8KKwlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9pbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBMZWF2ZSB2bV9wZ29mZiBhcy1pcywgdGhlIFBDSSBzcGFjZSBhZGRyZXNzIGlzIHRoZSBwaHlzaWNhbAorCSAqIGFkZHJlc3Mgb24gdGhpcyBwbGF0Zm9ybS4KKwkgKi8KKwl2bWEtPnZtX2ZsYWdzIHw9IChWTV9TSE0gfCBWTV9MT0NLRUQgfCBWTV9JTyk7CisKKwlwcm90ID0gcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMykKKwkJcHJvdCB8PSBfUEFHRV9QQ0QgfCBfUEFHRV9QV1Q7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdChwcm90KTsKKworCS8qIFdyaXRlLWNvbWJpbmUgc2V0dGluZyBpcyBpZ25vcmVkLCBpdCBpcyBjaGFuZ2VkIHZpYSB0aGUgbXRycgorCSAqIGludGVyZmFjZXMgb24gdGhpcyBwbGF0Zm9ybS4KKwkgKi8KKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29mZiwKKwkJCSAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkJICAgICB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCXJldHVybiAtRUFHQUlOOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2lycS5jIGIvYXJjaC9pMzg2L3BjaS9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTI4NDUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3BjaS9pcnEuYwpAQCAtMCwwICsxLDExMTkgQEAKKy8qCisgKglMb3ctTGV2ZWwgUENJIFN1cHBvcnQgZm9yIFBDIC0tIFJvdXRpbmcgb2YgSW50ZXJydXB0cworICoKKyAqCShjKSAxOTk5LS0yMDAwIE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CisjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKworI2luY2x1ZGUgInBjaS5oIgorCisjZGVmaW5lIFBJUlFfU0lHTkFUVVJFCSgoJyQnIDw8IDApICsgKCdQJyA8PCA4KSArICgnSScgPDwgMTYpICsgKCdSJyA8PCAyNCkpCisjZGVmaW5lIFBJUlFfVkVSU0lPTiAweDAxMDAKKworc3RhdGljIGludCBicm9rZW5faHBfYmlvc19pcnE5Oworc3RhdGljIGludCBhY2VyX3RtMzYwX2lycXJvdXRpbmc7CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKnBpcnFfdGFibGU7CisKK3N0YXRpYyBpbnQgcGlycV9lbmFibGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCisvKgorICogTmV2ZXIgdXNlOiAwLCAxLCAyICh0aW1lciwga2V5Ym9hcmQsIGFuZCBjYXNjYWRlKQorICogQXZvaWQgdXNpbmc6IDEzLCAxNCBhbmQgMTUgKEZQIGVycm9yIGFuZCBJREUpLgorICogUGVuYWxpemU6IDMsIDQsIDYsIDcsIDEyIChrbm93biBJU0EgdXNlczogc2VyaWFsLCBmbG9wcHksIHBhcmFsbGVsIGFuZCBtb3VzZSkKKyAqLwordW5zaWduZWQgaW50IHBjaWJpb3NfaXJxX21hc2sgPSAweGZmZjg7CisKK3N0YXRpYyBpbnQgcGlycV9wZW5hbHR5WzE2XSA9IHsKKwkxMDAwMDAwLCAxMDAwMDAwLCAxMDAwMDAwLCAxMDAwLCAxMDAwLCAwLCAxMDAwLCAxMDAwLAorCTAsIDAsIDAsIDAsIDEwMDAsIDEwMDAwMCwgMTAwMDAwLCAxMDAwMDAKK307CisKK3N0cnVjdCBpcnFfcm91dGVyIHsKKwljaGFyICpuYW1lOworCXUxNiB2ZW5kb3IsIGRldmljZTsKKwlpbnQgKCpnZXQpKHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxKTsKKwlpbnQgKCpzZXQpKHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxLCBpbnQgbmV3KTsKK307CisKK3N0cnVjdCBpcnFfcm91dGVyX2hhbmRsZXIgeworCXUxNiB2ZW5kb3I7CisJaW50ICgqcHJvYmUpKHN0cnVjdCBpcnFfcm91dGVyICpyLCBzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCB1MTYgZGV2aWNlKTsKK307CisKK2ludCAoKnBjaWJpb3NfZW5hYmxlX2lycSkoc3RydWN0IHBjaV9kZXYgKmRldikgPSBOVUxMOworCisvKgorICogIFNlYXJjaCAweGYwMDAwIC0tIDB4ZmZmZmYgZm9yIHRoZSBQQ0kgSVJRIFJvdXRpbmcgVGFibGUuCisgKi8KKworc3RhdGljIHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSAqIF9faW5pdCBwaXJxX2ZpbmRfcm91dGluZ190YWJsZSh2b2lkKQoreworCXU4ICphZGRyOworCXN0cnVjdCBpcnFfcm91dGluZ190YWJsZSAqcnQ7CisJaW50IGk7CisJdTggc3VtOworCisJZm9yKGFkZHIgPSAodTggKikgX192YSgweGYwMDAwKTsgYWRkciA8ICh1OCAqKSBfX3ZhKDB4MTAwMDAwKTsgYWRkciArPSAxNikgeworCQlydCA9IChzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKikgYWRkcjsKKwkJaWYgKHJ0LT5zaWduYXR1cmUgIT0gUElSUV9TSUdOQVRVUkUgfHwKKwkJICAgIHJ0LT52ZXJzaW9uICE9IFBJUlFfVkVSU0lPTiB8fAorCQkgICAgcnQtPnNpemUgJSAxNiB8fAorCQkgICAgcnQtPnNpemUgPCBzaXplb2Yoc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlKSkKKwkJCWNvbnRpbnVlOworCQlzdW0gPSAwOworCQlmb3IoaT0wOyBpPHJ0LT5zaXplOyBpKyspCisJCQlzdW0gKz0gYWRkcltpXTsKKwkJaWYgKCFzdW0pIHsKKwkJCURCRygiUENJOiBJbnRlcnJ1cHQgUm91dGluZyBUYWJsZSBmb3VuZCBhdCAweCVwXG4iLCBydCk7CisJCQlyZXR1cm4gcnQ7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiAgSWYgd2UgaGF2ZSBhIElSUSByb3V0aW5nIHRhYmxlLCB1c2UgaXQgdG8gc2VhcmNoIGZvciBwZWVyIGhvc3QKKyAqICBicmlkZ2VzLiAgSXQncyBhIGdyb3NzIGhhY2ssIGJ1dCBzaW5jZSB0aGVyZSBhcmUgbm8gb3RoZXIga25vd24KKyAqICB3YXlzIGhvdyB0byBnZXQgYSBsaXN0IG9mIGJ1c2VzLCB3ZSBoYXZlIHRvIGdvIHRoaXMgd2F5LgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBwaXJxX3BlZXJfdHJpY2sodm9pZCkKK3sKKwlzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKnJ0ID0gcGlycV90YWJsZTsKKwl1OCBidXNtYXBbMjU2XTsKKwlpbnQgaTsKKwlzdHJ1Y3QgaXJxX2luZm8gKmU7CisKKwltZW1zZXQoYnVzbWFwLCAwLCBzaXplb2YoYnVzbWFwKSk7CisJZm9yKGk9MDsgaSA8IChydC0+c2l6ZSAtIHNpemVvZihzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUpKSAvIHNpemVvZihzdHJ1Y3QgaXJxX2luZm8pOyBpKyspIHsKKwkJZSA9ICZydC0+c2xvdHNbaV07CisjaWZkZWYgREVCVUcKKwkJeworCQkJaW50IGo7CisJCQlEQkcoIiUwMng6JTAyeCBzbG90PSUwMngiLCBlLT5idXMsIGUtPmRldmZuLzgsIGUtPnNsb3QpOworCQkJZm9yKGo9MDsgajw0OyBqKyspCisJCQkJREJHKCIgJWQ6JTAyeC8lMDR4IiwgaiwgZS0+aXJxW2pdLmxpbmssIGUtPmlycVtqXS5iaXRtYXApOworCQkJREJHKCJcbiIpOworCQl9CisjZW5kaWYKKwkJYnVzbWFwW2UtPmJ1c10gPSAxOworCX0KKwlmb3IoaSA9IDE7IGkgPCAyNTY7IGkrKykgeworCQlpZiAoIWJ1c21hcFtpXSB8fCBwY2lfZmluZF9idXMoMCwgaSkpCisJCQljb250aW51ZTsKKwkJaWYgKHBjaV9zY2FuX2J1cyhpLCAmcGNpX3Jvb3Rfb3BzLCBOVUxMKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIlBDSTogRGlzY292ZXJlZCBwcmltYXJ5IHBlZXIgYnVzICUwMnggW0lSUV1cbiIsIGkpOworCX0KKwlwY2liaW9zX2xhc3RfYnVzID0gLTE7Cit9CisKKy8qCisgKiAgQ29kZSBmb3IgcXVlcnlpbmcgYW5kIHNldHRpbmcgb2YgSVJRIHJvdXRlcyBvbiB2YXJpb3VzIGludGVycnVwdCByb3V0ZXJzLgorICovCisKK3ZvaWQgZWlzYV9zZXRfbGV2ZWxfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgY2hhciBtYXNrID0gMSA8PCAoaXJxICYgNyk7CisJdW5zaWduZWQgaW50IHBvcnQgPSAweDRkMCArIChpcnEgPj4gMyk7CisJdW5zaWduZWQgY2hhciB2YWw7CisJc3RhdGljIHUxNiBlaXNhX2lycV9tYXNrOworCisJaWYgKGlycSA+PSAxNiB8fCAoMSA8PCBpcnEpICYgZWlzYV9pcnFfbWFzaykKKwkJcmV0dXJuOworCisJZWlzYV9pcnFfbWFzayB8PSAoMSA8PCBpcnEpOworCXByaW50aygiUENJOiBzZXR0aW5nIElSUSAldSBhcyBsZXZlbC10cmlnZ2VyZWRcbiIsIGlycSk7CisJdmFsID0gaW5iKHBvcnQpOworCWlmICghKHZhbCAmIG1hc2spKSB7CisJCURCRygiIC0+IGVkZ2UiKTsKKwkJb3V0Yih2YWwgfCBtYXNrLCBwb3J0KTsKKwl9Cit9CisKKy8qCisgKiBDb21tb24gSVJRIHJvdXRpbmcgcHJhY3RpY2U6IG55YmJsZXMgaW4gY29uZmlnIHNwYWNlLAorICogb2Zmc2V0IGJ5IHNvbWUgbWFnaWMgY29uc3RhbnQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF9jb25maWdfbnliYmxlKHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbnIpCit7CisJdTggeDsKKwl1bnNpZ25lZCByZWcgPSBvZmZzZXQgKyAobnIgPj4gMSk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShyb3V0ZXIsIHJlZywgJngpOworCXJldHVybiAobnIgJiAxKSA/ICh4ID4+IDQpIDogKHggJiAweGYpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9jb25maWdfbnliYmxlKHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbnIsIHVuc2lnbmVkIGludCB2YWwpCit7CisJdTggeDsKKwl1bnNpZ25lZCByZWcgPSBvZmZzZXQgKyAobnIgPj4gMSk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShyb3V0ZXIsIHJlZywgJngpOworCXggPSAobnIgJiAxKSA/ICgoeCAmIDB4MGYpIHwgKHZhbCA8PCA0KSkgOiAoKHggJiAweGYwKSB8IHZhbCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHJvdXRlciwgcmVnLCB4KTsKK30KKworLyoKKyAqIEFMSSBwaXJxIGVudHJpZXMgYXJlIGRhbW4gdWdseSwgYW5kIGNvbXBsZXRlbHkgdW5kb2N1bWVudGVkLgorICogVGhpcyBoYXMgYmVlbiBmaWd1cmVkIG91dCBmcm9tIHBpcnEgdGFibGVzLCBhbmQgaXQncyBub3QgYSBwcmV0dHkKKyAqIHBpY3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgcGlycV9hbGlfZ2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGlycW1hcFsxNl0gPSB7IDAsIDksIDMsIDEwLCA0LCA1LCA3LCA2LCAxLCAxMSwgMCwgMTIsIDAsIDE0LCAwLCAxNSB9OworCisJcmV0dXJuIGlycW1hcFtyZWFkX2NvbmZpZ19ueWJibGUocm91dGVyLCAweDQ4LCBwaXJxLTEpXTsKK30KKworc3RhdGljIGludCBwaXJxX2FsaV9zZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEsIGludCBpcnEpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgaXJxbWFwWzE2XSA9IHsgMCwgOCwgMCwgMiwgNCwgNSwgNywgNiwgMCwgMSwgMywgOSwgMTEsIDAsIDEzLCAxNSB9OworCXVuc2lnbmVkIGludCB2YWwgPSBpcnFtYXBbaXJxXTsKKwkJCisJaWYgKHZhbCkgeworCQl3cml0ZV9jb25maWdfbnliYmxlKHJvdXRlciwgMHg0OCwgcGlycS0xLCB2YWwpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgSW50ZWwgUElJWDQgcGlycSBydWxlcyBhcmUgZmFpcmx5IHNpbXBsZTogInBpcnEiIGlzCisgKiBqdXN0IGEgcG9pbnRlciB0byB0aGUgY29uZmlnIHNwYWNlLgorICovCitzdGF0aWMgaW50IHBpcnFfcGlpeF9nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCit7CisJdTggeDsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHJvdXRlciwgcGlycSwgJngpOworCXJldHVybiAoeCA8IDE2KSA/IHggOiAwOworfQorCitzdGF0aWMgaW50IHBpcnFfcGlpeF9zZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEsIGludCBpcnEpCit7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHJvdXRlciwgcGlycSwgaXJxKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRoZSBWSUEgcGlycSBydWxlcyBhcmUgbmliYmxlLWJhc2VkLCBsaWtlIEFMSSwKKyAqIGJ1dCB3aXRob3V0IHRoZSB1Z2x5IGlycSBudW1iZXIgbXVuZ2luZy4KKyAqIEhvd2V2ZXIsIFBJUlFEIGlzIGluIHRoZSB1cHBlciBpbnN0ZWFkIG9mIGxvd2VyIDQgYml0cy4KKyAqLworc3RhdGljIGludCBwaXJxX3ZpYV9nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCit7CisJcmV0dXJuIHJlYWRfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4NTUsIHBpcnEgPT0gNCA/IDUgOiBwaXJxKTsKK30KKworc3RhdGljIGludCBwaXJxX3ZpYV9zZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEsIGludCBpcnEpCit7CisJd3JpdGVfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4NTUsIHBpcnEgPT0gNCA/IDUgOiBwaXJxLCBpcnEpOworCXJldHVybiAxOworfQorCisvKgorICogSVRFIDgzMzBHIHBpcnEgcnVsZXMgYXJlIG5pYmJsZS1iYXNlZAorICogRklYTUU6IHBpcnFtYXAgbWF5IGJlIHsgMSwgMCwgMywgMiB9LAorICogCSAgMiszIGFyZSBib3RoIG1hcHBlZCB0byBpcnEgOSBvbiBteSBzeXN0ZW0KKyAqLworc3RhdGljIGludCBwaXJxX2l0ZV9nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcGlycW1hcFs0XSA9IHsgMSwgMCwgMiwgMyB9OworCXJldHVybiByZWFkX2NvbmZpZ19ueWJibGUocm91dGVyLDB4NDMsIHBpcnFtYXBbcGlycS0xXSk7Cit9CisKK3N0YXRpYyBpbnQgcGlycV9pdGVfc2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxLCBpbnQgaXJxKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBpcnFtYXBbNF0gPSB7IDEsIDAsIDIsIDMgfTsKKwl3cml0ZV9jb25maWdfbnliYmxlKHJvdXRlciwgMHg0MywgcGlycW1hcFtwaXJxLTFdLCBpcnEpOworCXJldHVybiAxOworfQorCisvKgorICogT1BUSTogaGlnaCBmb3VyIGJpdHMgYXJlIG5pYmJsZSBwb2ludGVyLi4KKyAqIEkgd29uZGVyIHdoYXQgdGhlIGxvdyBiaXRzIGRvPworICovCitzdGF0aWMgaW50IHBpcnFfb3B0aV9nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCit7CisJcmV0dXJuIHJlYWRfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4YjgsIHBpcnEgPj4gNCk7Cit9CisKK3N0YXRpYyBpbnQgcGlycV9vcHRpX3NldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSwgaW50IGlycSkKK3sKKwl3cml0ZV9jb25maWdfbnliYmxlKHJvdXRlciwgMHhiOCwgcGlycSA+PiA0LCBpcnEpOworCXJldHVybiAxOworfQorCisvKgorICogQ3lyaXg6IG5pYmJsZSBvZmZzZXQgMHg1QworICogMHg1QyBiaXRzIDc6NCBpcyBJTlRCIGJpdHMgMzowIGlzIElOVEEgCisgKiAweDVEIGJpdHMgNzo0IGlzIElOVEQgYml0cyAzOjAgaXMgSU5UQworICovCitzdGF0aWMgaW50IHBpcnFfY3lyaXhfZ2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxKQoreworCXJldHVybiByZWFkX2NvbmZpZ19ueWJibGUocm91dGVyLCAweDVDLCAocGlycS0xKV4xKTsKK30KKworc3RhdGljIGludCBwaXJxX2N5cml4X3NldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSwgaW50IGlycSkKK3sKKwl3cml0ZV9jb25maWdfbnliYmxlKHJvdXRlciwgMHg1QywgKHBpcnEtMSleMSwgaXJxKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqCVBJUlEgcm91dGluZyBmb3IgU2lTIDg1QzUwMyByb3V0ZXIgdXNlZCBpbiBzZXZlcmFsIFNpUyBjaGlwc2V0cy4KKyAqCVdlIGhhdmUgdG8gZGVhbCB3aXRoIHRoZSBmb2xsb3dpbmcgaXNzdWVzIGhlcmU6CisgKgktIHZlbmRvcnMgaGF2ZSBkaWZmZXJlbnQgaWRlYXMgYWJvdXQgdGhlIG1lYW5pbmcgb2YgbGluayB2YWx1ZXMKKyAqCS0gc29tZSBvbmJvYXJkIGRldmljZXMgKGludGVncmF0ZWQgaW4gdGhlIGNoaXBzZXQpIGhhdmUgc3BlY2lhbAorICoJICBsaW5rcyBhbmQgYXJlIHRodXMgcm91dGVkIGRpZmZlcmVudGx5IChpLmUuIG5vdCB2aWEgUENJIElOVEEtSU5URCkKKyAqCS0gZGlmZmVyZW50IHJldmlzaW9uIG9mIHRoZSByb3V0ZXIgaGF2ZSBhIGRpZmZlcmVudCBsYXlvdXQgZm9yCisgKgkgIHRoZSByb3V0aW5nIHJlZ2lzdGVycywgcGFydGljdWxhcmx5IGZvciB0aGUgb25jaGlwIGRldmljZXMKKyAqCisgKglGb3IgYWxsIHJvdXRpbmcgcmVnaXN0ZXJzIHRoZSBjb21tb24gdGhpbmcgaXMgd2UgaGF2ZSBvbmUgYnl0ZQorICoJcGVyIHJvdXRlYWJsZSBsaW5rIHdoaWNoIGlzIGRlZmluZWQgYXM6CisgKgkJIGJpdCA3ICAgICAgSVJRIG1hcHBpbmcgZW5hYmxlZCAoMCkgb3IgZGlzYWJsZWQgKDEpCisgKgkJIGJpdHMgWzY6NF0gcmVzZXJ2ZWQgKHNvbWV0aW1lcyB1c2VkIGZvciBvbmNoaXAgZGV2aWNlcykKKyAqCQkgYml0cyBbMzowXSBJUlEgdG8gbWFwIHRvCisgKgkJICAgICBhbGxvd2VkOiAzLTcsIDktMTIsIDE0LTE1CisgKgkJICAgICByZXNlcnZlZDogMCwgMSwgMiwgOCwgMTMKKyAqCisgKglUaGUgY29uZmlnLXNwYWNlIHJlZ2lzdGVycyBsb2NhdGVkIGF0IDB4NDEvMHg0Mi8weDQzLzB4NDQgYXJlCisgKglhbHdheXMgdXNlZCB0byByb3V0ZSB0aGUgbm9ybWFsIFBDSSBJTlQgQS9CL0MvRCByZXNwZWN0aXZlbHkuCisgKglBcHBhcmVudGx5IHRoZXJlIGFyZSBzeXN0ZW1zIGltcGxlbWVudGluZyBQQ0kgcm91dGluZyB0YWJsZSB1c2luZworICoJbGluayB2YWx1ZXMgMHgwMS0weDA0IGFuZCBvdGhlcnMgdXNpbmcgMHg0MS0weDQ0IGZvciBQQ0kgSU5UQS4uRC4KKyAqCVdlIHRyeSBvdXIgYmVzdCB0byBoYW5kbGUgYm90aCBsaW5rIG1hcHBpbmdzLgorICoJCisgKglDdXJyZW50bHkgKDIwMDMtMDUtMjEpIGl0IGFwcGVhcnMgbW9zdCBTaVMgY2hpcHNldHMgZm9sbG93IHRoZQorICoJZGVmaW5pdGlvbiBvZiByb3V0aW5nIHJlZ2lzdGVycyBmcm9tIHRoZSBTaVMtNTU5NSBzb3V0aGJyaWRnZS4KKyAqCUFjY29yZGluZyB0byB0aGUgU2lTIDU1OTUgZGF0YXNoZWV0cyB0aGUgcmV2aXNpb24gaWQncyBvZiB0aGUKKyAqCXJvdXRlciAoSVNBLWJyaWRnZSkgc2hvdWxkIGJlIDB4MDEgb3IgMHhiMC4KKyAqCisgKglGdXJ0aGVybW9yZSB3ZSd2ZSBhbHNvIHNlZW4gbHNwY2kgZHVtcHMgd2l0aCByZXZpc2lvbiAweDAwIGFuZCAweGIxLgorICoJTG9va3MgbGlrZSB0aGVzZSBhcmUgdXNlZCBpbiBhIG51bWJlciBvZiBTaVMgNXh4LzZ4eC83eHggY2hpcHNldHMuCisgKglUaGV5IHNlZW0gdG8gd29yayB3aXRoIHRoZSBjdXJyZW50IHJvdXRpbmcgY29kZS4gSG93ZXZlciB0aGVyZSBpcworICoJc29tZSBjb25jZXJuIGJlY2F1c2Ugb2YgdGhlIHR3byBVU0ItT0hDSSBIQ3MgKG9yaWdpbmFsIFNpUyA1NTk1CisgKgloYWQgb25seSBvbmUpLiBZTU1WLgorICoKKyAqCU9uY2hpcCByb3V0aW5nIGZvciByb3V0ZXIgcmV2LWlkIDB4MDEvMHhiMCBhbmQgcHJvYmFibHkgMHgwMC8weGIxOgorICoKKyAqCTB4NjE6CUlERUlSUToKKyAqCQliaXRzIFs2OjVdIG11c3QgYmUgd3JpdHRlbiAwMQorICoJCWJpdCA0IGNoYW5uZWwtc2VsZWN0IHByaW1hcnkgKDApLCBzZWNvbmRhcnkgKDEpCisgKgorICoJMHg2MjoJVVNCSVJROgorICoJCWJpdCA2IE9IQ0kgZnVuY3Rpb24gZGlzYWJsZWQgKDApLCBlbmFibGVkICgxKQorICoJCisgKgkweDZhOglBQ1BJL1NDSSBJUlE6IGJpdHMgNC02IHJlc2VydmVkCisgKgorICoJMHg3ZToJRGF0YSBBY3EuIE1vZHVsZSBJUlEgLSBiaXRzIDQtNiByZXNlcnZlZAorICoKKyAqCVdlIHN1cHBvcnQgVVNCSVJRIChpbiBhZGRpdGlvbiB0byBJTlRBLUlOVEQpIGFuZCBrZWVwIHRoZQorICoJSURFLCBBQ1BJIGFuZCBEQVEgcm91dGluZyB1bnRvdWNoZWQgYXMgc2V0IGJ5IHRoZSBCSU9TLgorICoKKyAqCUN1cnJlbnRseSB0aGUgb25seSByZXBvcnRlZCBleGNlcHRpb24gaXMgdGhlIG5ldyBTaVMgNjV4IGNoaXBzZXQKKyAqCXdoaWNoIGluY2x1ZGVzIHRoZSBTaVMgNjl4IHNvdXRoYnJpZGdlLiBIZXJlIHdlIGhhdmUgdGhlIDg1QzUwMworICoJcm91dGVyIHJldmlzaW9uIDB4MDQgYW5kIHRoZXJlIGFyZSBjaGFuZ2VzIGluIHRoZSByZWdpc3RlciBsYXlvdXQKKyAqCW1vc3RseSByZWxhdGVkIHRvIHRoZSBkaWZmZXJlbnQgVVNCIEhDcyB3aXRoIFVTQiAyLjAgc3VwcG9ydC4KKyAqCisgKglPbmNoaXAgcm91dGluZyBmb3Igcm91dGVyIHJldi1pZCAweDA0ICh0cnktYW5kLWVycm9yIG9ic2VydmF0aW9uKQorICoKKyAqCTB4NjAvMHg2MS8weDYyLzB4NjM6CTF4RUhDSSBhbmQgM3hPSENJIChjb21wYW5pb24pIFVTQi1IQ3MKKyAqCQkJCWJpdCA2LTQgYXJlIHByb2JhYmx5IHVudXNlZCwgbm90IGxpa2UgNTU5NQorICovCisKKyNkZWZpbmUgUElSUV9TSVNfSVJRX01BU0sJMHgwZgorI2RlZmluZSBQSVJRX1NJU19JUlFfRElTQUJMRQkweDgwCisjZGVmaW5lIFBJUlFfU0lTX1VTQl9FTkFCTEUJMHg0MAorCitzdGF0aWMgaW50IHBpcnFfc2lzX2dldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSkKK3sKKwl1OCB4OworCWludCByZWc7CisKKwlyZWcgPSBwaXJxOworCWlmIChyZWcgPj0gMHgwMSAmJiByZWcgPD0gMHgwNCkKKwkJcmVnICs9IDB4NDA7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocm91dGVyLCByZWcsICZ4KTsKKwlyZXR1cm4gKHggJiBQSVJRX1NJU19JUlFfRElTQUJMRSkgPyAwIDogKHggJiBQSVJRX1NJU19JUlFfTUFTSyk7Cit9CisKK3N0YXRpYyBpbnQgcGlycV9zaXNfc2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxLCBpbnQgaXJxKQoreworCXU4IHg7CisJaW50IHJlZzsKKworCXJlZyA9IHBpcnE7CisJaWYgKHJlZyA+PSAweDAxICYmIHJlZyA8PSAweDA0KQorCQlyZWcgKz0gMHg0MDsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShyb3V0ZXIsIHJlZywgJngpOworCXggJj0gfihQSVJRX1NJU19JUlFfTUFTSyB8IFBJUlFfU0lTX0lSUV9ESVNBQkxFKTsKKwl4IHw9IGlycSA/IGlycTogUElSUV9TSVNfSVJRX0RJU0FCTEU7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHJvdXRlciwgcmVnLCB4KTsKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogVkxTSTogbmliYmxlIG9mZnNldCAweDc0IC0gZWR1Y2F0ZWQgZ3Vlc3MgZHVlIHRvIHJvdXRpbmcgdGFibGUgYW5kCisgKiAgICAgICBjb25maWcgc3BhY2Ugb2YgVkxTSSA4MkM1MzQgUENJLWJyaWRnZS9yb3V0ZXIgKDEwMDQ6MDEwMikKKyAqICAgICAgIFRlc3RlZCBvbiBIUCBPbW5pQm9vayA4MDAgY292ZXJpbmcgUElSUSAxLCAyLCA0LCA4IGZvciBvbmJvYXJkCisgKiAgICAgICBkZXZpY2VzLCBQSVJRIDMgZm9yIG5vbi1wY2koISkgc291bmRjaGlwIGFuZCAodW50ZXN0ZWQpIFBJUlEgNgorICogICAgICAgZm9yIHRoZSBidXNicmlkZ2UgdG8gdGhlIGRvY2tpbmcgc3RhdGlvbi4KKyAqLworCitzdGF0aWMgaW50IHBpcnFfdmxzaV9nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCit7CisJaWYgKHBpcnEgPiA4KSB7CisJCXByaW50ayhLRVJOX0lORk8gIlZMU0kgcm91dGVyIHBpcnEgZXNjYXBlICglZClcbiIsIHBpcnEpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHJlYWRfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4NzQsIHBpcnEtMSk7Cit9CisKK3N0YXRpYyBpbnQgcGlycV92bHNpX3NldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSwgaW50IGlycSkKK3sKKwlpZiAocGlycSA+IDgpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVkxTSSByb3V0ZXIgcGlycSBlc2NhcGUgKCVkKVxuIiwgcGlycSk7CisJCXJldHVybiAwOworCX0KKwl3cml0ZV9jb25maWdfbnliYmxlKHJvdXRlciwgMHg3NCwgcGlycS0xLCBpcnEpOworCXJldHVybiAxOworfQorCisvKgorICogU2VydmVyV29ya3M6IFBDSSBpbnRlcnJ1cHRzIG1hcHBlZCB0byBzeXN0ZW0gSVJRIGxpbmVzIHRocm91Z2ggSW5kZXgKKyAqIGFuZCBSZWRpcmVjdCBJL08gcmVnaXN0ZXJzICgweDBjMDAgYW5kIDB4MGMwMSkuICBUaGUgSW5kZXggcmVnaXN0ZXIKKyAqIGZvcm1hdCBpcyAoUENJSVJRIyMgfCAweDEwKSwgZS5nLjogUENJSVJRMTA9MHgxYS4gIFRoZSBSZWRpcmVjdAorICogcmVnaXN0ZXIgaXMgYSBzdHJhaWdodCBiaW5hcnkgY29kaW5nIG9mIGRlc2lyZWQgUElDIElSUSAobG93IG5pYmJsZSkuCisgKgorICogVGhlICdsaW5rJyB2YWx1ZSBpbiB0aGUgUElSUSB0YWJsZSBpcyBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IGZvcm1hdAorICogZm9yIHRoZSBJbmRleCByZWdpc3Rlci4gIFRoZXJlIGFyZSBzb21lIHNwZWNpYWwgaW5kZXggdmFsdWVzOgorICogMHgwMCBmb3IgQUNQSSAoU0NJKSwgMHgwMSBmb3IgVVNCLCAweDAyIGZvciBJREUwLCAweDA0IGZvciBJREUxLAorICogYW5kIDB4MDMgZm9yIFNNQnVzLgorICovCitzdGF0aWMgaW50IHBpcnFfc2VydmVyd29ya3NfZ2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxKQoreworCW91dGJfcChwaXJxLCAweGMwMCk7CisJcmV0dXJuIGluYigweGMwMSkgJiAweGY7Cit9CisKK3N0YXRpYyBpbnQgcGlycV9zZXJ2ZXJ3b3Jrc19zZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEsIGludCBpcnEpCit7CisJb3V0Yl9wKHBpcnEsIDB4YzAwKTsKKwlvdXRiX3AoaXJxLCAweGMwMSk7CisJcmV0dXJuIDE7Cit9CisKKy8qIFN1cHBvcnQgZm9yIEFNRDc1NiBQQ0kgSVJRIFJvdXRpbmcKKyAqIEpob24gSC4gQ2FpY2VkbyA8amhjYWljZWRAb3Nzby5vcmcuY28+CisgKiBKdW4vMjEvMjAwMSAwLjIuMCBSZWxlYXNlLCBmaXhlZCB0byB1c2UgIm55YmJsZSIgZnVuY3Rpb25zLi4uIChqaGNhaWNlZCkKKyAqIEp1bi8xOS8yMDAxIEFscGhhIFJlbGVhc2UgMC4xLjAgKGpoY2FpY2VkKQorICogVGhlIEFNRDc1NiBwaXJxIHJ1bGVzIGFyZSBuaWJibGUtYmFzZWQKKyAqIG9mZnNldCAweDU2IDAtMyBQSVJRQSAgNC03ICBQSVJRQgorICogb2Zmc2V0IDB4NTcgMC0zIFBJUlFDICA0LTcgIFBJUlFECisgKi8KK3N0YXRpYyBpbnQgcGlycV9hbWQ3NTZfZ2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxKQoreworCXU4IGlycTsKKwlpcnEgPSAwOworCWlmIChwaXJxIDw9IDQpCisJeworCQlpcnEgPSByZWFkX2NvbmZpZ19ueWJibGUocm91dGVyLCAweDU2LCBwaXJxIC0gMSk7CisJfQorCXByaW50ayhLRVJOX0lORk8gIkFNRDc1NjogZGV2ICUwNHg6JTA0eCwgcm91dGVyIHBpcnEgOiAlZCBnZXQgaXJxIDogJTJkXG4iLAorCQlkZXYtPnZlbmRvciwgZGV2LT5kZXZpY2UsIHBpcnEsIGlycSk7CisJcmV0dXJuIGlycTsKK30KKworc3RhdGljIGludCBwaXJxX2FtZDc1Nl9zZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEsIGludCBpcnEpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiQU1ENzU2OiBkZXYgJTA0eDolMDR4LCByb3V0ZXIgcGlycSA6ICVkIFNFVCBpcnEgOiAlMmRcbiIsIAorCQlkZXYtPnZlbmRvciwgZGV2LT5kZXZpY2UsIHBpcnEsIGlycSk7CisJaWYgKHBpcnEgPD0gNCkKKwl7CisJCXdyaXRlX2NvbmZpZ19ueWJibGUocm91dGVyLCAweDU2LCBwaXJxIC0gMSwgaXJxKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJX0JJT1MKKworc3RhdGljIGludCBwaXJxX2Jpb3Nfc2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxLCBpbnQgaXJxKQoreworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CisJaW50IHBpbiA9IHBjaV9nZXRfaW50ZXJydXB0X3BpbihkZXYsICZicmlkZ2UpOworCXJldHVybiBwY2liaW9zX3NldF9pcnFfcm91dGluZyhicmlkZ2UsIHBpbiwgaXJxKTsKK30KKworI2VuZGlmCisKK3N0YXRpYyBfX2luaXQgaW50IGludGVsX3JvdXRlcl9wcm9iZShzdHJ1Y3QgaXJxX3JvdXRlciAqciwgc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdTE2IGRldmljZSkKK3sKKwlzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGlycV80NDBneFtdID0geworCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M0dYXzApIH0sCisJCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzR1hfMikgfSwKKwkJeyB9LAorCX07CisKKwkvKiA0NDBHWCBoYXMgYSBwcm9wcmlldGFyeSBQSVJRIHJvdXRlciAtLSBkb24ndCB1c2UgaXQgKi8KKwlpZiAocGNpX2Rldl9wcmVzZW50KHBpcnFfNDQwZ3gpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaChkZXZpY2UpCisJeworCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFGQl8wOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFTQl8wOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8wOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFNWDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzTVhfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUFfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUJfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfMTA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEyOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8wOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFXzA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVCXzA6CisJCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9FU0JfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMToKKwkJCXItPm5hbWUgPSAiUElJWC9JQ0giOworCQkJci0+Z2V0ID0gcGlycV9waWl4X2dldDsKKwkJCXItPnNldCA9IHBpcnFfcGlpeF9zZXQ7CisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHZpYV9yb3V0ZXJfcHJvYmUoc3RydWN0IGlycV9yb3V0ZXIgKnIsIHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHUxNiBkZXZpY2UpCit7CisJLyogRklYTUU6IFdlIHNob3VsZCBtb3ZlIHNvbWUgb2YgdGhlIHF1aXJrIGZpeHVwIHN0dWZmIGhlcmUgKi8KKwlzd2l0Y2goZGV2aWNlKQorCXsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1OTY6CisJCWNhc2UgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2OgorCQljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyMzE6CisJCS8qIEZJWE1FOiBhZGQgbmV3IG9uZXMgZm9yIDgyMzMvNSAqLworCQkJci0+bmFtZSA9ICJWSUEiOworCQkJci0+Z2V0ID0gcGlycV92aWFfZ2V0OworCQkJci0+c2V0ID0gcGlycV92aWFfc2V0OworCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbml0IGludCB2bHNpX3JvdXRlcl9wcm9iZShzdHJ1Y3QgaXJxX3JvdXRlciAqciwgc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdTE2IGRldmljZSkKK3sKKwlzd2l0Y2goZGV2aWNlKQorCXsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDNTM0OgorCQkJci0+bmFtZSA9ICJWTFNJIDgyQzUzNCI7CisJCQlyLT5nZXQgPSBwaXJxX3Zsc2lfZ2V0OworCQkJci0+c2V0ID0gcGlycV92bHNpX3NldDsKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgX19pbml0IGludCBzZXJ2ZXJ3b3Jrc19yb3V0ZXJfcHJvYmUoc3RydWN0IGlycV9yb3V0ZXIgKnIsIHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHUxNiBkZXZpY2UpCit7CisJc3dpdGNoKGRldmljZSkKKwl7CisJCWNhc2UgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0OgorCQljYXNlIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNToKKwkJCXItPm5hbWUgPSAiU2VydmVyV29ya3MiOworCQkJci0+Z2V0ID0gcGlycV9zZXJ2ZXJ3b3Jrc19nZXQ7CisJCQlyLT5zZXQgPSBwaXJxX3NlcnZlcndvcmtzX3NldDsKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgc2lzX3JvdXRlcl9wcm9iZShzdHJ1Y3QgaXJxX3JvdXRlciAqciwgc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdTE2IGRldmljZSkKK3sKKwlpZiAoZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfU0lfNTAzKQorCQlyZXR1cm4gMDsKKwkJCisJci0+bmFtZSA9ICJTSVMiOworCXItPmdldCA9IHBpcnFfc2lzX2dldDsKKwlyLT5zZXQgPSBwaXJxX3Npc19zZXQ7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IGN5cml4X3JvdXRlcl9wcm9iZShzdHJ1Y3QgaXJxX3JvdXRlciAqciwgc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdTE2IGRldmljZSkKK3sKKwlzd2l0Y2goZGV2aWNlKQorCXsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MjA6CisJCQlyLT5uYW1lID0gIk5hdFNlbWkiOworCQkJci0+Z2V0ID0gcGlycV9jeXJpeF9nZXQ7CisJCQlyLT5zZXQgPSBwaXJxX2N5cml4X3NldDsKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgb3B0aV9yb3V0ZXJfcHJvYmUoc3RydWN0IGlycV9yb3V0ZXIgKnIsIHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHUxNiBkZXZpY2UpCit7CisJc3dpdGNoKGRldmljZSkKKwl7CisJCWNhc2UgUENJX0RFVklDRV9JRF9PUFRJXzgyQzcwMDoKKwkJCXItPm5hbWUgPSAiT1BUSSI7CisJCQlyLT5nZXQgPSBwaXJxX29wdGlfZ2V0OworCQkJci0+c2V0ID0gcGlycV9vcHRpX3NldDsKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgaXRlX3JvdXRlcl9wcm9iZShzdHJ1Y3QgaXJxX3JvdXRlciAqciwgc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdTE2IGRldmljZSkKK3sKKwlzd2l0Y2goZGV2aWNlKQorCXsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0lURV9JVDgzMzBHXzA6CisJCQlyLT5uYW1lID0gIklURSI7CisJCQlyLT5nZXQgPSBwaXJxX2l0ZV9nZXQ7CisJCQlyLT5zZXQgPSBwaXJxX2l0ZV9zZXQ7CisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IGFsaV9yb3V0ZXJfcHJvYmUoc3RydWN0IGlycV9yb3V0ZXIgKnIsIHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHUxNiBkZXZpY2UpCit7CisJc3dpdGNoKGRldmljZSkKKwl7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0FMX00xNTMzOgorCWNhc2UgUENJX0RFVklDRV9JRF9BTF9NMTU2MzoKKwkJcHJpbnRrKCJQQ0k6IFVzaW5nIEFMSSBJUlEgUm91dGVyXG4iKTsKKwkJCXItPm5hbWUgPSAiQUxJIjsKKwkJCXItPmdldCA9IHBpcnFfYWxpX2dldDsKKwkJCXItPnNldCA9IHBpcnFfYWxpX3NldDsKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgYW1kX3JvdXRlcl9wcm9iZShzdHJ1Y3QgaXJxX3JvdXRlciAqciwgc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgdTE2IGRldmljZSkKK3sKKwlzd2l0Y2goZGV2aWNlKQorCXsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX0FNRF9WSVBFUl83NDBCOgorCQkJci0+bmFtZSA9ICJBTUQ3NTYiOworCQkJYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9BTURfVklQRVJfNzQxMzoKKwkJCXItPm5hbWUgPSAiQU1ENzY2IjsKKwkJCWJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfQU1EX1ZJUEVSXzc0NDM6CisJCQlyLT5uYW1lID0gIkFNRDc2OCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KKwlyLT5nZXQgPSBwaXJxX2FtZDc1Nl9nZXQ7CisJci0+c2V0ID0gcGlycV9hbWQ3NTZfc2V0OworCXJldHVybiAxOworfQorCQkKK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBpcnFfcm91dGVyX2hhbmRsZXIgcGlycV9yb3V0ZXJzW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBpbnRlbF9yb3V0ZXJfcHJvYmUgfSwKKwl7IFBDSV9WRU5ET1JfSURfQUwsIGFsaV9yb3V0ZXJfcHJvYmUgfSwKKwl7IFBDSV9WRU5ET1JfSURfSVRFLCBpdGVfcm91dGVyX3Byb2JlIH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgdmlhX3JvdXRlcl9wcm9iZSB9LAorCXsgUENJX1ZFTkRPUl9JRF9PUFRJLCBvcHRpX3JvdXRlcl9wcm9iZSB9LAorCXsgUENJX1ZFTkRPUl9JRF9TSSwgc2lzX3JvdXRlcl9wcm9iZSB9LAorCXsgUENJX1ZFTkRPUl9JRF9DWVJJWCwgY3lyaXhfcm91dGVyX3Byb2JlIH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZMU0ksIHZsc2lfcm91dGVyX3Byb2JlIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NFUlZFUldPUktTLCBzZXJ2ZXJ3b3Jrc19yb3V0ZXJfcHJvYmUgfSwKKwl7IFBDSV9WRU5ET1JfSURfQU1ELCBhbWRfcm91dGVyX3Byb2JlIH0sCisJLyogU29tZW9uZSB3aXRoIGRvY3MgbmVlZHMgdG8gYWRkIHRoZSBBVEkgUmFkZW9uIElHUCAqLworCXsgMCwgTlVMTCB9Cit9Oworc3RhdGljIHN0cnVjdCBpcnFfcm91dGVyIHBpcnFfcm91dGVyOworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpwaXJxX3JvdXRlcl9kZXY7CisKKworLyoKKyAqCUZJWE1FOiBzaG91bGQgd2UgaGF2ZSBhbiBvcHRpb24gdG8gc2F5ICJnZW5lcmljIGZvcgorICoJY2hpcHNldCIgPworICovCisgCitzdGF0aWMgdm9pZCBfX2luaXQgcGlycV9maW5kX3JvdXRlcihzdHJ1Y3QgaXJxX3JvdXRlciAqcikKK3sKKwlzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKnJ0ID0gcGlycV90YWJsZTsKKwlzdHJ1Y3QgaXJxX3JvdXRlcl9oYW5kbGVyICpoOworCisjaWZkZWYgQ09ORklHX1BDSV9CSU9TCisJaWYgKCFydC0+c2lnbmF0dXJlKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlBDSTogVXNpbmcgQklPUyBmb3IgSVJRIHJvdXRpbmdcbiIpOworCQlyLT5zZXQgPSBwaXJxX2Jpb3Nfc2V0OworCQlyLT5uYW1lID0gIkJJT1MiOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwkvKiBEZWZhdWx0IHVubGVzcyBhIGRyaXZlciByZWxvYWRzIGl0ICovCisJci0+bmFtZSA9ICJkZWZhdWx0IjsKKwlyLT5nZXQgPSBOVUxMOworCXItPnNldCA9IE5VTEw7CisJCisJREJHKCJQQ0k6IEF0dGVtcHRpbmcgdG8gZmluZCBJUlEgcm91dGVyIGZvciAlMDR4OiUwNHhcbiIsCisJICAgIHJ0LT5ydHJfdmVuZG9yLCBydC0+cnRyX2RldmljZSk7CisKKwlwaXJxX3JvdXRlcl9kZXYgPSBwY2lfZmluZF9zbG90KHJ0LT5ydHJfYnVzLCBydC0+cnRyX2RldmZuKTsKKwlpZiAoIXBpcnFfcm91dGVyX2RldikgeworCQlEQkcoIlBDSTogSW50ZXJydXB0IHJvdXRlciBub3QgZm91bmQgYXQgJTAyeDolMDJ4XG4iLCBydC0+cnRyX2J1cywgcnQtPnJ0cl9kZXZmbik7CisJCXJldHVybjsKKwl9CisKKwlmb3IoIGggPSBwaXJxX3JvdXRlcnM7IGgtPnZlbmRvcjsgaCsrKSB7CisJCS8qIEZpcnN0IGxvb2sgZm9yIGEgcm91dGVyIG1hdGNoICovCisJCWlmIChydC0+cnRyX3ZlbmRvciA9PSBoLT52ZW5kb3IgJiYgaC0+cHJvYmUociwgcGlycV9yb3V0ZXJfZGV2LCBydC0+cnRyX2RldmljZSkpCisJCQlicmVhazsKKwkJLyogRmFsbCBiYWNrIHRvIGEgZGV2aWNlIG1hdGNoICovCisJCWlmIChwaXJxX3JvdXRlcl9kZXYtPnZlbmRvciA9PSBoLT52ZW5kb3IgJiYgaC0+cHJvYmUociwgcGlycV9yb3V0ZXJfZGV2LCBwaXJxX3JvdXRlcl9kZXYtPmRldmljZSkpCisJCQlicmVhazsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBJUlEgcm91dGVyICVzIFslMDR4LyUwNHhdIGF0ICVzXG4iLAorCQlwaXJxX3JvdXRlci5uYW1lLAorCQlwaXJxX3JvdXRlcl9kZXYtPnZlbmRvciwKKwkJcGlycV9yb3V0ZXJfZGV2LT5kZXZpY2UsCisJCXBjaV9uYW1lKHBpcnFfcm91dGVyX2RldikpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9pbmZvICpwaXJxX2dldF9pbmZvKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlICpydCA9IHBpcnFfdGFibGU7CisJaW50IGVudHJpZXMgPSAocnQtPnNpemUgLSBzaXplb2Yoc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlKSkgLyBzaXplb2Yoc3RydWN0IGlycV9pbmZvKTsKKwlzdHJ1Y3QgaXJxX2luZm8gKmluZm87CisKKwlmb3IgKGluZm8gPSBydC0+c2xvdHM7IGVudHJpZXMtLTsgaW5mbysrKQorCQlpZiAoaW5mby0+YnVzID09IGRldi0+YnVzLT5udW1iZXIgJiYgUENJX1NMT1QoaW5mby0+ZGV2Zm4pID09IFBDSV9TTE9UKGRldi0+ZGV2Zm4pKQorCQkJcmV0dXJuIGluZm87CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcGNpYmlvc19sb29rdXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBhc3NpZ24pCit7CisJdTggcGluOworCXN0cnVjdCBpcnFfaW5mbyAqaW5mbzsKKwlpbnQgaSwgcGlycSwgbmV3aXJxOworCWludCBpcnEgPSAwOworCXUzMiBtYXNrOworCXN0cnVjdCBpcnFfcm91dGVyICpyID0gJnBpcnFfcm91dGVyOworCXN0cnVjdCBwY2lfZGV2ICpkZXYyID0gTlVMTDsKKwljaGFyICptc2cgPSBOVUxMOworCisJLyogRmluZCBJUlEgcGluICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisJaWYgKCFwaW4pIHsKKwkJREJHKCIgLT4gbm8gaW50ZXJydXB0IHBpblxuIik7CisJCXJldHVybiAwOworCX0KKwlwaW4gPSBwaW4gLSAxOworCisJLyogRmluZCBJUlEgcm91dGluZyBlbnRyeSAqLworCisJaWYgKCFwaXJxX3RhYmxlKQorCQlyZXR1cm4gMDsKKwkKKwlEQkcoIklSUSBmb3IgJXNbJWNdIiwgcGNpX25hbWUoZGV2KSwgJ0EnICsgcGluKTsKKwlpbmZvID0gcGlycV9nZXRfaW5mbyhkZXYpOworCWlmICghaW5mbykgeworCQlEQkcoIiAtPiBub3QgZm91bmQgaW4gcm91dGluZyB0YWJsZVxuIik7CisJCXJldHVybiAwOworCX0KKwlwaXJxID0gaW5mby0+aXJxW3Bpbl0ubGluazsKKwltYXNrID0gaW5mby0+aXJxW3Bpbl0uYml0bWFwOworCWlmICghcGlycSkgeworCQlEQkcoIiAtPiBub3Qgcm91dGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCURCRygiIC0+IFBJUlEgJTAyeCwgbWFzayAlMDR4LCBleGNsICUwNHgiLCBwaXJxLCBtYXNrLCBwaXJxX3RhYmxlLT5leGNsdXNpdmVfaXJxcyk7CisJbWFzayAmPSBwY2liaW9zX2lycV9tYXNrOworCisJLyogV29yayBhcm91bmQgYnJva2VuIEhQIFBhdmlsaW9uIE5vdGVib29rcyB3aGljaCBhc3NpZ24gVVNCIHRvCisJICAgSVJRIDkgZXZlbiB0aG91Z2ggaXQgaXMgYWN0dWFsbHkgd2lyZWQgdG8gSVJRIDExICovCisKKwlpZiAoYnJva2VuX2hwX2Jpb3NfaXJxOSAmJiBwaXJxID09IDB4NTkgJiYgZGV2LT5pcnEgPT0gOSkgeworCQlkZXYtPmlycSA9IDExOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIDExKTsKKwkJci0+c2V0KHBpcnFfcm91dGVyX2RldiwgZGV2LCBwaXJxLCAxMSk7CisJfQorCisJLyogc2FtZSBmb3IgQWNlciBUcmF2ZWxtYXRlIDM2MCwgYnV0IHdpdGggQ0IgYW5kIGlycSAxMSAtPiAxMCAqLworCWlmIChhY2VyX3RtMzYwX2lycXJvdXRpbmcgJiYgZGV2LT5pcnEgPT0gMTEgJiYgZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9PMikgeworCQlwaXJxID0gMHg2ODsKKwkJbWFzayA9IDB4NDAwOworCQlkZXYtPmlycSA9IHItPmdldChwaXJxX3JvdXRlcl9kZXYsIGRldiwgcGlycSk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgZGV2LT5pcnEpOworCX0KKworCS8qCisJICogRmluZCB0aGUgYmVzdCBJUlEgdG8gYXNzaWduOiB1c2UgdGhlIG9uZQorCSAqIHJlcG9ydGVkIGJ5IHRoZSBkZXZpY2UgaWYgcG9zc2libGUuCisJICovCisJbmV3aXJxID0gZGV2LT5pcnE7CisJaWYgKCEoKDEgPDwgbmV3aXJxKSAmIG1hc2spKSB7CisJCWlmICggcGNpX3Byb2JlICYgUENJX1VTRV9QSVJRX01BU0spIG5ld2lycSA9IDA7CisJCWVsc2UgcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBJUlEgJWkgZm9yIGRldmljZSAlcyBkb2Vzbid0IG1hdGNoIFBJUlEgbWFzayAtIHRyeSBwY2k9dXNlcGlycW1hc2tcbiIsIG5ld2lycSwgcGNpX25hbWUoZGV2KSk7CisJfQorCWlmICghbmV3aXJxICYmIGFzc2lnbikgeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJaWYgKCEobWFzayAmICgxIDw8IGkpKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwaXJxX3BlbmFsdHlbaV0gPCBwaXJxX3BlbmFsdHlbbmV3aXJxXSAmJiBjYW5fcmVxdWVzdF9pcnEoaSwgU0FfU0hJUlEpKQorCQkJCW5ld2lycSA9IGk7CisJCX0KKwl9CisJREJHKCIgLT4gbmV3aXJxPSVkIiwgbmV3aXJxKTsKKworCS8qIENoZWNrIGlmIGl0IGlzIGhhcmRjb2RlZCAqLworCWlmICgocGlycSAmIDB4ZjApID09IDB4ZjApIHsKKwkJaXJxID0gcGlycSAmIDB4ZjsKKwkJREJHKCIgLT4gaGFyZGNvZGVkIElSUSAlZFxuIiwgaXJxKTsKKwkJbXNnID0gIkhhcmRjb2RlZCI7CisJfSBlbHNlIGlmICggci0+Z2V0ICYmIChpcnEgPSByLT5nZXQocGlycV9yb3V0ZXJfZGV2LCBkZXYsIHBpcnEpKSAmJiBcCisJKCghKHBjaV9wcm9iZSAmIFBDSV9VU0VfUElSUV9NQVNLKSkgfHwgKCgxIDw8IGlycSkgJiBtYXNrKSkgKSB7CisJCURCRygiIC0+IGdvdCBJUlEgJWRcbiIsIGlycSk7CisJCW1zZyA9ICJGb3VuZCI7CisJfSBlbHNlIGlmIChuZXdpcnEgJiYgci0+c2V0ICYmIChkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSkgeworCQlEQkcoIiAtPiBhc3NpZ25pbmcgSVJRICVkIiwgbmV3aXJxKTsKKwkJaWYgKHItPnNldChwaXJxX3JvdXRlcl9kZXYsIGRldiwgcGlycSwgbmV3aXJxKSkgeworCQkJZWlzYV9zZXRfbGV2ZWxfaXJxKG5ld2lycSk7CisJCQlEQkcoIiAuLi4gT0tcbiIpOworCQkJbXNnID0gIkFzc2lnbmVkIjsKKwkJCWlycSA9IG5ld2lycTsKKwkJfQorCX0KKworCWlmICghaXJxKSB7CisJCURCRygiIC4uLiBmYWlsZWRcbiIpOworCQlpZiAobmV3aXJxICYmIG1hc2sgPT0gKDEgPDwgbmV3aXJxKSkgeworCQkJbXNnID0gIkd1ZXNzZWQiOworCQkJaXJxID0gbmV3aXJxOworCQl9IGVsc2UKKwkJCXJldHVybiAwOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJQQ0k6ICVzIElSUSAlZCBmb3IgZGV2aWNlICVzXG4iLCBtc2csIGlycSwgcGNpX25hbWUoZGV2KSk7CisKKwkvKiBVcGRhdGUgSVJRIGZvciBhbGwgZGV2aWNlcyB3aXRoIHRoZSBzYW1lIHBpcnEgdmFsdWUgKi8KKwl3aGlsZSAoKGRldjIgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYyKSkgIT0gTlVMTCkgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYyLCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisJCWlmICghcGluKQorCQkJY29udGludWU7CisJCXBpbi0tOworCQlpbmZvID0gcGlycV9nZXRfaW5mbyhkZXYyKTsKKwkJaWYgKCFpbmZvKQorCQkJY29udGludWU7CisJCWlmIChpbmZvLT5pcnFbcGluXS5saW5rID09IHBpcnEpIHsKKwkJCS8qIFdlIHJlZnVzZSB0byBvdmVycmlkZSB0aGUgZGV2LT5pcnEgaW5mb3JtYXRpb24uIEdpdmUgYSB3YXJuaW5nISAqLworCQkgICAgCWlmICggZGV2Mi0+aXJxICYmIGRldjItPmlycSAhPSBpcnEgJiYgXAorCQkJKCEocGNpX3Byb2JlICYgUENJX1VTRV9QSVJRX01BU0spIHx8IFwKKwkJCSgoMSA8PCBkZXYyLT5pcnEpICYgbWFzaykpICkgeworI2lmbmRlZiBDT05GSUdfUENJX01TSQorCQkgICAgCQlwcmludGsoS0VSTl9JTkZPICJJUlEgcm91dGluZyBjb25mbGljdCBmb3IgJXMsIGhhdmUgaXJxICVkLCB3YW50IGlycSAlZFxuIiwKKwkJCQkgICAgICAgcGNpX25hbWUoZGV2MiksIGRldjItPmlycSwgaXJxKTsKKyNlbmRpZgorCQkgICAgCQljb250aW51ZTsKKwkJICAgIAl9CisJCQlkZXYyLT5pcnEgPSBpcnE7CisJCQlwaXJxX3BlbmFsdHlbaXJxXSsrOworCQkJaWYgKGRldiAhPSBkZXYyKQorCQkJCXByaW50ayhLRVJOX0lORk8gIlBDSTogU2hhcmluZyBJUlEgJWQgd2l0aCAlc1xuIiwgaXJxLCBwY2lfbmFtZShkZXYyKSk7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2liaW9zX2ZpeHVwX2lycXModm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwl1OCBwaW47CisKKwlEQkcoIlBDSTogSVJRIGZpeHVwXG4iKTsKKwl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKKwkJLyoKKwkJICogSWYgdGhlIEJJT1MgaGFzIHNldCBhbiBvdXQgb2YgcmFuZ2UgSVJRIG51bWJlciwganVzdCBpZ25vcmUgaXQuCisJCSAqIEFsc28ga2VlcCB0cmFjayBvZiB3aGljaCBJUlEncyBhcmUgYWxyZWFkeSBpbiB1c2UuCisJCSAqLworCQlpZiAoZGV2LT5pcnEgPj0gMTYpIHsKKwkJCURCRygiJXM6IGlnbm9yaW5nIGJvZ3VzIElSUSAlZFxuIiwgcGNpX25hbWUoZGV2KSwgZGV2LT5pcnEpOworCQkJZGV2LT5pcnEgPSAwOworCQl9CisJCS8qIElmIHRoZSBJUlEgaXMgYWxyZWFkeSBhc3NpZ25lZCB0byBhIFBDSSBkZXZpY2UsIGlnbm9yZSBpdHMgSVNBIHVzZSBwZW5hbHR5ICovCisJCWlmIChwaXJxX3BlbmFsdHlbZGV2LT5pcnFdID49IDEwMCAmJiBwaXJxX3BlbmFsdHlbZGV2LT5pcnFdIDwgMTAwMDAwKQorCQkJcGlycV9wZW5hbHR5W2Rldi0+aXJxXSA9IDA7CisJCXBpcnFfcGVuYWx0eVtkZXYtPmlycV0rKzsKKwl9CisKKwlkZXYgPSBOVUxMOworCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwkJLyoKKwkJICogUmVjYWxjdWxhdGUgSVJRIG51bWJlcnMgaWYgd2UgdXNlIHRoZSBJL08gQVBJQy4KKwkJICovCisJCWlmIChpb19hcGljX2Fzc2lnbl9wY2lfaXJxcykKKwkJeworCQkJaW50IGlycTsKKworCQkJaWYgKHBpbikgeworCQkJCXBpbi0tOwkJLyogaW50ZXJydXB0IHBpbnMgYXJlIG51bWJlcmVkIHN0YXJ0aW5nIGZyb20gMSAqLworCQkJCWlycSA9IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4pOworCS8qCisJICogQnVzc2VzIGJlaGluZCBicmlkZ2VzIGFyZSB0eXBpY2FsbHkgbm90IGxpc3RlZCBpbiB0aGUgTVAtdGFibGUuCisJICogSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gbG9vayB1cCB0aGUgSVJRIGJhc2VkIG9uIHRoZSBwYXJlbnQgYnVzLAorCSAqIHBhcmVudCBzbG90LCBhbmQgcGluIG51bWJlci4gVGhlIFNNUCBjb2RlIGRldGVjdHMgc3VjaCBicmlkZ2VkCisJICogYnVzc2VzIGl0c2VsZiBzbyB3ZSBzaG91bGQgZ2V0IGludG8gdGhpcyBicmFuY2ggcmVsaWFibHkuCisJICovCisJCQkJaWYgKGlycSA8IDAgJiYgZGV2LT5idXMtPnBhcmVudCkgeyAvKiBnbyBiYWNrIHRvIHRoZSBicmlkZ2UgKi8KKwkJCQkJc3RydWN0IHBjaV9kZXYgKiBicmlkZ2UgPSBkZXYtPmJ1cy0+c2VsZjsKKworCQkJCQlwaW4gPSAocGluICsgUENJX1NMT1QoZGV2LT5kZXZmbikpICUgNDsKKwkJCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoYnJpZGdlLT5idXMtPm51bWJlciwgCisJCQkJCQkJUENJX1NMT1QoYnJpZGdlLT5kZXZmbiksIHBpbik7CisJCQkJCWlmIChpcnEgPj0gMCkKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogdXNpbmcgUFBCICVzWyVjXSB0byBnZXQgaXJxICVkXG4iLAorCQkJCQkJCXBjaV9uYW1lKGJyaWRnZSksICdBJyArIHBpbiwgaXJxKTsKKwkJCQl9CisJCQkJaWYgKGlycSA+PSAwKSB7CisJCQkJCWlmICh1c2VfcGNpX3ZlY3RvcigpICYmCisJCQkJCQkhcGxhdGZvcm1fbGVnYWN5X2lycShpcnEpKQorCQkJCQkJaXJxID0gSU9fQVBJQ19WRUNUT1IoaXJxKTsKKworCQkJCQlwcmludGsoS0VSTl9JTkZPICJQQ0ktPkFQSUMgSVJRIHRyYW5zZm9ybTogJXNbJWNdIC0+IElSUSAlZFxuIiwKKwkJCQkJCXBjaV9uYW1lKGRldiksICdBJyArIHBpbiwgaXJxKTsKKwkJCQkJZGV2LT5pcnEgPSBpcnE7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYKKwkJLyoKKwkJICogU3RpbGwgbm8gSVJRPyBUcnkgdG8gbG9va3VwIG9uZS4uLgorCQkgKi8KKwkJaWYgKHBpbiAmJiAhZGV2LT5pcnEpCisJCQlwY2liaW9zX2xvb2t1cF9pcnEoZGV2LCAwKTsKKwl9Cit9CisKKy8qCisgKiBXb3JrIGFyb3VuZCBicm9rZW4gSFAgUGF2aWxpb24gTm90ZWJvb2tzIHdoaWNoIGFzc2lnbiBVU0IgdG8KKyAqIElSUSA5IGV2ZW4gdGhvdWdoIGl0IGlzIGFjdHVhbGx5IHdpcmVkIHRvIElSUSAxMQorICovCitzdGF0aWMgaW50IF9faW5pdCBmaXhfYnJva2VuX2hwX2Jpb3NfaXJxOShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlpZiAoIWJyb2tlbl9ocF9iaW9zX2lycTkpIHsKKwkJYnJva2VuX2hwX2Jpb3NfaXJxOSA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIGRldGVjdGVkIC0gZml4aW5nIGJyb2tlbiBJUlEgcm91dGluZ1xuIiwgZC0+aWRlbnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdvcmsgYXJvdW5kIGJyb2tlbiBBY2VyIFRyYXZlbE1hdGUgMzYwIE5vdGVib29rcyB3aGljaCBhc3NpZ24KKyAqIENhcmRidXMgdG8gSVJRIDExIGV2ZW4gdGhvdWdoIGl0IGlzIGFjdHVhbGx5IHdpcmVkIHRvIElSUSAxMAorICovCitzdGF0aWMgaW50IF9faW5pdCBmaXhfYWNlcl90bTM2MF9pcnFyb3V0aW5nKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmICghYWNlcl90bTM2MF9pcnFyb3V0aW5nKSB7CisJCWFjZXJfdG0zNjBfaXJxcm91dGluZyA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIGRldGVjdGVkIC0gZml4aW5nIGJyb2tlbiBJUlEgcm91dGluZ1xuIiwgZC0+aWRlbnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgcGNpaXJxX2RtaV90YWJsZVtdID0geworCXsKKwkJLmNhbGxiYWNrID0gZml4X2Jyb2tlbl9ocF9iaW9zX2lycTksCisJCS5pZGVudCA9ICJIUCBQYXZpbGlvbiBONTQwMCBTZXJpZXMgTGFwdG9wIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKKwkJCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiR0UuTTEuMDMiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiSFAgUGF2aWxpb24gTm90ZWJvb2sgTW9kZWwgR0UiKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVSU0lPTiwgIk9tbmlCb29rIE4zMk4tNzM2IiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGZpeF9hY2VyX3RtMzYwX2lycXJvdXRpbmcsCisJCS5pZGVudCA9ICJBY2VyIFRyYXZlbE1hdGUgMzZ4IExhcHRvcCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUcmF2ZWxNYXRlIDM2MCIpLAorCQl9LAorCX0sCisJeyB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2lycV9pbml0KHZvaWQpCit7CisJREJHKCJQQ0k6IElSUSBpbml0XG4iKTsKKworCWlmIChwY2liaW9zX2VuYWJsZV9pcnEgfHwgcmF3X3BjaV9vcHMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlkbWlfY2hlY2tfc3lzdGVtKHBjaWlycV9kbWlfdGFibGUpOworCisJcGlycV90YWJsZSA9IHBpcnFfZmluZF9yb3V0aW5nX3RhYmxlKCk7CisKKyNpZmRlZiBDT05GSUdfUENJX0JJT1MKKwlpZiAoIXBpcnFfdGFibGUgJiYgKHBjaV9wcm9iZSAmIFBDSV9CSU9TX0lSUV9TQ0FOKSkKKwkJcGlycV90YWJsZSA9IHBjaWJpb3NfZ2V0X2lycV9yb3V0aW5nX3RhYmxlKCk7CisjZW5kaWYKKwlpZiAocGlycV90YWJsZSkgeworCQlwaXJxX3BlZXJfdHJpY2soKTsKKwkJcGlycV9maW5kX3JvdXRlcigmcGlycV9yb3V0ZXIpOworCQlpZiAocGlycV90YWJsZS0+ZXhjbHVzaXZlX2lycXMpIHsKKwkJCWludCBpOworCQkJZm9yIChpPTA7IGk8MTY7IGkrKykKKwkJCQlpZiAoIShwaXJxX3RhYmxlLT5leGNsdXNpdmVfaXJxcyAmICgxIDw8IGkpKSkKKwkJCQkJcGlycV9wZW5hbHR5W2ldICs9IDEwMDsKKwkJfQorCQkvKiBJZiB3ZSdyZSB1c2luZyB0aGUgSS9PIEFQSUMsIGF2b2lkIHVzaW5nIHRoZSBQQ0kgSVJRIHJvdXRpbmcgdGFibGUgKi8KKwkJaWYgKGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzKQorCQkJcGlycV90YWJsZSA9IE5VTEw7CisJfQorCisJcGNpYmlvc19lbmFibGVfaXJxID0gcGlycV9lbmFibGVfaXJxOworCisJcGNpYmlvc19maXh1cF9pcnFzKCk7CisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChwY2liaW9zX2lycV9pbml0KTsKKworCitzdGF0aWMgdm9pZCBwaXJxX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3sKKwkvKgorCSAqICBJZiBhbnkgSVNBUG5QIGRldmljZSByZXBvcnRzIGFuIElSUSBpbiBpdHMgbGlzdCBvZiBwb3NzaWJsZQorCSAqICBJUlEncywgd2UgdHJ5IHRvIGF2b2lkIGFzc2lnbmluZyBpdCB0byBQQ0kgZGV2aWNlcy4KKwkgKi8KKwlpZiAoaXJxIDwgMTYpCisJCXBpcnFfcGVuYWx0eVtpcnFdICs9IDEwMDsKK30KKwordm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3sKKyNpZmRlZiBDT05GSUdfQUNQSV9QQ0kKKwlpZiAoIWFjcGlfbm9pcnEpCisJCWFjcGlfcGVuYWxpemVfaXNhX2lycShpcnEpOworCWVsc2UKKyNlbmRpZgorCQlwaXJxX3BlbmFsaXplX2lzYV9pcnEoaXJxKTsKK30KKworc3RhdGljIGludCBwaXJxX2VuYWJsZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1OCBwaW47CisJZXh0ZXJuIGludCB2aWFfaW50ZXJydXB0X2xpbmVfcXVpcms7CisJc3RydWN0IHBjaV9kZXYgKnRlbXBfZGV2OworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisJaWYgKHBpbiAmJiAhcGNpYmlvc19sb29rdXBfaXJxKGRldiwgMSkgJiYgIWRldi0+aXJxKSB7CisJCWNoYXIgKm1zZyA9ICIiOworCisJCXBpbi0tOwkJLyogaW50ZXJydXB0IHBpbnMgYXJlIG51bWJlcmVkIHN0YXJ0aW5nIGZyb20gMSAqLworCisJCWlmIChpb19hcGljX2Fzc2lnbl9wY2lfaXJxcykgeworCQkJaW50IGlycTsKKworCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbik7CisJCQkvKgorCQkJICogQnVzc2VzIGJlaGluZCBicmlkZ2VzIGFyZSB0eXBpY2FsbHkgbm90IGxpc3RlZCBpbiB0aGUgTVAtdGFibGUuCisJCQkgKiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBsb29rIHVwIHRoZSBJUlEgYmFzZWQgb24gdGhlIHBhcmVudCBidXMsCisJCQkgKiBwYXJlbnQgc2xvdCwgYW5kIHBpbiBudW1iZXIuIFRoZSBTTVAgY29kZSBkZXRlY3RzIHN1Y2ggYnJpZGdlZAorCQkJICogYnVzc2VzIGl0c2VsZiBzbyB3ZSBzaG91bGQgZ2V0IGludG8gdGhpcyBicmFuY2ggcmVsaWFibHkuCisJCQkgKi8KKwkJCXRlbXBfZGV2ID0gZGV2OworCQkJd2hpbGUgKGlycSA8IDAgJiYgZGV2LT5idXMtPnBhcmVudCkgeyAvKiBnbyBiYWNrIHRvIHRoZSBicmlkZ2UgKi8KKwkJCQlzdHJ1Y3QgcGNpX2RldiAqIGJyaWRnZSA9IGRldi0+YnVzLT5zZWxmOworCisJCQkJcGluID0gKHBpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSAlIDQ7CisJCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoYnJpZGdlLT5idXMtPm51bWJlciwgCisJCQkJCQlQQ0lfU0xPVChicmlkZ2UtPmRldmZuKSwgcGluKTsKKwkJCQlpZiAoaXJxID49IDApCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogdXNpbmcgUFBCICVzWyVjXSB0byBnZXQgaXJxICVkXG4iLAorCQkJCQkJcGNpX25hbWUoYnJpZGdlKSwgJ0EnICsgcGluLCBpcnEpOworCQkJCWRldiA9IGJyaWRnZTsKKwkJCX0KKwkJCWRldiA9IHRlbXBfZGV2OworCQkJaWYgKGlycSA+PSAwKSB7CisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwkJCQlpZiAoIXBsYXRmb3JtX2xlZ2FjeV9pcnEoaXJxKSkKKwkJCQkJaXJxID0gSU9fQVBJQ19WRUNUT1IoaXJxKTsKKyNlbmRpZgorCQkJCXByaW50ayhLRVJOX0lORk8gIlBDSS0+QVBJQyBJUlEgdHJhbnNmb3JtOiAlc1slY10gLT4gSVJRICVkXG4iLAorCQkJCQlwY2lfbmFtZShkZXYpLCAnQScgKyBwaW4sIGlycSk7CisJCQkJZGV2LT5pcnEgPSBpcnE7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UKKwkJCQltc2cgPSAiIFByb2JhYmx5IGJ1Z2d5IE1QIHRhYmxlLiI7CisJCX0gZWxzZSBpZiAocGNpX3Byb2JlICYgUENJX0JJT1NfSVJRX1NDQU4pCisJCQltc2cgPSAiIjsKKwkJZWxzZQorCQkJbXNnID0gIiBQbGVhc2UgdHJ5IHVzaW5nIHBjaT1iaW9zaXJxLiI7CisKKwkJLyogV2l0aCBJREUgbGVnYWN5IGRldmljZXMgdGhlIElSUSBsb29rdXAgZmFpbHVyZSBpcyBub3QgYSBwcm9ibGVtLi4gKi8KKwkJaWYgKGRldi0+Y2xhc3MgPj4gOCA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUgJiYgIShkZXYtPmNsYXNzICYgMHg1KSkKKwkJCXJldHVybiAwOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogTm8gSVJRIGtub3duIGZvciBpbnRlcnJ1cHQgcGluICVjIG9mIGRldmljZSAlcy4lc1xuIiwKKwkJICAgICAgICdBJyArIHBpbiwgcGNpX25hbWUoZGV2KSwgbXNnKTsKKwl9CisJLyogVklBIGJyaWRnZXMgdXNlIGludGVycnVwdCBsaW5lIGZvciBhcGljL3BjaSBzdGVlcmluZyBhY3Jvc3MKKwkgICB0aGUgVi1MaW5rICovCisJZWxzZSBpZiAodmlhX2ludGVycnVwdF9saW5lX3F1aXJrKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGRldi0+aXJxICYgMTUpOworCXJldHVybiAwOworfQorCitpbnQgcGNpX3ZlY3Rvcl9yZXNvdXJjZXMoaW50IGxhc3QsIGludCBucl9yZWxlYXNlZCkKK3sKKwlpbnQgY291bnQgPSBucl9yZWxlYXNlZDsKKworCWludCBuZXh0ID0gbGFzdDsKKwlpbnQgb2Zmc2V0ID0gKGxhc3QgJSA4KTsKKworCXdoaWxlIChuZXh0IDwgRklSU1RfU1lTVEVNX1ZFQ1RPUikgeworCQluZXh0ICs9IDg7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQlpZiAobmV4dCA9PSBJQTMyX1NZU0NBTExfVkVDVE9SKQorCQkJY29udGludWU7CisjZWxzZQorCQlpZiAobmV4dCA9PSBTWVNDQUxMX1ZFQ1RPUikKKwkJCWNvbnRpbnVlOworI2VuZGlmCisJCWNvdW50Kys7CisJCWlmIChuZXh0ID49IEZJUlNUX1NZU1RFTV9WRUNUT1IpIHsKKwkJCWlmIChvZmZzZXQlOCkgeworCQkJCW5leHQgPSBGSVJTVF9ERVZJQ0VfVkVDVE9SICsgb2Zmc2V0OworCQkJCW9mZnNldCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY291bnQtLTsKKwkJfQorCX0KKworCXJldHVybiBjb3VudDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvbGVnYWN5LmMgYi9hcmNoL2kzODYvcGNpL2xlZ2FjeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTJlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvcGNpL2xlZ2FjeS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBsZWdhY3kuYyAtIHRyYWRpdGlvbmFsLCBvbGQgc2Nob29sIFBDSSBidXMgcHJvYmluZworICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInBjaS5oIgorCisvKgorICogRGlzY292ZXIgcmVtYWluaW5nIFBDSSBidXNlcyBpbiBjYXNlIHRoZXJlIGFyZSBwZWVyIGhvc3QgYnJpZGdlcy4KKyAqIFdlIHVzZSB0aGUgbnVtYmVyIG9mIGxhc3QgUENJIGJ1cyBwcm92aWRlZCBieSB0aGUgUENJIEJJT1MuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2ZpeHVwX3BlZXJfYnJpZGdlcyh2b2lkKQoreworCWludCBuLCBkZXZmbjsKKworCWlmIChwY2liaW9zX2xhc3RfYnVzIDw9IDAgfHwgcGNpYmlvc19sYXN0X2J1cyA+PSAweGZmKQorCQlyZXR1cm47CisJREJHKCJQQ0k6IFBlZXIgYnJpZGdlIGZpeHVwXG4iKTsKKworCWZvciAobj0wOyBuIDw9IHBjaWJpb3NfbGFzdF9idXM7IG4rKykgeworCQl1MzIgbDsKKwkJaWYgKHBjaV9maW5kX2J1cygwLCBuKSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGRldmZuID0gMDsgZGV2Zm4gPCAyNTY7IGRldmZuICs9IDgpIHsKKwkJCWlmICghcmF3X3BjaV9vcHMtPnJlYWQoMCwgbiwgZGV2Zm4sIFBDSV9WRU5ET1JfSUQsIDIsICZsKSAmJgorCQkJICAgIGwgIT0gMHgwMDAwICYmIGwgIT0gMHhmZmZmKSB7CisJCQkJREJHKCJGb3VuZCBkZXZpY2UgYXQgJTAyeDolMDJ4IFslMDR4XVxuIiwgbiwgZGV2Zm4sIGwpOworCQkJCXByaW50ayhLRVJOX0lORk8gIlBDSTogRGlzY292ZXJlZCBwZWVyIGJ1cyAlMDJ4XG4iLCBuKTsKKwkJCQlwY2lfc2Nhbl9idXMobiwgJnBjaV9yb290X29wcywgTlVMTCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9sZWdhY3lfaW5pdCh2b2lkKQoreworCWlmICghcmF3X3BjaV9vcHMpIHsKKwkJcHJpbnRrKCJQQ0k6IFN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFBDSVxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwY2liaW9zX3NjYW5uZWQrKykKKwkJcmV0dXJuIDA7CisKKwlwcmludGsoIlBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmVcbiIpOworCXBjaV9yb290X2J1cyA9IHBjaWJpb3Nfc2Nhbl9yb290KDApOworCisJcGNpYmlvc19maXh1cF9wZWVyX2JyaWRnZXMoKTsKKworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwocGNpX2xlZ2FjeV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvbW1jb25maWcuYyBiL2FyY2gvaTM4Ni9wY2kvbW1jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjFhNTBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE1hdHRoZXcgV2lsY294IDxtYXR0aGV3QHdpbC5jeD4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBJbnRlbCBDb3JwLgorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgorICovCisKKy8qCisgKiBtbWNvbmZpZy5jIC0gTG93LWxldmVsIGRpcmVjdCBQQ0kgY29uZmlnIHNwYWNlIGFjY2VzcyB2aWEgTU1DT05GSUcKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgInBjaS5oIgorCisvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgTU1DT05GSUcgYXBlcnR1cmUuICBTZXQgZnJvbSBBQ1BJIHRhYmxlcy4gKi8KK3UzMiBwY2lfbW1jZmdfYmFzZV9hZGRyOworCisjZGVmaW5lIG1tY2ZnX3ZpcnRfYWRkciAoKHZvaWQgX19pb21lbSAqKSBmaXhfdG9fdmlydChGSVhfUENJRV9NQ0ZHKSkKKworLyogVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgbGFzdCBNTUNPTkZJRyBkZXZpY2UgYWNjZXNzZWQgKi8KK3N0YXRpYyB1MzIgbW1jZmdfbGFzdF9hY2Nlc3NlZF9kZXZpY2U7CisKKy8qCisgKiBGdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSB3aXRoIE1NQ09ORklHIGFjY2Vzc2VzCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBjaV9leHBfc2V0X2Rldl9iYXNlKGludCBidXMsIGludCBkZXZmbikKK3sKKwl1MzIgZGV2X2Jhc2UgPSBwY2lfbW1jZmdfYmFzZV9hZGRyIHwgKGJ1cyA8PCAyMCkgfCAoZGV2Zm4gPDwgMTIpOworCWlmIChkZXZfYmFzZSAhPSBtbWNmZ19sYXN0X2FjY2Vzc2VkX2RldmljZSkgeworCQltbWNmZ19sYXN0X2FjY2Vzc2VkX2RldmljZSA9IGRldl9iYXNlOworCQlzZXRfZml4bWFwX25vY2FjaGUoRklYX1BDSUVfTUNGRywgZGV2X2Jhc2UpOworCX0KK30KKworc3RhdGljIGludCBwY2lfbW1jZmdfcmVhZCh1bnNpZ25lZCBpbnQgc2VnLCB1bnNpZ25lZCBpbnQgYnVzLAorCQkJICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiAqdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdmFsdWUgfHwgKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gNDA5NSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJcGNpX2V4cF9zZXRfZGV2X2Jhc2UoYnVzLCBkZXZmbik7CisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKnZhbHVlID0gcmVhZGIobW1jZmdfdmlydF9hZGRyICsgcmVnKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqdmFsdWUgPSByZWFkdyhtbWNmZ192aXJ0X2FkZHIgKyByZWcpOworCQlicmVhazsKKwljYXNlIDQ6CisJCSp2YWx1ZSA9IHJlYWRsKG1tY2ZnX3ZpcnRfYWRkciArIHJlZyk7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpX21tY2ZnX3dyaXRlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCisJCQkgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDQwOTUpKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlwY2lfZXhwX3NldF9kZXZfYmFzZShidXMsIGRldmZuKTsKKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQl3cml0ZWIodmFsdWUsIG1tY2ZnX3ZpcnRfYWRkciArIHJlZyk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJd3JpdGV3KHZhbHVlLCBtbWNmZ192aXJ0X2FkZHIgKyByZWcpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXdyaXRlbCh2YWx1ZSwgbW1jZmdfdmlydF9hZGRyICsgcmVnKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfbW1jZmcgPSB7CisJLnJlYWQgPQkJcGNpX21tY2ZnX3JlYWQsCisJLndyaXRlID0JcGNpX21tY2ZnX3dyaXRlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGNpX21tY2ZnX2luaXQodm9pZCkKK3sKKwlpZiAoKHBjaV9wcm9iZSAmIFBDSV9QUk9CRV9NTUNPTkYpID09IDApCisJCWdvdG8gb3V0OworCWlmICghcGNpX21tY2ZnX2Jhc2VfYWRkcikKKwkJZ290byBvdXQ7CisKKwkvKiBLbHVkZ2UgZm9yIG5vdy4gRG9uJ3QgdXNlIG1tY29uZmlnIG9uIEFNRCBzeXN0ZW1zIGJlY2F1c2UKKwkgICB0aG9zZSBoYXZlIHNvbWUgYnVzc2VzIHdoZXJlIG1tY29uZmlnIGRvZXNuJ3Qgd29yaywKKwkgICBhbmQgd2UgZG9uJ3QgcGFyc2UgQUNQSSBNQ0ZHIHdlbGwgZW5vdWdoIHRvIGhhbmRsZSB0aGF0LiAKKwkgICBSZW1vdmUgd2hlbiBwcm9wZXIgaGFuZGxpbmcgaXMgYWRkZWQuICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkKKwkJZ290byBvdXQ7IAorCisJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBNTUNPTkZJR1xuIik7CisJcmF3X3BjaV9vcHMgPSAmcGNpX21tY2ZnOworCXBjaV9wcm9iZSA9IChwY2lfcHJvYmUgJiB+UENJX1BST0JFX01BU0spIHwgUENJX1BST0JFX01NQ09ORjsKKworIG91dDoKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChwY2lfbW1jZmdfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL251bWEuYyBiL2FyY2gvaTM4Ni9wY2kvbnVtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzY5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvcGNpL251bWEuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIG51bWEuYyAtIExvdy1sZXZlbCBQQ0kgYWNjZXNzIGZvciBOVU1BLVEgbWFjaGluZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZSAicGNpLmgiCisKKyNkZWZpbmUgQlVTMlFVQUQoZ2xvYmFsKSAobXBfYnVzX2lkX3RvX25vZGVbZ2xvYmFsXSkKKyNkZWZpbmUgQlVTMkxPQ0FMKGdsb2JhbCkgKG1wX2J1c19pZF90b19sb2NhbFtnbG9iYWxdKQorI2RlZmluZSBRVUFETE9DQUwyQlVTKHF1YWQsbG9jYWwpIChxdWFkX2xvY2FsX3RvX21wX2J1c19pZFtxdWFkXVtsb2NhbF0pCisKKyNkZWZpbmUgUENJX0NPTkYxX01RX0FERFJFU1MoYnVzLCBkZXZmbiwgcmVnKSBcCisJKDB4ODAwMDAwMDAgfCAoQlVTMkxPQ0FMKGJ1cykgPDwgMTYpIHwgKGRldmZuIDw8IDgpIHwgKHJlZyAmIH4zKSkKKworc3RhdGljIGludCBwY2lfY29uZjFfbXFfcmVhZCh1bnNpZ25lZCBpbnQgc2VnLCB1bnNpZ25lZCBpbnQgYnVzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiAqdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdmFsdWUgfHwgKGJ1cyA+PSBNQVhfTVBfQlVTU0VTKSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKKworCW91dGxfcXVhZChQQ0lfQ09ORjFfTVFfQUREUkVTUyhidXMsIGRldmZuLCByZWcpLCAweENGOCwgQlVTMlFVQUQoYnVzKSk7CisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKnZhbHVlID0gaW5iX3F1YWQoMHhDRkMgKyAocmVnICYgMyksIEJVUzJRVUFEKGJ1cykpOworCQlicmVhazsKKwljYXNlIDI6CisJCSp2YWx1ZSA9IGlud19xdWFkKDB4Q0ZDICsgKHJlZyAmIDIpLCBCVVMyUVVBRChidXMpKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQkqdmFsdWUgPSBpbmxfcXVhZCgweENGQywgQlVTMlFVQUQoYnVzKSk7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpX2NvbmYxX21xX3dyaXRlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKChidXMgPj0gTUFYX01QX0JVU1NFUykgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gMjU1KSkgCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJb3V0bF9xdWFkKFBDSV9DT05GMV9NUV9BRERSRVNTKGJ1cywgZGV2Zm4sIHJlZyksIDB4Q0Y4LCBCVVMyUVVBRChidXMpKTsKKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQlvdXRiX3F1YWQoKHU4KXZhbHVlLCAweENGQyArIChyZWcgJiAzKSwgQlVTMlFVQUQoYnVzKSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb3V0d19xdWFkKCh1MTYpdmFsdWUsIDB4Q0ZDICsgKHJlZyAmIDIpLCBCVVMyUVVBRChidXMpKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlvdXRsX3F1YWQoKHUzMil2YWx1ZSwgMHhDRkMsIEJVUzJRVUFEKGJ1cykpOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisjdW5kZWYgUENJX0NPTkYxX01RX0FERFJFU1MKKworc3RhdGljIHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfZGlyZWN0X2NvbmYxX21xID0geworCS5yZWFkCT0gcGNpX2NvbmYxX21xX3JlYWQsCisJLndyaXRlCT0gcGNpX2NvbmYxX21xX3dyaXRlCit9OworCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfZml4dXBfaTQ1MG54KHN0cnVjdCBwY2lfZGV2ICpkKQoreworCS8qCisJICogaTQ1ME5YIC0tIEZpbmQgYW5kIHNjYW4gYWxsIHNlY29uZGFyeSBidXNlcyBvbiBhbGwgUFhCJ3MuCisJICovCisJaW50IHB4YiwgcmVnOworCXU4IGJ1c25vLCBzdWJhLCBzdWJiOworCWludCBxdWFkID0gQlVTMlFVQUQoZC0+YnVzLT5udW1iZXIpOworCisJcHJpbnRrKCJQQ0k6IFNlYXJjaGluZyBmb3IgaTQ1ME5YIGhvc3QgYnJpZGdlcyBvbiAlc1xuIiwgcGNpX25hbWUoZCkpOworCXJlZyA9IDB4ZDA7CisJZm9yKHB4Yj0wOyBweGI8MjsgcHhiKyspIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZCwgcmVnKyssICZidXNubyk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIHJlZysrLCAmc3ViYSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIHJlZysrLCAmc3ViYik7CisJCURCRygiaTQ1ME5YIFBYQiAlZDogJTAyeC8lMDJ4LyUwMnhcbiIsIHB4YiwgYnVzbm8sIHN1YmEsIHN1YmIpOworCQlpZiAoYnVzbm8pCisJCQlwY2lfc2Nhbl9idXMoUVVBRExPQ0FMMkJVUyhxdWFkLGJ1c25vKSwgJnBjaV9yb290X29wcywgTlVMTCk7CS8qIEJ1cyBBICovCisJCWlmIChzdWJhIDwgc3ViYikKKwkJCXBjaV9zY2FuX2J1cyhRVUFETE9DQUwyQlVTKHF1YWQsc3ViYSsxKSwgJnBjaV9yb290X29wcywgTlVMTCk7CS8qIEJ1cyBCICovCisJfQorCXBjaWJpb3NfbGFzdF9idXMgPSAtMTsKK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDUxTlgsIHBjaV9maXh1cF9pNDUwbngpOworCitzdGF0aWMgaW50IF9faW5pdCBwY2lfbnVtYV9pbml0KHZvaWQpCit7CisJaW50IHF1YWQ7CisKKwlyYXdfcGNpX29wcyA9ICZwY2lfZGlyZWN0X2NvbmYxX21xOworCisJaWYgKHBjaWJpb3Nfc2Nhbm5lZCsrKQorCQlyZXR1cm4gMDsKKworCXBjaV9yb290X2J1cyA9IHBjaWJpb3Nfc2Nhbl9yb290KDApOworCWlmIChudW1fb25saW5lX25vZGVzKCkgPiAxKQorCQlmb3JfZWFjaF9vbmxpbmVfbm9kZShxdWFkKSB7CisJCQlpZiAocXVhZCA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRrKCJTY2FubmluZyBQQ0kgYnVzICVkIGZvciBxdWFkICVkXG4iLCAKKwkJCQlRVUFETE9DQUwyQlVTKHF1YWQsMCksIHF1YWQpOworCQkJcGNpX3NjYW5fYnVzKFFVQURMT0NBTDJCVVMocXVhZCwwKSwgCisJCQkJJnBjaV9yb290X29wcywgTlVMTCk7CisJCX0KKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKHBjaV9udW1hX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9wY2Jpb3MuYyBiL2FyY2gvaTM4Ni9wY2kvcGNiaW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxNDIxYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9wY2kvcGNiaW9zLmMKQEAgLTAsMCArMSw0ODcgQEAKKy8qCisgKiBCSU9TMzIgYW5kIFBDSSBCSU9TIGhhbmRsaW5nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSAicGNpLmgiCisjaW5jbHVkZSAicGNpLWZ1bmN0aW9ucy5oIgorCisKKy8qIEJJT1MzMiBzaWduYXR1cmU6ICJfMzJfIiAqLworI2RlZmluZSBCSU9TMzJfU0lHTkFUVVJFCSgoJ18nIDw8IDApICsgKCczJyA8PCA4KSArICgnMicgPDwgMTYpICsgKCdfJyA8PCAyNCkpCisKKy8qIFBDSSBzaWduYXR1cmU6ICJQQ0kgIiAqLworI2RlZmluZSBQQ0lfU0lHTkFUVVJFCQkoKCdQJyA8PCAwKSArICgnQycgPDwgOCkgKyAoJ0knIDw8IDE2KSArICgnICcgPDwgMjQpKQorCisvKiBQQ0kgc2VydmljZSBzaWduYXR1cmU6ICIkUENJIiAqLworI2RlZmluZSBQQ0lfU0VSVklDRQkJKCgnJCcgPDwgMCkgKyAoJ1AnIDw8IDgpICsgKCdDJyA8PCAxNikgKyAoJ0knIDw8IDI0KSkKKworLyogUENJIEJJT1MgaGFyZHdhcmUgbWVjaGFuaXNtIGZsYWdzICovCisjZGVmaW5lIFBDSUJJT1NfSFdfVFlQRTEJCTB4MDEKKyNkZWZpbmUgUENJQklPU19IV19UWVBFMgkJMHgwMgorI2RlZmluZSBQQ0lCSU9TX0hXX1RZUEUxX1NQRUMJCTB4MTAKKyNkZWZpbmUgUENJQklPU19IV19UWVBFMl9TUEVDCQkweDIwCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBzdHJ1Y3R1cmUgdXNlZCB0byBpZGVudGlmeSB0aGUgZW50cnkgcG9pbnQKKyAqIHRvIHRoZSBCSU9TMzIgU2VydmljZSBEaXJlY3RvcnksIGFzIGRvY3VtZW50ZWQgaW4KKyAqIAlTdGFuZGFyZCBCSU9TIDMyLWJpdCBTZXJ2aWNlIERpcmVjdG9yeSBQcm9wb3NhbAorICogCVJldmlzaW9uIDAuNCBNYXkgMjQsIDE5OTMKKyAqIAlQaG9lbml4IFRlY2hub2xvZ2llcyBMdGQuCisgKglOb3J3b29kLCBNQQorICogYW5kIHRoZSBQQ0kgQklPUyBzcGVjaWZpY2F0aW9uLgorICovCisKK3VuaW9uIGJpb3MzMiB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBzaWduYXR1cmU7CS8qIF8zMl8gKi8KKwkJdW5zaWduZWQgbG9uZyBlbnRyeTsJCS8qIDMyIGJpdCBwaHlzaWNhbCBhZGRyZXNzICovCisJCXVuc2lnbmVkIGNoYXIgcmV2aXNpb247CQkvKiBSZXZpc2lvbiBsZXZlbCwgMCAqLworCQl1bnNpZ25lZCBjaGFyIGxlbmd0aDsJCS8qIExlbmd0aCBpbiBwYXJhZ3JhcGhzIHNob3VsZCBiZSAwMSAqLworCQl1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOwkJLyogQWxsIGJ5dGVzIG11c3QgYWRkIHVwIHRvIHplcm8gKi8KKwkJdW5zaWduZWQgY2hhciByZXNlcnZlZFs1XTsgCS8qIE11c3QgYmUgemVybyAqLworCX0gZmllbGRzOworCWNoYXIgY2hhcnNbMTZdOworfTsKKworLyoKKyAqIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHNlcnZpY2UgZGlyZWN0b3J5LiAgSSBkb24ndCBrbm93IGlmIHdlJ3JlCisgKiBhbGxvd2VkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBvZiB0aGVzZSBvciBub3QsIHNvIGp1c3QgaW4gY2FzZQorICogd2UnbGwgbWFrZSBwY2liaW9zX3ByZXNlbnQoKSB0YWtlIGEgbWVtb3J5IHN0YXJ0IHBhcmFtZXRlciBhbmQgc3RvcmUKKyAqIHRoZSBhcnJheSB0aGVyZS4KKyAqLworCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJdW5zaWduZWQgc2hvcnQgc2VnbWVudDsKK30gYmlvczMyX2luZGlyZWN0ID0geyAwLCBfX0tFUk5FTF9DUyB9OworCisvKgorICogUmV0dXJucyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlLCBOVUxMIG9uIGVycm9yCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYmlvczMyX3NlcnZpY2UodW5zaWduZWQgbG9uZyBzZXJ2aWNlKQoreworCXVuc2lnbmVkIGNoYXIgcmV0dXJuX2NvZGU7CS8qICVhbCAqLworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsJCS8qICVlYnggKi8KKwl1bnNpZ25lZCBsb25nIGxlbmd0aDsJCS8qICVlY3ggKi8KKwl1bnNpZ25lZCBsb25nIGVudHJ5OwkJLyogJWVkeCAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJX19hc21fXygibGNhbGwgKiglJWVkaSk7IGNsZCIKKwkJOiAiPWEiIChyZXR1cm5fY29kZSksCisJCSAgIj1iIiAoYWRkcmVzcyksCisJCSAgIj1jIiAobGVuZ3RoKSwKKwkJICAiPWQiIChlbnRyeSkKKwkJOiAiMCIgKHNlcnZpY2UpLAorCQkgICIxIiAoMCksCisJCSAgIkQiICgmYmlvczMyX2luZGlyZWN0KSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJc3dpdGNoIChyZXR1cm5fY29kZSkgeworCQljYXNlIDA6CisJCQlyZXR1cm4gYWRkcmVzcyArIGVudHJ5OworCQljYXNlIDB4ODA6CS8qIE5vdCBwcmVzZW50ICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJiaW9zMzJfc2VydmljZSgweCVseCk6IG5vdCBwcmVzZW50XG4iLCBzZXJ2aWNlKTsKKwkJCXJldHVybiAwOworCQlkZWZhdWx0OiAvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJiaW9zMzJfc2VydmljZSgweCVseCk6IHJldHVybmVkIDB4JXggLS0gQklPUyBidWchXG4iLAorCQkJCXNlcnZpY2UsIHJldHVybl9jb2RlKTsKKwkJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCXVuc2lnbmVkIHNob3J0IHNlZ21lbnQ7Cit9IHBjaV9pbmRpcmVjdCA9IHsgMCwgX19LRVJORUxfQ1MgfTsKKworc3RhdGljIGludCBwY2lfYmlvc19wcmVzZW50OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjaGVja19wY2liaW9zKHZvaWQpCit7CisJdTMyIHNpZ25hdHVyZSwgZWF4LCBlYngsIGVjeDsKKwl1OCBzdGF0dXMsIG1ham9yX3ZlciwgbWlub3JfdmVyLCBod19tZWNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHBjaWJpb3NfZW50cnk7CisKKwlpZiAoKHBjaWJpb3NfZW50cnkgPSBiaW9zMzJfc2VydmljZShQQ0lfU0VSVklDRSkpKSB7CisJCXBjaV9pbmRpcmVjdC5hZGRyZXNzID0gcGNpYmlvc19lbnRyeSArIFBBR0VfT0ZGU0VUOworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJX19hc21fXygKKwkJCSJsY2FsbCAqKCUlZWRpKTsgY2xkXG5cdCIKKwkJCSJqYyAxZlxuXHQiCisJCQkieG9yICUlYWgsICUlYWhcbiIKKwkJCSIxOiIKKwkJCTogIj1kIiAoc2lnbmF0dXJlKSwKKwkJCSAgIj1hIiAoZWF4KSwKKwkJCSAgIj1iIiAoZWJ4KSwKKwkJCSAgIj1jIiAoZWN4KQorCQkJOiAiMSIgKFBDSUJJT1NfUENJX0JJT1NfUFJFU0VOVCksCisJCQkgICJEIiAoJnBjaV9pbmRpcmVjdCkKKwkJCTogIm1lbW9yeSIpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJc3RhdHVzID0gKGVheCA+PiA4KSAmIDB4ZmY7CisJCWh3X21lY2ggPSBlYXggJiAweGZmOworCQltYWpvcl92ZXIgPSAoZWJ4ID4+IDgpICYgMHhmZjsKKwkJbWlub3JfdmVyID0gZWJ4ICYgMHhmZjsKKwkJaWYgKHBjaWJpb3NfbGFzdF9idXMgPCAwKQorCQkJcGNpYmlvc19sYXN0X2J1cyA9IGVjeCAmIDB4ZmY7CisJCURCRygiUENJOiBCSU9TIHByb2JlIHJldHVybmVkIHM9JTAyeCBodz0lMDJ4IHZlcj0lMDJ4LiUwMnggbD0lMDJ4XG4iLAorCQkJc3RhdHVzLCBod19tZWNoLCBtYWpvcl92ZXIsIG1pbm9yX3ZlciwgcGNpYmlvc19sYXN0X2J1cyk7CisJCWlmIChzdGF0dXMgfHwgc2lnbmF0dXJlICE9IFBDSV9TSUdOQVRVUkUpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIlBDSTogQklPUyBCVUcgIyV4WyUwOHhdIGZvdW5kXG4iLAorCQkJCXN0YXR1cywgc2lnbmF0dXJlKTsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIlBDSTogUENJIEJJT1MgcmV2aXNpb24gJXguJTAyeCBlbnRyeSBhdCAweCVseCwgbGFzdCBidXM9JWRcbiIsCisJCQltYWpvcl92ZXIsIG1pbm9yX3ZlciwgcGNpYmlvc19lbnRyeSwgcGNpYmlvc19sYXN0X2J1cyk7CisjaWZkZWYgQ09ORklHX1BDSV9ESVJFQ1QKKwkJaWYgKCEoaHdfbWVjaCAmIFBDSUJJT1NfSFdfVFlQRTEpKQorCQkJcGNpX3Byb2JlICY9IH5QQ0lfUFJPQkVfQ09ORjE7CisJCWlmICghKGh3X21lY2ggJiBQQ0lCSU9TX0hXX1RZUEUyKSkKKwkJCXBjaV9wcm9iZSAmPSB+UENJX1BST0JFX0NPTkYyOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGNpX2Jpb3NfZmluZF9kZXZpY2UgKHVuc2lnbmVkIHNob3J0IHZlbmRvciwgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLAorCQkJCQl1bnNpZ25lZCBzaG9ydCBpbmRleCwgdW5zaWduZWQgY2hhciAqYnVzLCB1bnNpZ25lZCBjaGFyICpkZXZpY2VfZm4pCit7CisJdW5zaWduZWQgc2hvcnQgYng7CisJdW5zaWduZWQgc2hvcnQgcmV0OworCisJX19hc21fXygibGNhbGwgKiglJWVkaSk7IGNsZFxuXHQiCisJCSJqYyAxZlxuXHQiCisJCSJ4b3IgJSVhaCwgJSVhaFxuIgorCQkiMToiCisJCTogIj1iIiAoYngpLAorCQkgICI9YSIgKHJldCkKKwkJOiAiMSIgKFBDSUJJT1NfRklORF9QQ0lfREVWSUNFKSwKKwkJICAiYyIgKGRldmljZV9pZCksCisJCSAgImQiICh2ZW5kb3IpLAorCQkgICJTIiAoKGludCkgaW5kZXgpLAorCQkgICJEIiAoJnBjaV9pbmRpcmVjdCkpOworCSpidXMgPSAoYnggPj4gOCkgJiAweGZmOworCSpkZXZpY2VfZm4gPSBieCAmIDB4ZmY7CisJcmV0dXJuIChpbnQpIChyZXQgJiAweGZmMDApID4+IDg7Cit9CisKK3N0YXRpYyBpbnQgcGNpX2Jpb3NfcmVhZCh1bnNpZ25lZCBpbnQgc2VnLCB1bnNpZ25lZCBpbnQgYnVzLAorCQkJIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdTMyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmZuOworCisJaWYgKCF2YWx1ZSB8fCAoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQlfX2FzbV9fKCJsY2FsbCAqKCUlZXNpKTsgY2xkXG5cdCIKKwkJCSJqYyAxZlxuXHQiCisJCQkieG9yICUlYWgsICUlYWhcbiIKKwkJCSIxOiIKKwkJCTogIj1jIiAoKnZhbHVlKSwKKwkJCSAgIj1hIiAocmVzdWx0KQorCQkJOiAiMSIgKFBDSUJJT1NfUkVBRF9DT05GSUdfQllURSksCisJCQkgICJiIiAoYngpLAorCQkJICAiRCIgKChsb25nKXJlZyksCisJCQkgICJTIiAoJnBjaV9pbmRpcmVjdCkpOworCQlicmVhazsKKwljYXNlIDI6CisJCV9fYXNtX18oImxjYWxsICooJSVlc2kpOyBjbGRcblx0IgorCQkJImpjIDFmXG5cdCIKKwkJCSJ4b3IgJSVhaCwgJSVhaFxuIgorCQkJIjE6IgorCQkJOiAiPWMiICgqdmFsdWUpLAorCQkJICAiPWEiIChyZXN1bHQpCisJCQk6ICIxIiAoUENJQklPU19SRUFEX0NPTkZJR19XT1JEKSwKKwkJCSAgImIiIChieCksCisJCQkgICJEIiAoKGxvbmcpcmVnKSwKKwkJCSAgIlMiICgmcGNpX2luZGlyZWN0KSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJX19hc21fXygibGNhbGwgKiglJWVzaSk7IGNsZFxuXHQiCisJCQkiamMgMWZcblx0IgorCQkJInhvciAlJWFoLCAlJWFoXG4iCisJCQkiMToiCisJCQk6ICI9YyIgKCp2YWx1ZSksCisJCQkgICI9YSIgKHJlc3VsdCkKKwkJCTogIjEiIChQQ0lCSU9TX1JFQURfQ09ORklHX0RXT1JEKSwKKwkJCSAgImIiIChieCksCisJCQkgICJEIiAoKGxvbmcpcmVnKSwKKwkJCSAgIlMiICgmcGNpX2luZGlyZWN0KSk7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIChpbnQpKChyZXN1bHQgJiAweGZmMDApID4+IDgpOworfQorCitzdGF0aWMgaW50IHBjaV9iaW9zX3dyaXRlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCisJCQkgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdTMyIHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2Zm47CisKKwlpZiAoKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gMjU1KSkgCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCV9fYXNtX18oImxjYWxsICooJSVlc2kpOyBjbGRcblx0IgorCQkJImpjIDFmXG5cdCIKKwkJCSJ4b3IgJSVhaCwgJSVhaFxuIgorCQkJIjE6IgorCQkJOiAiPWEiIChyZXN1bHQpCisJCQk6ICIwIiAoUENJQklPU19XUklURV9DT05GSUdfQllURSksCisJCQkgICJjIiAodmFsdWUpLAorCQkJICAiYiIgKGJ4KSwKKwkJCSAgIkQiICgobG9uZylyZWcpLAorCQkJICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlfX2FzbV9fKCJsY2FsbCAqKCUlZXNpKTsgY2xkXG5cdCIKKwkJCSJqYyAxZlxuXHQiCisJCQkieG9yICUlYWgsICUlYWhcbiIKKwkJCSIxOiIKKwkJCTogIj1hIiAocmVzdWx0KQorCQkJOiAiMCIgKFBDSUJJT1NfV1JJVEVfQ09ORklHX1dPUkQpLAorCQkJICAiYyIgKHZhbHVlKSwKKwkJCSAgImIiIChieCksCisJCQkgICJEIiAoKGxvbmcpcmVnKSwKKwkJCSAgIlMiICgmcGNpX2luZGlyZWN0KSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJX19hc21fXygibGNhbGwgKiglJWVzaSk7IGNsZFxuXHQiCisJCQkiamMgMWZcblx0IgorCQkJInhvciAlJWFoLCAlJWFoXG4iCisJCQkiMToiCisJCQk6ICI9YSIgKHJlc3VsdCkKKwkJCTogIjAiIChQQ0lCSU9TX1dSSVRFX0NPTkZJR19EV09SRCksCisJCQkgICJjIiAodmFsdWUpLAorCQkJICAiYiIgKGJ4KSwKKwkJCSAgIkQiICgobG9uZylyZWcpLAorCQkJICAiUyIgKCZwY2lfaW5kaXJlY3QpKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gKGludCkoKHJlc3VsdCAmIDB4ZmYwMCkgPj4gOCk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIHRhYmxlIGZvciBCSU9TMzIgYWNjZXNzCisgKi8KKworc3RhdGljIHN0cnVjdCBwY2lfcmF3X29wcyBwY2lfYmlvc19hY2Nlc3MgPSB7CisJLnJlYWQgPQkJcGNpX2Jpb3NfcmVhZCwKKwkud3JpdGUgPQlwY2lfYmlvc193cml0ZQorfTsKKworLyoKKyAqIFRyeSB0byBmaW5kIFBDSSBCSU9TLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX3Jhd19vcHMgKiBfX2RldmluaXQgcGNpX2ZpbmRfYmlvcyh2b2lkKQoreworCXVuaW9uIGJpb3MzMiAqY2hlY2s7CisJdW5zaWduZWQgY2hhciBzdW07CisJaW50IGksIGxlbmd0aDsKKworCS8qCisJICogRm9sbG93IHRoZSBzdGFuZGFyZCBwcm9jZWR1cmUgZm9yIGxvY2F0aW5nIHRoZSBCSU9TMzIgU2VydmljZQorCSAqIGRpcmVjdG9yeSBieSBzY2FubmluZyB0aGUgcGVybWlzc2libGUgYWRkcmVzcyByYW5nZSBmcm9tCisJICogMHhlMDAwMCB0aHJvdWdoIDB4ZmZmZmYgZm9yIGEgdmFsaWQgQklPUzMyIHN0cnVjdHVyZS4KKwkgKi8KKworCWZvciAoY2hlY2sgPSAodW5pb24gYmlvczMyICopIF9fdmEoMHhlMDAwMCk7CisJICAgICBjaGVjayA8PSAodW5pb24gYmlvczMyICopIF9fdmEoMHhmZmZmMCk7CisJICAgICArK2NoZWNrKSB7CisJCWlmIChjaGVjay0+ZmllbGRzLnNpZ25hdHVyZSAhPSBCSU9TMzJfU0lHTkFUVVJFKQorCQkJY29udGludWU7CisJCWxlbmd0aCA9IGNoZWNrLT5maWVsZHMubGVuZ3RoICogMTY7CisJCWlmICghbGVuZ3RoKQorCQkJY29udGludWU7CisJCXN1bSA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBsZW5ndGggOyArK2kpCisJCQlzdW0gKz0gY2hlY2stPmNoYXJzW2ldOworCQlpZiAoc3VtICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKGNoZWNrLT5maWVsZHMucmV2aXNpb24gIT0gMCkgeworCQkJcHJpbnRrKCJQQ0k6IHVuc3VwcG9ydGVkIEJJT1MzMiByZXZpc2lvbiAlZCBhdCAweCVwXG4iLAorCQkJCWNoZWNrLT5maWVsZHMucmV2aXNpb24sIGNoZWNrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCURCRygiUENJOiBCSU9TMzIgU2VydmljZSBEaXJlY3Rvcnkgc3RydWN0dXJlIGF0IDB4JXBcbiIsIGNoZWNrKTsKKwkJaWYgKGNoZWNrLT5maWVsZHMuZW50cnkgPj0gMHgxMDAwMDApIHsKKwkJCXByaW50aygiUENJOiBCSU9TMzIgZW50cnkgKDB4JXApIGluIGhpZ2ggbWVtb3J5LCBjYW5ub3QgdXNlLlxuIiwgY2hlY2spOworCQkJcmV0dXJuIE5VTEw7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBsb25nIGJpb3MzMl9lbnRyeSA9IGNoZWNrLT5maWVsZHMuZW50cnk7CisJCQlEQkcoIlBDSTogQklPUzMyIFNlcnZpY2UgRGlyZWN0b3J5IGVudHJ5IGF0IDB4JWx4XG4iLCBiaW9zMzJfZW50cnkpOworCQkJYmlvczMyX2luZGlyZWN0LmFkZHJlc3MgPSBiaW9zMzJfZW50cnkgKyBQQUdFX09GRlNFVDsKKwkJCWlmIChjaGVja19wY2liaW9zKCkpCisJCQkJcmV0dXJuICZwY2lfYmlvc19hY2Nlc3M7CisJCX0KKwkJYnJlYWs7CS8qIEhvcGVmdWxseSBtb3JlIHRoYW4gb25lIEJJT1MzMiBjYW5ub3QgaGFwcGVuLi4uICovCisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBTb3J0IHRoZSBkZXZpY2UgbGlzdCBhY2NvcmRpbmcgdG8gUENJIEJJT1MuIE5hc3R5IGhhY2ssIGJ1dCBzaW5jZSBzb21lCisgKiBmb29sIGZvcmdvdCB0byBkZWZpbmUgdGhlIGBjb3JyZWN0JyBkZXZpY2Ugb3JkZXIgaW4gdGhlIFBDSSBCSU9TIHNwZWNzCisgKiBhbmQgd2Ugd2FudCB0byBiZSAocG9zc2libHkgYnVnLXRvLWJ1ZyA7LV0pIGNvbXBhdGlibGUgd2l0aCBvbGRlciBrZXJuZWxzCisgKiB3aGljaCB1c2VkIEJJT1Mgb3JkZXJpbmcsIHdlIGFyZSBib3VuZCB0byBkbyB0aGlzLi4uCisgKi8KKwordm9pZCBfX2RldmluaXQgcGNpYmlvc19zb3J0KHZvaWQpCit7CisJTElTVF9IRUFEKHNvcnRlZF9kZXZpY2VzKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsbjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2LCAqZDsKKwlpbnQgaWR4LCBmb3VuZDsKKwl1bnNpZ25lZCBjaGFyIGJ1cywgZGV2Zm47CisKKwlEQkcoIlBDSTogU29ydGluZyBkZXZpY2UgbGlzdC4uLlxuIik7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwY2lfZGV2aWNlcykpIHsKKwkJbG4gPSBwY2lfZGV2aWNlcy5uZXh0OworCQlkZXYgPSBwY2lfZGV2X2cobG4pOworCQlpZHggPSBmb3VuZCA9IDA7CisJCXdoaWxlIChwY2lfYmlvc19maW5kX2RldmljZShkZXYtPnZlbmRvciwgZGV2LT5kZXZpY2UsIGlkeCwgJmJ1cywgJmRldmZuKSA9PSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwkJCWlkeCsrOworCQkJbGlzdF9mb3JfZWFjaChsbiwgJnBjaV9kZXZpY2VzKSB7CisJCQkJZCA9IHBjaV9kZXZfZyhsbik7CisJCQkJaWYgKGQtPmJ1cy0+bnVtYmVyID09IGJ1cyAmJiBkLT5kZXZmbiA9PSBkZXZmbikgeworCQkJCQlsaXN0X2RlbCgmZC0+Z2xvYmFsX2xpc3QpOworCQkJCQlsaXN0X2FkZF90YWlsKCZkLT5nbG9iYWxfbGlzdCwgJnNvcnRlZF9kZXZpY2VzKTsKKwkJCQkJaWYgKGQgPT0gZGV2KQorCQkJCQkJZm91bmQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAobG4gPT0gJnBjaV9kZXZpY2VzKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBCSU9TIHJlcG9ydGluZyB1bmtub3duIGRldmljZSAlMDJ4OiUwMnhcbiIsIGJ1cywgZGV2Zm4pOworCQkJCS8qCisJCQkJICogV2UgbXVzdCBub3QgY29udGludWUgc2Nhbm5pbmcgYXMgc2V2ZXJhbCBidWdneSBCSU9TZXMKKwkJCQkgKiByZXR1cm4gZ2FyYmFnZSBhZnRlciB0aGUgbGFzdCBkZXZpY2UuIEdyci4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IERldmljZSAlcyBub3QgZm91bmQgYnkgQklPU1xuIiwKKwkJCQlwY2lfbmFtZShkZXYpKTsKKwkJCWxpc3RfZGVsKCZkZXYtPmdsb2JhbF9saXN0KTsKKwkJCWxpc3RfYWRkX3RhaWwoJmRldi0+Z2xvYmFsX2xpc3QsICZzb3J0ZWRfZGV2aWNlcyk7CisJCX0KKwl9CisJbGlzdF9zcGxpY2UoJnNvcnRlZF9kZXZpY2VzLCAmcGNpX2RldmljZXMpOworfQorCisvKgorICogIEJJT1MgRnVuY3Rpb25zIGZvciBJUlEgUm91dGluZworICovCisKK3N0cnVjdCBpcnFfcm91dGluZ19vcHRpb25zIHsKKwl1MTYgc2l6ZTsKKwlzdHJ1Y3QgaXJxX2luZm8gKnRhYmxlOworCXUxNiBzZWdtZW50OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlICogX19kZXZpbml0IHBjaWJpb3NfZ2V0X2lycV9yb3V0aW5nX3RhYmxlKHZvaWQpCit7CisJc3RydWN0IGlycV9yb3V0aW5nX29wdGlvbnMgb3B0OworCXN0cnVjdCBpcnFfcm91dGluZ190YWJsZSAqcnQgPSBOVUxMOworCWludCByZXQsIG1hcDsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisKKwlpZiAoIXBjaV9iaW9zX3ByZXNlbnQpCisJCXJldHVybiBOVUxMOworCXBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gTlVMTDsKKwlvcHQudGFibGUgPSAoc3RydWN0IGlycV9pbmZvICopIHBhZ2U7CisJb3B0LnNpemUgPSBQQUdFX1NJWkU7CisJb3B0LnNlZ21lbnQgPSBfX0tFUk5FTF9EUzsKKworCURCRygiUENJOiBGZXRjaGluZyBJUlEgcm91dGluZyB0YWJsZS4uLiAiKTsKKwlfX2FzbV9fKCJwdXNoICUlZXNcblx0IgorCQkicHVzaCAlJWRzXG5cdCIKKwkJInBvcCAgJSVlc1xuXHQiCisJCSJsY2FsbCAqKCUlZXNpKTsgY2xkXG5cdCIKKwkJInBvcCAlJWVzXG5cdCIKKwkJImpjIDFmXG5cdCIKKwkJInhvciAlJWFoLCAlJWFoXG4iCisJCSIxOiIKKwkJOiAiPWEiIChyZXQpLAorCQkgICI9YiIgKG1hcCksCisJCSAgIj1tIiAob3B0KQorCQk6ICIwIiAoUENJQklPU19HRVRfUk9VVElOR19PUFRJT05TKSwKKwkJICAiMSIgKDApLAorCQkgICJEIiAoKGxvbmcpICZvcHQpLAorCQkgICJTIiAoJnBjaV9pbmRpcmVjdCksCisJCSAgIm0iIChvcHQpCisJCTogIm1lbW9yeSIpOworCURCRygiT0sgIHJldD0lZCwgc2l6ZT0lZCwgbWFwPSV4XG4iLCByZXQsIG9wdC5zaXplLCBtYXApOworCWlmIChyZXQgJiAweGZmMDApCisJCXByaW50ayhLRVJOX0VSUiAiUENJOiBFcnJvciAlMDJ4IHdoZW4gZmV0Y2hpbmcgSVJRIHJvdXRpbmcgdGFibGUuXG4iLCAocmV0ID4+IDgpICYgMHhmZik7CisJZWxzZSBpZiAob3B0LnNpemUpIHsKKwkJcnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUpICsgb3B0LnNpemUsIEdGUF9LRVJORUwpOworCQlpZiAocnQpIHsKKwkJCW1lbXNldChydCwgMCwgc2l6ZW9mKHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSkpOworCQkJcnQtPnNpemUgPSBvcHQuc2l6ZSArIHNpemVvZihzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUpOworCQkJcnQtPmV4Y2x1c2l2ZV9pcnFzID0gbWFwOworCQkJbWVtY3B5KHJ0LT5zbG90cywgKHZvaWQgKikgcGFnZSwgb3B0LnNpemUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBCSU9TIEludGVycnVwdCBSb3V0aW5nIFRhYmxlXG4iKTsKKwkJfQorCX0KKwlmcmVlX3BhZ2UocGFnZSk7CisJcmV0dXJuIHJ0OworfQorCisKK2ludCBwY2liaW9zX3NldF9pcnFfcm91dGluZyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGluLCBpbnQgaXJxKQoreworCWludCByZXQ7CisKKwlfX2FzbV9fKCJsY2FsbCAqKCUlZXNpKTsgY2xkXG5cdCIKKwkJImpjIDFmXG5cdCIKKwkJInhvciAlJWFoLCAlJWFoXG4iCisJCSIxOiIKKwkJOiAiPWEiIChyZXQpCisJCTogIjAiIChQQ0lCSU9TX1NFVF9QQ0lfSFdfSU5UKSwKKwkJICAiYiIgKChkZXYtPmJ1cy0+bnVtYmVyIDw8IDgpIHwgZGV2LT5kZXZmbiksCisJCSAgImMiICgoaXJxIDw8IDgpIHwgKHBpbiArIDEwKSksCisJCSAgIlMiICgmcGNpX2luZGlyZWN0KSk7CisJcmV0dXJuICEocmV0ICYgMHhmZjAwKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcGNpX3BjYmlvc19pbml0KHZvaWQpCit7CisJaWYgKChwY2lfcHJvYmUgJiBQQ0lfUFJPQkVfQklPUykgCisJCSYmICgocmF3X3BjaV9vcHMgPSBwY2lfZmluZF9iaW9zKCkpKSkgeworCQlwY2lfcHJvYmUgfD0gUENJX0JJT1NfU09SVDsKKwkJcGNpX2Jpb3NfcHJlc2VudCA9IDE7CisJfQorCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKHBjaV9wY2Jpb3NfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL3BjaS5oIGIvYXJjaC9pMzg2L3BjaS9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZjODBjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3BjaS9wY2kuaApAQCAtMCwwICsxLDc0IEBACisvKgorICoJTG93LUxldmVsIFBDSSBBY2Nlc3MgZm9yIGkzODYgbWFjaGluZXMuCisgKgorICoJKGMpIDE5OTkgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+CisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoeC4uLikgcHJpbnRrKHgpCisjZWxzZQorI2RlZmluZSBEQkcoeC4uLikKKyNlbmRpZgorCisjZGVmaW5lIFBDSV9QUk9CRV9CSU9TCQkweDAwMDEKKyNkZWZpbmUgUENJX1BST0JFX0NPTkYxCQkweDAwMDIKKyNkZWZpbmUgUENJX1BST0JFX0NPTkYyCQkweDAwMDQKKyNkZWZpbmUgUENJX1BST0JFX01NQ09ORgkweDAwMDgKKyNkZWZpbmUgUENJX1BST0JFX01BU0sJCTB4MDAwZgorCisjZGVmaW5lIFBDSV9OT19TT1JUCQkweDAxMDAKKyNkZWZpbmUgUENJX0JJT1NfU09SVAkJMHgwMjAwCisjZGVmaW5lIFBDSV9OT19DSEVDS1MJCTB4MDQwMAorI2RlZmluZSBQQ0lfVVNFX1BJUlFfTUFTSwkweDA4MDAKKyNkZWZpbmUgUENJX0FTU0lHTl9ST01TCQkweDEwMDAKKyNkZWZpbmUgUENJX0JJT1NfSVJRX1NDQU4JMHgyMDAwCisjZGVmaW5lIFBDSV9BU1NJR05fQUxMX0JVU1NFUwkweDQwMDAKKworZXh0ZXJuIHVuc2lnbmVkIGludCBwY2lfcHJvYmU7CisKKy8qIHBjaS1pMzg2LmMgKi8KKworZXh0ZXJuIHVuc2lnbmVkIGludCBwY2liaW9zX21heF9sYXRlbmN5OworCit2b2lkIHBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KHZvaWQpOworaW50IHBjaWJpb3NfZW5hYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqLCBpbnQpOworCisvKiBwY2ktcGMuYyAqLworCitleHRlcm4gaW50IHBjaWJpb3NfbGFzdF9idXM7CitleHRlcm4gc3RydWN0IHBjaV9idXMgKnBjaV9yb290X2J1czsKK2V4dGVybiBzdHJ1Y3QgcGNpX29wcyBwY2lfcm9vdF9vcHM7CisKKy8qIHBjaS1pcnEuYyAqLworCitzdHJ1Y3QgaXJxX2luZm8geworCXU4IGJ1cywgZGV2Zm47CQkJLyogQnVzLCBkZXZpY2UgYW5kIGZ1bmN0aW9uICovCisJc3RydWN0IHsKKwkJdTggbGluazsJCS8qIElSUSBsaW5lIElELCBjaGlwc2V0IGRlcGVuZGVudCwgMD1ub3Qgcm91dGVkICovCisJCXUxNiBiaXRtYXA7CQkvKiBBdmFpbGFibGUgSVJRcyAqLworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgaXJxWzRdOworCXU4IHNsb3Q7CQkJLyogU2xvdCBudW1iZXIsIDA9b25ib2FyZCAqLworCXU4IHJmdTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpcnFfcm91dGluZ190YWJsZSB7CisJdTMyIHNpZ25hdHVyZTsJCQkvKiBQSVJRX1NJR05BVFVSRSBzaG91bGQgYmUgaGVyZSAqLworCXUxNiB2ZXJzaW9uOwkJCS8qIFBJUlFfVkVSU0lPTiAqLworCXUxNiBzaXplOwkJCS8qIFRhYmxlIHNpemUgaW4gYnl0ZXMgKi8KKwl1OCBydHJfYnVzLCBydHJfZGV2Zm47CQkvKiBXaGVyZSB0aGUgaW50ZXJydXB0IHJvdXRlciBsaWVzICovCisJdTE2IGV4Y2x1c2l2ZV9pcnFzOwkJLyogSVJRcyBkZXZvdGVkIGV4Y2x1c2l2ZWx5IHRvIFBDSSB1c2FnZSAqLworCXUxNiBydHJfdmVuZG9yLCBydHJfZGV2aWNlOwkvKiBWZW5kb3IgYW5kIGRldmljZSBJRCBvZiBpbnRlcnJ1cHQgcm91dGVyICovCisJdTMyIG1pbmlwb3J0X2RhdGE7CQkvKiBDcmFwICovCisJdTggcmZ1WzExXTsKKwl1OCBjaGVja3N1bTsJCQkvKiBNb2R1bG8gMjU2IGNoZWNrc3VtIG11c3QgZ2l2ZSB6ZXJvICovCisJc3RydWN0IGlycV9pbmZvIHNsb3RzWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBwY2liaW9zX2lycV9tYXNrOworCitleHRlcm4gaW50IHBjaWJpb3Nfc2Nhbm5lZDsKK2V4dGVybiBzcGlubG9ja190IHBjaV9jb25maWdfbG9jazsKKworZXh0ZXJuIGludCAoKnBjaWJpb3NfZW5hYmxlX2lycSkoc3RydWN0IHBjaV9kZXYgKmRldik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL3Zpc3dzLmMgYi9hcmNoL2kzODYvcGNpL3Zpc3dzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5MjQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9wY2kvdmlzd3MuYwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqCUxvdy1MZXZlbCBQQ0kgU3VwcG9ydCBmb3IgU0dJIFZpc3VhbCBXb3Jrc3RhdGlvbgorICoKKyAqCShjKSAxOTk5LS0yMDAwIE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlICJjb2JhbHQuaCIKKyNpbmNsdWRlICJsaXRoaXVtLmgiCisKKyNpbmNsdWRlICJwY2kuaCIKKworCitleHRlcm4gc3RydWN0IHBjaV9yYXdfb3BzIHBjaV9kaXJlY3RfY29uZjE7CisKK3N0YXRpYyBpbnQgcGNpX3Zpc3dzX2VuYWJsZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldikgeyByZXR1cm4gMDsgfQorCitpbnQgKCpwY2liaW9zX2VuYWJsZV9pcnEpKHN0cnVjdCBwY2lfZGV2ICpkZXYpID0gJnBjaV92aXN3c19lbmFibGVfaXJxOworCit2b2lkIF9faW5pdCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkge30KKworCit1bnNpZ25lZCBpbnQgcGNpX2J1czAsIHBjaV9idXMxOworCitzdGF0aWMgaW5saW5lIHU4IGJyaWRnZV9zd2l6emxlKHU4IHBpbiwgdTggc2xvdCkgCit7CisJcmV0dXJuICgoKHBpbiAtIDEpICsgc2xvdCkgJSA0KSArIDE7Cit9CisKK3N0YXRpYyB1OCBfX2luaXQgdmlzd3Nfc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCkKK3sKKwl1OCBwaW4gPSAqcGlucDsKKworCXdoaWxlIChkZXYtPmJ1cy0+c2VsZikgewkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAqLworCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKTsKKwkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CisJfQorCSpwaW5wID0gcGluOworCisJcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOworfQorCitzdGF0aWMgaW50IF9faW5pdCB2aXN3c19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwlpbnQgaXJxLCBidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOworCisJcGluLS07CisKKwkvKiBOb3RoaW5nIHVzZWZ1bCBhdCBQSUlYNCBwaW4gMSAqLworCWlmIChidXMgPT0gcGNpX2J1czAgJiYgc2xvdCA9PSA0ICYmIHBpbiA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBQSUlYNCBVU0IgaXMgb24gQnVzIDAsIFNsb3QgNCwgTGluZSAzICovCisJaWYgKGJ1cyA9PSBwY2lfYnVzMCAmJiBzbG90ID09IDQgJiYgcGluID09IDMpIHsKKwkJaXJxID0gQ09fSVJRKENPX0FQSUNfUElJWDRfVVNCKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRmlyc3QgcGluIHNwcmVhZCBkb3duIDEgQVBJQyBlbnRyeSBwZXIgc2xvdCAqLworCWlmIChwaW4gPT0gMCkgeworCQlpcnEgPSBDT19JUlEoKGJ1cyA9PSBwY2lfYnVzMCA/IENPX0FQSUNfUENJQl9CQVNFMCA6CisJCQkJCQlDT19BUElDX1BDSUFfQkFTRTApICsgc2xvdCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGxpbmVzIDEsMiwzIGZyb20gYW55IHNsb3QgaXMgc2hhcmVkIGluIHRoaXMgdHdpcmx5IHBhdHRlcm4gKi8KKwlpZiAoYnVzID09IHBjaV9idXMxKSB7CisJCS8qIGxpbmVzIDEtMyBmcm9tIGRldmljZXMgMCAxIHJvdGF0ZSBvdmVyIDIgYXBpYyBlbnRyaWVzICovCisJCWlycSA9IENPX0lSUShDT19BUElDX1BDSUFfQkFTRTEyMyArICgoc2xvdCArIChwaW4gLSAxKSkgJSAyKSk7CisJfSBlbHNlIHsgLyogYnVzID09IHBjaV9idXMwICovCisJCS8qIGxpbmVzIDEtMyBmcm9tIGRldmljZXMgMC0zIHJvdGF0ZSBvdmVyIDMgYXBpYyBlbnRyaWVzICovCisJCWlmIChzbG90ID09IDApCisJCQlzbG90ID0gMzsgLyogc2FtZSBwYXR0ZXJuICovCisJCWlycSA9IENPX0lSUShDT19BUElDX1BDSUFfQkFTRTEyMyArICgoMyAtIHNsb3QpICsgKHBpbiAtIDEpICUgMykpOworCX0KK291dDoKKwlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBCdXMgJWQgU2xvdCAlZCBMaW5lICVkIC0+IElSUSAlZFxuIiwgYnVzLCBzbG90LCBwaW4sIGlycSk7CisJcmV0dXJuIGlycTsKK30KKwordm9pZCBfX2luaXQgcGNpYmlvc191cGRhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpcnEpCit7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKK3sKKwkvKiBUaGUgVklTV1Mgc3VwcG9ydHMgY29uZmlndXJhdGlvbiBhY2Nlc3MgdHlwZSAxIG9ubHkgKi8KKwlwY2lfcHJvYmUgPSAocGNpX3Byb2JlIHwgUENJX1BST0JFX0NPTkYxKSAmCisJCSAgICB+KFBDSV9QUk9CRV9CSU9TIHwgUENJX1BST0JFX0NPTkYyKTsKKworCXBjaV9idXMwID0gbGlfcGNpYl9yZWFkMTYoTElfUENJX0JVU05VTSkgJiAweGZmOworCXBjaV9idXMxID0gbGlfcGNpYV9yZWFkMTYoTElfUENJX0JVU05VTSkgJiAweGZmOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBMaXRoaXVtIGJyaWRnZSBBIGJ1czogJXUsICIKKwkJImJyaWRnZSBCIChQSUlYNCkgYnVzOiAldVxuIiwgcGNpX2J1czEsIHBjaV9idXMwKTsKKworCXJhd19wY2lfb3BzID0gJnBjaV9kaXJlY3RfY29uZjE7CisJcGNpX3NjYW5fYnVzKHBjaV9idXMwLCAmcGNpX3Jvb3Rfb3BzLCBOVUxMKTsKKwlwY2lfc2Nhbl9idXMocGNpX2J1czEsICZwY2lfcm9vdF9vcHMsIE5VTEwpOworCXBjaV9maXh1cF9pcnFzKHZpc3dzX3N3aXp6bGUsIHZpc3dzX21hcF9pcnEpOworCXBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KCk7CisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChwY2liaW9zX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3Bvd2VyL01ha2VmaWxlIGIvYXJjaC9pMzg2L3Bvd2VyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZmE0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvcG93ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmotJChDT05GSUdfUE0pCQkrPSBjcHUubworb2JqLSQoQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQpCSs9IHN3c3VzcC5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcG93ZXIvY3B1LmMgYi9hcmNoL2kzODYvcG93ZXIvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzMzdjNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9wb3dlci9jcHUuYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIFN1c3BlbmQgc3VwcG9ydCBzcGVjaWZpYyBmb3IgaTM4Ni4KKyAqCisgKiBEaXN0cmlidXRlIHVuZGVyIEdQTHYyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBQYXRyaWNrIE1vY2hlbCA8bW9jaGVsQG9zZGwub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc2F2ZWRfY29udGV4dCBzYXZlZF9jb250ZXh0OworCit1bnNpZ25lZCBsb25nIHNhdmVkX2NvbnRleHRfZWJ4OwordW5zaWduZWQgbG9uZyBzYXZlZF9jb250ZXh0X2VzcCwgc2F2ZWRfY29udGV4dF9lYnA7Cit1bnNpZ25lZCBsb25nIHNhdmVkX2NvbnRleHRfZXNpLCBzYXZlZF9jb250ZXh0X2VkaTsKK3Vuc2lnbmVkIGxvbmcgc2F2ZWRfY29udGV4dF9lZmxhZ3M7CisKK2V4dGVybiB2b2lkIGVuYWJsZV9zZXBfY3B1KHZvaWQgKik7CisKK3ZvaWQgX19zYXZlX3Byb2Nlc3Nvcl9zdGF0ZShzdHJ1Y3Qgc2F2ZWRfY29udGV4dCAqY3R4dCkKK3sKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisKKwkvKgorCSAqIGRlc2NyaXB0b3IgdGFibGVzCisJICovCisJYXNtIHZvbGF0aWxlICgic2dkdCAlMCIgOiAiPW0iIChjdHh0LT5nZHRfbGltaXQpKTsKKwlhc20gdm9sYXRpbGUgKCJzaWR0ICUwIiA6ICI9bSIgKGN0eHQtPmlkdF9saW1pdCkpOworCWFzbSB2b2xhdGlsZSAoInNsZHQgJTAiIDogIj1tIiAoY3R4dC0+bGR0KSk7CisJYXNtIHZvbGF0aWxlICgic3RyICUwIiAgOiAiPW0iIChjdHh0LT50cikpOworCisJLyoKKwkgKiBzZWdtZW50IHJlZ2lzdGVycworCSAqLworCWFzbSB2b2xhdGlsZSAoIm1vdncgJSVlcywgJTAiIDogIj1tIiAoY3R4dC0+ZXMpKTsKKwlhc20gdm9sYXRpbGUgKCJtb3Z3ICUlZnMsICUwIiA6ICI9bSIgKGN0eHQtPmZzKSk7CisJYXNtIHZvbGF0aWxlICgibW92dyAlJWdzLCAlMCIgOiAiPW0iIChjdHh0LT5ncykpOworCWFzbSB2b2xhdGlsZSAoIm1vdncgJSVzcywgJTAiIDogIj1tIiAoY3R4dC0+c3MpKTsKKworCS8qCisJICogY29udHJvbCByZWdpc3RlcnMgCisJICovCisJYXNtIHZvbGF0aWxlICgibW92bCAlJWNyMCwgJTAiIDogIj1yIiAoY3R4dC0+Y3IwKSk7CisJYXNtIHZvbGF0aWxlICgibW92bCAlJWNyMiwgJTAiIDogIj1yIiAoY3R4dC0+Y3IyKSk7CisJYXNtIHZvbGF0aWxlICgibW92bCAlJWNyMywgJTAiIDogIj1yIiAoY3R4dC0+Y3IzKSk7CisJYXNtIHZvbGF0aWxlICgibW92bCAlJWNyNCwgJTAiIDogIj1yIiAoY3R4dC0+Y3I0KSk7Cit9CisKK3ZvaWQgc2F2ZV9wcm9jZXNzb3Jfc3RhdGUodm9pZCkKK3sKKwlfX3NhdmVfcHJvY2Vzc29yX3N0YXRlKCZzYXZlZF9jb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2RvX2ZwdV9lbmQodm9pZCkKK3sKKyAgICAgICAgLyogcmVzdG9yZSBGUFUgcmVncyBpZiBuZWNlc3NhcnkgKi8KKwkvKiBEbyBpdCBvdXQgb2YgbGluZSBzbyB0aGF0IGdjYyBkb2VzIG5vdCBtb3ZlIGNyMCBsb2FkIHRvIHNvbWUgc3R1cGlkIHBsYWNlICovCisgICAgICAgIGtlcm5lbF9mcHVfZW5kKCk7CisJbXhjc3JfZmVhdHVyZV9tYXNrX2luaXQoKTsKK30KKworCitzdGF0aWMgdm9pZCBmaXhfcHJvY2Vzc29yX2NvbnRleHQodm9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCB0c3Nfc3RydWN0ICogdCA9ICZwZXJfY3B1KGluaXRfdHNzLCBjcHUpOworCisJc2V0X3Rzc19kZXNjKGNwdSx0KTsJLyogVGhpcyBqdXN0IG1vZGlmaWVzIG1lbW9yeTsgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkuIEJ1dC4uLiBUaGlzIGlzIG5lY2Vzc2FyeSwgYmVjYXVzZSAzODYgaGFyZHdhcmUgaGFzIGNvbmNlcHQgb2YgYnVzeSBUU1Mgb3Igc29tZSBzaW1pbGFyIHN0dXBpZGl0eS4gKi8KKyAgICAgICAgcGVyX2NwdShjcHVfZ2R0X3RhYmxlLCBjcHUpW0dEVF9FTlRSWV9UU1NdLmIgJj0gMHhmZmZmZmRmZjsKKworCWxvYWRfVFJfZGVzYygpOwkJCQkvKiBUaGlzIGRvZXMgbHRyICovCisJbG9hZF9MRFQoJmN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dCk7CS8qIFRoaXMgZG9lcyBsbGR0ICovCisKKwkvKgorCSAqIE5vdyBtYXliZSByZWxvYWQgdGhlIGRlYnVnIHJlZ2lzdGVycworCSAqLworCWlmIChjdXJyZW50LT50aHJlYWQuZGVidWdyZWdbN10peworICAgICAgICAgICAgICAgIGxvYWRkZWJ1ZygmY3VycmVudC0+dGhyZWFkLCAwKTsKKyAgICAgICAgICAgICAgICBsb2FkZGVidWcoJmN1cnJlbnQtPnRocmVhZCwgMSk7CisgICAgICAgICAgICAgICAgbG9hZGRlYnVnKCZjdXJyZW50LT50aHJlYWQsIDIpOworICAgICAgICAgICAgICAgIGxvYWRkZWJ1ZygmY3VycmVudC0+dGhyZWFkLCAzKTsKKyAgICAgICAgICAgICAgICAvKiBubyA0IGFuZCA1ICovCisgICAgICAgICAgICAgICAgbG9hZGRlYnVnKCZjdXJyZW50LT50aHJlYWQsIDYpOworICAgICAgICAgICAgICAgIGxvYWRkZWJ1ZygmY3VycmVudC0+dGhyZWFkLCA3KTsKKwl9CisKK30KKwordm9pZCBfX3Jlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKHN0cnVjdCBzYXZlZF9jb250ZXh0ICpjdHh0KQoreworCisJLyoKKwkgKiBjb250cm9sIHJlZ2lzdGVycworCSAqLworCWFzbSB2b2xhdGlsZSAoIm1vdmwgJTAsICUlY3I0IiA6OiAiciIgKGN0eHQtPmNyNCkpOworCWFzbSB2b2xhdGlsZSAoIm1vdmwgJTAsICUlY3IzIiA6OiAiciIgKGN0eHQtPmNyMykpOworCWFzbSB2b2xhdGlsZSAoIm1vdmwgJTAsICUlY3IyIiA6OiAiciIgKGN0eHQtPmNyMikpOworCWFzbSB2b2xhdGlsZSAoIm1vdmwgJTAsICUlY3IwIiA6OiAiciIgKGN0eHQtPmNyMCkpOworCisJLyoKKwkgKiBzZWdtZW50IHJlZ2lzdGVycworCSAqLworCWFzbSB2b2xhdGlsZSAoIm1vdncgJTAsICUlZXMiIDo6ICJyIiAoY3R4dC0+ZXMpKTsKKwlhc20gdm9sYXRpbGUgKCJtb3Z3ICUwLCAlJWZzIiA6OiAiciIgKGN0eHQtPmZzKSk7CisJYXNtIHZvbGF0aWxlICgibW92dyAlMCwgJSVncyIgOjogInIiIChjdHh0LT5ncykpOworCWFzbSB2b2xhdGlsZSAoIm1vdncgJTAsICUlc3MiIDo6ICJyIiAoY3R4dC0+c3MpKTsKKworCS8qCisJICogbm93IHJlc3RvcmUgdGhlIGRlc2NyaXB0b3IgdGFibGVzIHRvIHRoZWlyIHByb3BlciB2YWx1ZXMKKwkgKiBsdHIgaXMgZG9uZSBpIGZpeF9wcm9jZXNzb3JfY29udGV4dCgpLgorCSAqLworCWFzbSB2b2xhdGlsZSAoImxnZHQgJTAiIDo6ICJtIiAoY3R4dC0+Z2R0X2xpbWl0KSk7CisJYXNtIHZvbGF0aWxlICgibGlkdCAlMCIgOjogIm0iIChjdHh0LT5pZHRfbGltaXQpKTsKKwlhc20gdm9sYXRpbGUgKCJsbGR0ICUwIiA6OiAibSIgKGN0eHQtPmxkdCkpOworCisJLyoKKwkgKiBzeXNlbnRlciBNU1JzCisJICovCisJaWYgKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9TRVApKQorCQllbmFibGVfc2VwX2NwdShOVUxMKTsKKworCWZpeF9wcm9jZXNzb3JfY29udGV4dCgpOworCWRvX2ZwdV9lbmQoKTsKK30KKwordm9pZCByZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSh2b2lkKQoreworCV9fcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUoJnNhdmVkX2NvbnRleHQpOworfQorCisvKiBOZWVkZWQgYnkgYXBtLmMgKi8KK0VYUE9SVF9TWU1CT0woc2F2ZV9wcm9jZXNzb3Jfc3RhdGUpOworRVhQT1JUX1NZTUJPTChyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcG93ZXIvc3dzdXNwLlMgYi9hcmNoL2kzODYvcG93ZXIvc3dzdXNwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxMDUyOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9wb3dlci9zd3N1c3AuUwpAQCAtMCwwICsxLDczIEBACisudGV4dAorCisvKiBPcmlnaW5hbGx5IGdjYyBnZW5lcmF0ZWQsIG1vZGlmaWVkIGJ5IGhhbmQKKyAqCisgKiBUaGlzIG1heSBub3QgdXNlIGFueSBzdGFjaywgbm9yIGFueSB2YXJpYWJsZSB0aGF0IGlzIG5vdCAiTm9TYXZlIjoKKyAqCisgKiBJdHMgcmV3cml0aW5nIG9uZSBrZXJuZWwgaW1hZ2Ugd2l0aCBhbm90aGVyLiBXaGF0IGlzIHN0YWNrIGluICJvbGQiCisgKiBpbWFnZSBjb3VsZCB2ZXJ5IHdlbGwgYmUgZGF0YSBwYWdlIGluICJuZXciIGltYWdlLCBhbmQgb3ZlcndyaXRpbmcKKyAqIHlvdXIgb3duIHN0YWNrIHVuZGVyIHlvdSBpcyBiYWQgaWRlYS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNtX29mZnNldHMuaD4KKworCS50ZXh0CisKK0VOVFJZKHN3c3VzcF9hcmNoX3N1c3BlbmQpCisKKwltb3ZsICVlc3AsIHNhdmVkX2NvbnRleHRfZXNwCisJbW92bCAlZWJ4LCBzYXZlZF9jb250ZXh0X2VieAorCW1vdmwgJWVicCwgc2F2ZWRfY29udGV4dF9lYnAKKwltb3ZsICVlc2ksIHNhdmVkX2NvbnRleHRfZXNpCisJbW92bCAlZWRpLCBzYXZlZF9jb250ZXh0X2VkaQorCXB1c2hmbCA7IHBvcGwgc2F2ZWRfY29udGV4dF9lZmxhZ3MKKworCWNhbGwgc3dzdXNwX3NhdmUKKwlyZXQKKworRU5UUlkoc3dzdXNwX2FyY2hfcmVzdW1lKQorCW1vdmwJJHN3c3VzcF9wZ19kaXItX19QQUdFX09GRlNFVCwgJWVjeAorCW1vdmwJJWVjeCwgJWNyMworCisJbW92bAlwYWdlZGlyX25vc2F2ZSwgJWVkeAorCS5wMmFsaWduIDQsLDcKKworY29weV9sb29wOgorCXRlc3RsCSVlZHgsICVlZHgKKwlqeglkb25lCisKKwltb3ZsCXBiZV9hZGRyZXNzKCVlZHgpLCAlZXNpCisJbW92bAlwYmVfb3JpZ19hZGRyZXNzKCVlZHgpLCAlZWRpCisKKwltb3ZsCSQxMDI0LCAlZWN4CisJcmVwCisJbW92c2wKKworCW1vdmwJcGJlX25leHQoJWVkeCksICVlZHgKKwlqbXAJY29weV9sb29wCisJLnAyYWxpZ24gNCwsNworCitkb25lOgorCS8qIEZsdXNoIFRMQiwgaW5jbHVkaW5nICJnbG9iYWwiIHRoaW5ncyAodm1hbGxvYykgKi8KKwltb3ZsCW1tdV9jcjRfZmVhdHVyZXMsICVlYXgKKwltb3ZsCSVlYXgsICVlZHgKKwlhbmRsCSR+KDE8PDcpLCAlZWR4OyAgIyBQR0UKKwltb3ZsCSVlZHgsICVjcjQ7ICAjIHR1cm4gb2ZmIFBHRQorCW1vdmwJJWNyMywgJWVjeDsgICMgZmx1c2ggVExCCisJbW92bAklZWN4LCAlY3IzCisJbW92bAklZWF4LCAlY3I0OyAgIyB0dXJuIFBHRSBiYWNrIG9uCisKKwltb3ZsIHNhdmVkX2NvbnRleHRfZXNwLCAlZXNwCisJbW92bCBzYXZlZF9jb250ZXh0X2VicCwgJWVicAorCW1vdmwgc2F2ZWRfY29udGV4dF9lYngsICVlYngKKwltb3ZsIHNhdmVkX2NvbnRleHRfZXNpLCAlZXNpCisJbW92bCBzYXZlZF9jb250ZXh0X2VkaSwgJWVkaQorCisJcHVzaGwgc2F2ZWRfY29udGV4dF9lZmxhZ3MgOyBwb3BmbAorCisJeG9ybAklZWF4LCAlZWF4CisKKwlyZXQK